我使用函数从数据库表生成一个菜单,并将其放在扩展的基本控制器类中:
<?php
class MY_Controller extends Controller {
public function __construct()
{
parent::Controller();
}
public function category_menu()
{
$this->load->model('category_model', 'category');
$categories = $this->category->get_categories();
$menu ="<ul class=\"menu_body\" id=\"nav_categories\">\n";
foreach($categories->result() as $row)
{
$menu .= "\t<li>" . anchor('listing/view' . $row->url, $row->name) . "</li>\n";
}
$menu .= "</ul>\n";
return $menu;
}
}
然后自然我的控制器看起来像〜
<?php
class Site extends MY_Controller {
function __construct()
{
parent::__construct();
}
function index()
{
$data['menu'] = $this->category_menu();
$this->load->view('view', $data);
}
}
这确实有效,但是〜每页〜/视图都必须这样做效率低吗?
或者这仅仅是CI / MVC的限制,没有其他方法可以做到。
感谢任何见解
答案 0 :(得分:2)
更好的方法是在视图中呈现内容。您可以拥有部分模板,不需要在控制器中添加字符串:
$categories = $this->category->get_categories();
$data['menu'] = $this->load->view('menu', array('data'=>$categories), TRUE);
$this->load->view('view', $data);
对视图的调用中的TRUE告诉函数返回呈现的内容而不是将其放入缓冲区。然后,您可以将其传递给“查看”。您还可以获取类别并将其传递到视图“视图”并从那里加载部分模板。
答案 1 :(得分:2)
如果你的菜单条目变化不大,你可以缓存生成的数组(序列化到文件,到memcache,无论哪里),并使用它来构建菜单,而不是在每个页面加载时查询数据库。然后,只有在缓存无效时才会查询数据库。
这样您应该每隔几分钟使缓存过期,以便从数据库中获取新数据,或者确保无论何时从其他地方(例如,CMS)更新菜单结构,都会使缓存失效(删除文件,删除内存缓存密钥等)以便下次调用category_menu()
时获得新数据。
作为旁注,Ken Struys提出了一个非常有效的观点,你应该考虑它。控制器和视图的重点在于您可以将代码与html分开。