CodeIgniter重用/扩展控制器

I have my controller

class Page extends CI_Controller {

    public function id() {
        $this->load->model('content');

        $page = $this->uri->segment(3, 0);
        if($page == 0)
            $page = $this->content->get_default_page($page);

        $data['navigation'] = $this->content->getNav();
        $data['pagename'] = $this->content->get_pagename($page);
        $data['content'] = $this->content->get_content($page);
        $this->load->view('main', $data);
    }
}

Now I'll try to explain. Im getting navigation, and navigation text from mysql (id, navName, navText). then im returning those elements in views/main_view.php in url like: http://abc.com/page/id/1 etc...

Now i need to create other controller like mySuperDuperModule which have some functions not just text.

The problem is that if i create new controller like Gallery(), i need to copy all the stuff from Page() controller to make website show the same.

Is there any way not to do that ?

You can create base controller under /application/core/MY_Controller.php Here MY_ is the value specified for $config['subclass_prefix'] in /application/config/config.php

class MY_Controller extends CI_Controller
{
    protected $data;
    public function __construct()
    {
        parent::__construct();
        $this->data = array();
    }
    public function loadPage($page)
    {
        $this->load->model('content');

        if($page == 0)
            $page = $this->content->get_default_page();  // I hope this function will give default page from database table. (A Change from your code)

        $this->data['navigation'] = $this->content->getNav();
        $this->data['pagename'] = $this->content->get_pagename($page);
        $this->data['content'] = $this->content->get_content($page);
    }
}

Your modified Page Class in /application/controllers/page.php

class Page extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function id()
    {
        $page = $this->uri->segment(3, 0);
        parent::loadPage($page);
        $this->load->view('main', $this->data);
    }
}

and your new gallery controller can be in /application/controllers/gallery.php

class Gallery extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function id()
    {
        $page = 10;  // Assuming gallery page index is 10 in database table OR you can change any logic here.
        parent::loadPage($page);
        $this->load->view('main', $this->data);
    }
}

you can create as many controllers as you want by extending MY_Controller.

You can pass these two lines to any controller and they will display the same template.

$data['navigation'] = $this->content->getNav();
$data['pagename'] = $this->content->get_pagename($page);

If you still dont understand try to use this library

https://github.com/philsturgeon/codeigniter-template