Codeigniter Dynamic Menu / MY_Controller вопрос - PullRequest
0 голосов
/ 17 сентября 2010

Я генерирую меню из таблицы базы данных, используя функцию, и поместил это в расширенный базовый класс контроллера:

<?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 ]

2 голосов
/ 17 сентября 2010

Если ваши пункты меню не будут сильно изменяться, вы, вероятно, можете кэшировать результирующий массив (сериализованный в файл, в memcache, где угодно) и использовать его для создания своего меню вместо запроса базы данных при каждой загрузке страницы.Тогда вы будете запрашивать базу данных только в том случае, если кеш недействителен.

Таким образом, вы должны либо истекать срок действия кеша каждые несколько минут, чтобы получать свежие данные из базы данных, либо проверять это при каждом обновлении меню.структура из другого места (скажем, CMS), вы делаете недействительным кеш (удаление файла, удаление ключа memcache и т. д.), чтобы в следующий раз при вызове category_menu() вы получили свежие данные.очень верный момент, и вы должны рассмотреть его.Весь смысл Controllers и Views заключается в том, что вы можете отделить свой код от html.

2 голосов
/ 17 сентября 2010

Лучший способ сделать это - рендерить контент в представлениях.У вас могут быть частичные шаблоны, вам не нужно добавлять строку в контроллер:

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

Значение TRUE в вызове для просмотра указывает функции возвращать визуализированный контент, а не помещать его в буфер,Затем вы можете передать его в «просмотр».Вы также можете получить категории и передать их в представление «представление» и загрузить оттуда частичный шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...