0,0
рейтинг
8 января 2011 в 12:07

Разработка → Заметки программиста о новых возможностях MODx Revolution из песочницы

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

Я постараюсь описать следующие нововведения MODx Revolution:
  1. xPDO
  2. Пространства имен
  3. Контексты
  4. Новая система кэширования
  5. Интернационализация

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


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, и еще ни разу в ней не разочаровался.

Ресурсы

  1. Официальный сайт MODx
  2. Документация MODx
  3. Сайт xPDO
  4. MODx Россия
  5. Неофициальное русскоязычное сообщество MODx
Александр Шевяков @stavsandro
карма
11,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (35)

  • +3
    Пока не смог себя заставить перейти на Revo. Админка совершенно не родная, перегружен аяксом и вообще, как-то все не очевидно в ней.

    Пока наблюдаю процесс улучшения Revolution, и с интересом читаю о ней статьи.

    Спасибо!
    • +1
      С перегруженностью админки полностью согласен. На ранних бетах админка очень сильно тормозила, но сейчас все стало намного лучше, хотя, конечно, со скоростью Evo ей до сих пор не сравниться.

      Думаю, что будущее все-таки за Revo.

      В дальнейшем я постараюсь разобрать подробней каждый аспект нововведений в MODx Revolution.
      • 0
        Будущее — согласен, за ней, когда нибудь.

        С Evolution работать легко и приятно, а для Revo в пору уже курсы обучения проводить.

        Буду ждать новых топиков! Возможно, благодаря вам, я на нее перейду )
      • 0
        можно попросить скринкаст/топик по правильной настройке окружения для рабочего сайт?
        допустим с задачей разделить «внешних» пользователей, редакторов и администраторов по правам и возможностям
        • 0
          возможно это поможет (http://community.modx-cms.ru/blog/documentation/869.html)

          Это подробное описание прав доступа в системе. В новой версии появились шаблоны политик доступа, но с документацией команда запаздывает. Проблемы с документацией, кстати, многих разделов касаются.
  • +3
    Забыли про модификаторы — очень удобная вещь! [[+title:trim=`100`]] (их много)
    rtfm.modx.com/display/revolution20/Input+and+Output+Filters
    • 0
      Спасибо!

      В следующий раз обязательно опишу их. Помимо модификаторов плейсхолдеров там есть еще новые фишки, которые я не описал.
      • 0
        Было бы очень интересно почитать более развернутый пост про все эти фишки и как с ними работать (вкратце конечто же, чтобы заинтересоваться и прочесть документацию).
        Помню, когда MODx только начал мелькать на хабре, его называли мечтой верстальщика. По различным причинам я так и не стал им пользоваться, не просек его фишку. Надеюсь, что с Revolution будет иначе и он удовлетворит моим потребностям.
        • 0
          Я надеюсь, что смогу помочь.
        • 0
          К сожалению, документации пока не сильно много. Например в разделе о том, как создавать свои страницы в админке, в документации нету нормального описания, как работать с ExtJS объектами системы (DataGrid и т.д.)
      • 0
        Я как-то начинал писать серию статей о MODx Revolution: http://habrahabr.ru/blogs/modx/108154/
        но потом так получилось, что пришлось работать с Evo, а от Revo отойти и работу над очередной статьей приостановил. Просто напомнил об этой статье чтобы вы не повторяли то, что там уже описано :). Так же буду благодарен, если продолжите писать про Revo.
        • 0
          Спасибо, я учту ваши наработки.
  • –1
    А Вы когда-нибудь организовывали посещаемые ресурсы (более 1000 посетителей за 12 часов) с количеством объектов(пусть даже страниц) от 2000 с 15 связанными свойствами для каждого объекта и двумя языковыми версиями?
    • 0
      Такие ресурсы я не организовывал.

      MODx Revolution сейчас нетороплив, поэтому создание такого ресурса «в лоб», без кэширования, безусловно ничего хорошего не принесет. Основные тормоза наблюдаются в формировании кэша контекста, и при выборке списка ресурсов на сайте. Но кэш контекста формируется один раз при изменении количества ресурсов, а результат выборки списка ресурсов можно кэшировать, тем более что уже есть компоненты, позволяющие это делать. Что касается многоязычности, то здесь особых проблем не наблюдается, админка целиком построена на словарях.
    • 0
      Такие универсальные комбайны никогда не смогут решить проблему высоких нагрузок, об этом знают почти все. Но при должном подходе такой проект можно организовать.
  • 0
    У меня интернет-магазин на modx+shopkeeper. Много дописанного функционала, но работает супер.
    • 0
      какая версия modX?
      • 0
        1.0.4
    • 0
      Поделитесь линкой, хоть заценим на что способна эта связка.
      • 0
        На сайте Shopkeeper есть галерея сайтов.
      • 0
        Как только допилим новости, то опубликую статью на хабре.
  • 0
    Не подскажите как в Shopkeeper организовать накопительную систему скидок?
    • 0
      Прошу прощения, это было к этому комментарию habrahabr.ru/blogs/modx/111448/#comment_3555477
      • 0
        Емнип, нету там такого функционала. Поэтому надо делать самим.
  • 0
    Кто-нибудь знает Эво еще будет обновляться?
    • 0
      Вряд ли.

      Обновление Evo — это Revo. Другой вопрос, что не все ему рады, но разработчики считают, что Evo расширять уже некуда. Он стабильный и пригодный для большинства проектов, но будущее на Revo.

      Правда, мне это будущее пока не нравится.

    • 0
      Насколько говорит нам баг-трекер Evo, релизы еще будут, команда MODx ведет параллельную разработку Evo и Revo.
      • 0
        Но очень медленно, учитывая 6 bugfix-релизов Revo и ни одного Evo за это время.
  • 0
    Не слишком внушительно. Система кеширования революционна
  • +1
    Revo очень нравится. Жаль, только, что xPDO еще не всесилен. Когда потребовалось сделать запрос, в котором в условии WHERE используется какая-нибудь sql-функция — он не осилил, что собственно и подтвердили на официальном форуме. Пришлось делать по-старинке.
    В любом случае, считаю MODx пока что лучшей CMF, с которой я сталкивался.
  • –2
    Почитал как то в инете про MODX — крутая современная CMS типа.
    Да выглядит действительно солидно. Но взглянув на код внутри, я понял что это УГ, что Evo что Revo.
    Так что вернулся обратно на Joomla!, до которой MODX по качеству API никогда не достигнуть и уж тем более по кол-ву расширений.
    • +1
      А можно конкретнее что в коде MODx вас напугало и что в коде Joomla радует глаз? Иначе ваш коммент — троллинг.
      • –2
        Конкретно — исходный код напугал. Внешне же выглядит все прилично, но внутри какая-то ересь, нету подхода MVC и нормальной модульности.
        • +1
          нету подхода MVC и нормальной модульности

          Это по-вашему конкретика? По-моему это пустословие. Всё там есть. Чтобы убедиться достаточно посмотреть здесь: api.modxcms.com/
          • –1
            ладно есть — но MVC неполноценна в MODX, нету его в общепринятом понимании — когда есть контроллеры модели вьювсы и это все должно быть гибким и заменяемым.
            А не когда система предлагает свои не очевидные элементы на которых все сильно завязано.

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