你真的喜欢将许多 $this->load->view() 复制/粘贴到任何控制器功能吗?这是一个意大利面条代码。您可以尝试下一个:例如,我们将 main.php 控制器作为默认控制器。该主控制器包含主要功能:
public function index()
{
ob_start();
$this->load->model('mainmodel');
$data = $this->mainmodel->_build_blocks(); //return array with needed blocks (header, menu, content, footer) in correct order
foreach ($data->result_array() as $row) {
$this->load->module($row['block_name']);
$this->name = new $row['block_name'];
$this->name->index();
}
ob_end_flush();
}
因此,每个其他控制器也具有 index() 函数,可以根据 url 段、准备参数等调度动作。
以页脚控制器为例(我使用 Smarty 作为模板引擎):
public function index()
{
$this->mysmarty->assign('year', date("Y"));
$this->mysmarty->view('footer');
return true;
}
内容控制器将具有:
public function index()
{
$name = $this->uri->segment(1, 'index');
$act = $this->uri->segment(2, 'index');
$this->load->module($name);
$this->name = new $name;
$pageData = $this->name->_show($act);
if ($pageData)
{
$this->mysmarty->assign($name, $pageData);
}
$this->mysmarty->view($name);
}
这意味着如果你想显示http://site.name/page/contactus,我们接下来会做:
1) main.php 按需要的块启动循环
2)首先我们通过标题控制器显示 header.tpl
3)然后我们显示菜单
4)然后我们调用解析url的内容控制器,在页面控制器中找到他应该调用的_show()函数并将action ='contactus'传递给它。_show() 函数可以包含一些 switch/case 构造,这些构造显示模板取决于操作名称(在这种情况下为contactus.tpl)
5)最后我们显示页脚模板
在这种情况下,我们有灵活的结构。所有控制器都应该有 index() 函数,所有可以在内容中调用的控制器都应该有 _show($act) 函数。就这样。