Codeigniter动态菜单/ MY_Controller问题

时间:2010-09-16 20:49:28

标签: php codeigniter menu

我使用函数从数据库表生成一个菜单,并将其放在扩展的基本控制器类中:

<?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的限制,没有其他方法可以做到。

感谢任何见解

2 个答案:

答案 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分开。