В данной статье я хочу рассмотреть некоторые новые возможности MODx Revolution, которых не было в младшей ветке – MODx Evolution.

С данной CMF я начал работать еще когда была доступна версия modx-2.0.0-beta-2, т.е. примерно полтора года назад. Могу сказать, что за период с лета 2009 г., когда система была только в стадии беты, до релиза летом 2010 г., MODx прошел большой путь в своем развитии, добавились новые возможности, стал быстрее и лучше работать старый функционал. Я считаю, что в настоящее время MODx Revolution является действительно мощной платформой для построения самых разнообразных веб-приложений, от простейших сайтов до больших порталов. Итак, начнём.

Я постараюсь описать следующие нововведения MODx Revolution:

  • xPDO
  • Пространства имен
  • Контексты
  • Новая система кэширования
  • Интернационализация

Теперь обо всем по порядку.

xPDO

Сначала выдержка из описания xPDO с официального сайта:

xPDO – это легковесная ORB-библиотека, которая работает на PHP 4 и 5, предоставляя преимущества нового стандарта доступа к базам данных в PHP 5.1 и выше – PDO. Она реализует очень простой, но эффективный паттерн Active Record для доступа к данным.

xPDO – разрабатываемая сообществом MODx ORB-библиотека, на которой базируется вся работа системы, даже основной класс MODx является наследником класса xPDO. В MODx Revolution все операции с базой данных выполняются с помощью xPDO, разработчикам компонентов также рекомендуется использовать эту библиотеку, однако старый механизм работы с базой данных из MODx Evolution пока оставлен для обратной совместимости.

xPDO позволяет использовать единый интерфейс для связи с различными типами баз данных. На данный момент доступны коннекторы для MySQL и SQLite, в дальнейшем планируется расширение списка поддерживаемых БД.

Все манипуляции с данными выполняются с помощью специализированных методов. Для выборки, создания, обновления и удаления данных не требуется использование прямых запросов, благодаря чему практически исключаются SQL-инъекции.

Следующий пример выбирает из базы данных все ресурсы в контексте web, у которых родительский ресурс установлен в 3 и распечатывает их заголовки.

//выбираем ресурсы по заданному условию
$resources = $modx->getCollection(“modResource”, array(
“parent” => 3,
“context_key” => “web”
));
//проходим по полученному массиву и выводим заголовок ресурса
foreach ($resources as $resource) {
echo($resource->get(“pagetitle”).”|”);
}
 
Похожим образом выполняются создание, редактирование и удаление объектов:
 
//создаем новый объект
$resource = $modx->newObject(“modResource”);
//устанавливаем заголовок и содержимое страницы
$resource->set(“pagetitle”, “Мой заголовок”);
$resource->set(“content”, “Мое содержимое”);
//и сохраняем в базу данных.
//Внимание! До вызова этого метода данные в базу данных не запишутся!
$resource->save();
 
//получаем ресурс с идентификатором 1
$resource = $modx->getObject(“modResource”, 1);
//устанавливаем новый заголовок
$resource->set(“pagetitle”, “Новый заголовок”);
//и сохраняем изменения
$resource->save();
 
//получаем ресурс с идентификатором 5
$resource = $modx->getObject(“modResource”, 5);
//и удаляем его
$resource->remove();

Пространства имен

Пространства имен используются для идентификации различных компонентов, не входящих в ядро системы. Фактически, пространство имен – это папка в core/components, содержащая в себе файлы моделей для xPDO, словари и прочие необходимые компонентам ресурсы.

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

Контексты

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

Политики доступа к контекстам реализуются с помощью набора прав, которые устанавливаются для определенной группы пользователей в некотором контексте. Следовательно, можно запретить определенным пользователям редактировать или даже просматривать ресурсы в определенном контексте. По умолчанию в системе после установки присутствуют 2 контекста: web (контекст пользовательской части сайта) и mgr (контекст административной панели).

В контексте web анонимные пользователи имеют права только на просмотр ресурсов, а пользователи, входящие в группу Administrator имеют полные права на все действия с ресурсами. Соответственно, в контексте mgr только пользователи из группы Administrator, могут выполнять любые действия с ресурсами.

Контексты можно использовать для создания нескольких сайтов на одной инсталляции MODx Revolution, а также для создания субдоменов, в которых пользователи сайта могут размещать свои материалы. Однако для реализации такого поведения потребуется небольшая правка файла index.php, поскольку в нем по умолчанию инициализируется контекст web, а нам потребуется в некоторых случаях инициализировать другие контексты.

Новая система кэширования

MODx Revolution предоставляет новую систему кэширования, с помощью которой программист может хранить в кэше любые данные и полностью управлять их жизненным циклом. Пример записи и извлечения данных из кэша (взят из официальной документации MODx):

// пишем что-то в кэш
$colors = array('red','blue','green');
$modx->cacheManager->set('colors',$colors); /* запишется в core/cache/colors.cache.php */
 
// теперь получаем записанные данные
$colors = $modx->cacheManager->get('colors');
foreach ($colors as $color) {
echo $color.'-';
} /* выведет 'red-blue-green' */

Также сохраненные данные можно удалить. Пример удаления:

$modx->cacheManager->delete('colors'); 

Интернационализация

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

Рассмотрим пример организации хранения системных словарей MODx в файловой системе.

Корневая папка словарей содержит в себе подпапки, имена которых совпадают с обозначениями языков, принятыми IANA (например, en или ru). Далее каждая языковая подпапка содержит в себе файлы с именами в формате имя_темы.inc.php. И каждый файл с темой содержит в себе строки в формате

$_lang['идентификатор_строки'] = 'значение_строки';

На страницу сайта значение строки из словаря вставляется следующим тегом:

[[%идентификатор_строки? &topic=`имя_темы` &namespace=`modx` &language=`язык`]]

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

Я попытался рассмотреть только некоторые новые возможности MODx Revolution. Эта система таит в себе гораздо больше, чем я сейчас могу себе представить. Я с удовольствием продолжаю изучать эту замечательную, на мой взгляд, CMF, и еще ни разу в ней не разочаровался.

Ресурсы

Автор Александр Шевяков, http://stavsandro.habrahabr.ru/
Оригинальная статья http://habrahabr.ru/blogs/modx/111448/
Публикуется с разрешения автора.