Для начала прочтите вводную статью о модульности архитектуры Magento.
Во вводной статье была теория, теперь пора перейти к практике.
Статья предназначена для программистов.
Для примера рассмотрим конкретную задачу: изменение алгоритма формирования URL key при создании нового товарного раздела (категории) в административном интерфейсе Magento.
Что такое URL key?
Magento использует URL key для формирования адресов страниц товарных разделов (и собственно товаров, но это вне рамок темы).
В чём проблема с URL key в Magento?
Системный класс Mage_Catalog_Model_Category неправильно производит транслитерацию русских букв.
Если ваш товарный раздел называется "Суши", то Magento добавит в адрес страницы: "d-n-n-d".
Несмертельный баг, но в качестве учебного примера пойдёт.
Как бы вы поступили, будь у вас другой движок?
Вы бы поиском по системным файлам нашли бы участок кода, который формирует URL key, и внесли бы в него правки.
Чем это плохо, я писал во введении.
В чём отличие подхода Magento?
В Magento можно написать свой модуль, подключить его к Magento и тем самым переопрелить поведение движка (в данном случае: исправить дефект).
Итак, переходим к воплощению замысла.
Для начала прочтите, как написать самый простой модуль Magento.
Теперь пошаговая инструкция, как патчить системный класс Mage_Catalog_Model_Category:
1) Создаю папку app/code/local/Fediuk/CorePatches
Этот модуль у меня для заплаток к ядру.
2) Создаю app/etc/modules/Fediuk_CorePatches.xml
Туда помещаю стандартный код:
<?xml version="1.0"?> <config> <modules> <Fediuk_CorePatches> <active>true</active> <codePool>local</codePool> </Fediuk_CorePatches> </modules> </config>
2) Создаю свой класс app/code/local/Fediuk/CorePatches/Model/Category.php: наследник от системного класса. Перекрываю нужный метод:
class Fediuk_CorePatches_Model_Category extends Mage_Catalog_Model_Category { public function formatUrlKey($str) { $urlKey = preg_replace('#[^0-9a-z]+#i', '-', Mage::helper('catalog/product_url')->format($str)); $urlKey = strtolower($urlKey); $urlKey = trim($urlKey, '-'); return $urlKey; } }
3) Теперь говорю Magento, что вместо Mage_Catalog_Model_Category надо загружать Fediuk_CorePatches_Model_Category:
Для этого пишу такой конфиг для своего модуля:
app/code/local/Fediuk/CorePatches/etc/config.xml
<?xml version="1.0" encoding="utf-8"?> <config> <modules> <Fediuk_CorePatches> <version>0.1.0</version> </Fediuk_CorePatches> </modules> <global> <models> <catalog> <rewrite> <category>Fediuk_CorePatches_Model_Category</category> </rewrite> </catalog> </models> </global> </config>
Теперь очищаем кеш и любуемся результатом: слово "суши" будет транслитерироваться в ссылке как "sushi", а не как "d-n-n-d".