Modx получить TV в сниппете

Modx Revolution (Revo) — одна из самых популярных систем управления контентом (CMS), используемых для создания и управления веб-сайтами. В Revo вы можете создавать пользовательские поля для различных типов контента, включая поля шаблонов (tv поля). Tv поля позволяют пользователю создавать и управлять дополнительными данными на странице. В этой статье мы рассмотрим, как вывести tv поля в Modx Revo.

Шаг 1: Создание tv поля
Прежде чем мы сможем вывести tv поле на странице, необходимо создать его в административной панели Modx Revo. Чтобы создать новое tv поле, выполните следующие шаги:

1. Войдите в административную панель Modx Revo.
2. Перейдите в раздел «Элементы» и выберите «Tv-поля».
3. Нажмите на кнопку «Создать Tv-поле».
4. Задайте имя для tv поля, выберите тип поля и заполните остальные требуемые параметры.
5. Нажмите на кнопку «Сохранить».

Шаг 2: Вывод tv поля на странице
Когда tv поле создано, мы можем начать выводить его на странице. Существует несколько способов сделать это:

MODX Implementation Part 2 — Settings, Chunks & TV’s

1. Использование сниппета getResources:

[[!getResources? tvPrefix=`tv.` tpl=`yourTemplateTpl` // ID страницы $key = ‘yourTvName’; // имя tv поля $tv = $modx->getTemplateVar($key, ‘*’, $id, ‘name’); $value = $tv[‘value’]; echo $value;

В этом примере мы используем PHP код для получения значения tv поля «yourTvName» для страницы с ID 1. Вы можете изменить ID страницы и имя tv поля в соответствии с вашими потребностями.

Шаг 3: Пользовательские выводы tv поля
Вывод tv полей в Modx Revo может быть дополнен с использованием пользовательских выводов. Пользовательский вывод позволяет изменить способ вывода tv поля на странице или добавить дополнительную обработку данных. Для настройки пользовательского вывода tv поля выполните следующие шаги:

1. Войдите в административную панель Modx Revo.
2. Перейдите в раздел «Элементы» и выберите «Tv-поля».
3. Нажмите на tv поле, для которого вы хотите настроить пользовательский вывод.
4. Перейдите на вкладку «Пользовательский вывод».
5. Введите соответствующий пользовательский вывод для tv поля.
6. Нажмите на кнопку «Сохранить».

Пользовательский вывод может содержать HTML, CSS, JavaScript и другой код, который будет применяться к tv полю на странице.

Вывод tv полей в Modx Revo является мощным и удобным инструментом для создания и управления дополнительными данными на страницах вашего сайта. С помощью различных способов вывода и пользовательского вывода, вы можете создать уникальные и настраиваемые элементы для вашего контента. Пользуйтесь этим руководством, чтобы легко и эффективно использовать tv поля в Modx Revo.

Источник: qaa-engineer.ru

Как писать сниппеты для MODX?

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

MODX Implementation Part 3 — Advanced Chunks & TV’s

Разберем на небольшом примере.

Часто приходится иметь дело со следующей ситуацией: есть сайт-каталог, товары в каталоге имеют численную характеристику, будь то вес, или чаще всего цена. В том случае, если цена используется для фильтрации товаров, тогда TV параметр должен иметь формата числа, но для пользователей числа надо форматировать. Вот этим мы как раз и займемся.

Есть MODX Revolution, есть TV-параметр

price

, в нем есть значение 5000000 (пять миллионов). Согласитесь, понять 5 миллионов или 500 тысяч — понять довольно сложно, но так как оно численное, с ним удобно работать для сравнения и фильтрации.

Для форматирования числа будем использовать PHP функцию

number_format()

. Вызов сниппета будет примерно выглядеть следующим образом:

[[num_format? dec=`2` tho=` `]]

Наш сниппет принимает следующие параметры:

  1. num

    — TV параметр, или число, которое нужно отформатировать;

  2. dec

    — количество символов после запятой;

  3. sep

    — разделитель между целой и дробной частью;

  4. tho

    — разделитель между тысячными разрядами.

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

Заходим в раздел «Сниппеты» и создаем новый с названием

num_format

.

Вставляем в него следующий код:

if ($num == ») // Значение из TV параметра $num = 0; if ($dec == ») // число знаков после запятой $dec = 2; if ($sep == ») // разделитель дробной части $sep = ‘,’; if ($tho == ») // разделитель тысячого разряда $tho = ‘ ‘; $output = number_format( $num, $dec, $sep, $tho); return $output;

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

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

В первых строчках сниппета определяем значения по-умолчанию. Сделано это прежде всего для того, чтобы максимально универсально использовать PHP функцию.

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

// [[num_format]] 0,00 // [[num_format? dec=`2`]] 5 000 000,00 // [[num_format? dec=`3` https://remontka.com/kak-pisat-snippetyi-dlya-modx/» target=»_blank»]remontka.com[/mask_link]

MODX Revolution встречает Fenom

В последнее время в англоязычном сообществе MODX много рассуждений на тему «как нам жить дальше». Все на перебой обсуждают грядущую (через несколько лет, полагаю) мажорную версию 3, а мы пока улучшаем текущую версию своими дополнениями.

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

Это не требует никаких изменения в работе сайта, просто все ваши сниппеты, работающие через pdoTools уже поддерживают Fenom в чанках, с версии 2.0. А с помощью некоторых системных настроек вы можете включить его и для всех страниц сайта.

Самое приятно, что теги MODX отлично соседствуют с Fenom и работаю в одном чанке без каких-либо проблем. Быстрый пример для затравки:

[[!pdoMenu?parents=`0`]] [[!pdoResources?parents=`1,2,3`]]

Под катом огромное количество информации о парсере pdoTools, которую я еще ни разу не собирал в одном месте.

Итак, парсер pdoTools представляет из себя отдельный класс, который прописывается в системных настройках MODX и перехватывает обработку тегов на странице.
В старых версиях компонента, включение парсера нужно было подтверждать при установке, но с версии 2.1.1-pl он включается по умолчанию. Если, по каким-то причинам, вас это не устраивает — удалите системные настройки

  • parser_class — имя класса парсера
  • parser_class_path — путь к классу парсера

По умолчанию в MODX нет этих настроек, они нужны только для подключения стороннего парсера, как в нашем случае.

Принцип работы

` ]]

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

То есть, если вызвать сниппет на странице вот так:

[[!pdoResources? tpl=`@INLINE

[[+id]] — [[+pagetitle]]

` ]]

и в памяти системы при этом выставлены плейсхолдеры [[+id]] или [[+pagetitle]] , то в сниппет придёт уже обработанный чанк и вы получите на странице одинаковые строки, типа:

15 — тест 15 — тест 15 — тест

Просто одинаковые значения, которые выставил какой-то другой сниппет раньше. Именно поэтому в примере у нас такие необычные плейсхолдеры — > вместо [[+]] . Системный парсер их не трогает, а pdoTools заменяет их на нормальные во время работы.

Вы можете использовать фигурные скобочки в качестве обрамления плейсхолдеров во всех чанках pdoTools — он сам превратит их в [[+]] при загрузке.

По этой же причине у вас никогда не будут работать вызовы сниппетов и фильтров в INLINE чанках. Вот так работать не будет:

[[!pdoResources? tpl=`@INLINE

[[+id]] — [[+pagetitle:default=`название страницы`]]

` ]]

А вот так — без проблем

[[!pdoResources? tpl=`@INLINE

> — >

` ]]

Помните об этом нюансе при использовании INLINE чанков.

@FILE

Многие люди обвиняют MODX в том, что он не умеет хранить чанки в файлах и вынуждает лишний раз работать с базой данных. Это и неудобно для системы контроля версий, и медленнее.

С версии 2.2 MODX предлагает использовать для этих целей статичные элементы, но по ряду причин, этот способ всё равно может быть менее удобен, чем прямая работа с файлами.

pdoTools открывает такую возможность при указании @FILE:

[[!pdoResources? tpl=`@FILE resources/mychank.tpl` ]]

В целях безопасности, использовать можно только файлы с расширеним html и tpl, и только из определённой, заранее заданной директории. По умолчанию это: /assets/elements/chunks/ .

Вы можете указать свою собственную директорию для файлов через параметр parents=`0` FILE resources/mychunk.tpl` TEMPLATE

Этот тип чанка позволяет использовать шаблоны системы (т.е. объекты modTemplate) для оформления вывода.

[[!pdoResources? tpl=`@TEMPLATE Base Template` ]]

Если указан пустой шаблон и в выбранных записях есть поле template с id или именем шаблона, то запись будет обёрнута в этот шаблон:

[[!pdoResources? tpl=`@TEMPLATE` ]]

Это такой аналог сниппета renderResources.

При выводе шаблона можно указывать и набор параметров (как у сниппетов):

[[!pdoResources? tpl=`@TEMPLATE Base Template@MyPropertySet` ]]

Тогда значения из этого набора будут вставлены в шаблон.

Обычные чанки

Это режим по умолчанию, который загружает чанк из базы данных:

[[!pdoResources? tpl=`MyChunk` ]]

Точно так же поддерживаются и наборы параметров:

[[!pdoResources? tpl=`MyChunk@MyPropertySet` ]]

Эти способы загрузки чанков работают во всех родных сниппетах pdoTools и во всех других, которые используют методы pdoTools getChunk и parseChunk .

Метод getChunk

Объявление этого метода выглядит так:

getChunk(string $chunkName, array $properties, bool $fastMode = false)

Метод загружает указанный чанк (следуя указанию @BINDING, если есть) и полностью обратывает его, заменяя все плейсхолдеры на переданные значения (параметр $properties).

Третий параметр fastMode вырезает все оставшиеся необработанные плейсхолдеры, чтобы не было лишних тегов на странице. Если этого не сделать, то парсер будет пытаться рекурсивно разобрать эти теги (до 10 итераций по умолчанию), что может привести к замедлению работы.

Рекурсивный парсер — это одно из достоинств MODX и специально оставленные теги очень часто встречаются в логике работы сниппетов системы. Поэтому fastMode отключен по умолчанию и использовать его нужно, только если вы уверены в том, что делаете.

Парсер pdoTools не будет вызывать системный парсер, если смог самостоятельно разобрать все плейсхолдеры. Если же в чанке остались какие-то вызовы фильтров или сниппетов, то работа передаётся в modParser, что требует дополнительное время на обработку.

Метод parseChunk

А этот метод объявлен вот так:

parseChunk(string $name, array $properties, string $prefix = ‘[[+’, string $suffix = ‘]]’)

Он также создаёт чанк из указанного имени, разбирая @BINDING, если есть, а потом просто заменяет плейсхолдеры на значения, без особых обработок.

Это самый простой и быстрый способ оформления данных в чанки.

Обработка страницы

Если pdoParser включен в настройках, то он вызывается и для обработки всей страницы при выводе её пользователю.

При использовании этого парсера все чанки и дополнения MODX обрабатываются немного быстрее. Всего лишь «немного» потому, что он не берёт на себя условия и фильтры, обрабатывая только простенькие теги, типа [[+id]] и [[~15]] . Однако, он это делает быстрее modParser, потому что не создаёт лишних объектов.

Помимо возможной прибавки скорости, вы получаете еще и новые возможности по удобному выводу данных из разных ресурсов.

Теги fastField

В конце 2012 года общественности был представлен небольшой плагин с добавлением новых тегов парсеру MODX, который затем вырос в компонент fastField.

Он добавляет в систему обработку дополнительных плейсхолдеров, типа [[#15.pagetitle]] . С разрешения автора, этот функционал уже включен в pdoParser, и даже немного расширен.

Все теги fastField начинаются с # и дальше содержат или id нужного ресурса, или название глобального массива.

Вывод обычных полей ресурсов:

[[#15.pagetitle]] [[#20.content]]

ТВ параметры ресурсов:

[[#15.date]] [[#20.some_tv]]

Поля товаров miniShop2:

[[#21.price]] [[#22.article]]

Массивы ресурсов и товаров:

[[#12.properties.somefield]] [[#15.size.1]]
[[#POST.key]] [[#SESSION.another_key]] [[#GET.key3]] [[#REQUEST.key]] [[#SERVER.key]] [[#FILES.key]] [[#COOKIE.some_key]]

Можно указывать любые поля в массивах:

[[#15.properties.key1.key2]]

Если вы не знаете, какие значения находятся внутри массива — просто укажите его и он будет распечатан полностью:

[[#GET]] [[#15.colors]] [[#12.properties]]

Теги fastField можно сочетать с тегами MODX:

[[#[[++site_start]].pagetitle]] [[#[[++site_start]]]]

Шаблонизатор Fenom

Поддержка шаблонизатора Fenom появилась в pdoTools с версии 2.0, после чего он стал требовать PHP 5.3+.

Он работает гораздо быстрее, чем родной modParser, и если вы перепишите свой чанк так, что в нём не будет ни одного тега MODX, то modParser и вовсе не будет запускаться. При этом, конечно, одновременная работа и старых тегов, и новых в одном чанке допускается.

На обработку шаблонизатором влияют следующие системные настройки:

  • pdotools_fenom_default — включает обработку через Fenom чанков pdoTools. Включено по умолчанию.
  • pdotools_fenom_parser — включает обработку шаблонизатором всех страниц сайта. То есть, не только чанков, но и шаблонов.
  • pdotools_fenom_php — включает поддержку PHP функций в шаблонизаторе. Очень опасная функция, так как любой менеджер получит доступ к PHP прямо из чанка.
  • pdotools_fenom_modx — добавляет системные переменные и в шаблоны Fenom. Тоже очень опасно — любой менеджер может управлять объектами MODX из чанков.
  • pdotools_fenom_options — JSON строка с массивом настроек согласно официальной документации. Например:
  • pdotools_fenom_cache — кэширование скопмилированных шаблонов. Имеет смысл только для сложных чанков на рабочих сайтах, по умолчанию отключено.

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

Включение pdotools_fenom_parser позволяет использовать синтаксис Fenom прямо в контенте документов и шаблонах страниц, но есть один нюанс — шаблонизатор может неверно реагировать на фигурные скобочки, которые в MODX очень любят.

В таких случаях автор рекомендует использовать тег .

Если вы планируете включить Fenom глобально для всего сайта, вам нужно проверить, на всех ли страницах он нормально работает.

Синтаксис

Для начала советую прочитать официальную документацию, а дальше мы рассмотрим синтаксис применительно к MODX.

Все переменные от сниппетов передаются в чанк как есть, поэтому переписывать старые чанки на новый синтаксис — сплошное удовольствие.

MODX Fenom
[[+id]]
[[+id:default=`test`]]
[[+id:is=«:then=`test`:else=`[[+pagetitle]]`]]

Для использования более сложных сущностей, в pdoParser предусмотрена служебная переменная , которая даёт безопасный доступ к некоторым переменным и методам системы.

MODX Fenom
[[*id]] resource.id>
[[*tv_param]] resource.tv_param>
[[%lexicon]] lexicon(‘lexicon’)>
[[~15]] makeUrl(15)>
[[~[[*id]]]] makeUrl($_modx->resource.id)>
[[++system_setting]] config.system_setting>

Помимо этого вам доступны переменные:
config> — системные настройки

config.site_name> config.emailsender> config[‘site_url’]> config[‘any_system_setting’]>

user> — массив текущего пользователя. Если он авторизован, то добавляются и данные из профиля:

user.id > 0> Привет, user.fullname>! Вам нужно авторизоваться.

context> — массив с текущим контекстом

Вы находитесь в контексте context.key>

resource> — массив с текущим ресурсом, это вы уже видели в примерах выше

resource.id> resource.pagetitle> makeUrl($_modx->resource.id)>

lexicon> — объект (не массив!) modLexicon, который можно использовать для загрузки произвольных словарей:

lexicon->load(‘ms2gallery:default’)> Проверка словарей ms2Gallery: lexicon(‘ms2gallery_err_gallery_exists’)>

За вывод записей отвечает отдельная функция lexicon()> .

Плейсхолдеры с точкой

Fenom использует точку для доступа к значению массива, а MODX обычно выствляет так плейсхолдеры из массивов. Соотвественно, для тегов [[+tag.sub_tag]] аналогов в Fenom не предусмотрено.

Поэтому для подобных плейсхолдеров вам необходимо использовать вторую служебную переменную — :

Вывод сниппетов и чанков

Переменная на самом деле представляет собой простой и безопасный класс microMODX

Поэтому сниппеты и чанки вызываются так:

runSnippet(‘!pdoPage@PropertySet’, [ ‘parents’ => 0, ‘showLog’ => 1, ‘element’ => ‘psoResources’, ‘where’ => [‘isfolder’ => 1], ‘showLog’ => 1, ])> getPlaceholder(‘page.total’)> getPlaceholder(‘page.nav’)>

Как видите, синтаксис практически полностью повторяет PHP, что открывает новые возможности. Например, можно указывать массивы, вместо JSON строк.

По умолчанию все сниппеты вызываются кэшированными, но вы можете добавить ! перед именем — как в тегах MODX.

Если для вызова сниппета используется родной метод MODX, то для вывода чанков запускается pdoTools, и вы можете использовать все его возможности:

getChunk(‘MyChunk@PropertySet’)> parseChunk(‘MyChunk’, [ ‘pl1’ => ‘placeholder1’, ‘pl2’ => ‘placeholder2’, ])> getChunk(‘@TEMPLATE Base Template’)> getChunk(‘@INLINE Имя сайта: config.site_name> ‘)> getChunk( ‘@INLINE Передача перемнной в чанк: ‘, [‘var’ => ‘Тест’] )> getChunk(‘ @INLINE Передача переменной в вызов сниппета: runSnippet(«pdoResources», [ «parents» => $parents ])> Всего результатов: getPlaceholder(«total»)> ‘, [‘parents’ => 0] )>

Примеры выше немного безумные, но вполне себе работают.

Управление кэшированием

В объекте доступен сервиc modX::cacheManager, который позволяет вам устанавливать произвольное время кэширование вызываемых сниппетов:

cacheManager->get(‘cache_key’)> runSnippet(‘!pdoResources’, [ ‘parents’ => 0, ‘tpl’ => ‘@INLINE — ‘, ‘showLog’ => 1, ])> cacheManager->set(‘cache_key’, $snippet, 1800)>

Посмотреть этот кэш можно в /core/cache/default/ , в примере он сохраняется на 30 минут.

set $null = . нужен, чтобы cacheManager->set не вывел 1 (т.е. true) на страницу.

А еще вы можете запускать системные процессоры (если прав хватит):

runProcessor(‘resource/update’, [ ‘id’ => 10, ‘alias’ => ‘test’, ‘context_key’ => ‘web’, ])>

Проверка авторизации

Так как объекта с пользователем в нет, методы проверки авторизации и прав доступа вынесены непосредственно в класс:

isAuthenticated()> hsSessionContext(‘web’)> hasPermission(‘load’)>

Остальные методы

Эти методы должны быть знакомы всем разработчикам MODX, поэтому просто покажу их на примерах:

regClientCss(‘/assets/css/style.css’)> regClientScript(‘/assets/css/script.js’)> sendForward(10)> sendRedirect(‘http://yandex.ru’)> setPlaceholder(‘key’, ‘value’)> getPlaceholder(‘key’)> findResource(‘url-to/doc/’)> sendRedirect( $_modx->makeUrl($res) )>

Расширение шаблонов

Использование шаблонизатора Fenom позволяет включать одни чанки (шаблоны в другие) и даже расширять их.

Например, вы можете просто подгрузить содержимое чанка:

Обычный чанк Шаблон modTemplate Чанк с набором параметров

Подробнее про читайте в официальной документации.

Гораздо более интересная функция — шаблонов, она требует включенной системной настройки pdotools_fenom_parser.

Пишем базовый шаблон «Fenom Base»:

resource.content> Sidebar

Он включает обычные чанки (в которых, кстати, обычные плейсхолдеры MODX от компонента Theme.Bootstrap) и определяет несколько блоков , которые можно расширить в другом шаблоне.

Теперь пишем «Fenom Extended»:

resource.pagetitle>

Так вы можете написать один базовый шаблон и расширить его дочерними.

Точно также можно писать и расширять чанки, только обратите внимание, что для работы с modTemplate нужно указывать префикс template:, а для чанков нет — они работают по умолчанию во всех и .

Заключение

Давайте подытожим возможности парсера pdoTools:

  • Быстрая работа
  • Загрузка чанков из разных источников, включая файлы
  • Поддержка тегов fastField
  • Поддержка шаблонизатора Fenom
  • Наследование шаблонов
  • Расширение шаблонов
  • Безопасный доступ к продвинутым функциям MODX

На данный момент pdoTools скачан более 40 000 раз из официального репозитория и более 10 000 из репозитория modstore.pro, что позволяет надеяться на широкое распространение новых технологий шаблонизации в MODX.

Большое спасибо хабраюзеру aco за замечательный шаблонизатор!

Источник: savepearlharbor.com

Оцените статью
Добавить комментарий