Меню Рубрики

Как написать сниппет для modx

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

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

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

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

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

Для форматирования числа будем использовать PHP функцию number_format() . Вызов сниппета будет примерно выглядеть следующим образом:

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

  1. num — TV параметр, или число, которое нужно отформатировать;
  2. dec — количество символов после запятой;
  3. sep — разделитель между целой и дробной частью;
  4. tho — разделитель между тысячными разрядами.

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

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

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

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

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

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

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

При этом очередность перечисления параметров во время вызова сниппета значения не имеет. в отличии от параметров в PHP функции.

Таким образов в написании своих сниппетов для MODX нет абсолютно никаких сложностей. Все работает очень просто и понятно. По такому же принципу работает и Evolution, различаться будет только синтаксис при вызове сниппета, статья с различиями между Evo и Revo также есть на сайте.

Источник статьи: http://dmitriyilichev.com/kak-pisat-snippetyi-dlya-modx/

Написание сниппетов

Общее представление

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

Что такое сниппет?

Согласно одному определению, «сниппет» — это «короткий повторяющийся сниппет компьютерного исходного кода». Некоторым людям трудно отличить это от «чанка», поэтому полезная мнемоника может выглядеть так: сниппет это как «PHP», например, sni-P(h)P-et.

Как они работают?

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

Затем, как только они будут кэшированы, сниппеты затем обрабатываются парсером MODX. У них есть доступ к объекту $modx.

Простой пример

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

Если вы назвали этот сниппет «helloWorld», вы можете вызвать его, используя [[helloWorld]] в ваших документах, шаблонах или чанках (см. Синтаксис тегов). Вы также можете вызвать сниппет из другого сниппета, используя метод API runSnippet.

Обратите внимание, что мы возвращали код, а не выводили его содержимое. Никогда не используйте echo в сниппете — всегда возвращайте вывод.

Передача значений в сниппет

Значения передаются в ваш сниппет с использованием модифицированной нотации типа веб-формы CGI, которая следует за именем сниппета. Если ваш сниппет был назван «mySnippet», вы можете вызвать его, используя что-то вроде этого:

И код вашего сниппета может выглядеть примерно так:

Обратите внимание, что имена переменных в вызывающем бите должны точно соответствовать именам переменных в сниппете (регистр имеет значение, т.е. ‘input’, а не ‘INPUT’ или ‘Input’. Во-вторых, не забывайте «&» перед потенциальными именами переменных. И, наконец, что не менее важно, обратите внимание, что это обратные кавычки, а не одинарные кавычки!

Чтение значений в ваших сниппетах

В общем, вы можете прочитать ваши значения, сославшись на переданные аргументы: &someParameter в вызове преобразуется в $someParameter в коде PHP.

Вы также можете прочитать все параметры, используя встроенный массив $scriptProperties. Это полезно, если ваш сниппет принимает переменные параметры, т.е. он обрабатывает тот же вариант использования, что и PHP-функция func_get_args().

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

Тогда массив $scriptProperties будет содержать следующее:

Взаимодействие с базой данных в сниппетах

Доступ к слою базы данных в MODX основан на объектно-реляционной модели (ORM), называемой xPDO для подключения к базе данных, поэтому, чаще всего, вам не придется писать необработанные запросы к базе данных, как вы могли бы делать в других CMS. Обычно вы получаете доступ к данным из базы данных, используя несколько объектов и методов MODX, таких как getObject и getCollection. Это зависит от базовой структуры xPDO.

Почему ОРМ?

Вы можете спросить, зачем использовать ОРМ вместо простого SQL? Ну, хотя бы несколько причин ниже:

  1. Абстракция SQL — это означает, что вы можете писать код, который работает с различными типами баз данных, такими как MySQL, SQLite, PostgreSQL и т. д., когда MODX расширяется до этих баз данных. Все без необходимости переписывать ни единой строки кода. Это делает его идеальным для авторов плагинов, которые хотят, чтобы их код был исполняемым на самых разнообразных системах.
  2. Экранирование параметров — больше не нужно беспокоиться о внедрении SQL; xPDO использует PDO PHP для экранирования всех передаваемых в вызов SQL переменных для предотвращения любых злонамеренных вызовов.
  3. Более чистый, короткий код — то, что ранее могло быть сделано в более, чем 40 строках в вызовах функций mysql_ *, теперь можно сделать в 10 строках или менее.

Есть и другие причины, но это для краткости. Давайте посмотрим на несколько примеров:

Пример кода БД

Давайте возьмем чанк с названием LineItem и изменим в нем плейсхолдеры (выполненные с помощью синтаксиса [[+placeholderName]]) на некоторые пользовательские значения:

Этот код получит чанк с именем LineItem и вернет его обработанным с установленным плейсхолдером. Переменная $chunk на самом деле представляет собой xPDOObject, который является объектным представлением ресурса.

Как насчет более сложных запросов? Как, скажем, получение первых 10 ресурсов с родителями 23, 24 или 25. И давайте сделаем так, чтобы они не были скрыты от меню или удалены, опубликованы и отсортированы по menuindex. Вот когда мы используем мощный метод $modx->newQuery():

Обратите внимание, как мы сначала создаем объект xPDOQuery ($c), используя $modx->newQuery(). Мы передали имя класса, из которого мы хотели построить запрос — здесь ‘modResource’ или ресурсы — и затем использовали нашу функцию where(), чтобы добавить некоторые ограничения. Затем мы отсортировали и ограничили их.

И, наконец, мы вызвали getCollection, которая — в отличие от getObject — возвращает коллекцию или массив xPDOObjects. Затем мы можем перебирать коллекцию, используя цикл foreach, и делать с элементами коллекции все, что мы хотим.

Дальнейшие подробности о работе с базой данных

Чтобы узнать больше о xPDO, прочитайте следующее:

Рекомендуемые методы и советы

Пишите свои сниппеты за пределами менеджера MODX

Начиная с 2.2.0, вы можете просто добавить «статический» сниппет: просто сослаться на статический файл.

До 2.2.0 это все еще довольно легко сделать — просто создайте сниппет ‘include’, но сделайте так, чтобы его содержимое было таким:

Вы можете использовать сниппет ‘include’ на странице, например:

И запускайте свои cниппеты извне, пока вы их разрабатываете!

Затем вы можете проверить их, чтобы убедиться, что они работают (например, в командной строке bash вы можете использовать команду php -l my_script.php, чтобы проверить скрипт на наличие синтаксических ошибок). В зависимости от вашей среды вы можете также получить несколько полезных сообщений об ошибках, которые помогут вам в отладке. Скопируйте и вставьте код в MODX, только когда вы уверены, что он работает.

Помните, что любой сниппет в файле на вашем веб-сайте может выполнить любой, у кого есть веб-браузер, поэтому не оставляйте его на живом сайте, если вы не разместили код сниппета вне корневого веб-каталога таким образом, чтобы файл не мог быть доступным через Интернет. В MODX Revolution вы можете поместить файлы сниппетов в основной каталог и переместить весь каталог за пределы корневого веб-каталога. Вы также можете поместить тест в сниппет, который заставляет его завершиться, если сниппет не работает внутри MODX. Однако безопаснее всего просто переместить файл или вставить код в сниппет в менеджере и удалить файл.

Не пытайтесь смешивать коды PHP и HTML в сниппете

Сниппеты выполняют PHP-код. Они всегда должны начинаться с Нельзя смешивать PHP и HTML в сниппете!

** Например, следующий код работать не будет:

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

Если вам нужно сделать что-то вроде этого, используйте чанк — выделите PHP в сниппет, загрузите его вывод в плейсхолдер с помощью функций-плейсхолдеров MODX API или обработайте сниппетом, и включите плейсхолдеры сниппета в чанк:

Не работайте с работающими сниппетами

Если вы пишете новые версии сниппетов, продублируйте старую версию! Таким образом, вы можете вернуться к старой версии кода, если что-то работает неправильно! MODX по своей сути не управляет версиями, поэтому вы должны сделать резервную копию кода самостоятельно.

Используйте свойства по умолчанию

Попробуйте добавить свойства по умолчанию для вашего сниппета на вкладку «Свойства», чтобы другой разработчик мог добавить пользовательские наборы свойств для их переопределения.

Источник статьи: http://docs.modx.com/3.x/ru/extending-modx/snippets

Написание сниппетов

Общее представление

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

Что такое сниппет?

Согласно одному определению, «сниппет» — это «короткий повторяющийся сниппет компьютерного исходного кода». Некоторым людям трудно отличить это от «чанка», поэтому полезная мнемоника может выглядеть так: сниппет это как «PHP», например, sni-P(h)P-et.

Как они работают?

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

Затем, как только они будут кэшированы, сниппеты затем обрабатываются парсером MODX. У них есть доступ к объекту $modx.

Простой пример

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

Если вы назвали этот сниппет «helloWorld», вы можете вызвать его, используя [[helloWorld]] в ваших документах, шаблонах или чанках (см. Синтаксис тегов). Вы также можете вызвать сниппет из другого сниппета, используя метод API runSnippet.

Обратите внимание, что мы возвращали код, а не выводили его содержимое. Никогда не используйте echo в сниппете — всегда возвращайте вывод.

Передача значений в сниппет

Значения передаются в ваш сниппет с использованием модифицированной нотации типа веб-формы CGI, которая следует за именем сниппета. Если ваш сниппет был назван «mySnippet», вы можете вызвать его, используя что-то вроде этого:

И код вашего сниппета может выглядеть примерно так:

Обратите внимание, что имена переменных в вызывающем бите должны точно соответствовать именам переменных в сниппете (регистр имеет значение, т.е. ‘input’, а не ‘INPUT’ или ‘Input’. Во-вторых, не забывайте «&» перед потенциальными именами переменных. И, наконец, что не менее важно, обратите внимание, что это обратные кавычки, а не одинарные кавычки!

Чтение значений в ваших сниппетах

В общем, вы можете прочитать ваши значения, сославшись на переданные аргументы: &someParameter в вызове преобразуется в $someParameter в коде PHP.

Вы также можете прочитать все параметры, используя встроенный массив $scriptProperties. Это полезно, если ваш сниппет принимает переменные параметры, т.е. он обрабатывает тот же вариант использования, что и PHP-функция func_get_args().

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

Тогда массив $scriptProperties будет содержать следующее:

Взаимодействие с базой данных в сниппетах

Доступ к слою базы данных в MODX основан на объектно-реляционной модели (ORM), называемой xPDO для подключения к базе данных, поэтому, чаще всего, вам не придется писать необработанные запросы к базе данных, как вы могли бы делать в других CMS. Обычно вы получаете доступ к данным из базы данных, используя несколько объектов и методов MODX, таких как getObject и getCollection. Это зависит от базовой структуры xPDO.

Почему ОРМ?

Вы можете спросить, зачем использовать ОРМ вместо простого SQL? Ну, хотя бы несколько причин ниже:

  1. Абстракция SQL — это означает, что вы можете писать код, который работает с различными типами баз данных, такими как MySQL, SQLite, PostgreSQL и т. д., когда MODX расширяется до этих баз данных. Все без необходимости переписывать ни единой строки кода. Это делает его идеальным для авторов плагинов, которые хотят, чтобы их код был исполняемым на самых разнообразных системах.
  2. Экранирование параметров — больше не нужно беспокоиться о внедрении SQL; xPDO использует PDO PHP для экранирования всех передаваемых в вызов SQL переменных для предотвращения любых злонамеренных вызовов.
  3. Более чистый, короткий код — то, что ранее могло быть сделано в более, чем 40 строках в вызовах функций mysql_ *, теперь можно сделать в 10 строках или менее.

Есть и другие причины, но это для краткости. Давайте посмотрим на несколько примеров:

Пример кода БД

Давайте возьмем чанк с названием LineItem и изменим в нем плейсхолдеры (выполненные с помощью синтаксиса [[+placeholderName]]) на некоторые пользовательские значения:

Этот код получит чанк с именем LineItem и вернет его обработанным с установленным плейсхолдером. Переменная $chunk на самом деле представляет собой xPDOObject, который является объектным представлением ресурса.

Как насчет более сложных запросов? Как, скажем, получение первых 10 ресурсов с родителями 23, 24 или 25. И давайте сделаем так, чтобы они не были скрыты от меню или удалены, опубликованы и отсортированы по menuindex. Вот когда мы используем мощный метод $modx->newQuery():

Обратите внимание, как мы сначала создаем объект xPDOQuery ($c), используя $modx->newQuery(). Мы передали имя класса, из которого мы хотели построить запрос — здесь ‘modResource’ или ресурсы — и затем использовали нашу функцию where(), чтобы добавить некоторые ограничения. Затем мы отсортировали и ограничили их.

И, наконец, мы вызвали getCollection, которая — в отличие от getObject — возвращает коллекцию или массив xPDOObjects. Затем мы можем перебирать коллекцию, используя цикл foreach, и делать с элементами коллекции все, что мы хотим.

Дальнейшие подробности о работе с базой данных

Чтобы узнать больше о xPDO, прочитайте следующее:

Рекомендуемые методы и советы

Пишите свои сниппеты за пределами менеджера MODX

Начиная с 2.2.0, вы можете просто добавить «статический» сниппет: просто сослаться на статический файл.

До 2.2.0 это все еще довольно легко сделать — просто создайте сниппет ‘include’, но сделайте так, чтобы его содержимое было таким:

Вы можете использовать сниппет ‘include’ на странице, например:

И запускайте свои cниппеты извне, пока вы их разрабатываете!

Затем вы можете проверить их, чтобы убедиться, что они работают (например, в командной строке bash вы можете использовать команду php -l my_script.php, чтобы проверить скрипт на наличие синтаксических ошибок). В зависимости от вашей среды вы можете также получить несколько полезных сообщений об ошибках, которые помогут вам в отладке. Скопируйте и вставьте код в MODX, только когда вы уверены, что он работает.

Помните, что любой сниппет в файле на вашем веб-сайте может выполнить любой, у кого есть веб-браузер, поэтому не оставляйте его на живом сайте, если вы не разместили код сниппета вне корневого веб-каталога таким образом, чтобы файл не мог быть доступным через Интернет. В MODX Revolution вы можете поместить файлы сниппетов в основной каталог и переместить весь каталог за пределы корневого веб-каталога. Вы также можете поместить тест в сниппет, который заставляет его завершиться, если сниппет не работает внутри MODX. Однако безопаснее всего просто переместить файл или вставить код в сниппет в менеджере и удалить файл.

Не пытайтесь смешивать коды PHP и HTML в сниппете

Сниппеты выполняют PHP-код. Они всегда должны начинаться с Нельзя смешивать PHP и HTML в сниппете!

** Например, следующий код работать не будет:

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

Если вам нужно сделать что-то вроде этого, используйте чанк — выделите PHP в сниппет, загрузите его вывод в плейсхолдер с помощью функций-плейсхолдеров MODX API или обработайте сниппетом, и включите плейсхолдеры сниппета в чанк:

Не работайте с работающими сниппетами

Если вы пишете новые версии сниппетов, продублируйте старую версию! Таким образом, вы можете вернуться к старой версии кода, если что-то работает неправильно! MODX по своей сути не управляет версиями, поэтому вы должны сделать резервную копию кода самостоятельно.

Используйте свойства по умолчанию

Попробуйте добавить свойства по умолчанию для вашего сниппета на вкладку «Свойства», чтобы другой разработчик мог добавить пользовательские наборы свойств для их переопределения.

Источник статьи: http://docs.modx.com/current/ru/extending-modx/snippets


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии