Fenom MODX - Документация и примеры
Всем привет, дорогие читатели моего блога!
Я уже давно ничего не писал в свой блог, в связи с тем, что у меня есть заказы + учеба. Вообщем времени не так уж много.
Сегодня я хочу рассказать про шаблонизатор под названием Fenom, привести примеры. Может кто-то уже активно им пользуется, и думаю, что найдет что-нибудь нового и полезного в этой статье.
Давайте сначала разберемся, что из себя представляет Fenom.
Fenom - это быстрый и удобный шаблонизатор, который очень схож со Smarty (в плане синтаксиса), но является намного лучше! С его помощью Вы можете ускорить разработку,
время на выполнение запросов, сократить количество чанков, использовать циклы прям в чанках/шаблонах и многое другое
В MODX Fenom появился в 2015 году, с выходом обновления pdoTools 2.0.
Теперь когда вы устанавливается pdoTools, парсер Fenom уже активен, но не обрабатывает страницы и шаблоны сайта
Для того, чтобы включить fenom (обработку страниц и шаблонов сайта), необходимо активировать параметр pdotools_fenom_parser в системных настройках.
Синтаксис
Можете посмотреть официальную документацию, а я буду рассматривать синтаксис, касательно MODX Revolution
Итак, как я уже говорил, синтаксис довольно прост, вместо привычных двойных квадратных скобок в MODX [[ ]]
и Fenom используются одинарные фигурные скобки { }
Чтобы использовать более сложные функции, в pdoParser есть служебная переменная {$_modx}
, которая даёт безопасный доступ к некоторым переменным и методам системы.
{$_modx->resource.id}
- вывод id текущего ресурса{$_modx->resource.tv_name}
- вывод tv текущего ресурса{$_modx->user}
- массив текущего пользователя{$_modx->makeUrl(10)}
- ссылка на 10 ресурс{$_modx->config.system_setting}
- вывод системной настройки
Игнорирование кода
Так как в Fenom используются фигурные скобки, то возможно возникнет такая проблема, что не будут выполняться какие-то скрипты/стили.
Для этих случаев существует переменная ignore. Для того, чтобы выключить обработку Fenom необходимо просто обернуть скрипты/стили в этот тег:
<style>
{ignore}
body {font-size: 16px; background-color: #000;}
{/ignore}
</style>
Подключение счетчика Яндекс Метрики:
{'<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(9999999999, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true,
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/9999999999" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->' | jsToBottom : true}
Если нужно в Head, тогда jsToHead
Плейсхолдеры с точкой или тире
В MODX как вы знаете существуют TV параметры у ресурса или плейсхолдеры с точкой (данные массивов). Так как они не соответсвуют правилам наименования, то в Fenom для доступа к плейсхолдерам и TV существуют служебная переменная {$_pls}
<!-- Вывод сразу -->
{$_pls['tag.subtag']}
<!-- Или через переменную -->
{var $tv_name = $_pls['tv-name']}
{$tv_name}
Как запустить сниппет в Fenom?
Я знаю два способа, как запустить сниппет в Fenom, какой использовать, решать только Вам.
1 способ:
{'!pdoPage' | snippet : [
'parents' => $_modx->resource.id,
'limit' => 5,
'toPlaceholder' => 'result'
]}
{'result' | placeholder}
{'page.total' | placeholder}
{'page.nav' | placeholder}
2 способ:
{$_modx->runSnippet('!pdoPage', [
'parents' => $_modx->resource.id,
'limit' => 5,
'toPlaceholder' => 'result'
])}
{$_modx->getPlaceholder('result')}
{$_modx->getPlaceholder('page.total')}
{$_modx->getPlaceholder('page.nav')}
Если необходимо вызвать pdopage без параметров:
#1 способ
{'!pdoPage' | snippet}
#2 способ
{$_modx->runSnippet('!pdoPage')}
Примеры использования Fenom MODX:
Условие IF
#Устанавливаем id текущей страницы в переменную
{set $id = $_modx->resource.id}
#Условие
{if $id == '1'}
<p>Главная страница</p>
{else}
<p>Не главная</p>
{/if}
Условие IF с использованием тренарного оператора
#Устанавливаем id текущей страницы в переменную
{set $id = $_modx->resource.id}
#Условие
{$id == 1 ? '<p>Главная страница</p>' : '<p>Не главная</p>'}
Перебор с использованием switch/case
{switch $_modx->resource.id}
{case 1}
<p>Главная страница</p>
{case 2}
<p>О компании</p>
{case 3}
<p>Услуги</p>
{default}
<p>Для остальных id</p>
{/switch}
Вывод чанка
{include 'myChank'}
Если не передаете параметры, то вот так
{insert 'myChank'}
Получение значения TV у произвольного ресурса:
{1 | resource: 'tv_name'}
*1 - id ресурса
Вывод MIGX через Fenom для текущего ресурса:
{set $rows = json_decode($_modx->resource.tv_images, true)}
{foreach $rows as $row}
{$row.image}
{/foreach}
Вывод MIGX через Fenom для определенного ресурса:
{set $rows = json_decode(1 | resource: 'tvname', true)}
{foreach $rows as $row}
{$row.image}
{/foreach}
Информация о прозводителе в miniShop2
{$_modx->makeUrl($_pls['vendor.resource'])}
{$_pls['vendor.name']})
{$_modx->getPlaceholder('vendor.name')}
Получение изображения через переменную с точкой ($_pls)
{$_pls["tv.img"] | phpthumbon : "w=300&h=200&zc=1"}
//Без префикса
{$img | phpthumbon : "w=300&h=200&zc=1"}
Получение превью изображений в корзине
{if $product['120x90']?}
<img src="{$product['120x90']}" alt="{$product.pagetitle}" title="{$product.pagetitle}"/>
{else}
<img src="{'assets_url' | option}components/minishop2//web/ms2_small.png"
srcset="{'assets_url' | option}components/minishop2/img/web/ms2_small@2x.png 2x"
alt="{$product.pagetitle}" title="{$product.pagetitle}"/>
{/if}
Модификатор дата
{$_modx->resource.publishedon | date_format:"%d-%m-%Y %H:%M:%S"}
Вывысти текущий год
{'' | date : 'Y'}
Проверка авторизации
{$_modx->isAuthenticated()}
{$_modx->hasSessionContext('web')}
{$_modx->hasPermission('load')}
Получение данных по id (FastField)
{id | параметр : [доп указания]}
{3 | url : ['scheme' => 'full'] : ['param' => 'value']} // генерируем url
{3 | resource : 'my_tv'} // выводим TV поле у ресурса
//Выводим заголовок дедушки
{set $parent_id = $_modx->resource.parent} //Получаем id родителя
{set $grand_parent_id = $parent_id | resource : 'parent' } //Получаем id дедушки
{$grand_parent_id | resource : 'pagetitle'} //выводим заголовок
Создание и расширение базового шаблона
Названием шаблона base
<!doctype html>
<html lang="ru">
<head>
<base href="{'site_url' | config}" />
<title>{$_modx->resource.longtitle} - {'site_name' | config} </title>
</head>
<body>
{insert 'header'}
// расширяем шаблон
{block 'main'}
{insert 'main'}
{/block}
{insert 'footer'}
{insert 'js'}
</body>
</html>
Расширяем шаблон base
// расширяем шаблон
{extends 'template:base'}
{block 'main'}
{insert 'other_main'}
{/block}
Источник: docs.modx.pro
13.07.2017 / 79144
Получение значения TV у произвольного ресурса:
Спасибо заранее)
{set $rows = json_decode(1 | resource: 'tvname', true)}
возвращает пустую заглушку
#Устанавливаем id текущей страницы в переменную
{set $id = $_modx->resource.id}
#Условие
{if $id == '1'}
Главная страница
{else}
Не главная
{/if>
"{/if>" — опечатка, там должна быть закрывающая "}"
Написал с телефона, может есть ошибки
Я не в восторге что изначально modx хранит все в админке и дергать код из нее в редактор и обратно это не гуд и долго. Но если и шаблоны и чанки посадить не феном, реальный прирост скорости и удобства будет? Или будет примерно «шило на мыло». Убрав все радостные возгласы «наконец-то все по человечески» и всякие эмоции. Чисто и сухо — сухой прирост скорости разработки?
Нужно постараться сделать так, чтобы не запускался родной парсер modx.То есть максимально переписать все вызовы на Fenom. Скорость загрузки сайта в разы уменьшится.
По поводу хранения кода в базе, то Вас никто не обязывает его там хранить. Можно полностью перенести работу с сайтом в IDE. Василий Наумкин даже выпустил специально для этого пакет.
Вот ссылка: modx.pro/news/13793/
Вместо того, чтобы использовать то, что в самом MODX уже есть — SMARTY.
Проект немолодой, но очень даже жизнеспособный и удовлетворяющий практически все потребности, которые могут возникнуть при разработке в MODX.
Просто Безумкину вот нравится Fenom и все тут. Или используйте весь его зоопарк pdoTools или идите лесом. Такой вот подход.
Не нравится феном — не используйте, в чем проблема?
Предположу… имелось ввиду скорость увеличится, а время загрузки уменьшится )))