Can't load a specific page on codeigniter "slug" - php

I'm trying to load a specific page within a controller. I followed the Codeigniter tutorial and the main pages work but the individual page (loaded with view) doesn't load according to the given slug.
blog.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Blog extends CI_Controller {
/**
* Index Page for this controller.
*
* Maps to the following URL
* http://example.com/index.php/index
* - or -
* http://example.com/index.php/Index/index
* - or -
*/
function __construct()
{
parent::__construct();
$this->load->model('blog_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['post'] = $this->blog_model->get_posts();
$data['title'] = 'Blog archive';
$this->load->view('header', $data);
$this->load->view('blog', $data);
$this->load->view('footer', $data);
}
public function view($slug = NULL)
{
$data['post'] = $this->blog_model->get_posts($slug);
if (empty($data['post']))
{
show_404();
}
$data['title'] = $data['post']['title'];
$this->load->view('header', $data);
$this->load->view('post', $data);
$this->load->view('footer', $data);
}
}
blog_model.php
<?php
class Blog_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = FALSE)
{
if ($slug === FALSE)
{
$this->db->select('*');
$this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
$query = $this->db->get();
return $query->result_array();
}
$this->db->select('*');
// $this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
// $this->db->where('slug', $slug);
$query = $this->db->get_where('blog_posts', array('slug' => $slug));
return $query->row_array();
}
}
As you can see I tried a few combinations because I'm not sure it's retrieving the table in get_posts when slug is not false.

try like this
call url_helper helper in __construct like following
$this->load->helper('url');
Now, update the routes.php like following
If your URL like
http://www.example.com/blog/view/slug
Your ruote should be like this
$route['blog/view/(:any)'] = 'blog/view/$1';
If your URL like
http://www.example.com/view/slug
Your ruote should be like this
$route['view/(:any)'] = 'blog/view/$1';
And, your get_posts model function repeating queries, use it simply like below
public function get_posts($slug = FALSE){
$this->db->select('*');
$this->db->from('blog_posts');
$this->db->join('category', 'category.id = blog_posts.category_id');
$this->db->join('author', 'author.id = blog_posts.author_id');
if($slug){
$this->db->where(compact('slug'));
}
$query = $this->db->get();
return ($query->num_rows() > 1) ? $query->result_array() : $query->row_array();
}

In the end I solved it by modifying the routes:
At first I had:
$route['default_controller'] = 'Index';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['blog'] = 'blog';
$route['blog/(:any)'] = 'blog/$1';
So I changed it to:
$route['default_controller'] = 'Index';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['blog'] = 'blog';
$route['blog/(:any)'] = 'blog/view/$1';
And changed the method name in blog.php from blog to view. "view" looks more standard than "blog" so I left it that way. In 'blog/view/$1' represents the controller, view the method and of course $1 is the first param. Actually if I try Blog/view/hello-world it works too.

Related

How to solve page blank problem with codeigniter "news" section?

I'm following the Codeigniter tutorial: http://localhost:8080/myproject/user_guide/tutorial/news_section.html
When i point my browser to http://localhost:8080/myproject/news as the tutorial indicates at the final of the section, "Point your browser to your document root, followed by index.php/news and watch your news page." appears a blank page.
I tried to point to localhost:8080/index.php/news or /myproject/news but occurs the same problem.
Also i tried to set in autoload.php the next: $autoload['libraries'] = array('database');
as is indicated in codeigniter news section tutorial not working but not solve, so i leave it like this: $autoload['libraries'] = array('');
This is the routes:
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
The News.php:
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item']))
{
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
}
the view.php:
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
and the News_model.php:
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' =>
$slug));
return $query->row_array();
}
}
I expect to watch the news page

URI routing in CodeIgniter causes 404 error

Second EDIT - Found the Problem, and answered it as well.
First Edit - added my Post_model.php file as well for clearer explanation of my code.
I am trying to redirect a Blogs slug to a separate page where I can show the entire blogs content.
here's an example slug
http://localhost/aag/posts/test-one
Here's the Posts controller
<?php
class Posts extends CI_Controller {
public function index(){
// Shows a blog listing
}
public function view($slug = NULL){
$data['post'] = $this->post_model->get_posts($slug);
if(empty($data['post'])){
show_404();
}
$data['title'] = $data['post']['title'];
$this->load->view('templates/header');
$this->load->view('posts/view', $data);
$this->load->view('templates/footer');
}
}
The posts/view.php file
<h2><?php echo $post['title']; ?></h2>
<small class="post-date">Created on <?php echo $post['created_at']?></small><br>
<div class="post-body">
<?php echo $post['body']; ?>
</div>
the Post_model.php
class Post_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = FALSE)
{
if ($slug === FALSE) {
$query = $this->db->get('posts');
return $query->result_array();
}
$query = $this->db->get_where('posts', array('slug' => '$slug'));
return $query->row_array();
}
}
routes.php
$route['posts/(:any)'] = 'posts/view/$1';
$route['posts'] = 'posts/index';
$route['(:any)'] = 'pages/view/$1';
Okay, so years of writing mysqli queries made me do this mistake. In my Post_model.php I am getting the data where (DB column field) slug should match the $slug that gets passed in, but I surrounded the slugs inside single quotes that was causing the error. Here's the working code now.
class Post_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_posts($slug = NULL)
{
if ($slug === NULL) {
$query = $this->db->get('posts');
return $query->result_array();
}
$query = $this->db->get_where('posts', array('slug' => $slug));
return $query->row_array();
}
}
TLDR: Don't encapsulate your passed in arguments inside quotes.

Codeigniter admin route [closed]

Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 7 years ago.
Improve this question
I am stuck with this problem.
I get 404 error when try to access admin pages in codeigniter, I can only access the fronted pages.
Here you have my route.php file:
$route['default_controller'] = "page";
$route['404_override'] = '';
$route[':any'] = "page/index/$1"; **WORKS**
$route['admin/page'] = "admin/page"; **WORKS**
$route['admin/page/order'] = "admin/page/order"; **NOT WORKING** <!-- this i my issue -->
$route['admin/page/edit'] = "admin/page/edit"; **WORKS**
$route['admin/page/edit/(:num)'] = "admin/page/edit/$1"; **NOT WORKING** <!-- this i my issue -->
Admin Controller
class Admin_Controller extends MY_Controller
{
function __construct ()
{
parent::__construct();
$this->data['meta_title'] = 'My awesome CMS';
$this->load->helper('form');
$this->load->library('form_validation');
$this->load->library('session');
$this->load->model('user_m');
// Login check
$exception_uris = array(
'admin/user/login',
'admin/user/logout'
);
if (in_array(uri_string(), $exception_uris) == FALSE) {
if ($this->user_m->loggedin() == FALSE) {
redirect('admin/user/login');
}
}
}
}
Frontend pages format
http://www.my_site.com/index.php/about
Backend format
http://www.my_site.com/admin/page
http://www.my_site.com/index.php/admin/page/edit/1
Please, can anyone help me?
Thanks in advance.
Guys thanks for the reply
Here you have my Page Admin Controller and also I have amended the route.php above.
<?php
class Page extends Admin_Controller
{
public function __construct ()
{
parent::__construct();
$this->load->model('page_m');
}
public function index ()
{
// Fetch all pages
$this->data['pages'] = $this->page_m->get_with_parent();
// Load view
$this->data['subview'] = 'admin/page/index';
$this->load->view('admin/_layout_main', $this->data);
}
public function order ()
{
$this->data['sortable'] = TRUE;
$this->data['subview'] = 'admin/page/order';
$this->load->view('admin/_layout_main', $this->data);
}
public function order_ajax ()
{
// Save order from ajax call
if (isset($_POST['sortable'])) {
$this->page_m->save_order($_POST['sortable']);
}
// Fetch all pages
$this->data['pages'] = $this->page_m->get_nested();
// Load view
$this->load->view('admin/page/order_ajax', $this->data);
}
public function edit ($id = NULL)
{
// Fetch a page or set a new one
if ($id) {
$this->data['page'] = $this->page_m->get($id);
count($this->data['page']) || $this->data['errors'][] = 'page could not be found';
}
else {
$this->data['page'] = $this->page_m->get_new();
}
// Pages for dropdown
$this->data['pages_no_parents'] = $this->page_m->get_no_parents();
// Set up the form
$rules = $this->page_m->rules;
$this->form_validation->set_rules($rules);
// Process the form
if ($this->form_validation->run() == TRUE) {
$data = $this->page_m->array_from_post(array(
'title',
'slug',
'body',
'template',
'parent_id'
));
$this->page_m->save($data, $id);
redirect('admin/page');
}
// Load the view
$this->data['subview'] = 'admin/page/edit';
$this->load->view('admin/_layout_main', $this->data);
}
public function delete ($id)
{
$this->page_m->delete($id);
redirect('admin/page');
}
public function _unique_slug ($str)
{
// Do NOT validate if slug already exists
// UNLESS it's the slug for the current page
$id = $this->uri->segment(4);
$this->db->where('slug', $this->input->post('slug'));
! $id || $this->db->where('id !=', $id);
$page = $this->page_m->get();
if (count($page)) {
$this->form_validation->set_message('_unique_slug', '%s should be unique');
return FALSE;
}
return TRUE;
}
}
Front End Page Controller
<?php
class Page extends Frontend_Controller{
public function __construct(){
parent::__construct();
$this->load->model('page_m');
}
public function index(){
// Fetch the page template
$this->data['page'] = $this->page_m->get_by(array('slug' => (string) $this->uri->segment(1)), TRUE);
count($this->data['page']) || show_404(current_url());
// Fetch the page data
$method = '_' . $this->data['page']->template;
if (method_exists($this, $method)) {
$this->$method();
}
else {
log_message('error', 'Could not load template ' . $method .' in file ' . __FILE__ . ' at line ' . __LINE__);
show_error('Could not load template ' . $method);
}
//Fetch the view
$this->data['subview'] = $this->data['page']->template;
$this->load->view('_main_layout', $this->data);
}
private function _page(){
dump('welcome from the page template');
}
private function _homepage(){
$this->load->model('article_m');
$this->db->where('pubdate <=', date('Y-m-d'));
$this->db->limit(6);
$this->data['articles'] = $this->article_m->get();
}
private function _news_archive(){
$this->load->model('article_m');
// Count all articles
$this->db->where('pubdate <=', date('Y-m-d'));
$count = $this->db->count_all_results('articles');
// Set up pagination
$perpage = 4;
if ($count > $perpage) {
$this->load->library('pagination');
$config['base_url'] = site_url($this->uri->segment(1) . '/');
$config['total_rows'] = $count;
$config['per_page'] = $perpage;
$config['uri_segment'] = 2;
$this->pagination->initialize($config);
$this->data['pagination'] = $this->pagination->create_links();
$offset = $this->uri->segment(2);
}
else {
$this->data['pagination'] = '';
$offset = 0;
}
// Fetch articles
$this->db->where('pubdate <=', date('Y-m-d'));
$this->db->limit($perpage, $offset);
$this->data['articles'] = $this->article_m->get();
}
}
Hope you can have help me
Thanks
I dont see any routes nor URLs that point to your Admin_Controller . If a user types http://.../admin/page Codeigniter will try to look for a controller named Admin not Admin_controller unless you have routes set up.
Also, you have this route: $route[':any'] = "page/index/$1"; This route will take any URL given and redirect the user to the Page controller (which you have not provided any code on). I would get rid of it, or what is its function?
What you need to decide is whether your admin URL should be this: http://www.my_site.com/admin/page
or this: http://www.my_site.com/admin_controller/page
Personally I would choose the first one since it looks cleaner. Which then means you have to decide whether your controller should stay named as Admin_Controller or just Admin. I would chose Admin so that you dont have to deal with routes.
The final result should be this:
Your admin URL: http://www.my_site.com/admin/page
Your Controller: application/controllers/Admin.php
class Admin extends MY_Controller {
public function __construct() {
//... your code here
}
public function page() {
//... your code here
}
}
You don't seem to have
function index()
in your admin controller.

getting a 404 error while clicking on a article

I am building my first CodeIgniter website and I am conquering a problem that seems to be hard to solve..
When I click on a article to read it I keep getting a 404 page. ( not found )
the link that I get is as follows
index.php/articles/articlename
In my controller I have the following for the view part
public function view($slug) {
$data['article_item'] = $this->articles_model->get_article($slug);
if (empty($data['article_item']))
{
show_404();
}
$data['title'] = $data['article_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('articles/view', $data);
$this->load->view('templates/side', $data);
$this->load->view('templates/footer');
}
As you see it has to include the view.php in the articles directory
In my router I have the following
$route['articles/(:any)'] = 'articles/view/$1';
$route['articles/create'] = 'articles/create';
$route['(:any)'] = 'pages/view/$1';
$route['gallery'] = 'gallery';
$route['articles'] = 'articles';
$route['default_controller'] = 'home';
$route['404_override'] = '';
Just to be sure I have posted every relevant stuff here is the link that I create
Read more
and the model
<?php
class Articles_model extends CI_Model {
public function __construct() {
$this->load->database();
}
public function get_article($slug = FALSE) {
if ($slug === FALSE) {
$query = $this->db->get('articles');
return $query->result_array();
}
$query = $this->db->get_where('articles', array('slug' => $slug));
return $query->row_array();
}
}
I hope someone can tell me what I'm doing wrong here..
You are missing the function name in your link.
Your URL should be: index.php/articles/view/articlename
The first part in your URL after index.php is the name of your Class and the second part is the name of your function and then your input values

dynamic Page control in codeigniter

In my CI project, I would like to use a full dynamic page control. So, I’ve two controller methods, which load the php files. The model control’s queries are based on url segments. All page output generated automatically in the views php file depending on url and results of database, except index.php file.
Is this a right way?
Controller
public function index()
{
$data['title'] = "Index";
$data['nav'] = $this->content_model->get_index_nav(); //TODO
$this->load->view('templates/header', $data);
$this->load->view('templates/nav', $data);
$this->load->view('templates/nav_pict', $data);
$this->load->view('pages/aktualis', $data);
$this->load->view('templates/footer', $data);
}
public function view($page)
{
$page = 'content';
$this->load->helper('text');
$this->load->helper('url');
$page = lcfirst(convert_accented_characters(urldecode($page)));
if ( ! file_exists('application/views/pages/'.$page.'.php'))
{
show_404();
}
$data['title'] = ucfirst($page); // Capitalize the first letter
$data['nav'] = $this->content_model->get_nav();
$data['content'] = $this->content_model->get_content();
if(empty($data['content']))
{
show_404();
}
$this->load->view('templates/header', $data);
$this->load->view('templates/nav', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/footer', $data);
}
Model (Each menu has a content in database. When create a new submenu you must be add content)
public function get_content()
{
$this->db->select('content.*, mainmenu.label');
$this->db->from('content');
$this->db->join('mainmenu', 'mainmenu.id = content.katId', 'left');
$this->db->where('mainmenu.label', mysql_escape_string(urldecode(end($this->uri->segments))));
$query = $this->db->get();
return $query->result_array();
}
Routing
$route['404_override'] = '';
$route['/:any/(:any)'] = 'pages/view/$1';
$route['(:any)'] = 'pages/view/$1';
$route['Index'] = 'pages/index';
$route['default_controller'] = 'pages/index';
You're using CodeIgniter just fine, there's no need for any structure modification.

Categories