Intereting Posts
Как предотвратить дублирование имен пользователей в php / mysql как преобразовать форматы даты php в GMT и наоборот? Является PHP объектно-ориентированным? Поиск по сайту с помощью CodeIgniter? Как разделить кеш APC между несколькими процессами PHP при работе в FastCGI? Структура базы данных инбридингового иммунитета Как удалить файл через PHP? Письма, отправленные PHP, имеют = 0A = 0A вместо новых строк Как построить Threaded комментарии с 1 или 2 запросами? jQuery UI Datepicker реагирует только на первое текстовое поле Регулярное выражение PHP для фильтрации URL-адресов из определенных доменов для использования в плагине vBulletin передача параметра из представления в библиотеку и возврат после процесса. PHP exec Java на Windows не производит вывод Должен ли я использовать текстовый файл или базу данных для счетчика посетителей PHP? Не найдено ни одного маршрута для «GET /» Symfony при входе в систему

Создание меню с базами данных на каждой странице в CodeIgniter?

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

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

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

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

Вы можете прочитать здесь: https://ellislab.com/codeigniter/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); 

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

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

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

 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() или некоторые из них. В моем случае я справляюсь с этим, просто установив префиксный параметр, который добавляется к пути к файлу, и он получил то, что мне нужно для моего текущего проекта.