Решение проблемы отсутствия layout в codeigniter’е

в 9:41, , рубрики: Новости

Известная проблема этого фреймворка — это отсутствие встроенной библиотеки 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


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js