В данном цикле статей попробуем разобрать MODx Revolution по шагам от самого простого к самому сложному.
Для начала попробуем сразу обозначить какая информация для новичков, то есть для тех, кто с CMS на Вы в принципе, и для тех, кто уверенный веб-разработчик, и просто желает максимально быстро ознакомиться с данным движком, чтобы сходу взяться непосредственно за программирование на данном фреймворке.
В принципе, даже начинающему веб-программисту достаточно знать HTML + CSS, освоить базовые принципы разработки на MODx Revolution, шаблоны, чанки, базовые сниппеты и всё! Уже можно создавать несложные сайты.
Опытным программистам придется освоить гораздо больше, включая дополнительные TV-параметры, плагины, API и т.п.
Итак, попробуем разобрать в целом парадигму программирования под MODx Revolution.
1. Вся платформа держится на трех китах:
- xPDO. Это ответвление от библиотеки PDO, которая используется для работы с различными типами баз данных. Используя PDO для построения запросов к БД, вам не придется переписывать код при миграции на другой тип БД. Вам достаточно будет в настройках только указать соответствующий тип базы данных, а PDO уже сам при обращении к БД сгенерирует соответствующий SQL-запрос под эту БД.
- API MODx. API - это интерфейс программирования. Практически во всех случаях, когда вы будете писать свой PHP-код под MODx Revolution, вы будете так или иначе использовать объект $modx и его свойства. К примеру, для того, чтобы получить нужный нам документ, зная его ID, мы не будем писать кучу PHP и SQL кода, а просто вызовим $doc = $modx->getDocument($id);
Так же стоит сразу отметить, что $modx расширяет объект $xpdo, то есть все методы xPDO можно вызывать и через объект $modx, в том числе методы работы с кэшем, БД и т.п. - ExtJS/Sencha. Админ-панель полностью построена на этой мощной javascript-библиотеке. К сожалению, данная библиотека на сколько мощная, на столько же и сложная, по этому админка очень гибкая, но если вы захотите что-то в ней осознанно изменить, вам придется потратить не один день на освоение этой библиотеки.
Что интересно, админ-панель не является неотъемлемой частью всей платформы. Вы легко можете удалить папку /manager (то есть всю админку), и, зная API MODx, написать свою, более легкую админ-панель. Или просто создать несколько параллельных админ-панелей.
Вообще файловая модель MODx Revolution заслуживает особого внимания. Более детально об этом написано тут.
2. MODx Revolution - это конструктор. Для того, чтобы легко и быстро разрабатывать сайты на MODx Revolution, нужно четко понимать все программные элементы данной платформы. Практически все программные элементы MODx Revolution (кроме шаблонов и плагинов) прописываются в двойных квадратных скобках (параметры не обязательный аргумент, потому не обязательно указывать), и могут быть использованы в любом месте шаблона, а так же внутри друг друга. Вообще все это очень напоминает язык Objectiv-C, так же вызывается объект и ему передаются дополнительные сообщения, в свою очередь в качестве сообщения может быть передан и другой объект, к примеру ]]. Кратко опишем все эти элементы:
- Шаблон (Template). В MODx Revolution очень сильно развита модель MVC, то есть отделение визуализации от програмной части. Для всех типичных страниц не надо каждый раз прописывать весь HTML-код в отдельности, достаточно создать один HTML-шаблон, в котором будет присутствовать плейсхолдер , который в момент генерации страницы будет заменен на контент конкретной страницы. Так же в шаблоне могут быть использованы и другие объекты MODx, такие как сниппеты, чанки, TV-параметры и т.п.
- Дополнительные параметры (TV или Template Variables). В шаблоне вызывается . Очень полезная штука. К примеру, в каждом документе у нас есть базовые поля (Заголовок, расширенный заголовок, псевдоним, контент и т.п.). Но мы хотим так же добавить поле, в котором мы будем указывать путь к картинке превью. Вот мы создаем новый TV-параметр, указываем для каких шаблонов он доступен, и в дальнейшем, когда мы будем редактировать документ с таким шаблоном, у нас будет дополнительное поле, с помощью которого мы сможем выбрать картинку для этого документа. А в шаблоне мы просто вставим , и в этом месте будет выводиться значение этого дополнительного параметра.
- Сниппеты (Snippets). В шаблоне вызываются (кэшируемый сниппет) или (некэшируемый сниппет). Данный элемент содержит исполняемый PHP-код (только). Переданные в сниппет параметры будут доступны внутри кода сниппета как PHP-параметры. К примеру вызываем (наклонные ковычки ` используются для более явного опраделения начала и конца строкового значения параметра). Внутри сниппета эти параметры нам будут доступны как $param1 и $param2.
Рассмотрим простой пример: если вы хотите в шаблоне, к примеру, выводить текущее время, вы можете создать сниппет date, в нем прописать <?php return date('Y-m-d H:i:s');, а в шаблоне вызвать . В результате при генерации страницы в месте вызова этого сниппета будут выведены дата и время.
Вот на этом простом примере мы сразу и рассмотрим разницу между выводом кэшируемого сниппета () и некэшируемого (). Если страница кэшируемая (указывается соответствующей галочкой в настройках каждой конкретной страницы), то в момент генерации конечной страницы создается ее кэш, и весь конечный HTML-код хранится в таком кэше, и в момент следующего вызова этой страницы не происходит повторной генерации страницы в полной мере, а просто отдается HTML-код из кэша. Так вот, если мы вызываем кэшируемый сниппет (), то результат выполнения этого сниппета (в нашем случае дата и время), будет закэширован, то есть при обращении к этой же странице мы увидим не актуальную дату, а старую, не меняемую. Для того, чтобы сниппет каждый раз опять выполнялся, мы вызываем его с восклицательным знаком, который указывает, что данный сниппет некэшируемый (). В результате у нас будет все закэшировано, кроме этого сниппета, который будет вызываться каждый раз при обращении к странице. Так, грамотно оперируя с моделью страницы, мы можем значительно снизить нагрузку на сервер, сократить время генерации страниц, и при этом не потерять в функциональности. - Чанки (Chunks). В шаблоне вызывается . Данный элемент используется для HTML-кода. Переданные в чанк параметры будут видны в коде чанка как плейсхолдеры, то есть .
К примеру у вас во всех шаблонах будет выводиться одно и то же меню. Не нужно в каждом шаблоне прописывать это меню. Достаточно создать свой пользовательский чанк, к примеру mainMenu, прописать в этом чанке код меню, а к нужны шаблонах в месте вывода меню просто прописать чанк . Так же в чанк вы можете прописать не только статический HTML, но и другие объекты MODx. К примеру, для динамического формирования меню вы используете сниппет Wayfinder. Тогда в чанке вы прописываете вызов сниппета с параметрами (если они нужны) &level=2&outerClass=`main`]], а чанк уже вставить в шаблон в виде . В процессе генерации страницы MODx обработает переменную и заменит ее на системную настройку корня сайта, передаст это значение в сниппет Wayfinder, который сгенерирует код меню и вернет этот код в чанк, а конечный код чанка в свою очередь будет выведен в шаблон в место расположения этого чанка.
Все это может показаться довольно сложным, но поверьте - это на самом деле очень удобно, так как вы четко отделяете логику от статики. Вы четко отделяете динамические и статические элементы, и используете их как конструктор, оперируя ими как отдельными сущностями. В результате, когда вам нужно будет что-то поменять, вы не будете ковырять весь движек, а будете редактировать четко отдельный элемент. А за нагрузку не беспокойтесь. В MODx шикарная система кэширования, и раз сгенерировав страницу, в следующий раз при обращении к этой странице большая часть логики уже лежит как статический HTML. - Плейсхолдеры (Placeholders). В шаблоне вызываются . Плейсхолдеры - это статические переменные шаблонизатора. То есть если мы в шаблоне пропишем , то объявив плейсхолдер date и передав в него какое-либо значение, в момент обработки кода шаблонизатором, плейсхолдер будет заменен на его значение.
Плейсхолдер может быть объявлен двумяспособами:- Как мы уже говорили выше, он может быть передан в виде параметра в чанк.
- Через API MODx в сниппете или плагине: $modx->setPlaceholder($placeholderNname, $value).
- Системные настройки. В шаблоне вызываются . В качестве системных настроек мы можем перехватить, к примеру, название сайта (), полный адрес сайта (), адрес корня сайта () и т.п., а можем и свои указывать. Все настройки можно увидеть во вкладке Система->Настройки системы.
Системные настройки - отдельная история и будут рассмотрены в отдельной статье. - Плагины (Plugins). В шаблоне не вызываются никак. Плагины вызываются, срабатывая на определенные события (мы сами указываем на какие, к примеру OnWebPageInit, то есть в момент инициализации страницы, или OnPageNotFound, то есть в момент, когда страница не найдена).
Конечно плагин можно вызвать и через API MODx, но это не правильно.
Плагины - очень мощный инструмент, позволяющий легко расширить платформу, практически не трогая кода самой платформы. К примеру, я хочу добавить свой модуль к системе. Создаем плагин, называем его как хотим, назначаем ему выполнение в момент иинициализации страницы. В плагине прописываем, наш PHP код. В момент инициализации страницы код нашего плагина срабатывает внутри системы с полным доступом к объекту $modx. В результате мы можем и работать с настройками платформы, и воздействовать на всю логику в целом и т.п.
Итак, самое главное - это освоить эти элементы каждый в отдельности, и научиться использовать их совместно. В результате вы не заморачиваетесь с разработкой самой модели сайта, а программируете непосредственно сам сайт.
В дальнейших уроках мы рассмотрим каждый из представленных элементов в отдельности.