Да, ручное назначение одинаковых данных частичному представлению в каждом контроллере или методе является излишним.Вы хотите избежать этого.
Любая приличная библиотека шаблонов должна быть в состоянии справиться с этим за вас.Вы можете google найти решение или написать свое собственное.
Вот что в макете кода может выглядеть так:
class Template {
public $data = array();
function area($area_name)
{
$CI =& get_instance();
$data = isset($this->data[$area_name]) : $this->data[$area_name] ? NULL;
$CI->load->view('templates/'.$area_name, $data);
}
function set_data($area_name, $data)
{
$this->data[$area_name] = $data;
}
}
Затем в контроллере что-токак это:
$this->template->set_data('header', $my_data);
Тогда в представлении, что-то вроде этого:
<header><?php echo $this->template->area('header'); ?></header>
<div><?php echo $this->template->area('content'); ?></div>
<footer><?php echo $this->template->area('footer'); ?></footer>
Это слишком упрощенно, и есть миллион способов справиться с этим, но я определенно предлагаюнаписание некоторого вида класса для обработки ваших шаблонов, а не просто использование $this->load->view()
для всего, даже если это просто оболочка для загрузки представлений.
Чтобы избежать ручной настройки этих же данных вДля каждого контроллера используйте MY_Controller
, установите его в классе шаблона __construct()
или вызовите его напрямую из файла представления из любого источника (модель, библиотека и т. д.).Отец MVC может пролить слезу, но иногда это проще всего или даже имеет смысл.
Быстрый пример использования расширения контроллера:
// File: application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
public function __construct()
{
parent::__construct();
$data['var_name'] = $this->some_lib->get_data();
$data['var_name2'] = $this->some_model->get_more_data();
$this->template->set_data('header', $data);
}
}
Тогда все ваши контроллеры будут расширяться MY_Controller
, а не CI_Controller
, и данные заголовка уже будут загружены.Это всего лишь упрощенный взгляд на другую тему. С этим методом можно сделать гораздо больше.
Я попытался вызвать библиотеку из представления, но это дает мне ошибку.
Этого не должно быть, если библиотека загружена и вы ее правильно вызываете.Синтаксис: $this->library_name->method()
.
В любом случае, я определенно рекомендую написать или позаимствовать какой-нибудь класс Template.