Конфігурування(config) є серцем Magento-системи. Цей опис, майже в цілому, буде навколо module/model/class/template/etc. Це рівень абстракції, з яким, більшість розробників PHP не звикли працювати. І хоча, він збільшує час розробки у вигляді безладу і заплутаності, він також дозволяє мати безпрецедентну гнучкість, перекриваючи базові функції системи власними, не втручаючись в ядро.
Почнемо з того, що ми створимо модуль Magento, котрий дозволить переглядати конфігурацію системи в вікні веб-браузера. Поки все, що вам потрібно запам’ятати, це копіювання і вставка, це дорога до комфортного освоєння технік роботи з Magento, так і до освоєння термінології.
Для нетерплячих, завершений модуль може бути завантажений тут: (http://alanstorm.com/2005/projects/MagentoConfigViewer.tar.gz).
Налаштування структури директорій модуля
Варто відзначити, що більша частина базової системи Magento побудована з використанням модульної системи, яку ви будете використовувати. Якщо подивитеся в
app/code/core/Mage
Кожна папка представляє собою окремий модуль, побудований різними командами. Разом, ці модулі утворюють систему взаємодії, яку ви використовуєте. Ваші модулі, повинні бути поміщені в таку папку
app/code/local/Packagename
“Packagename” повинен бути унікальним в комбінації Namespace/Package. Є неофіційне правило, що воно має містити назву вашої компанії. Ідея полягає у виборі комбінації назви, котру ніхто інший, у цілому світі, не буде використовувати.
app/code/local/Microsoft
Коли я працюю на своїх проектах Magento, я використовую версію мого доменного імені, “Alanstormdotcom“.
Таким чином, щоб додати модуль до вашої Magento-системи, створіть наступну структуру каталогів
app/code/local/Alanstormdotcom/Configviewer/Block
app/code/local/Alanstormdotcom/Configviewer/controllers
app/code/local/Alanstormdotcom/Configviewer/etc
app/code/local/Alanstormdotcom/Configviewer/Helper
app/code/local/Alanstormdotcom/Configviewer/Model
app/code/local/Alanstormdotcom/Configviewer/sql
Вам не потрібно буде всі ці папки для кожного модуля, але створити їх всіх одразу – хороша ідея.
Далі, потрібно створити два файли. По-перше, це config.xml. Його зберігаємо у папці
app/code/local/Alanstormdotcom/Configviewer/etc/config.xml
Другий файл (Alanstormdotcom_Configviewer.xml), повинен бути створений за адресою
app/etc/modules/Alanstormdotcom_Configviewer.xml
Домовлено, що іменуватись ці файли мають як Packagename_Modulename.xml.
Файл config.xml, повинен містити наступну XML. (Не турбуйтеся надто сильно про те, що робить цей весь код, про нього, ми дізнаємось найближчим часом)
<config> <modules> <Alanstormdotcom_Configviewer> <version>0.1.0</version> </Alanstormdotcom_Configviewer> </modules> </config>
В кінці-кінців, Alanstormdotcom_Configviewer.xml повинна містити наступну XML.
<config> <modules> <Alanstormdotcom_Configviewer> <active>true</active> <codePool>local</codePool> </Alanstormdotcom_Configviewer> </modules> </config>
От і все, тепер у вас є голий кістяк модуля, який не буде робити нічого, але Magento його буде бачити. Щоб переконатися, у правильності Ваших дій
- Очистіть кеш Magento
- У меню адміністратора Magento, перейдіть до система-> Конфігурація-> Додатково(System->Configuration->Advanced)
- Розгорніть “Відключити модулі виводу”(“Disable modules output”) (якщо це ще не реалізовано)
- Переконайтеся, що Alanstormdotcom_Configviewer з’явився у списку
Вітаємо, ви створили свій перший модуль Magento!
Створюємо Config модуля
Звичайно, цей модуль ще нічого не робить. Але коли ми його закінчимо, то він буде
- Переварювати існування змінної “showConfig” в рядку запиту
- Якщо “showConfig” в наявності, то показує нашу Magento-конфігурацію і зупиняє поточне виконання процесу
- Перевіряє в запиті, наявність додаткової змінної, showConfigFormat, що дозволить нам визначити у якому форматі виводити результат – текстовому чи XML.
По-перше, до нашого config.xml файлу, ми збираємося додати розділ <Global>:
<config> <modules>...</modules> <global> <events> <controller_front_init_routers> <observers> <alanstormdotcom_configviewer_model_observer> <type>singleton</type> <class>Alanstormdotcom_Configviewer_Model_Observer</class> <method>checkForConfigRequest</method> </alanstormdotcom_configviewer_model_observer> </observers> </controller_front_init_routers> </events> </global> </config>
Потім створюємо файл в
Alanstormdotcom/Configviewer/Model/Observer.php
і розміщуємо тут наступний код
<?php class Alanstormdotcom_Configviewer_Model_Observer { const FLAG_SHOW_CONFIG = 'showConfig'; const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat'; private $request; public function checkForConfigRequest($observer) { $this->request = $observer->getEvent()->getData('front')->getRequest(); if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){ $this->setHeader(); $this->outputConfig(); } } private function setHeader() { $format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ? $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml'; switch($format){ case 'text': header("Content-Type: text/plain"); break; default: header("Content-Type: text/xml"); } } private function outputConfig() { die(Mage::app()->getConfig()->getNode()->asXML()); } }
Ось і все. Очистіть кеш Magento, а потім завантажте будь який Magento-URL(запит) з доданим до нього рядком “showConfig=true”:
http://magento.example.com/?showConfig=true
На що я звертаю увагу?
Ви повинні глянути на гігантській XML файл. Це опис стану вашої Magento-системи. У ньому перераховані всі модулі, моделі, класи, обробники подій чи майже все, про що ви б могли подумати.
Для прикладу, розглянемо створений вище файл config.xml. Якщо ви шукаєте XML-файл у вашому браузері для тексту
Configviewer_Model_Observer
ви знайдете цей клас зарахованим у файл. Кожен модуль файлу config.xml розбирається Magento і включається в глобальну конфігурацію(global config).
Для чого це мені?
Зараз це може здатися дивним, але ця конфігурація є ключем до розуміння Magento. Кожен модуль, який ви будете створювати додадуть до цієї конфігурації, і весь час вам потрібно мати доступ до базової частини функціональності системи. Magento буде повертатись до конфігурації і шукати потрібне.
Невеличкий приклад, перед тим як ми перейдемо до більш практичних речей. Як розробник MVC, ви, ймовірно, працювали якимось допоміжними класами, екземплярами щось на зразок
$helper_sales = new HelperSales();
Одна з речей, яку зробив Magento – це абстрагування від декларативних класів PHP. У Magento, згаданий вище код, виглядає приблизно так
$helper_sales = Mage::helper('sales/data');
Простою мовою, цей статичний метод буде:
- Подивиться секцію <helpers />, в розділі Config .
- В <helpers />, подивіться секцію <sales />.
- В секції <sales /> гляне на секцію <class />.
- Використає базове ім’я класу, знайдене в пункті #3 (Mage_Sales_Helper), щоб побудувати повне ім’я класу Mage_Sales_Helper_Data
На перший погляд це багато роботи(так і є), але ключовою перевагою є можливість подивиться в конфігураційному файлі ім’я класів. Також, ми можемо перевизначити базову функціональність Magento без зміни або додавання до ядра системи додаткового коду. Цей рівень мета-програмування, як правило, не зустрічається в PHP, але він дозволяє акуратно розширити тільки ті частини системи, які потрібно.
Allan Storm ( http://alanstorm.com/magento_config )
Переклад: Ненько Сергій( snenko@gmail.com )