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