比方说,我有一个网站,有100个不同的网页。 每个页面都使用通用的页眉和页脚。 头里面是来自于一个数据库中的一些动态内容。
我想避免必须具有代码在每一个控制器和动作即通过这个共同的代码到视图中。
function index()
{
// It sucks to have to include this on every controller action.
data['title'] = "This is the index page";
data['currentUserName'] = "John Smith";
$this->load->view("main_view", data);
}
function comments()
{
// It sucks to have to include this on every controller action.
data['title'] = "Comment list";
data['currentUserName'] = "John Smith";
$this->load->view("comment_view", data);
}
我意识到,我可以重构代码,以便共同部分是在一个单一的功能和作用是由动作调用。 这样做会减少一些痛苦,但它仍然感觉不对,因为我仍然必须作出每次该函数的调用。
什么是正确的操作方法是什么?
我一直在做这方面的一个办法是扩展默认的控制器类。 您可以在与MY_Controller扩展类阅读了用户指南 。 这里面扩展类可以包括的东西,你总是想要做的,喜欢的主要内容之前呈现的页面页眉模板或授权的用户访问等。
class MY_Controller extends Controller {
function __construct()
{
parent::Controller();
//code to always do goes here
echo 'Always print this comment';
$this->load->view('partials/template_start');
}
}
然后,你可以有你的正常控制器类使用扩展此类
class MyControllerNameHere extends MY_Controller {
function __construct()
{
//setup here
}
function index()
{
echo 'Only print this bit when this method is called';
$this->load->view('partials/MYPAGENAMEHERE');
}
}
这样做有其他的方式,我用上面的混合物和威廉的概念笨模板库 。 做一些搜索的 - 还有你的几个解决方案。
我还用模板库上面提到的- http://www.williamsconcepts.com/ci/codeigniter/libraries/template/
这是最近出来的另一个模板库- http://philsturgeon.co.uk/code/codeigniter-template
我还没有研究两者之间的差异很大,但我知道是谁创造他们的人都强烈贡献者笨社区。
我也有类似的情况。 我创建了一个“包括”文件夹,并在那里把那个已经从我的控制器重复代码的文件。 然后,在控制器只include('/path/to/includeFile.php');
不知道这是“正确”的方式,但它很适合我。
我碰到这个跑了搜索他们的网站后。 http://codeigniter.com/wiki/Header_and_footer_and_menu_on_every_page/我将回顾本页面及其链接,然后发布我的想法。