Search code examples
phpcodeignitercodeigniter-urlcodeigniter-routing

Codeigniter admin route


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


Solution

  • 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
        }
    }