- Основы движка MODX — чанки, сниппеты и плейсхолдеры
- Чанки
- Сниппеты в modx revo
- Передача параметров сниппету
- Передача плейсхолдеров в чанк
- Запуск сниппета из сниппета
- Плейсхолдеры в MODX
- Шаблонизация сниппетов в MODx Revolution
- Наш начальный сниппет
- Шаблонизация сниппета
- Добавление класса для Ряда
- Передача пользовательского ID
- Modx как вывести сниппет
- Что такое сниппет?
- Как установить сниппет в MODx Revolution
- Простейший вызов сниппета
- Что дальше?
Основы движка MODX — чанки, сниппеты и плейсхолдеры
Рассмотрим базовые элементы движка MODX — чанки, сниппеты и плейсхолдеры. Они являются неотъемлемой частью сайтов на этой CMS, поэтому следует четко понимать их отличие и назначение. Посмотрим следующую схему:
Шаблон является базовым элементом в MODX . Это площадка, на которой размещаются остальные элементы. Любая страница сайта (ресурс) обязана быть привязана к одному из шаблонов.
Чанки
Чанк это мини-шаблон для отдельного блока сайта. Например, требуется для разных страниц использовать разные шаблоны, а шапка сайта должна быть одинаковой. В таком случае её лучше вынести в отдельный чанк и подключить его в нужных шаблонах. При необходимости поправить код шапки, не придется редактировать все имеющиеся шаблоны. Достаточно будет поправить один чанк.
Чанки могут быть вложены друг в друга, содержать сниппеты и плейсхолдеры:
Сниппеты в modx revo
Сниппет — это программный код (PHP,SQL,XPDO), в результате выполнения которого возвращается результат (аналог функций в PHP). Чаще всего результатом является html код, но это не обязательно. Например, он может произвести действия с базой данных и при этом ничего не вывести на экран. Вызываться сниппет может в шаблоне, чанке и даже в содержимом ресурса:
В примере используется стандартный вариант вызова сниппета с кешированием. В этом режиме при первом обращении к сниппету результат его работы кешируется, а при последующих обращениях — выдается сохраненный результат. Такой способ вызова ускоряет время генерации страницы и может применяться к элементам сайта, которые не требуют моментального обновления. Например, главное меню сайта, которое изменяется редко. Для запрета кеширования перед названием ставится восклицательный знак:
В MODX чаще всего используют готовые сниппеты, входящие в состав установленных компонентов (пакетов), но для лучшего понимания принципов их работы создадим свой.
Передача параметров сниппету
Создадим сниппет «CountChar», который будет в качестве параметров получать строку и цвет, а на выходе выдавать количество букв в строке и выделять это число указанным цветом.
В коде сниппета получаем параметры. При этом, можно задать значение, которое будет присваиваться переменной, если параметр не указывался (», ‘black’). Далее производим вычисления и возвращаем результат.
Передача плейсхолдеров в чанк
Мы реализовали задуманное, но при этом нарушили негласное правило — смешали программный код и теги оформления. Если кому-то потребуется обернуть результат не в тег «span», а в «div», то могут возникнуть проблемы. Конечно, хорошо когда в коде всего десять строк, а если их будет тысяча? Для избежания таких проблем отделим «мух от котлет».
Создадим чанк «tplCountChar», внутрь которого поместим плейсхолдеры:
Осталось доработать сам сниппет. Разбирать его подробно не будем, так как он содержит в себе комментарии:
Результат работы: 11 символов!
Запуск сниппета из сниппета
Про тонкости разработки сниппетов в MODX Revolution можно написать целую книгу, поэтому я ограничусь ещё только одной «фишкой» — возможностью запускать из своего сниппета сторонние. При создании сайтов такой функционал будет требоваться крайне редко, поэтому считайте эту информацию лишь небольшим бонусом.
Синтаксис вызова отличается от используемого в чанках или шаблонах, но результат будет тот же самый.
Плейсхолдеры в MODX
Из предыдущих примеров Вы, наверно, уже поняли что такое плейсхолдеры. Фактически, плейсхолдер это переменная , которую генерирует сниппет. Вызывается он следующим образом:
Есть ещё системные плейсхолдеры. Они берутся из системных настроек MODX и доступны для вызова в любом месте сайта:
- [[++site_name]] возвращает название сайта
- [[++site_url]] возвращает доменное имя сайта
- [[++modx_charset]] возвращает установленную кодировку
Таких переменных насчитывается несколько десятков, но большинство из них не требуется при разработке сайта.
Источник
Шаблонизация сниппетов в MODx Revolution
Одной из самых лучших практик , это когда вы никогда прямо не пишете HTML код в сниппете, но вставляете HTML код для шаблонизации сниппета в чанки. Этот урок покажет вам как сделать это в сниппете.
Наш начальный сниппет
Давайте разберём пример, где вам нужно пройти через опубликованные неудалённые ресурсы, которые являются наследниками Ресурса с ID 390, отсортированного по и далее вывести их в тегах LI с именем статьи pagetitle и активной ссылкой.
Давайте продолжим и создадим сниппет с именем ‘ResourceLister’ и вставим следующий код:
Это делает то, что нам нужно, но содержит внутри HTML код. Нас такое не устраивает. Это не даёт пользователю возможность контролировать разметку или менять её, если он это захочет сделать. Нам нужно больше гибкости.
Шаблонизация сниппета
Во-первых, давайте создадим чанк, который мы будем использовать для каждого элемента в результирующем выводе. Назовём его «ResourceItem» и код содержимого назначим как:
В основном, мы пользуемся тегами LI и помещаем несколько заполнителей туда, где находился наш контент. Мы имеет доступ к каждому полю в ресурсе и теперь мы просто используем ID и поле ресурса pagetitle. Выражение [[
говорит MODx, чтобы сделал ссылку от ID переданного через [[+id]] параметр. Давайте добавим параметр по-умолчанию к сниппету, называемый ‘tpl’ к верху нашего сниппет кода:
Этим мы получим в распоряжение параметр &tpl= от вызова Сниппета поскольку $scriptProperties просто содержит все параметры в вызове Сниппета. Если ‘tpl’ не существует, то по-умолчанию getOption является значением ResourceItem (чанк, который мы создали недавно).
После этого мы меняем цикл по каждому элементу в Сниппете на такой:
Код вначале возвращает объект modResource в массив пар field=name (например, $resourceArray [’pagetitle’] — это pagetitle) используя метод toArray(). Далее мы используем $modx->getChunk() для передачи нашего tpl чанка и массива ресурсов в него как параметры. MODx парсит чанк, заменяет параметры и возвращает нам некоторый контент.
Теперь пользователь может вызывать сниппет этим способом для перезаписи чанка для каждого ресурса с помощью такого вызова:
Это значит, что пользователи могут шаблонизировать их результаты вызова как им угодно – используя теги Lis или поля таблиц, в общем что угодно! Вы создали гибкий и мощный сниппет!
Добавление класса для Ряда
Если мы хотим, чтобы пользователи могли определять CSS класс для каждого LI ряда, но не могли делать свои собственные чанки. Тогда мы просто добавляем параметр по-умолчанию ‘rowCls’ для кода нашего сниппета вверху прямо под нашим первым вызовом getOption:
Это говорит MODx, что по-умолчанию &rowCls класс ряда для сниппета — это ‘resource-item’. Давайте отредактируем наш чанк ResourceItem:
И далее изменим наш цикл для каждого элемента:
Обратите внимание как мы в прямой форме определили переменную ‘rowCls’ в наш массив параметров $resourceArray. Мы так сделали, потому что у нас уже есть значение rowCls ранее в этом сниппете (с вызовом getOption) и теперь мы знаем, что он не будет отличаться для каждого ряда.
Передача пользовательского ID
Если мы хотим, чтобы пользователь имел возможность передавать от какого предка брать ресурсы. Тогда мы просто добавляем параметр ‘id’ к коду нашего сниппета вверху под вызовом getOption:
В основном позволять пользователям переписывать (назначать) родительский ID для Сниппета – для примера скажем Ресурс 123 с параметром &id=`123` — в их вызове сниппета. Мы хотим, чтобы по умолчанию он равнялся 390. И далее мы поменяем строку getChildIds для этого:
Очевидно, что вы могли бы добавить больше функций к этому сниппету, таким как firstRowCls (для первого ряда результата вызова), lastRowCls, firstRowTpl, sortBy, sortDir, limit и всё угодно, что вы смогли бы придумать. Мы могли бы даже сделать фильтр ‘published’ как параметр или скрывать ресурсы, которые являются папками для других ресурсов и др. Теперь важно, что вы имеете общее представление о создании пользовательского сниппета.
Для справки, наш конечный код выглядит вот так:
sirega
здравствуйте, не ответите мне на такой вопрос, на сколько хорошо нужно знать php чтобы делать на modx все что душе угодно.
Viktorminator
Я тоже недавно задал приблизительно такой же вопрос «Сколько времени нужно провести с MODx, чтобы общаться с ним на ты». Я думаю, нужно знать MODx как фреймворк, если умеете использовать его методы и классы, тогда сможете сделать всё, что угодно. Функционал делаете на php и помещаете в сниппеты, отображение в чанки и css, Объекты такие как продукты (объявления, новости и т.д.) делаете как ресурсы. Для понимания MODx как фреймворка нужно разобраться с xPDO (уже начал работу над уроками). Ничего суперсложного в пхп и MODx с пхп нет, нужно просто сесть и разобраться. По аналогии могу ответить вопросом на вопрос — насколько хорошо нужно знать html и css, чтобы делать на MODx суперкрасивые сайты.
Sirega
Html и Css знаю неплохо, чтобы делать красивые сайты достаточно знать процентов 10 из всех html и css тегов, Дримвиавер в верстке неплохо помогает.
OhMyGodMan
Нда, «чтобы делать красивые сайты достаточно знать процентов 10 из всех html и css тегов» и «Дримвиавер в верстке неплохо помогает.»
Настоящий web-master! Может сразу на Юкоз? )
Игорь
отчасти он прав. чтобы сделать сайт, далеко не обязательно использовать 100% тегов html и css правил. прежде всего важен результат и кроссбраузерность. а то, как это сделано пользователям сайта будет абсолютно по барабану.
10% нет — ребят этого вообще недостаточно!
Rasul Abu Muhammad Amin
Спасибо за статью. Не могли бы вы подсказать один момент.
Как по-проще можно сделать вложенный чанк и вызов в сниппете. Например, обернуть ResourceItem в какой нибудь чанк ResourceWrapper с
Источник
Modx как вывести сниппет
Начнем наш 7 урок MODx Revolution для новичков. В предыдущем уроке мы изучили переменные шаблона и как их можно использовать для создания пользовательких полей на страницах сайта. При этом использовали шаблон студии Themeforest, вы можете использовать любой удобный для вас шаблон. Мы изучили как преобразовавывать статический HTML/CSS/JS шаблон в динамический контент нашего сайта. В целом, всё то, на что мы смотрели представляло собой внешний вид сайта и разметку. В этом уроке мы коротко рассмотрим как добавить функциональности нашему сайту при помощи сниппетов. Это будет короткий пример использования сниппетов. Каждая запись будет содержать описания одного сниппета, максимум два.
Что такое сниппет?
Сниппеты – это куски PHP кода, которые позволяют добавлять функциональность в ваш MODx сайт. Согласно официальной документации:
Сниппеты – это ответ MODx на внутренний PHP код. Они обеспечивают пользовательский динамичный контент, такой как меню, блоги или новые списки и другие функциональные блоки и что еще угодно, что ваш сайт должен генерировать по запросу.
Сниппеты позволяют вам добавлять такую функциональность как навигацию, записи твиттера, поиск, галереи образов, формы контактов, вместолище контента, комментарии в ваш MODx сайт без необходимости написания PHP кода самому (если, конечно же, вы не хотите сами создать ваш собственный сниппет).
Репозиторий MODx постоянно пополняется коллекциями сниппетов, которые создаются разработчиками ядра либо членами сообщества и вы можете установить и использовать эти сниппеты в пару кликов. Как я уже ранее упомянул, вы можете создать собственный сниппет с пользовательским функционалом, если нет аналогичных доступных сниппетов, поэтому всё зависит от ваших способностей в программировании на PHP и знания MODx API. Поскольку мы здесь ведём разговор о курсе для новичков, то сосредоточимся на существующих сниппетах, но кроме этого я потом сделаю серию уроков, посвященных созданию собственных сниппетов.
Как установить сниппет в MODx Revolution
Если до этого вы использовали MODx Evolution, то вы должны знать, что вместе с установкой ядра Evolution в комплекте идет несколько сниппетов по умолчанию. Чтобы добавить другие сниппеты, вам нужно скачать их с официального сайта MODx, загрузить на сервер, а дальше вручную скопировать и вставить некоторый код для создания сниппета. В Revolution всё намного проще, базовая установка движка не содержит никаких сниппетов, всё что нужно – это зайти в менеджер сайта, дальше System->Package Management нажать Download Extras, и далее выбрать необходимый сниппет, загрузить его и установить. Все просто!
Тут я не буду останавливаться, более детально этот вопрос был освещен в 3 уроке, его можно почитать по этой ссылке Урок 3. Базовая настройка и установка дополнений
Простейший вызов сниппета
После установки необходимых сниппетов, следующим шагом является вызов сниппета в нашем шаблоне или странице – там где вам нужна дополнительная функциональность. Базовым синтаксисом вызова сниппета является: [[snippetName]]. Если ожидается, что сниппет будет генерировать различные результаты для разных пользователей или разных сессий, таких как агрегаторы или RSS лента, то тогда вам нужно вызывать некешируемый сниппет и это вы делаете просто поставив восклицательный знак перед сниппетом: [[!snippetName]]
Базового вызова сниппета не достаточно для использования необходимой функциональности. Для этой цели сниппеты имеют свойства, некоторые из которых обязательные, а некоторые и нет. В большинстве случаев сниппеты также дают вам возможность задать стиль и шаблон своего вывода.
Большинство сниппетов в репозитории MODx хорошо задокументированны и положительно стремление всегда заглядывать в MODx документацию. Каждому сниппету посвящен отдельный раздел в форумах MODx, где можно задать вопрос и получить поддержку и квалифицированный ответ от разработчика сниппета. Если у вас проблемы со сниппетом, то эти форумы – лучше место, где можно получить ответ на вопрос либо решить возникшую проблему, 100% у кого-то она уже была до вас .
Что дальше?
Как я уже говорил – это всего лишь общее вступление. Реально рассматривать сниппеты мы начнем лишь на следующем занятии. А начнем мы с Wayfinder, сниппета который занимается построением несортированных списков и является идеальным инструментом для создания меню. Мы будем использовать Wayfinder для замены статического меню нашего сайта динамическим, которое будет отображать необходимые названия страниц.
Итак для работы вам необходимо установить сниппет Wayfinder в ваш сайт на MODx Revolution и таким образом подготовится к следующему уроку.
Рекомендую для прочтения
Подскажите пожалуйста
Всё шло хорошо до снипетов.
Не удаётся установить пакеты, СИСТЕМА-Управление пакетами-Добавить новый пакет/Скачать дополнения. Выдаётся ответ — «Произошла ошибка при подключении к поставщику:MODX получил пустой ответ от поставщика. Пожалуйста, проверьте URL-адрес поставщика и убедитесь, что поставщик является корректным поставщиком.» Попытка добавить новых поставщиков ничего не меняет.
Подскажите, что делать?
Viktorminator
проверить права доступа к папкам, созданы ли папки assets, assets/components, какой сервер локальный(XAMPP, WAMP, DeNWeR) или виртуальный?
Извините, что в первый раз кратко. Система установлена на бесплатном хостинге «Вагончик» ( никаких проблем при размещении сайтов раньше не было)
Права доступа на assets -755, assets/components — тоже 755.
Viktorminator
Папки /assets/cache (и их файлы), /assets/export и /assets/images папки права 777.
katerina
у меня тоже нет возможности установить пакеты. Кнопка «Загрузить дополнения» неактивна! И вверху написано: Предупреждение!cURL должен быть установлен и настроен как расширение PHP, если вы собираетесь использовать управление пакетами.
Я работаю на Denwer, где копать — не пойму
Viktorminator
Проверьте есть ли соединение с провайдером пакетов — команда «tracert rest.modx.com». Если есть файервол — выключите его.
В вопросах указывайте версию php и modx.
sergey
2katerina
Так чего непонятного, надо подключить библиотеку cURL. Как — это уже другой вопрос.
Как подключить библиотеку cURL?
Филипп
Z:\usr\local\php5\php.ini
Раскомментируйте строчу extension=php_curl.dll в файле php.ini и перезагрузите сервер.
Павел Савин
А что делать если я уже скачал cURL и установил. Но строчка эта как была так и осталась, и в php.ini нету такой строчки с экстеншеном. Тупо нету. Я её даже пробовал сам дописывать. Бесполезно 🙁
Павел Савин
А что делать если я уже скачал cURL и установил. Но Warning этот как был так и остался, и в php.ini нету такой строчки с экстеншеном. Тупо нету. Я её даже пробовал сам дописывать. Бесполезно 🙁
pcheliakov
Не могу поставить плагины. php v. 5.3.8, MODx Revolution MODX Revolution 2.2.6-pl (traditional)
Вручную, локально — ошибка — Рабочее пространство не найдено.
online — файлы скачиваются, но бесконечно идёт процесс Загружается.
Viktor Minator
попробуйте ниже версию пхп
pcheliakov
Пришлось ставить на OPEN SERVER. Только так всё заработало. И кстати на версию PHP 5.2.17. На xampp и на мною установленной связке PHP APACHE MSSQL не работала, хоть ты тресни!
Источник