Magento для PHP MVC розробників (Alan Storm) – ч.1/11

 

Частина 1. Конфігурування Magento. Створення модуля

 

Конфігурування є серцем Magento-системи. Тож в цьому описові майже вся увага буде зосереджена на конфігурації модуля (module/etc). Це рівень абстракції, з яким більшість PHP-розробників не звикли працювати. І хоча така логіка збільшує час розробки через безлад і заплутаність на початку, вона також надає безпрецедентну гнучкість та можливість переписувати базові функції системи своїми власними (не втручаючись в саме ядро).

Почнемо з того, що ми створимо модуль Magento, котрий дозволить переглядати всю конфігурацію системи у вікні веб-браузера. На початковій стадії від вас вимагається лише вміти копіювати та вставляти шматки коду. Трохи згодом ви вже й самі будете знати без пояснень, що той чи інший код робить.

 

 

Налаштування структури каталогів модуля

Варто відзначити, що більша частина базової системи Magento побудована з використанням модульної системи. Якщо ви подивитеся в app/code/core/Mage, то побачите, що кожна папка представляє собою окремий модуль, кожен з яких розроблявся різними командами програмістів компанії. Усі разом ці модулі утворюють загальну систему двигуна (ядро).

Ваші власні модулі повинні розміщуватись в цьому каталогові: app/code/local/Packagename.

“Packagename” (назва пакету модулів) повинен бути унікальним в комбінації Namespace/Package (простір імен/пакет). Це неофіційне правило, і воно заключається в тому, що назва пакету модулів повинна включати назву вашої компанії (або особисті ініціали). Ідея полягає в тому, щоб назва модулів була унікальна і не збігалася із наявними у цілому світі.

Коли я працюю над своїми проектами з Magento, я використовую версію мого доменного імені (Alanstormdotcom). Ви повинні ж використовувати власний простір імен.

 

Таким чином, щоб додати новий модуль до вашої Magento-системи, створіть наступну структуру каталогів. Зверніть увагу, що використовується локальне середовище розробки (local), тобто ми не змінюємо код ядра (core). Alanstormdotcom – це назва пакету модулів (використовуйте власну назву), а Configviewer – це назва модуля.

 

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, а потім завантажте будь який URL свого сайту на Magento з доданим в кінці рядком ?showConfig=true

    vash-domen/?showConfig=true

 

 

На що звернути увагу?

Перейшовши за таким лінком ви побачите гігантській XML файл. Це повний опис стану поточної Magento-системи. У ньому перераховані всі модулі, моделі, класи, обробники подій та майже все, що вам може знадобитись при розробці.

Для прикладу, розглянемо створений вище файл config.xml. Якщо ви скористаєтесь пошуком у браузері (Ctrl+F) і перевірите наявність рядка Configviewer_Model_Observer, то ви знайдете цей клас у описі системи. Кожен файл config.xml модуля обробляється Magento і включається в глобальну конфігурацію (global config).

 

Яка мені від цього користь?

Зараз це може здатися дивним, але ця конфігурація є ключем до розуміння двигуна 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, але він дозволяє акуратно розширити лише ті частини системи, які потрібно.

 

 

 

Автор: Alan Storm (http://alanstorm.com/magento_config/)

Переклад українською: Ненько Сергій

Адаптація перекладу: SebWeo

 

 

Share

Останні пости

Антуан де Сент-Екзюпері

Ніколи не втрачай терпіння — це останній ключ, що відкриває двері Антуан де Сент-Екзюпері   Читати далі

28/03/2024

Сомерсет Моем

Подорослішавши, ви збагнете, що світ стає стерпним за однієї умови: коли розумієш, що людський егоїзм… Читати далі

27/03/2024

Михайло Грушевський

Всі вчаться своєї рідної мови, а наша біда така, що треба вчитися її більше, ніж… Читати далі

26/03/2024

ТОП-5 покерних обмінників

Професійний покер – це численні турніри та великі гроші, що потребує правильного налаштування фінансових інструментів.… Читати далі

25/03/2024

Гай Юлій Цезар

Всі довкола прагнуть винищити ворогів, а не об'єднатися з друзями Гай Юлій Цезар   Читати далі

24/03/2024

Як вибрати оптимальний смартфон для дитини?

Сьогоднішні діти стикаються з технологіями вже в ранньому віці, і смартфон давно перестав бути просто… Читати далі

22/03/2024