Мои заметки

Тут я делюсь своим различным опытом в области программирования и своего хобби.

Напишите мне
Отвечу по возможности по услгам

Fenom MODX - Документация и примеры

Всем привет, дорогие читатели моего блога!

Я уже давно ничего не писал в свой блог, в связи с тем, что у меня есть заказы + учеба. Вообщем времени не так уж много.

Сегодня я хочу рассказать про шаблонизатор под названием Fenom, привести примеры. Может кто-то уже активно им пользуется, и думаю, что найдет что-нибудь нового и полезного в этой статье.

Давайте сначала разберемся, что из себя представляет Fenom.

Fenom - это быстрый и удобный шаблонизатор, который очень схож со Smarty (в плане синтаксиса), но является намного лучше! С его помощью Вы можете ускорить разработку,
время на выполнение запросов, сократить количество чанков, использовать циклы прям в чанках/шаблонах и многое другое

В MODX Fenom появился в 2015 году, с выходом обновления pdoTools 2.0.
Теперь когда вы устанавливается pdoTools, парсер Fenom уже активен, но не обрабатывает страницы и шаблоны сайта

Для того, чтобы включить fenom (обработку страниц и шаблонов сайта), необходимо активировать параметр pdotools_fenom_parser в системных настройках.


Синтаксис

Можете посмотреть официальную документацию, а я буду рассматривать синтаксис, касательно MODX Revolution

Итак, как я уже говорил, синтаксис довольно прост, вместо привычных двойных квадратных скобок в MODX и Fenom используются одинарные фигурные скобки { }

Чтобы использовать более сложные функции, в pdoParser есть служебная переменная {$_modx} ,
которая даёт безопасный доступ к некоторым переменным и методам системы.



Игнорирование кода

Так как в 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 - id ресурса
 

{1 | resource: 'tv_name'}
 
Вывод 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'} //выводим заголовок    
 
Создание и расширение базового шаблона
 

<!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}    
 
конструкции указать чтобы бралось из ресурса 1
 

{set $rows = json_decode(1 | resource: 'tvname', true)}
        {foreach $rows as $idx => $row}
            {$row.title}
            {$row.description} 
{/foreach}
 
phpthumbon на MIGX IMAGE
 

{$row.image | phpthumbon : "w=300&h=200&zc=1"}

или

{("uploads/" ~ $row.image) | phpthumbon : 'w=620&h=500&zc=1&f=jpg&q=100'}
 
Условие IF
 

#Устанавливаем id текущей страницы в переменную
{set $id = $_modx->resource.id}
#Условие
{if $id == '1'}
Главная страница
{else}
Не главная
{/if}
 
Узнать количество изображений у товара в miniShop2
 

{if $files | length > 2}
  //что-то там  
{else}
  //что-то там  
{/if}
 
Скрытие чанка при условии пустого TV
 

{if $_modx->resource.tags != ''}
    {$_modx->runSnippet('pdoResources', [
    'parents' => 2,
    'limit' => 5,
    'tpl' => 'tplArticleSim'
    ])}
{/if}

Ну или так, если угодно:
{if $_modx->resource.tags != ''}
    {$_modx->getChunk('similarArticles')}
{/if}

Или вообще так ):
{if $_modx->resource.tags != ''}
    [[pdoResources?
    &parents=`2`
    &limit=`5`
    &tpl=`tplArticleSim`
    ]]
{/if}

 
esc (tag) — экранирование HTML и MODX тегов
 

{'Привет, [[+username]]' | esc}
 

Источник: docs.modx.pro