重用/扩展控制器


CodeIgniter reUse/extend 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);
    }
}

现在我来解释一下。我得到导航,和导航文本从mysql (id, navName, navText)。然后我返回这些元素在views/main_view.php url: http://abc.com/page/id/1等…

现在我需要创建其他控制器,如mySuperDuperModule,它有一些功能,而不仅仅是文本。

问题是,如果我创建新的控制器像画廊(),我需要复制所有的东西从Page()控制器使网站显示相同。

有没有办法不这样做呢?

可以在/application/core/MY_Controller.php下创建基本控制器这里MY_是为/application/config/config.php

中的$config['subclass_prefix']指定的值。
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);
    }
}

你在/application/controllers/Page .php中修改过的Page类

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);
    }
}

和你的新画廊控制器可以在/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);
    }
}

你可以通过扩展MY_Controller来创建任意多的控制器

您可以将这两行传递给任何控制器它们将显示相同的模板。

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

如果你仍然不明白,试着使用这个库

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