Шпаргалка по FENOM для MODX

В этой заметке оставляю часто мной используемые конструкции на Fenom при разработке шаблонов сайта на основе движка Modx.

Вот классный сервис который автоматом переделывает записи и выражения со стандартного шаблонизатора на феном – https://m2f.zencod.ru

MODXFenom
[[*id]] вывод id{$_modx->resource.id}
[[*my_tv]] вывод TV поля{$_modx->resource.my_tv} или
{3 | resource : ‘my_tv’}   
[[%my_lexicon]] вывод лексикона{$_modx->lexicon(‘my_lexicon’)} или
{‘my_lexicon’ | lexicon}
[[~15]] вывод ссылки на ресурс{$_modx->makeUrl(15)} или {15 | url}
[[~[[*id]]]] вывод ссылки на текущий ресурс{$_modx->makeUrl($_modx->resource.id)} или
{$_modx->resource.id | url} или
{$_modx->resource.id | url : [‘scheme’ => ‘full’]}
[[++system_setting]] вывод настройки{$_modx->config.system_setting} или {‘system_setting’ | config}
[[$chunkName]] вывод чанка{‘chunkName’ | chunk} или с параметрами
{‘chunkName’ | chunk : [ ‘a’ => ‘b’, ‘c’ => ‘d’]}
[[snippetName]] вывод сниппета{‘snippetName’ | snippet} или с параметрами
{‘snippetName’ | snippet : [ ‘a’ => ‘b’, ‘c’ => ‘d’]}

Как видно из примера выше записи на феном можно сделать по разному, они могут выглядеть длиннее, но гораздо понятнее поскольку говорящие.

Часто используемые модификаторы

Вообще весь список модификаторов Fenom находится тут

// Дата

{$_modx->resource.publishedon | date : 'd.m.Y'} 
выведет 08.03.2023Code language: PHP (php)
{'' | date : 'Y'} 
Например удобно в подвале выводить текущий год: 
© 2006–{'' | date : 'Y'}Code language: JavaScript (javascript)

// Обрезка текста с предварительным очищением от тегов

{$content | stripTags | ellipsis : '150'} очистит, обрежет и добавит ...Code language: PHP (php)
{$_modx->resource.pagetitle | limit : '150'} просто обрежетCode language: PHP (php)
{'https://test.com/' | rtrim : '/'} получим https://test.comCode language: JavaScript (javascript)

// Подсчет символов в строке и массиве

{'Длинна' | length} // 6Code language: JavaScript (javascript)

// Форматирование числа php функцией number_format().

{10000 | number : 0 : '.' : ' '} выведет 10 000Code language: JavaScript (javascript)

// Кодирование и декодирование JSON формата.

{'{"key":"value"}' | fromJSON} получим массив ["key" => "value"]Code language: PHP (php)
{["key" => "value"] | toJSON} получим json {"key":"value"}Code language: PHP (php)
{set $rows = json_decode($_modx->resource.ProjectMigxSlideshow, true)} 
получим массив из MIGX поля чтобы сразу его разобрать в цикле foreachCode language: PHP (php)

// Распечатка данных.

{$_modx->resource | var_dump} или {var_dump($_modx->resource)} 
получим данные с указаниями типов данных.Code language: PHP (php)
{$_modx->resource | print_r} 
показывает только значения в более читаемом формате.Code language: PHP (php)

// Объединение массивов

{set $allProducts = $newslist | array_merge : $actionProductlist}Code language: PHP (php)

// Объединяем и разбиваем элементы массива в строку.

{$array | join:$delimiter = ","} 
или просто {$array | join}Code language: PHP (php)
{$string | split:$delimiter = ","}
или просто {$string | split}Code language: PHP (php)

// Оператор проверки наличия подстроки в строке или значения в массиве.

{if 'img' | in : $content} В тексте есть картинки {/if}Code language: PHP (php)
{$key | in : [1, 3, 42] ? 'ключ найден' : 'не найден'}Code language: PHP (php)

// Использование тильды если нужно вставить переменную в строку то только через тильду

{$longtitle ? '<small>(' ~ $longtitle ~ ')</small>' :'' }Code language: PHP (php)

// Тег {ignore}

Теги {ignore}{/ignore} позволяют игнорировать заключенные в них другие теги. Весь текст внутри тегов {ignore}{/ignore} не интерпретируется, а выводится “как есть”. Обычно они используются вместе с javascript или таблицами стилей, в которых фигурные скобки конфликтуют с синтаксисом разделителей. Я обычно использую только для инлайновых CSS, при этом обязательно делать пробелы пережима и после любой фигурной скобки в стилях чтобы избежать конфликта

// Вывод JS скриптов в подвале сайта

    {'<script type="text/javascript">
        console.log("Hi world!");
        } );
    </script>'| jsToBottom : true}Code language: HTML, XML (xml)

// Вывод CSS стилей внутри тегов HEAD

{$_modx->regClientCss('/assets/css/catalog.css?ver=15')}Code language: PHP (php)

// Проверка на существование переменной

{if $a! && $a?}
   А существует и не пустое
{/if}Code language: PHP (php)

// Теги для перебора массивов и циклические действия – switch, for и foreach

{switch $aa}
   {case 1} <p>значение 1</p>
   {case 2} <p>значение 2</p>
   {case 28} <p>значение 28</p>
   {default} <p>значение 0</p>
{/switch}

{for $counter=<start> to=<end> [step=<step>] [index=$index] [first=$first] [last=$last]}
   {* ...code... *}
   {break}
   {* ...code... *}
   {continue}
   {* ...code... *}
{forelse}
   {* ...code... *}
{/for}

{foreach $list as $key => $value}
 <div>{$key}: {$value}</br>
  {if $value@last}(last){/if}
  {if $value@first}(first){/if}
 </div>
{foreachelse}
 <div>empty</div>
{/foreach}

Code language: PHP (php)

// Обрезка картинок по заданным параметрам (и наложение вотермарка)

<img src="{$_modx->resource.mainPic | pthumb : 'w=800&h=500&zc=1&q=85'}" alt />
zc - обрезка по центру.
q - качество на выходе.

или вот такая конструкция позволит наложить вотермарки к обрезанным кешированный картинкам:
'w=1200&h=800&zc=1&fltr[]=wmi|/assets/almaris/icons/fav.png|BR|100|20|20&q=85'

BR — нижний правый угол (Bottom Right).
100 — Прозрачность водяного знака (100% = полностью непрозрачный).
20 — Смещение по оси X (отступ от правого края на 20 пикселей).
20 — Смещение по оси Y (отступ от нижнего края на 20 пикселей).
Code language: HTML, XML (xml)

Карта сайта

Делаем так, создаем новый ресурс и в настройках ресурса указываем тип содержимого XML, выбираем пустой шаблон и отключаем визуальный редактор, сохраняем и вписываем следующий код в поле контента:

// Если только одна языковая версия на сайте:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{set $resources = 'pdoResources'|snippet:[
        'parents' => 0,
        'resources' => '-65,-66,-67,-68,-69,-70',
        'showHidden' => 1,
        'limit' => 0,
        'sortby' => 'menuindex',
        'sortdir' => 'ASC',
        'return' => 'json',
   ]}

{if $resources! && $resources?}
    {set $resources = json_decode($resources, true)}
    {foreach $resources as $resource}
        <url>
            <loc>{$resource['id'] | url : ['scheme' => 'full']}</loc>
             <lastmod>{if $resource['editedon']}{$resource['editedon'] | date : 'Y-m-d'}{else}2025-04-17{/if}</lastmod>
            <changefreq>weekly</changefreq>
            <priority>{if $resource['id'] == $homeId}1.0{else}{if $resource['isfolder']}0.9{else}0.8{/if}{/if}</priority>
        </url>
    {/foreach}
{/if}
</urlset>

Code language: PHP (php)

// Если используется пакет мультиязычности Localizator

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
{set $langs = 'pdoResources' | snippet : [
  'loadModels' => 'localizator',
  'class' => 'localizatorLanguage',
  'sortby' => 'id',
  'sortdir' => 'asc',
  'where' => ['active' => 1],
  'return' => 'json',
]}
{set $resources = 'pdoResources' | snippet : [
    'parents' => '0',
    'resources' => '-65,-66,-67,-68,-69,-70',
    'limit' => 0,
    'showHidden' => 1,
    'sortby' => 'menuindex',
    'sortdir' => 'ASC',
    'return' => 'json',
]}
{if $langs && $resources}
    {set $langs = json_decode($langs, true)}
    {set $resources = json_decode($resources, true)}
    {set $homeId = 'site_start' | option}
    {foreach $resources as $resource}
       {if ($resource['id'] != $homeId)}
            {set $resourceUri = $resource['uri'] ? $resource['uri'] : $resource['alias']}
            {set $resourceUri = ltrim($resource['uri'] ?: $resource['alias'], '/')}
       {else}
           {set $resourceUri = ''}
       {/if}
       {foreach $langs as $lang}
                {set $langKey = $lang['key']}
                {set $baseUrl = $lang['http_host'] | rtrim : '/'}
                {set $url = 'https://' ~ $baseUrl ~ '/' ~ $resourceUri}
                <url>
                    <loc>{$url}</loc>
                    {foreach $langs as $altLang}
                        {set $altLangKey = $altLang['key']}
                        {set $altBaseUrl = $altLang['http_host'] | rtrim : '/'}
                        {set $altUrl = 'https://' ~ $altBaseUrl ~ '/' ~ $resourceUri}
                        <xhtml:link rel="alternate" hreflang="{$altLangKey}" href="{$altUrl}"/>
                    {/foreach}
                    <lastmod>{if $resource['editedon']}{$resource['editedon'] | date : 'Y-m-d'}{else}2025-04-17{/if}</lastmod>
                    <changefreq>weekly</changefreq>
                    <priority>{if $resource['id'] == $homeId}1.0{else}{if $resource['isfolder']}0.9{else}0.8{/if}{/if}</priority>
                </url>
            {/foreach}
    {/foreach}
{/if}
</urlset>Code language: PHP (php)

PdoTools

PdoTools – это набор удобных сниппетов для повседневной работы + небольшая библиотека, которая делает их очень быстрыми. Ниже ссылки на официальную документацию с примерами использования.

  • pdoResources — Очень быстрая замена для getResources, совместимая по параметрам.
  • pdoMenu — Замена для Wayfinder, строит меню.
  • pdoUsers — Выборка и вывод пользователей сайта, с фильтрацией по ролям и группам.
  • pdoCrumbs — Хлебные крошки, замена BreadCrumb.
  • pdoSitemap — Быстрая генерация карты сайта, замена GoogleSiteMap.
  • pdoNeighbors — Вывод ссылок на соседние документы.
  • pdoField — Вывод любого поля документа, замена getResourceField и UltimateParent.
  • pdoPage — Постраничный вывод результатов, замена getPage.

// pdoField в бою

{set $parentNameByChildID =  18 | pdoField : '{"field":"pagetitle", "top":1}'}
{set $resourceNameByID = 'pdoField' | snippet : ['id' => 162, 'field' => 'pagetitle']}Code language: PHP (php)

// pdoPage вывести страницы из определенного ресурса на основе шаблонов

{'!pdoPage' | snippet : [
  'parents' => 95, 
  'limit' => 12,
  'toPlaceholder' => 'result',
  'tpl'=> 'TourIntro',
  'includeTVs'=> 'HotelPicFolderMigx’,
  'where' => '{"template:=":"30","TourCountry:=":"' ~ $_modx->resource.id ~ '"}'
]}
//тут в where я задал дополнительные условия выборки по нужному шаблону и значению tv поля
                
<div class="resultes wrapper">    
     {'result' | placeholder}
</div>        
<div class="pagination">    
     {'page.nav' | placeholder}
</div>
Code language: PHP (php)

// Хлебные крошки

{'pdoCrumbs' | snippet : [
 'outputSeparator' => '',
 'showHome' => 1,
 'showCurrent' => 1,
 'hideSingle' => 1,
 'tplWrapper' => '@INLINE <ul itemscope itemtype="http://schema.org/BreadcrumbList" class="breadcrumbs flex">{$output}</ul>',
 'tpl' => '@INLINE
    <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
       <a title="{$menutitle}" itemprop="item" href="{$link}"><span itemprop="name">{$menutitle}</span></a>
        <meta itemprop="position" content="{$idx}">
    </li>'
]}Code language: HTML, XML (xml)

// Вывод трехуровневого меню на основе pdoMenu и pdoResources

{'pdoMenu' | snippet : [
   'parents' => 0,
   'resources' => '-1,-5',
   'level' => 2,
   'hereClass' => 'active',
   'parentClass' => 'parent',
   'outerClass' => 'main_ul',
   'levelClass' => 'menu-item level',
   'tplOuter' => '@INLINE <ul {$classes}>{$wrapper}</ul>',
   'tplInner' => '@INLINE <ul class="sub-menu">{$wrapper}</ul>',
   'tplParentRow' => '@INLINE <li {$classes}><a {$attributes}>{$pagetitle}</a>{$wrapper}</li>',
   'tpl' => 'topMenuThirdLevel',
]}

чанк topMenuThirdLevel:

<li {$classes}>
  <a href="{$link}"{$attributes}>
      {$pagetitle}
  </a>
  {if ($parent > 0) && ($parent != $id)}
    {set $thirdLevel = 'pdoResources'| snippet : [
            'parents' => $id,
            'tpl' => '@INLINE <a href="{$uri}">{$pagetitle}</a>',
            'sortby' => 'menuindex',
            'limit' => '10'
            'sortdir' => 'DESC',
            'where' => '{"template:=":"13"}'
        ]}
     {if $thirdLevel}
        <div class="third_level">
            {$thirdLevel}
        </div>
     {/if}
  {/if}
</li>
 Code language: JavaScript (javascript)
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: