Хочу представить свой первый пакет для Laravel, который позволяет создавать виды «на лету» из строки по аналогии с INLINE шаблонами в pdoTools. Потребность в нём возникла при разработке админки для моего сайта. Давайте разберёмся поподробнее.

Большинство модыксеров используют или, по крайней мере, слышали про библиотеку pdoTools. Одна из возможностей — использование INLINE шаблонов вместо чанков. Это удобнее и на оптимизацию влияет самым положительным образом. Я даже потрудился написать статью о том, как адаптировать другие сниппеты для инлайн шаблонов. Так вот, в Laravel все виды (элементы фреймворка, отвечающие за отображение информации пользователю) хранятся в файлах. Это тоже предмет зависти модыксеров, но я о другом. Когда вид отвечает за отображение всей страницы или её части, вопросов нет — гармония мира не нарушается. А вот когда нужно в файлах хранить шаблоны для HTML элемента, возникает чувство диссонанса — целый файл для какого-то li элемента. :) А ведь на него ещё нужно тратить целую операцию чтения.

И вот, чтобы привести в равновесие внутреннее чувство прекрасного, я решил, что в Laravel не помешает иметь такую же возможность, как в MODX. Не долго думая сел и сделал. Я даже хотел поначалу снять видео. Но там делов-то оказалось на 5 минут. Поэтому я решил, что как-нибудь сделаю видео про создание полноценного Composer пакета.

Немного отвлечёмся. Я скажу пару слов о том, чем отличается шаблонизатор MODX от других шаблонизаторов на примере сниппета pdoMenu. У него, как вы знаете, больше 10 параметров с шаблонами. Один отвечает за обычный пункт меню, другой за текущий, третий за родительский и т.д. А в других шаблонизаторах вполне достаточно всего одного шаблона. Вся логика прописывается именно в нём. Достаточно передать в него объекты или массивы пунктов.

// Чанк 'Шаблон меню'
<ul class={if $item->hasParent()} "outer" {else} "inner" {/if}>
{foreach $items as $item}
    {set $class = $item->isActive() ? 'active' : ''}
    {if $item->hasChild()}
        {set $class = 'parent ' ~ $class}
        <li class="{$class}">{$_modx->getChunk('Шаблон меню', ['items' => $item->getChildren()])}  <li>
    {else}
        <li class="{$class}">$item->name<li>
    {/if}
{/foreach}
<ul>

Код возможно (или даже скорее всего) не рабочий. Я просто хочу наглядно показать как отличаются возможности шаблонизатора MODX от других.

Вернёмся к теме статьи. Собственно вот сам пакет. Он добавляет одну единственную функцию view_raw(). Главное отличие от стандартной функции view() — первым параметром передаётся не название вида, а строка с HTML кодом:

$output = '';
$tpl = '<li> {{ $item["name"] }} </li>';
foreach($items as $item) {
    $output .= view_raw($tpl, compact('item'))->render();
}
$output = '<ul>' . $output . '</ul>';

Как видите, строка парсится на лету. И это в некоторых случаях удобнее, чем создавать вид. Особенно при разработке пакетов.

Конечно, данный пример простоватый и немного ломающий правила MVC. Но он чисто для понимания механизма. Более функциональный пример есть на GitHub.

Вот такие теперь у меня игрушки.

26 марта 2018, 12:18   325     2

Комментарии ()

  1. Семён 26 марта 2018, 14:13 # 0
    Интересное влияние MODX пакетов на Лару) Странно, что это не предусмотрено в самом фреймворке.
    И отдельное спасибо за прекрасную статью про сниппеты-обёртки с inline-чанками
    1. Сергей Шлоков 26 марта 2018, 17:26 # 0
      На здоровье!

      Странно, что это не предусмотрено в самом фреймворке.
      А что тут странного. И в MODX это доступно только в pdoTools и getResources. Просто разработчики Laravel не парятся по этому поводу. А я вот «запарился». :)

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.