Magento для разработчиков: Часть II - Конфиг в Magento

Last modified by vso on Sun, January 16, 2011 12:02
Source|Old Revisions  

ПРОЛОГ

Это продолжение перевода из серии статей Элана Сторма. Статья вторая http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-2-the-magento-config

По прежнему любые корректировки для улучшения перевода приветствуются

ВВЕДЕНИЕ

Конфиг это рабочее сердце Magento. Он описывает, полностью, едва ли не каждый модуль, модель, класс, шаблон и т.д., что Вам необходимо для доступа. С таким уровнем абстракции большинство PHP разработчиков не имеют привычки работать, и хотя это добавляет времени в виде путаницы и начального программирования, это так же предоставляет Вам беспрецедентную степень гибкости в переопределении поведения системы по умолчанию. Для начала мы собираемся создать Magento модуль, который позволит нам увидеть системный конфиг в нашем веб браузере. Во время исследования кода ниже, его стоит проходить самостоятельно, рассматривая это как способ начать понимать вещи, которые Вы будете делать с Magento, а так же как изучение азов терминологии.

НАСТРОЙКА СТРУКТУРЫ ДИРЕКТОРИЙ МОДУЛЯ

Мы собираемся создать модуль Magento. Модуль это группа php и xml файлов предназначенные для расширения системы новыми возможностями или переопределение поведение базовых возможностей. Это может означать добавление дополнительной информации для отслеживания торговой информации, изменение поведения существующих классов или добавление полностью новых возможностей. Стоит отметить, что большая часть базовой системы Magento построена с использованием того же модуля, который вы будете использовать. Если Вы взгляните на

app/code/core/Mage

каждая папка это отдельный модуль созданный командой Magento. Вместе все эти модули формируют систему интернет магазина используемого Вами. Ваши же модули должны размещаться в следующей папке

app/code/local/Packagename

“Packagename” должна быть уникальной строкой для Namespace/Package Вашего кода. В не официальном соглашении принято использовать название вашей компании. Идея в том чтобы ни у кого не было возможности использовать такое же слово.

app/code/local/Microsoft

Мы используем “Magentotutorial”. И так, чтобы добавить модуль в систему вашей, создайте следующую структуру каталогов

app/code/local/Magentotutorial/Configviewer/Block
app/code/local/Magentotutorial/Configviewer/controllers
app/code/local/Magentotutorial/Configviewer/etc
app/code/local/Magentotutorial/Configviewer/Helper
app/code/local/Magentotutorial/Configviewer/Model
app/code/local/Magentotutorial/Configviewer/sql

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

app/code/local/Magentotutorial/Configviewer/etc/config.xml

Второй необходимо создать по следующему пути

app/etc/modules/Magentotutorial_Configviewer.xml

Соглашение об именовании этих файлов такое Packagename_Modulename.xml. Файл config.xml должен содержать следующий XML. Сейчас сильно не задумывайтесь что все это значит, мы будем делать это постоянно

  1. <config>   
  2.     <modules>
  3.         <Magentotutorial_Configviewer>
  4.             <version>0.1.0</version>
  5.         </Magentotutorial_Configviewer>
  6.     </modules>
  7. </config>

Наконец, Magentotutorial_Configviewer.xml должен содержать следующий xml.

  1. <config>
  2.     <modules>
  3.         <Magentotutorial_Configviewer>
  4.             <active>true</active>
  5.             <codePool>local</codePool>
  6.         </Magentotutorial_Configviewer>
  7.     </modules>
  8. </config>

Это все. Сейчас Вы имеете каркас модуля, который ничего не делает, but that Magento will be aware of. Чтобы убедится, что Вы сделали все правильно, сделайте следующее:

  1. Очистите кэш
  2. В Админ панели Magento, следуйте System(Система)→Configuration(Настройка)→Advanced(Дополнительно)
  3. В панели In the “Disable modules output(Отключить вывод модулей)” проверьте что Magentotutorial_Configviewer отображается

Поздравляю, Вы создали первый модуль в Magento!

СОЗДАНИЕ КОНФИГА ДЛЯ МОДУЛЯ

Конечно, модуль все еще ничего не делает. Когда мы закончим, наш модуль будет делать

  1. Проверять существует ли переменная “showConfig” в строке запроса
  2. Если showConfig присутствует, выводить на экран конфиг нашего Magento и останавливать дальнейшее выполнение
  3. Проверять на существование в строке запроса дополнительной переменной showConfigFormat, что позволит нам увидеть специфичный текст или xml.

Для начала нам следует добавить секцию <global> в наш файл config.xml

  1. <config>
  2.     <modules>...</modules>
  3.     <global>
  4.         <events>
  5.             <controller_front_init_routers>
  6.                 <observers>
  7.                     <Magentotutorial_configviewer_model_observer>
  8.                         <type>singleton</type>                         
  9.                         <class>Magentotutorial_Configviewer_Model_Observer</class>
  10.                         <method>checkForConfigRequest</method>
  11.                     </Magentotutorial_configviewer_model_observer>
  12.                 </observers>
  13.             </controller_front_init_routers>
  14.         </events>
  15.     </global>
  16. </config>

Затем создаем файл

Magentotutorial/Configviewer/Model/Observer.php

и пишем следующий код

  1. <?php
  2.     class Magentotutorial_Configviewer_Model_Observer {
  3.         const FLAG_SHOW_CONFIG = 'showConfig';
  4.         const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';     
  5.  
  6.         private $request;
  7.  
  8.         public function checkForConfigRequest($observer) {         
  9.             $this->request = $observer->getEvent()->getData('front')->getRequest();
  10.             if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){
  11.                 $this->setHeader();
  12.                 $this->outputConfig();
  13.             }
  14.         }
  15.  
  16.         private function setHeader() {
  17.             $format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
  18.             $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';                               
  19.             switch($format){
  20.                 case 'text':
  21.                     header("Content-Type: text/plain");
  22.                     break;
  23.                 default:
  24.                     header("Content-Type: text/xml");
  25.             }           
  26.         }
  27.  
  28.         private function outputConfig() {           
  29.             die(Mage::app()->getConfig()->getNode()->asXML());     
  30.         }
  31.     }

Это все. Очищаем кэш опять и загружаем любую URL со строкой запроса showConfig=true

http://magento.example.com/?showConfig=true

ЧТО Я НАБЛЮДАЮ?

Вы должны наблюдать огромный XML файл. Он описывает состояние Вашей системы Magento. Он демонстрирует все модули, модели, классы, слушатели событий и даже то что вы не можете себе вообразить. Например, относительно файла config.xml, созданного ранее. Если Вы изучите текст этого XML файла в Вашем браузере, Вы найдете Ваш слушающий класс Configviewer_Model_Observer. Каждый config.xml файл модулей исследуется и включается в глобальный конфиг.

ПОЧЕМУ Я ТАК ЩЕПЕТИЛЕН?

На данный момент это может показаться эзотерикой, но этот конфиг является ключом к пониманию Magento. Каждый модуль, создаваемый Вами будет добавляться в этот конфиг и в любое время когда необходим доступ к конкретному функционалу ядра системы, Magento будет обращаться к конфигу за этим. Маленький пример: Как MVC разработчику, Вам приходилось работать с некоторыми видами классов помощников, что-то типа

  1. $helper_sales = new HelperSales();

Одной из особенностей Magento возможность декларировать абстрактные PHP классы. В Magento, код выше выглядит следующим образом

$helper_sales = Mage::helper('sales');

План действий метода Помощника будет:

  1. Найти секцию <helpers /> в Конфиге.
  2. В секции <helpers />, найти секцию <sales />
  3. В секции <sales />, найти секцию <class />
  4. Обработать класс найденный в пункте #3 (Mage_SalesRule_Helper)

Пока это выглядит громоздко, ключевым же преимуществом является то, что всегда за именем класса исследуется файл Конфига, это позволяет изменять базовую функциональность Magento без изменения или добавления кода в базовые файлы. Это наивысший уровень программирования, обычно не встречающийся в PHP, позволяет Вам расширить только необходимую Вам часть системы.




 

Magento 2 GitHub Repository

Magento Job Board - Some sort of tag line goes here

Latest Posts| View all Jobs