MODX: лучшая CMS, которой вы никогда не пользовались
CMS MODX – система управления контентом, которая была выпущена в 2005 году. В 2009 году, она была представлена под кодовыми именами Evolution и Revolution. Версия Evolution была основана на оригинальном коде, в то время как Revolution была полностью переписана с нуля. Наша сегодняшняя статья посвящена по большей части Revolution.

В консоли управления MODX вы сможете создавать собственные плагины и скрипты, и при этом иметь доступ к ассортименту платных дополнений.
Более подробная информация представлена на главной странице сайта MODX и в разделе «О нас».
Знакома ли вам эта CMS?
MODX – это больше фреймворк для разработчиков, и уж точно не как готовое решение для любителей «конструкторов». Это не лучший вариант для тех, кто не знает PHP и HTML. Здесь нет конструкторов меню или готовых модулей, которые можно перетащить в шаблон.
Я бы сказал, что MODX – больше CMF (content management framework, «фреймворк для управления контентом»), а не CMS. В нем можно использовать API для управления скриптами, без готовых шаблонов страниц и постов.
Копнём глубже
CMS MODX шаблоны разработаны на PHP. Она работает на всех популярных серверах, включая Apache, IIS, Lighttpd и nginx. Она использует MySQL, а в качестве ORB (object-relational bridge, «объектно-реляционный мост») - xPDO.
Консоль управления в MODX реализована при помощи ExtJS, Smarty-шаблонов, и собственного API. можно самостоятельно редактировать консоль управления и панели инструментов.
Собственные меню, полный контроль над ACL (списки контроля доступов) – все это в вашем распоряжении. Но для полноценной работы с функционалом потребуются определенные навыки и знания.
Платформа MODX поддерживается компанией MODX, LLC. У нее есть и другие продукты, включая облачный хостинг и консалтинговые услуги. Выбирая MODX, можно быть уверенным в надежности, так как компания вряд ли внезапно исчезнет или прекратит поддержку своего проекта.
Обучение и документация
MODX предлагает отличную документацию, включая видеоролики, книги, а также сообщество на форуме. Я думаю, вам будет полезно для начала ознакомиться просмотреть несколько обучающих видео и пробежаться по документации, чтобы хоть немного вникнуть в суть.
Установка
MODX можно установить, только скачав ZIP-архив и загрузив его содержимое на сервер:

Скачиваем MODX
В ядре данной платформы отсутствуют автоматические обновления. Но есть дополнение, которое позволит без труда обновляться до свежих релизов. Кстати говоря, все дополнения также просто обновляются через консоль.
Управление проектом происходит через GitHub, и там всегда можно найти свежие скриншоты и релизы проекта. Я рекомендую скачать самую последнюю версию платформы и загрузить ее на свой сервер.
Чем примечательна CMS MODX
CMS MODX Evolution – это нечто вроде движка для продвинутых пользователей. С самого начала перед вами будет пустой шаблон, над которым придется поработать, а также сотня настроек и функций, с помощью которых можно полностью адаптировать платформу под собственные проекты. Здесь нет никаких конструкторов, помощников, drag and drop интерфейсов, виджетов и прочих удобств.
Если вам нравится писать код вручную, MODX вам точно подойдет. Эта CMS позволяет достаточно быстро обучиться ручной переработке сайтов.
Если вам нужно получить мультиязычную, многосайтовую платформу с раздельным контентом и отдельными уникальными панелями управления для клиентов, то вы точно оцените то, на что способна MODX.
Её можно использовать для создания API, форумов, блогов, корпоративных сайтов, сайтов-визиток! Здесь может быть несколько языков, расширенные настройки прав доступа и безопасности, а также возможность настраивать административные панели под каждого клиента.
Создание веб-страницы
Для формирования веб-страницы в MODX используется стек элементов. Так называемые шаблоны, сниппеты, фрагменты кода, переменные шаблона, а также собственная система тегов:

В шаблонах при помощи тегов можно использовать пользовательские данные, данные о текущей странице, метаданные, глобальные системные настройки, переменные, фрагменты кода, сниппеты или заглушки.
Использование MODX предполагает работу над HTML-шаблоном, а также парсинг HTML-кода в готовые фрагменты, а PHP-кода — в сниппеты. Также в шаблонах можно использовать любые произвольные поля. Далее после MODX CMS установки нужно создать ресурс, привязать его к шаблону, заполнить нужные поля, и на этом все!
Resource (ресурс) — обозначение конечной точки. Это то, что указывается в URL-адресе. Тип содержимого ресурса может быть отличным от HTML (например, PDF или двоичные данные). Можно установить принудительное скачивание контента или же отображать его прямо в браузере. Ресурс может даже вести на файл или на внешнюю страницу, либо перенаправлять посетителя на другой контент в пределах сайта.
Template (шаблон) — это рамка (фрейм), в которой отображается контент. Все ресурсы привязываются к шаблону.
Chunk (фрагмент кода) — это HTML или JS-код с возможностью повторного использования.
Snippets (сниппеты) используются для PHP-кода. У сниппетов есть доступ к ядру MODX и ко всем его объектам.
Сниппеты могут запускать фрагменты, и наоборот. Шаблоны и ресурсы могут запускать и то и другое. Это четыре основных составляющих, при помощи которых можно формировать веб-страницы.
Plugin (плагины) способны расширять функционал ядра.
Template Variable (переменная шаблона) — это любые произвольные данные, которые могут понадобиться внутри шаблона, и для которых можно указать ресурс. Например, можно использовать переменную шаблона для произвольного изображения баннера на странице, но потом каждый ресурс может привязать иное изображение для отображения шаблоне. Это что-то вроде произвольных полей WordPress, но с большим набором функций.
Можно комбинировать любые из этих элементов при помощи категорий (Categories). Не забывайте их использовать, чтобы фрагменты кода и сниппеты были организованы, и ими было проще пользоваться.
Знакомство с административной панелью (Manager)
Админ-панель CMS MODX Revolution основывается на ExtJS. За счет этого в ней можно работать с drag and drop интерфейсом, формами, динамическими таблицами, контекстным меню для правой кнопки мыши и многим другим.
Удобная функция управления позволяет указывать источники медиа-ресурсов, которые также привязываются к правам доступа. У вас могут быть такие ресурсы, доступ к которым клиент получает только после авторизации. При этом конкретные ресурсы для определенных пользователей могут быть доступны только в режиме read-only.
Настройки системы основываются на пространстве имён. Можно создать пространство имён для самого себя и отдельно для того, чтобы использовать его в каком-то из элементов приложения.
Административная панель не такая уж и сложная, просто требуется некоторое время на знакомство и изучение всех функций и возможностей:

Контекст

Хочу обратить ваше внимание на пункт Website. Это «Контекст», который отвечает за то, что видят пользователи, когда попадают на ваш сайт. У контекстов могут быть абсолютно разные древа ресурсов, права доступа, язык и т. д. По умолчанию, контекст Mgr скрыт из древа.
Контексты можно расценивать как полностью отдельные сайты, хотя даже крупные и сложные ресурсы редко пользуются преимуществом от создания дополнительных контекстов. Одно из распространенных применений контекстов заключается в создании на сайте раздела для зарегистрированных пользователей. Все, что от вас требуется, это запретить гостям видеть определенный контекст.
Можно использовать контексты как вам заблагорассудится. Но будьте готовы к тому, что если пользователь авторизован в одном из контекстов, это совсем не значит, что у него будет доступ ко всем другим. Если нужно сделать одну форму авторизации для всех контекстов, то понадобится немного поработать.
Контексты можно использовать для отделения разделов сайта. Некоторые используют их для разделения версий сайта на разных языках.
Шаблоны и теги
Я уже упоминал о том, что в CMS MODX есть встроенная система тегов шаблона. Давайте кратко ознакомимся с ее.
Каждый тег открывается и закрывается двумя квадратными скобками [[ … ]].
Специальные символы определяют, что именно используется: фрагмент кода, ресурсы или системные настройки. Как ими пользоваться:
[[*...]]: звёздочка отвечает за ресурсы. То есть, за конкретные данные, используемые текущим источником. Например, заголовок страницы или основной контент. Аналогичным образом можно использовать переменные шаблона.
[[++...]]: осуществляется поиск системных настроек, будь то site_url или произвольная настройка вроде company_phone1 (если до этого вы ее создали).
[[~##]]: этот тег генерирует URL для ресурса по ID (например, [[~32]]).
[[$...]]: этот тег извлекает HTML-код из фрагмента.
[[...]]: тег без спецсимвола приведет к запуску сниппета.
[[%...]]: выводит языковую строку.
[[-...]]: комментарий к коду MODX.
[[!...]]: восклицательный знак указывает MODX на то, что не нужно кешировать вывод данного тега; его нужно использовать в дополнение к предыдущим символам. Если вы вызываете [[!$SomeChunk]], то вывод будет обрабатываться каждый раз вместо того, чтобы выводиться из кеша. Я уже говорил, что в MODX CMS функциональные возможности входит встроенная система кеширования?
Параметры тегов
К тегам можно применять параметры и фильтры и таким образом изменять их вывод. Например, можно добавить несколько параметров к автоматически сгенерированному URL-адресу:
<a href="[[~17? §ion=`food` &sort=`asc`]]">Здесь</a>
Из примера видно, что синтаксис с применением параметров слегка отличается от параметров в привычной строке запроса URL. Вопросительный знак обозначает начало списка параметров, и каждый параметр начинается со знака &, а значение заключаются в обратные кавычки.
Вывод приведенного выше тега будет выглядеть следующим образом:
<a href="yourpage?section=food&sort=asc">Здесь</a>
Сниппет также можно снабдить дополнительными данными, если запустить его подобным образом:
[[!MyCustomSnippet? &input=`something tasty`]]
Мы запускаем сниппет с названием MyCustomSnippet, и задаем ему дополнительные данные через поле input со значением something tasty. В PHP автоматически создается переменная с именем $input, которую позже можно использовать в сниппете.
Теги можно встраивать друг в друга. Один из популярных тегов выглядит следующим образом:
<a href="[[~[[*id]]]]">Ссылка на страницу</a>
Здесь есть указание ресурса [[*id]], встроенное в тег ссылки [[~#]]. Внутренние теги парсятся до внешних.
В иных случаях можно запускать HTML-код и выводить динамические данные, извлекаемые из сниппета. Выглядеть это будет так:
[[$AChunk? &data=`[[!GetTheData]]`]]
Тег chunk использует сниппет для того, чтобы знать, о каких именно данных идет речь.
Так как приведенный выше тег запускает фрагмент, состоящий только из HTML-кода, то как он считывает значения данных? Они доступны автоматически благодаря тегу placeholder:
<h2>Заголовок</h2>
<p>[[+data]]</p>
Заглушки (placeholders) чаще всего используют именно так.
Фильтры вывода
В CMS MODX Revolution теги принимают не только параметры. К ним также можно применять фильтры вывода. Фильтры запускают код постобработки вывода. Можно образовать цепочку из нескольких фильтров. Самый простой пример, приведенный ниже, изменяет регистр строки:
[[SomeSnippet:ucase]]
Фильтр начинается с двоеточия, и должен быть указан до параметров. Посмотрите, как выглядит цепочка из нескольких фильтров:
[[SomeSnippet:ucase:replace=`this==that`? ¶m1=`Go big`]]
В данном примере результат объявления Snippet сначала конвертируется в верхний регистр, а затем запускается специальный фильтр replace, который и меняет положение дел. После фильтров идет перечисление параметров, которое начинается с вопросительного знака.
Стандартных фильтров не так уж много, и ознакомиться с ними можно здесь.
Любой сниппет можно применять как фильтр. Для этого нужно использовать название сниппета в качестве фильтра:
[[$CallingChunk:mySnippet]]
Какой бы HTML-код ни отправлялся с помощью CallingChunk, у mySnippet будет к нему доступ, и его можно будет изменять. Значение $CallingChunk доступно в PHP внутри переменной $input, где вы получите в ответ отредактированное значение (подробнее об этом можно узнать здесь).
Также фильтры можно применять для создания полноценной логики «if then else».
Если и этого недостаточно
В сайтах на MODX CMS можно распределять контент по категориям, выстраивать отношения элементов в формате parent/child, группировать контент в целях безопасности, создавать плагины для валидации данных, которые вносят ваши пользователи.
Также можно редактировать типы контента и MIME-данные, расширения страниц (использовать .html или нет), а в качестве источника медиафайлов использовать библиотеку Amazon S3.
Редактировать все можно как в формате простого текста/HTML-кода или ради удобства установить дополнения вроде TinyMCE, CodeMirror или ACE. Здесь даже есть свой редактор для Markdown. Это уже не говоря про расширения для отслеживания редакций и экспорта кода для последующего использования в других сайтах на MODX.
У элементов тоже есть свойства, напоминающие системные настройки, которые предназначены исключительно для конкретного элемента. Так что, если вы создали сниппет на PHP, то его свойства можно использовать для создания стандартных настроек для подобных модулей.
В MODX CMS админке переменные шаблонов можно распределять по категориям, а затем использовать отдельными группами при редактировании ресурсов. Это удобно, когда нужно создавать произвольный контент, который пользователи впоследствии смогут изменять.
Недостатки
Revolution демонстрирует нам опыт разработчиков, но при этом не задействует некоторые современные PSR-стандарты типа автоматической загрузки или пространства имён.
MODX действительно многофункциональна, безопасна и готова к масштабированию. Однако вы, скорее всего, часто будете сталкиваться с критикой от многих разработчиков.
Еще одна проблема заключается в использовании ExtJS. Этот фреймворк хорош, но в MODX используется его устаревшая версия. И обновить ее нельзя, так как это нарушит поддержку множества сторонних дополнений.
Не считая этих основных недостатков, единственные сложности, с которыми я сталкивался при работе с MODX, заключаются в настройке платформы на серверной стороне. Этой проблеме посвящена отдельная ветка на официальном форуме системы.
В завершение

В этой статье я попытался предоставить как можно больше информации об этой малоизвестной, но крайне интересной CMS.
Как и любой другой инструмент, эта платформа подходит не для всех случаев. Я не буду рекомендовать CMS MODX технически не подкованным людям. Но если вы разработчик с хорошим опытом, и вам необходимо предложить клиентам максимально защищенное решение, то это подходящий вариант.
Если нужна полная свобода с точки зрения дизайна, и у вас есть навыки в разработке, то рекомендую попробовать MODX в действии!