Известная проблема этого фреймворка — это отсутствие встроенной библиотеки layout'ов. Это серьезно ограничивает разработку веб приложений даже среднего уровня сложности. Страница вызывается как составной шаблон:
$data['page_title'] = 'Your title';
$this->load->view('header');
$this->load->view('menu');
$this->load->view('content', $data);
$this->load->view('footer');
Понятно, что такая запись громоздкая и неудобная. Гораздо удобнее было бы вызывать вид как вложенный шаблон — один раз:
$this->load->view('content', $data);
Недавно я наткнулся на заморскую статью с примером разрешающим эту проблему. Принцип довольно прост. Создается библиотека application/libraries/my_layout.php
class MY_Layout extends CI_Controller {
// пути к файлам вида
public $header = 'header';
public $footer = 'footer';
// метод получает на вход два параметра: название вида и данные для него
public function content($views = '', $data = '')
{
// загружаем header
if ($this->header)
{
$this->load->view($this->header, $data);
$data = '';
}
// загружаем основной контент, который может иметь больше одного вида
if (is_array($views))
{
foreach ($views as $view)
{
$this->load->view($view, $data);
$data = '';
}
}
else
{
$this->load->view($views, $data);
}
// загружаем footer
if ($this->footer)
{
$this->load->view($this->footer);
}
}
}
В используемом контроллере достаточно подключить нашу библиотеку и обратиться к нужному виду через $this->my_layout->content('user/test', $data);
class User extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->library('MY_Layout');
}
public function test()
{
$data['title'] = 'dynamic_string';
$this->my_layout->content('user/test', $data);
}
}
Вы так-же можете передавать несколько видов одновременно:
$data['title'] = 'dynamic_string';
$views = array(
'menu' => 'menu',
'content' => 'user/test'
);
$this->my_layout->content($views, $data);
И в завершении, вы можете отключать часть вашего layout'a или использовать вместо него другой вид.
$this->my_layout->header = 'user/custom_user_header';
// or turn off header
$this->my_layout->header = FALSE;
До этого я использовал свою библиотеку layout'ов, но это решение мне показалось интереснее и проще. Надеюсь, статья окажется полезной.
Автор: frentsel