Modx подключить файл в сниппете

Обновлено: 25.06.2024

С MODX Revolution я работаю не так уж давно, но, тем не менее, на данный момент, для меня это CMS-жемчужина. Гибкость, расширяемость и интуитивность (Если на минутку забыть о злополучном MODX Manager), привлекают в ней всё так же, как и в самом начале.
Ниже представлены заметки, которые я делал по ходу работы с MODX Revolution на протяжении прошлого года. Эти несложные приёмы, знай я о них раньше, помогли бы мне сэкономить неимоверное количество времени. Целевая аудитория этих заметок — новички, лишь недавно разобравшиеся в том, что же такое MODX. Откровенные «велосипеды», из уважения к вам, в заметки включать не стал.

1. Упрощение работы с MODX Manager

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

Ещё одна вещь, которая имеет весьма неблагоприятное влияние на производительность — RSS-фиды на главной странице менеджера, сообщающие о новых версиях и фиксах безопасности. Отключаются следующим образом: System -> System Settings -> MODX News Feed Enabled/MODX Security Feed Enabled -> No.

2. Передача параметров в сниппет

Предположим, у вас есть сниппет по имени Monkeys, выводящий на страницу самую обычную строку:

Этот спиппет вам необходимо выводить на нескольких страницах с разным значением переменной $howMany. Делается это весьма просто:

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

3. Вызов MODX в статичном PHP файле

В случает, если сниппет вы используете лишь для include/require_once статичного файла, предыдущий приём всё равно сработает как положено. Но, что если необходимо использовать сам $modx объект? К примеру, забрать pagetitle определённого ресурса? Всё тоже весьма элементарно:

Теперь, подобные вещи, вы можете использовать сколько душе угодно:

3. Switch контекста в зависимости от домена

В вышеописанном приёме промелькнула такая строчка:

Это — инициализация default контекста, в котором, собственно, всё вышеописанное и отработает. Но, что если контекстов несколько, и каждый должен отображаться со своего определённого домена? Легко!

Данный свитч необходимо запускать либо в плагине, на событии OnHandleRequest, либо немного «раньше», в конце index.php, чего вам, пожалуй, никто из ныне живущих не посоветует.

4. Switch по контексту

При необходимости «разнообразить» ваш код для каждого из контекстов, можно использовать следующее:

Условие if($modx->context->get('key') != «mgr»), как вы уже догадались, предотвращает запуск кода прямо в менеджере.

5. Настройки контекста

Ещё один способ варьировать контент на имеющихся контекстах — индивидуальные настройки. Откройте нужный вам контекст и перейдите во кладку Context Settings. По нажатии Create New, укажите Key, и, соответственно, Value. Созданный вами ключ, вызывается в документе/чанке следующим образом:

6. Вызываем в контексте нужный нам чанк, не создавая отдельных настроек

Предыдущий метод, разумеется, хорош, но что если нам нужны всего лишь разные чанки в зависимости от контекста? Весьма полезен в этом плане ключ [[*context_key]], возвращающий имя текущего контекста. К примеру, создадим два чанка: Footer_Web и Footer_One, где Web и One — имена контекстов. Теперь, вызовем их на странице / в template:

7. modMail

modMail — класс, расширяемый modPHPMailer. По дефолту встроен в MODX и используется следующим образом:

*Выдержка из официальной документации.

8. Из сниппета в чанк

Вышеописанный пример берёт чанк myEmailTemplate в качестве template для нашего письма. Если в письме необходимо отобразить, к примеру Username, полученный из формы, мы делает следующее:

Таким образом, мы передаём Username в наш чанк myEmailTemplate. Получаем его в чанке, таким вот способом:

На сегодня всё. Если кому-либо будут интересны подобные заметки, готов с радостью их продолжить. Благодарю за внимание.

Начнем наш 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, и далее выбрать необходимый сниппет, загрузить его и установить. Все просто!

Установка сниппета в MODx Revolution

Тут я не буду останавливаться, более детально этот вопрос был освещен в 3 уроке, его можно почитать по этой ссылке Урок 3. Базовая настройка и установка дополнений

Простейший вызов сниппета

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

Большинство сниппетов в репозитории MODx хорошо задокументированны и положительно стремление всегда заглядывать в MODx документацию. Каждому сниппету посвящен отдельный раздел в форумах MODx, где можно задать вопрос и получить поддержку и квалифицированный ответ от разработчика сниппета. Если у вас проблемы со сниппетом, то эти форумы – лучше место, где можно получить ответ на вопрос либо решить возникшую проблему, 100% у кого-то она уже была до вас .

Что дальше?

Как я уже говорил – это всего лишь общее вступление. Реально рассматривать сниппеты мы начнем лишь на следующем занятии. А начнем мы с Wayfinder, сниппета который занимается построением несортированных списков и является идеальным инструментом для создания меню. Мы будем использовать Wayfinder для замены статического меню нашего сайта динамическим, которое будет отображать необходимые названия страниц.

Итак для работы вам необходимо установить сниппет Wayfinder в ваш сайт на MODx Revolution и таким образом подготовится к следующему уроку.

Рекомендую для прочтения

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 не работала, хоть ты тресни!

Сниппеты - это метод, с помощью которого 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, прочитайте следующее:

  • xPDO в пространстве xPDO
  • Получение объектов в xPDO
  • Объект xPDOQuery

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

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

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

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

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

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

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

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

Сниппеты выполняют PHP-код. Они всегда должны начинаться с <?php **<php> <em data-md-type="emphasis">Нельзя смешивать PHP и HTML в сниппете!</em></php> ** Например, следующий код работать не будет:

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

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

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

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

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

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

Рассмотрим базовые элементы движка MODX — чанки, сниппеты и плейсхолдеры. Они являются неотъемлемой частью сайтов на этой CMS, поэтому следует четко понимать их отличие и назначение. Посмотрим следующую схему:

основные элементы modx

Шаблон является базовым элементом в MODX . Это площадка, на которой размещаются остальные элементы. Любая страница сайта (ресурс) обязана быть привязана к одному из шаблонов.

Чанки

Чанки могут быть вложены друг в друга, содержать сниппеты и плейсхолдеры:

чанки в modx

Сниппеты в modx revo

Сниппет — это программный код (PHP,SQL,XPDO), в результате выполнения которого возвращается результат (аналог функций в PHP). Чаще всего результатом является html код, но это не обязательно. Например, он может произвести действия с базой данных и при этом ничего не вывести на экран. Вызываться сниппет может в шаблоне, чанке и даже в содержимом ресурса:

В примере используется стандартный вариант вызова сниппета с кешированием. В этом режиме при первом обращении к сниппету результат его работы кешируется, а при последующих обращениях — выдается сохраненный результат. Такой способ вызова ускоряет время генерации страницы и может применяться к элементам сайта, которые не требуют моментального обновления. Например, главное меню сайта, которое изменяется редко. Для запрета кеширования перед названием ставится восклицательный знак:

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

сниппеты в modx

Передача параметров сниппету

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

В коде сниппета получаем параметры. При этом, можно задать значение, которое будет присваиваться переменной, если параметр не указывался ('', 'black'). Далее производим вычисления и возвращаем результат.

Передача плейсхолдеров в чанк

Мы реализовали задуманное, но при этом нарушили негласное правило — смешали программный код и теги оформления. Если кому-то потребуется обернуть результат не в тег «span», а в «div», то могут возникнуть проблемы. Конечно, хорошо когда в коде всего десять строк, а если их будет тысяча? Для избежания таких проблем отделим «мух от котлет».

Создадим чанк «tplCountChar», внутрь которого поместим плейсхолдеры:

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

Результат работы: 11 символов!

Запуск сниппета из сниппета

Про тонкости разработки сниппетов в MODX Revolution можно написать целую книгу, поэтому я ограничусь ещё только одной «фишкой» — возможностью запускать из своего сниппета сторонние. При создании сайтов такой функционал будет требоваться крайне редко, поэтому считайте эту информацию лишь небольшим бонусом.

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

Плейсхолдеры в MODX

Из предыдущих примеров Вы, наверно, уже поняли что такое плейсхолдеры. Фактически, плейсхолдер это переменная , которую генерирует сниппет. Вызывается он следующим образом:

Есть ещё системные плейсхолдеры. Они берутся из системных настроек MODX и доступны для вызова в любом месте сайта:

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

Читайте также: