Создание сгенерированного базой данных меню на каждой странице в CodeIgniter? - PullRequest
4 голосов
/ 19 сентября 2011

Я использую CodeIgniter и у меня есть меню на сайте, которое должно прочитать список городов из базы данных.Это легко сделать, если он находится на одной или двух страницах - я загружаю модель, вызываю функцию из контроллера и передаю данные в представление.

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

Каков наилучший способ автоматической загрузки некоторых данных при каждой загрузке страницы и их доступности для моего просмотра?

Ответы [ 3 ]

10 голосов
/ 20 сентября 2011

Создайте новый класс корневых контроллеров, например MY_Controller.

Вы можете прочитать, как здесь: https://www.codeigniter.com/user_guide/general/core_classes.html

Затем заставить все ваши контроллеры расширять этот класс.

Добавить функцию в MY_Controller следующим образом:

function show_view_with_menu($view_name, $data) {
   $menu_data = $this->menu_model->get_menu(); // load your menu data from the db
   $this->load->view('header', $menu_data); // display your header by giving it the menu
   $this->load->view($view_name, $data); // the actual view you wanna load
   $this->load->view('footer'); // footer, if you have one
}

Всякий раз, когда вы обычно загружаете представление, вместо этого сделайте следующее:

$this->show_view_with_menu('view_for_this_controller', $data);
0 голосов
/ 06 декабря 2011

Мое решение было просто создать класс отображения, который обрабатывает эти вещи. Упрощенная версия:

class Display
{
    public function load_pages($name, $data = array()) {
        $CI =& get_instance();

        // Top and header templates
        $CI->load->view('header.php', $data);

        // Default to loading the one template file
        $CI->load->view($name, $data);

        // Footer template
        $CI->load->view('footer.php');
    }   
}

У меня есть более причудливые вещи, такие как установка значений по умолчанию (заголовок страницы, мета-теги), загрузка js / css и т. Д. Это работает так же, как ярлык на необходимость копирования / вставки обычных шаблонов, которые я загружаю, но также позволяет мне определить пользовательские настройки шаблона, если мне нужно, в отличие от того, если они у вас есть, это автоматически расширяет класс вашего контроллера.

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

0 голосов
/ 19 сентября 2011

Вы определяете свой собственный Application_Controller, который расширяет CI_Controller. Тогда все ваши собственные контроллеры расширяют ваш Application_Controller, а не CI_Controller.

В __construct() вашего Application_Controller вы введете код, который вы копировали и вставляли повсюду ранее.

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