我正在寻找一种更好的方法来处理我的模板。 现在,我的模板看起来像这样:
查看/的template.php
$this->load->view('includes/menu', $menu);
$this->load->view('includes/content', $main_content);
我模板中的菜单使用了数据库中的几个变量。
我的控制器看起来像这样:
function show_pageA() {
/* */
/* */
/* */
/* */
/* */
/* 10 lines menu related codes here */
/* mainly to get variables from databas */
/* */
/* */
/* */
/* */
$data['menu'] = array of variables pulled from previous line
$data['main_content'] = 'pageA';
$this->load->view('template',$data);
}
function show_pageB() {
/* */
/* */
/* */
/* */
/* */
/* 10 lines menu related codes here */
/* mainly to get variables from databas */
/* */
/* */
/* */
/* */
$data['menu'] = array of variables pulled from previous line
$data['main_content'] = 'pageB';
$this->load->view('template',$data);
}
正如您所看到的,每个页面函数都有10行与菜单相关的代码,这对我来说似乎是多余的。
有人建议我在练习MVC时有更好的方法吗?
谢谢,
答案 0 :(得分:4)
我会采取两种不同的方法来解决这种情况。
我会将这10行代码打包成Model,因为正如你所说,它与数据库交互。也许创建一个Menu_model
,其get()
函数返回您需要加载到视图中的项目数组。然后在每个控制器中调用它就像
$data['menu'] = $this->menu_model->get(); //assuming you autoload this model
但是不要停止它们,因为这仍然是 EVERY 控制器功能中的重复代码行。让我们在Controller的构造函数中执行此操作,以便在我们生成的所有视图中全局加载这些选项。
假设你是php5'd
function __construct() {
parent::__construct();
//get menu data
$global_data['menu'] = $this->menu_model->get();
//load into all views loaded by this controller
$this->load->vars($global_data);
}
然后,您的控制器功能将如下所示。
function show_pageA() {
$data['main_content'] = 'pageA';
$this->load->view('template',$data);
}
(另外,如果这个'菜单'逻辑跨越多个控制器,我建议滚动包含此逻辑的自定义MY_Controller.php
,这样你再一次,不会在每个控制器构造函数中重复自己)
答案 1 :(得分:1)
在使用模板和部分时,不应使用Codeigniter视图,而应考虑使用模板库。你可能会发现有很多有用的东西,他们都主要处理面包屑导航,查看局部和你想要做的其他很棒的东西。
我在我的Codeigniter项目中使用了Phil Sturgeon的模板库,因为它很轻巧而且很有效:http://philsturgeon.co.uk/code/codeigniter-template
Colin Williams模板库是另一个受欢迎的模板库:http://williamsconcepts.com/ci/codeigniter/libraries/template/
有些人似乎喜欢使用Ocular模板库:https://github.com/lonnieezell/Ocular-Template-Library