Переход к официальным ресурсам:      Codeigniter4 / Документация / Github / Форум / CodeIgniter3
Привет! В настоящий момент я временно прекратил перевод документации по причине того, что она она содержит целый ряд неточностей, а также еще дорабатывается со стороны разработчиков. Если ты заинтересован в изучении фреймворка CodeIgniter 4, то приглашаю тебя на свой канал на YouTube (Перейти на канал), где я более подробно выкладываю занятия по данному фреймворку.


Подключаем Smarty к CodeIgniter 4

«Мы в жизни любим только раз, а после ищем лишь похожих…» © С.А. Есенин

Именно эти слова, лучше всего, подходят для данного раздела документации, который совершенно не относится к официальным разделам.

В сети Интернет, особенно на профильных ресурсах, не утихают войны по поводу применения различных сторонних шаблонизаторов для фреймворков. Кто-то кричит, что это классно, чисто и удобно, а другие, в ответ, рвут и мечут, что сторонние шаблонизаторы делают код ничем не чище, но значительно тормозят систему. Правда у каждого своя. Лично Я, как автор ресурса, однажды влюбившись в шаблонизатор Smarty, не могу больше воспринимать ничего. Где бы и что бы я не реализовывал, первое, с чего я начинаю разработку, так это с "прикручивания" Smarty. Я не буду тебя убеждать или заставлять использовать шаблонизаторы в своих проектах, а просто предлагаю тебе посмотреть на пример одного и того же кода, который реализован с помощью шаблонизатора и с помощью чистого php-кода. Посмотри сам и реши для себя, что тебе ближе. Если ты выбрал первый вариант, можешь дальше не читать и закрыть страницу, а если приглянулся второй вариант - читай дальше.

Это чистый PHP-код:

    <?php if ($username === 'sally') : ?>
        <h3><?= $sally_name ?></h3>

    <?php elseif ($username === 'joe') : ?>
        <h3><?= $joe_name ?></h3>

    <?php else : ?>
        <h3><?= $unknown_name ?></h3>

    <?php endif ?>

Это с применением шаблонизатора Smarty:

    {if $username == 'sally'}
        <h3>{#sally_name#}</h3>
    {elseif $username == 'joe'}
        <h3>{#joe_name#}</h3>
    {else}
        <h3>{#unknown_name#}</h3>
    {/if}

Начинаем прикручивать Smarty

1. В фреймворке CodeIgniter 4 перейди в директорию app/ThirdParty и создай там новую пустую директорию с названием Smarty. С БОЛЬШОЙ буквы, т.к. регистр букв ВАЖЕН!

2. После этого, переходи на официальный сайт шаблонизатора, в раздел Загрузки, и скачивай последнюю версию. На момент написания статьи, последняя версия была 3.1.34. Распаковывай архив в любое удобное для тебя место. Из полученного архива нас интересует только папка libs. Заходи в неё, выделяй все файлы и директории и переноси в только что созданную папку Smarty. В итоге, ты должен будешь получить такую структуру:

     app
    |-- ThirdParty
        |-- Smarty
            |-- plugins
            |-- sysplugins
            |-- Autoloader.php
            |-- bootstrap.php
            |-- debug.tpl
            |-- Smarty.class.php
            |-- SmartyBC.class.php

3. Всё, про эту папку можешь забыть. Двигаемся дальше. Теперь нам нужно, чтобы CodeIgniter 4 подхватывал класс шаблонизатора Smarty. Для этого, открой своим текстовым редактором файл app/Config/Autoload.php, найди параметр $classmap = [] и добавь в него строку, чтобы получилось так:


    $classmap = ['Smarty' => APPPATH . 'ThirdParty/Smarty/Smarty.class.php'];

4. Двигаемся дальше. Теперь нам нужно определить директорию, в которую шаблонизатор будет складывать скомпилированные tpl-файлы. Для этого, иди в папку /writable и создай там пустую папку templates_c. Если ты работаешь под Linux, тогда эта папка должна иметь права на запись. Не забудь!

5. Теперь фреймворк знает об этом классе и будет подхватывать его автоматически. Осталось настроить сам шаблонизатор и научиться подключать его к твоим Контроллерам. Перейди в папку app/Libraries, создай там новый php-файл с именем CI4Smarty.php и добавь в него следующий код:

    <?php namespace App\Libraries;

    use \Smarty;

    class CI4Smarty extends Smarty
    {
        public function __construct()
        {
            parent::__construct();

            $this->template_dir = APPPATH . "views/";  
            $this->compile_dir = WRITEPATH . "templates_c";
            
            // $this->assign( 'APPPATH', APPPATH );   
            // $this->assign( 'BASEPATH', ROOTPATH ); 
        }

        public function view($template_name) {
            if (strpos($template_name, '.') === FALSE && strpos($template_name, ':') === FALSE) 
            {
                $template_name .= '.tpl';
            }
            
            parent::display($template_name);
        }
    }

Вот про этот файл не забывай! Фактически - это основной конфигурационный файл, в котором ты задаешь начальную настройку для Шаблонизатора. В строках #11 и #12 мы как раз и задаем параметры, где будут лежать файлы с шаблонами и скомпилированные файлы. Помимо этих параметров, шаблонизатор Smarty имеет еще целую гору настроек, которую ты можешь указать здесь же. В строках #14 и #15, которые закомментированы и оставлены исключительно для примера, ты можешь задать ГЛОБАЛЬНЫЕ переменные, которые будут всегда доступны в твоих шаблонах. Второй метод с названием public function view($template_name) можно вообще было не создавать. Он необязателен, но поскольку в фреймворке CodeIgniter вывод шаблонов идет через функцию view(), то здесь мы тоже приводим работу как бы к "стандартной" схеме. Плюс ко всему, при выводе шаблонов в Контроллерах, тебе не нужно будет указывать постоянно расширения файлов. Просто имя и всё. На этом настройка завершена. Переходим к практическому применению.

Используем Smarty в реальном проекте на CodeIgniter

Ну вот и всё. Осталось узнать, как же подключить шаблонизатор к Контроллерам. А всё очень просто. В любом Контролере, в начале, пропиши строку:

    use App\Libraries\CI4Smarty;

Дальше, как только ты создал Контроллер, реализуй одно приватное Свойство и его Конструктор и пропиши в нём следующий код. Он будет повторятся в каждом Контроллере, если тебе необходима работа со Smarty.

    private $tmpl;

    public function __construct()
    {
        $this->tmpl = new CI4Smarty();
        $this->tmpl->configLoad(APPPATH.'Language/ru/ru.txt');
    }

Строку под номером #6 можно вообще не писать. Совсем. Если ты не знаешь, зачем она нужна, могу пояснить. Дело в том, что когда ты создаешь шаблон, то среди HTML-тегов ты пишешь текст. Простой обычный текст. Так вот, чтобы не писать этот текст в шаблонах, посреди HTML-кода, я весь текст выношу как бы в переменные. Конкретно в обычный текстовый файл (место хранения файла, его имя и расширение могут быть абсолютно любыми), он имеет такой вид:

    sally_name      =   "Это пользователь с именем Салли"
    joe_name        =   "Это пользователь с именем Джо"
    unknown_name    =   "Имя пользователя не известно"
    и т.д.

И теперь вместо того, чтобы загромождать HTML-шаблон лишним текстом, я в нужное место просто вставляю {#sally_name#} или {#unknown_name#} и все шаблоны становятся исключительно приятными для редактирования.

Ну, и последний шаг....Например, ты хочешь для страницы вывести заголовок, title, присвоив ему значение полученное из базы данных. Здесь просто пример:

    // В любом методе твоего Контроллера присваиваем переменной title какое-то значение
    $this->tmpl->assign('title', а_сюда_вставляем_текст_или_значение_какой_то_переменной);
    
    // И выводим шаблон на экран
    $this->tmpl->view('dashboard');
    
    // При условии, что файл шаблона лежит в папке app/Views/dashboard.tpl
    // и имеет расширение .tpl <----!!!!

Теперь, в любом месте твоего шаблона, написав {$title} оно заменится на то значение, которые ты задал. Остальное читай в мануале к шаблонизатору Smarty

ОБНОВЛЕНО! БОЛЕЕ ПРАВИЛЬНОЕ РЕШЕНИЕ!

Конечно, тот вариант интеграции Smarty, который я привёл выше, работает в полном объеме, однако, он имеет ряд недостатков. Посмотри внимательно на код Контроллера. При такой интеграции мы вынуждены в КАЖДОМ Контроллере вызывать use App\Libraries\CI4Smarty;, а также в КАЖДОМ конструкторе Контроллера постоянно создавать новый объект $this->tmpl = new CI4Smarty();. Теперь давай представим ситуацию, что в твоем приложении имеется 100 или 200 Контроллеров. Получается, что в каждом из них ты будешь создавать новый объект. Подумай, а что будет, если ты захочешь изменить имя класса CI4Smarty на что-то другое? Или захочешь немного изменить конфигурацию шаблонизатора, сделав похожий класс, но с другими параметрами, например CI4Smarty_Extended. Или вообще, вместо Smarty задействовать какой-то иной шаблонизатор, например Twig? Правильно, тебе придется открывать все Контроллеры, искать все объявления объекта и переименовывать. Можно ли сделать более универсальное решение? В фреймворке CodeIgniter 4 оказывается можно! Через Службы!

Что такое Службы? Это некие "обёртки" или "фабрики" по созданию объектов. За их создание отвечает файл конфигурации app/Config/Services.php. Открывай этот файл в редакторе кода и пропиши в нем следующее:

    // В самом верху файла добавь пространство имен строкой
    use App\Libraries\CI4Smarty;

    // А Внизу
    
    class Services extends CoreServices
    {
        public static function TemplateEngine($getShared = true)
        {
            if ($getShared)
            {
                return static::getSharedInstance('TemplateEngine');
            }

            return new CI4Smarty();
        }
    }

Что мы здесь сделали? Мы создали новую "обёртку" с именем TemplateEngine (ты можешь придумать что-то свое). Эта служба работает очень просто. При её вызове, она определяет, существует ли уже созданный объект. Если да, тогда мы возвращаем его, если нет, тогда создаем новый. Теперь, если ты вернешься в Контроллер, во-первых, можешь смело удалять в самом начале строку use App\Libraries\CI4Smarty;, она нам больше не нужна и указывать её больше не нужно. Во-вторых, замени создание объекта:

    $this->tmpl = new CI4Smarty();

на такой вариант:

    $this->tmpl = service('TemplateEngine');

Всё! У тебя будет работать всё, как и прежде, но теперь, если ты захочешь изменить имя класса CI4Smarty на что-то другое, тебе достаточно лишь открыть всего один файл app/Config/Services.php и изменить имя там. После этого, все Контроллеры начнут работать с другим классом. Считаю, что такой вариант более верный.

P.S. Обращаю внимание!

Поскольку я еще достаточно плохо знаю CodeIgniter 4 и только делаю первые шаги в его изучении, то, вполне возможно, ТАКОЙ вариант подключения шаблонизатора является не совсем корректным, типа "не по фен-шуй", за что приношу искренне извинения. Если ты знаешь, как можно подключить его более "грамотно и профессионально", пожалуйста расскажи в комментариях или личным письмом на почту. Заранее благодарю!


Комментарии к разделу:

Кто-то уже оставил свои комментарии. Оставить свой!

Thank You !
» Написал: adrian (26-02-2020 в 18:39) Ответить
Your Welcome :)
» Ответил: code4 (14-03-2020 в 21:45) Ответить

Добавить комментарий к статье:


Ваше имя:
Ваша почта:

  Закрыть