RSS Мои друзья Контакты

Magento конфигурация от А до Я: базовые настройки модуля

Magento, как и любая другая современная система, состоит из модулей. Понятно, что любой модуль имеет свои настройки. По-этому для написания дополнительного функционала стоит разораться с их форматом в Magento.

В Magento основная часть конфигурации модуля находится в файле  etc/config.xml. Для оптимизации загрузки модуля, часть конфигурации можно вынести в adminhtml.xml, но об этом позже.

Структура конфигурации модуля

Любая конфигурация модуля состоит из корневого элемента config (заголовок XML-я необязательный) и нескольких базовых секций: modules, frontend, adminhtml, global, admin, default, crontab

<config>
<modules>.................</modules>
<frontend>................</frontend>
<adminhtml>...............</adminhtml>
<global>..................</global>
<default>.................</default>
<crontab>.................</crontab>
<admin>...................</admin>
</config>

В секции modules находится информация об имени и версии модуля, в случае Mage_Cms

<Mage_Cms>
<version>0.7.13</version>
</Mage_Cms>

Секция frontend задает настройки модуля для фронта (т.е. сайта): настройка роутинга, обсерверов событий, переводов и layout-update-ов.

<frontend>
<routers>
<cms>
<use>standard</use>
<args>
<module>Mage_Cms</module>
<frontName>cms</frontName>
</args>
</cms>
</routers>
<events>
<controller_action_noroute>
<observers>
<cms>
<class>cms/observer</class>
<method>noRoute</method>
</cms>
</observers>
</controller_action_noroute>
<controller_action_nocookies>
<observers>
<cms>
<class>cms/observer</class>
<method>noCookies</method>
</cms>
</observers>
</controller_action_nocookies>
</events>
<translate>
<modules>
<Mage_Cms>
<files>
<default>Mage_Cms.csv</default>
</files>
</Mage_Cms>
</modules>
</translate>
<layout>
<updates>
<cms>
<file>cms.xml</file>
</cms>
</updates>
</layout>
</frontend>

В секции routers указываем, какие запросы будут обрабатываться контроллерами данного модуля. Каждое правило роутинга имеет свое имя, оно задается в качестве имени первого тега, в данном случае - <cms>, т.е. имя - cms. Тег use задает, какую модель роутера использовать в данном случае используем стандартный. Для его инициализации нужно передать аргументы и это можно сделать при помощи тега args. Для стандартного роутера нужно передать имя модуля и префикс запроса - frontName. Теперь все запросы по адресу http://BASE_URL/cms/* будут обрабатываться контроллерами модуля Mage_CMS.

В секции events задаем настройки для обсерверов. Имя любого дочернего тега в секции events является названием события в Magento. В случае с модулем Mage_Cms указываем, что при возникновении события controller_action_noroute нужно вызвать метод noRoute модели cms/observer. Благодаря этому, в административном интерфейсе существует возможность создать собственную страницу и приаттачить ее на  404 HTTP ошибку.

В секции translate можно указать название файла для локализации (в Magento для этого используются csv файлы).

В секции layout можно указать файл, в котором прописаны настройки для layout-update-ов.

Для секции adminhtml справедливо все то, что и для frontend. Разница только в том, что эти настройки будут применяться для административной части, а не для фронта. Чтобы файл config.xml не был слишком большим (что замедляет его загрузку и разбор xml), все директивы относящиеся к секции adminhtml (т.е. к административному интерфейсу) можно вынести в отдельный файл - adminhtml.xml. Именно так и сделано в модуле Mage_Cms

<config>
<menu>.....</menu>
<acl>
<resources>
<admin>
<children>....</children>
</admin>
</resources>
</acl>
</config>

Конфигурация обычно состоит из 2 секций: menu и acl, но также можно указывать и другие директивы (например, events, layout-update и т.д.). Первая отвечает за добавление новых элементов в меню административной части, а вторая - за права доступа, т.е. ACL. Рассмотрим секцию menu

<cms translate="title" module="cms">
<title>CMS</title>
<sort_order>70</sort_order>
<children>
<page translate="title" module="cms">
<title>Pages</title>
<action>adminhtml/cms_page</action>
<sort_order>0</sort_order>
</page>
<block translate="title" module="cms">
<title>Static Blocks</title>
<action>adminhtml/cms_block</action>
<sort_order>10</sort_order>
</block>
</children>
</cms>

Чтобы добавить новый элемент меню нужно указать: title, action и sort_order. Атрибут translate указывает, содержимое какого тега нужно переводить, нужно указывать для каждого элемента меню. Атрибут module указывает используемый модуль, не смотря на то, что он указан для каждого тега, его можно задать только для верхнего родительского элемента (в данном случае cms), для остальных он пронаследуется.

Тег action указывает на модель контроллера. Например, adminhtml/cms_page - Mage_Adminhtml_Cms_PageController.

Перейдем к секции acl

<cms translate="title" module="cms">
<title>CMS</title>
<sort_order>70</sort_order>
<children>
<block translate="title">
<title>Static Blocks</title>
<sort_order>10</sort_order>
</block>
<page translate="title">
<title>Pages</title>
<sort_order>0</sort_order>
<children>
<save translate="title">
<title>Save Page</title>
<sort_order>0</sort_order>
</save>
<delete translate="title">
<title>Delete Page</title>
<sort_order>10</sort_order>
</delete>
</children>
</page>
<media_gallery translate="title">
<title>Media Gallery</title>
<sort_order>20</sort_order>
</media_gallery>
</children>
</cms>

В ACL можно задать структуру для возможности изменения прав доступа в административной панели (System -> Permissions -> Выбрать роль -> Role Resources -> Custom). Потом проверить имеет ли пользователь права на определенные действия можно при помощи конструкции

Mage::getSingleton('admin/session')->isAllowed('cms/page/save');

А в контроллере при помощи метода _isAllowed (пример взят из Mage_Adminhtml_Cms_PageController класса)

/**
* Check the permission to run it
*
* @return boolean
*/

protected function _isAllowed()
{
switch ($this->getRequest()->getActionName()) {
case 'new':
case 'save':
return Mage::getSingleton('admin/session')->isAllowed('cms/page/save');
break;
case 'delete':
return Mage::getSingleton('admin/session')->isAllowed('cms/page/delete');
break;
default:
return Mage::getSingleton('admin/session')->isAllowed('cms/page');
break;
}
}

Будьте внимательны в файле adminhtml.xml можно задавать только права доступа (acl) и добавлять новые элементы меню!

В секции global можно задавать тоже самое, что и в секции frontend. Директивы из этой секции будут применяться, как для фронта, так и для административной части. Здесь в основном задаются префиксы для имен классов

<blocks>
<cms><class>Mage_Cms_Block</class></cms>
</blocks>
<helpers>
<cms><class>Mage_Cms_Helper</class></cms>
</helpers>
<models>
<cms>
<class>Mage_Cms_Model</class>
<resourceModel>cms_mysql4</resourceModel>
</cms>
<cms_mysql4>
<class>Mage_Cms_Model_Mysql4</class>
<entities>
<page>
<table>cms_page</table>
</page>
<page_store>
<table>cms_page_store</table>
</page_store>
<block>
<table>cms_block</table>
</block>
<block_store>
<table>cms_block_store</table>
</block_store>
</entities>
</cms_mysql4>
</models>

Когда Magento обрабатывает layout-update-ы и видит конструкцию

<block type="cms/block" name="cms_footer_links" before="footer_links" />

То сначала она разбирает атрибут type, который указывает класс блока. cms/block - первая часть (до слэша) определяет модуль - Mage_Cms. Смотрим настройки данного модуля, находим содержимое blocks/cms/class, в данном случае Mage_Cms_Block и добавляем к нему вторую часть от атрибута type (после слэша, в данном случае block) и получаем имя класса Mage_Cms_Block_Block. Аналогично все происходит для моделей и хелперов.

Бизнес модель связана с ресурс моделью при помощи тега models/cms/resourceModel, в котором хранится имя другого тега, отвечающего за конфигурацию последней. В данном случае - это тег cms_mysql4. В теге models/cms/cms_mysql4/entities указываются имена и элиасы таблиц в базе данных, доступ к которым можно получить в ресурс модели при помощи конструкции

$blocksTable = $this->getTable('cms/block'); # cms_block

В данном случае метод смотрит конфигурацию модуля (models/cms_mysql4/entities/block/table) и возвращает его контент. Если такого тега не существует, то возвращается передаваемая строка. По-этому рекомендуется обращаться к имени таблицы именно таким методом, а не хардкодить или писать, что-то вроде

$blocksTable = $this->getTable('cms_block');

потому что это неправильно!

В секции default можно прописать настройки по умолчанию для Magento, именно те, которые можно редактировать в System -> Configuration. Например, часть секции из модуля Mage_Cms

<default>
<cms>
<wysiwyg>
<enabled>enabled</enabled>
</wysiwyg>
</cms>

<!-- another configs -->
</default>

указывает, что по умолчанию WYSIWYG редактор включен.

В секции crontab можно создать задание, которое выполнится через крон в Magento. Информация о всех заданиях крона хранится в таблице cron_schedule. Рассмотрим пример из модуля Mage_Newsletter

<crontab>
<jobs>
<newsletter_send_all>
<schedule><cron_expr>*/5 * * * *</cron_expr></schedule>
<run><model>newsletter/observer::scheduledSend</model></run>
</newsletter_send_all>
</jobs>
</crontab>

Имена всех дочерних тегов секции crontab/jobs являются именами заданий в таблице крона и хранятся в поле job_code. В данном случае задача называется newsletter_send_all. В секции schedule/cron_expr задается периодичность выполнения задания, в данном случае каждые 5 минут. Формат похож на тот, который используется в Linux cron табе. В директиве run/model задается модель (newsletter/observer) и метод, который нужно запустить в определенное время (scheduledSend).

Последняя секции admin - в основном здесь прописываются правила роутинга для административной панели

<admin>
<routers>
<adminhtml>
<args>
<modules>
<importexport before="Mage_Adminhtml">Mage_ImportExport_Adminhtml</importexport>
</modules>
</args>
</adminhtml>
</routers>
</admin>

На последок

В файле конфигурации также могут быть и нестандартные теги. Например, в модуле Mage_ImportExport есть секция global/importexport. Доступ к нестандартным настройкам можно получить при помощи конструкции

$dataArray = Mage::getConfig()->getNode('global/importexport')->asCanonicalArray();

Добавить комментарий

Комментариев: 5

  • ForceMan
    Ответить 14 ноября 2011 г., 18:59
    Большое спасибо за труды!
  • ForceMan
    Ответить 14 ноября 2011 г., 19:00
    Если можна предложить тему я бы предложил модели в магенто от А до Я )))
    • Сергей (Администратор)
      Ответить 14 ноября 2011 г., 20:46
      Конечно можно! Возьму на заметку, но сначала будет еще одна статья о конфигурации
  • Dima
    Ответить 29 ноября 2011 г., 23:08
    Спасибо за статьи!
    Очень интересны темы по Magento.
  • Виктор
    Ответить 16 марта 2012 г., 1:49
    Спасибо. Очень просто и наглядно.