Инлайн виды для Laravel
Хочу представить свой первый пакет для 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.
Вот такие теперь у меня игрушки.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
И отдельное спасибо за прекрасную статью про сниппеты-обёртки с inline-чанками
А что тут странного. И в MODX это доступно только в pdoTools и getResources. Просто разработчики Laravel не парятся по этому поводу. А я вот «запарился».