代码之家  ›  专栏  ›  技术社区  ›  Ross

Codeigniter动态菜单/我的\控制器问题

  •  0
  • Ross  · 技术社区  · 14 年前

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

    <?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 回复  |  直到 14 年前
        1
  •  2
  •   Ken Struys    14 年前

    $categories = $this->category->get_categories();
    $data['menu'] = $this->load->view('menu', array('data'=>$categories), TRUE);
    $this->load->view('view', $data);
    

    视图调用中的TRUE告诉函数返回呈现的内容,而不是将其放入缓冲区。然后可以将其传递给“view”。您还可以获取类别并将它们传递到视图“view”中,然后从那里加载部分模板。

        2
  •  2
  •   Fanis Hatzidakis    14 年前

    如果您的菜单项不会有太大的变化,您可以缓存生成的数组(序列化为file、memcache,无论在何处),并使用它来构建菜单,而不是在每次页面加载时查询数据库。然后,仅当缓存无效时才查询数据库。

    category_menu() 你会得到新的数据。