$this->load->view('header');
$this->load->view('workmenu');
$this->load->view('all_gk');
$this->load->view('footer');
Вот в этом коде мне не нравится что во всех контролерах мне надо вызывать загрузку хедера, меню, и футера, их можно как то вынести?
Ответ
Из-за отсутствия layout в Codeigniter, нужно прибегать к костылям. Вот решение данной проблемы:
Создается библиотека 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);
}
// загружаем основной контент, который может иметь больше одного вида
if (is_array($views))
{
foreach ($views as $view)
{
$this->load->view($view, $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;
Пример был взят: Источник . Удачного кодинга...
Комментариев нет:
Отправить комментарий