четверг, 17 декабря 2009 г.

Плагины (plugins) в MODx

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

Значение плагинов трудно переоценить. На самом деле использование этих «невидимых помощников» позволяет аккуратно подправлять поведение ядра системы точно настолько, насколько это нужно для целей конкретного проекта — и совершенно без модификации кода ядра системы (что частенько приходится делать с многими другими CMS). А раз ядро остается нетронутым, то меньше проблем с безопасностью, и можно спокойно обновлять систему, не боясь потерять патчи. Ave MODx! :)

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

Template Service Events
  • OnDocPublished
  • OnDocUnPublished
  • OnLoadWebDocument
  • OnLogPageHit
  • OnParseDocument
  • OnWebPageComplete
  • OnWebPageInit
  • OnWebPagePrerender
Cache Service Events
  • OnBeforeCacheUpdate
  • OnBeforeSaveWebPageCache
  • OnCacheUpdate
  • OnLoadWebPageCache
Web Access Service Events
  • OnBeforeWebLogin
  • OnBeforeWebLogout
  • OnWebAuthentication
  • OnWebChangePassword
  • OnWebCreateGroup
  • OnWebDeleteUser
  • OnWebLogin
  • OnWebLogout
  • OnWebSaveUser
Manager Access Events
  • OnBeforeManagerLogin
  • OnBeforeManagerLogout
  • OnBeforeManagerPageInit
  • OnManagerAuthentication
  • OnManagerChangePassword
  • OnManagerCreateGroup
  • OnManagerDeleteUser
  • OnManagerLogin
  • OnManagerLoginFormPrerender
  • OnManagerLoginFormRender
  • OnManagerLogout
  • OnManagerPageInit
  • OnManagerSaveUser
  • OnManagerWelcomeHome
  • OnManagerWelcomePrerender
  • OnManagerWelcomeRender
Parser Service Events
  • OnFileManagerUpload
  • OnPageNotFound
  • OnPageUnauthorized
  • OnSiteRefresh
Chunks
  • OnBeforeChunkFormDelete
  • OnBeforeChunkFormSave
  • OnChunkFormDelete
  • OnChunkFormPrerender
  • OnChunkFormRender
  • OnChunkFormSave
Documents
  • OnBeforeDocDuplicate
  • OnBeforeDocFormDelete
  • OnBeforeDocFormSave
  • OnBeforeEmptyTrash
  • OnCreateDocGroup
  • OnDocDuplicate
  • OnDocFormDelete
  • OnDocFormPrerender
  • OnDocFormRender
  • OnDocFormSave
  • OnEmptyTrash
  • OnStripAlias
Modules
  • OnBeforeModFormDelete
  • OnBeforeModFormSave
  • OnModFormDelete
  • OnModFormPrerender
  • OnModFormRender
  • OnModFormSave
Plugins
  • OnBeforePluginFormDelete
  • OnBeforePluginFormSave
  • OnPluginFormDelete
  • OnPluginFormPrerender
  • OnPluginFormRender
  • OnPluginFormSave
RichText Editor
  • OnRichTextEditorInit
  • OnRichTextEditorRegister
Snippets
  • OnBeforeSnipFormDelete
  • OnBeforeSnipFormSave
  • OnSnipFormDelete
  • OnSnipFormPrerender
  • OnSnipFormRender
  • OnSnipFormSave
System Settings
  • OnFriendlyURLSettingsRender
  • OnInterfaceSettingsRender
  • OnMiscSettingsRender
  • OnSiteSettingsRender
  • OnUserSettingsRender
Template Variables
  • OnBeforeTVFormDelete
  • OnBeforeTVFormSave
  • OnTVFormDelete
  • OnTVFormPrerender
  • OnTVFormRender
  • OnTVFormSave
Templates
  • OnBeforeTempFormDelete
  • OnBeforeTempFormSave
  • OnTempFormDelete
  • OnTempFormPrerender
  • OnTempFormRender
  • OnTempFormSave
Users
  • OnBeforeUserFormDelete
  • OnBeforeUserFormSave
  • OnUserFormDelete
  • OnUserFormPrerender
  • OnUserFormRender
  • OnUserFormSave
Web Users
  • OnBeforeWUsrFormDelete
  • OnBeforeWUsrFormSave
  • OnWUsrFormDelete
  • OnWUsrFormPrerender
  • OnWUsrFormRender
  • OnWUsrFormSave

среда, 16 декабря 2009 г.

Сниппеты в MODx



Сниппеты (snippets) — это чистый PHP-код, обеспечивающий динамическую логику. Сниппеты позволяют отделить бизнес-логику от структуры и представления данных на веб-странице. Они могут использоваться для генерации динамических меню, вывода контента из базы данных по некоему условию (например, только для зарегистрированных пользователей), вообще, для любых действий, доступных через MODx API. Сниппеты могут (но не обязаны) принимать параметры и выводить какой-либо результат (например, генерировать HTML-код).

Использовать сниппеты не так очевидно, как чанки, однако сложная красота этого процесса не сразу, но удивляет с положительной стороны. Вставляем [[snippetName]] или [!snippetName!] где-либо в шаблоне, в области контента, в чанке или в параметре шаблона (TV).

Важно: Формат [[snippetName]] разрешает кэширование результатов выполнения сниппета, если для страницы включено кэширование. Формат [!snippetName!] кеширование запрещает, и используется для исполнения PHP-кода сниппета при каждом просмотре страницы, даже если для страницы разрешено кэширование.

Чтобы при вызове PHP-кода сниппета передать в него параметры, нужно просто указать их в виде [[snippetName? &param1='value1' &param2='value2' .. &paramN='valueN']] (или [!snippetName? &param1='value1' &param2='value2' .. &paramN='valueN'!]). В качестве параметров вызова сниппета можно использовать вызов других сниппетов (также с параметрами) или чанков.

вторник, 15 декабря 2009 г.

Новая версия ветки 2.х (Revolution)

Вышел MODx Revolution 2.0.0-beta-5. Новой версией "бету-5" назвать сложно, но список улучшений в очередной раз значителен. Интересно, что будет в финальном релизе Revolution?

Чанки (chunks) в MODx




Одна из ситуаций, когда термин выглядит страшнее самого понятия. Чанк (от chunk) — это кусочек исходного текста страницы, которому присвоено имя. В том месте шаблона, где хочется видеть содержимое чанка, просто пишем имя чанка в двойных фигурных скобках — и все! Чанк можно использовать в шаблонах, в области контента, в коде других чанков, либо в параметре шаблона (TV).


Да, вот так просто — скажем, заводим чанк counters, и в него пишем код счетчиков, которые надо встраивать в страницу. В коде шаблона страницы пишем {{counters}}, и код счетчиков оказывается в нужном месте.

Польза, против прямым указыванием кода тех же счетчиков в шаблоне страниц, весьма заметная. Во-первых, шаблонов у нас может быть (и частенько есть) больше одного, и, раз указав в них ссылку на чанк, мы экономим себе время на правку каждого шаблона по одному. Во-вторых, повышается наглядность работы, и уменьшает захламленность шаблона маловажными данными.

Есть еще одно применение чанкам — благодаря им можно изменить вывод плагинов (таких, как Wayfinder или Ditto). Такой подход кажется громоздким, но он позволяет довольно понятно выкручиваться в сложных ситуациях.

На случай — чанки подставляются (выводятся) в самом начале обработки страницы, а потому не могут содержать server-side код (напр., PHP). C другой стороны, в чанках можно использовать все то, что можно писать в шаблоне, напр., вызов сниппетов. Скажем, удобно создать чанк, который выводит, например, статей раздела, и использовать в нужных местах нужных шаблонов именно чанк.