我正在尝试使用CodeIgniter和整个MVC模式。我已经安装了Colin Williams的模板库,但是当试图考虑包括两个菜单/NAVS的正确方法时,我会被卡住:一个将军(也许在顶部)和一个针对每个控制器的侧边栏。
。无论哪种方式,他们的位置都不相关,我正在考虑代码的一般结构。目前,我的模型中有一个函数get_menu()
,并且在加载侧边栏的部分模板视图时将其返回作为参数。还是我应该在控制器中进行?
我的一个好友给了我建议不要将默认控制器或模型与MY_Controller
扩展,但是我不知道什么时候实现一般菜单?或者我应该在模板配置文件中进行硬码?
我找不到此类任务的准则。我到处走了,我发现了一个新的解决方案,其中许多解决方案都不漂亮,而其他很多则有很多重复的代码。
编辑。我已经更新了代码。我仍然不确定如何编写顶级NAV(可能在MY_Controller
中,以便我可以突出显示当前页面)。
my_controller.php
abstract class MY_Controller extends CI_Controller {
protected $_nav;
const CONTENT_REGION = 'content';
const NAV_REGION = 'nav';
const TITLE_REGION = 'title';
const SIDEBAR_NAV_TEMPLATE = 'templates/sidebar_nav';
public function __construct() {
parent::__construct();
$this->_load_nav();
}
abstract protected function _get_nav();
protected function _load_nav() {
$this->_nav = array('nav' => $this->_get_nav());
}
protected function _render() {
$args = func_get_args();
$n = func_num_args() - 1;
if ($n < 2) {
return;
}
$this->template->write(self::TITLE_REGION, $args[0]);
for ($i = 1; $i < $n; $i++) {
$this->template->write_view(self::CONTENT_REGION, $args[$i], $args[$n]);
}
$this->template->write_view(self::NAV_REGION, self::SIDEBAR_NAV_TEMPLATE, $this->_nav);
$this->template->render();
}
protected function _set_active_view($active) {
if ($active !== null && isset($this->_nav['nav'][$active])) {
$this->_nav['nav'][$active]['class'] .= ' active';
}
}
}
collection.php
class Collection extends MY_Controller {
public function __construct() {
parent::__construct();
$this->load->model('collection_model');
}
protected function _get_nav() {
return array(
'collection/view' => array(
'href' => 'collection/view',
'value' => 'View collection',
'class' => 'icon-film'
),
'collection/add' => array(
'href' => 'collection/add',
'value' => 'Add title',
'class' => 'icon-plus-sign'
)
);
}
public function index() {
$this->view();
}
public function view() {
$data['list'] = $this->collection_model->get_list();
$this->_set_active_view('collection/view');
$this->_render('View Collection', 'collection/view', $data);
}
}
sidebar_nav.php
<ul class="nav nav-list bs-docs-sidenav">
<?php
foreach ($nav as $item) {
echo '<li';
if ($item['class'] !== null || $item['class'] !== '') {
echo ' class="' . $item['class'] . '"';
}
echo '><a href="' . $item['href'] . '">' . $item['value'] . '</a></li>';
}
?>
</ul>
看起来如何?我可能会在MY_Controller
中编写一个函数_render($title, $view, $data)
,该功能可以完成所有模板工作。你怎么看?
我一直在考虑的另一个解决方案是删除_get_nav()
并从配置文件加载所需的NAV数据,但我不知道该执行此操作。
您的"伙伴"告诉您不要扩展控制器类别?这种重复性的内容正是该功能的目的...创建My_controller具有诸如GetMenu和其他功能的功能,您将在整个站点中经常使用,然后只需将Collection Extend My_controller而不是CI_CONTROLLER。
。我们不仅扩展了CI控制器,还将my_controller扩展到User_controller和admin_controller,以包括仅适用于这些用户的特定功能。
我真的不能为自己的生命来想象为什么有人会告诉你不要那样做。