Magento — интернет-магазин с открытым исходным кодом, распространяющееся в соответствии с Open Software License (OSL 3.0).Эта штука сделана с использованием Zend Framework, но только еще нехило навернута.
Wiki (http://ru.wikipedia.org/wiki/Magento)
В двух словах:Тяжелая, достаточно сложная и туповатая система(для разработчиков) с оООООчень хреновой документацией и не без глюков.
Скажем так, эээ... статей по ней достаточно много(на офф. сайте), но в них достаточно сложно разобраться,и, к тому же, во многих
статьях просто непонятно, что, как и откуда берется.
В общем надо долго и вдумчиво курить статьи и код самой Мадженты, чтобы понять многие вещи.
Ну.. и без медитаций конечно никак :)
Почему я с ней работаю? Да потому что работа такая )) И приходится работать и разбираться с разными проектами и технологиями, ну и конечно же писать "под них".
Написал я что-то вроде небольшого обзора по перегрузке контроллера.
Может кому-то пригодится/поможет.
Перегрузка контроллера пригодится любому программеру, которому надо добавить
какую-либо свою фичу в Magento, либо просто расширить функционал системы без
вмешательства в ее исходники.
Покажу на простом примере способ, которым я добился поставленной задачи.
Я перегружал Mage_Checkout_OnepageController, но, я думаю, не составит труда
перегрузить какой-либо другой контроллер аналогичным способом.
В классе OnepageController.php есть метод saveBillingAction(), который надо
немного изменить.
Алгоритм действий следующий:
1)Делаем свой контроллер
2)Правим конфиг нашего модуля, который лежит в /app/code/local/NameSpace/OurModule/etc/config.xml
3)Правим layout.
Итак, приступим.
Из обозначений, NameSpace - пространство имен/название вашей компании, ну и
OurModule - имя вашего модуля.
В общем, смотрим на перегружаемый контроллер.
А вот,собственно,и он app/code/core/Mage/Checkout/controllers/OnepageController.php
Идем в каталог своего модуля,т.е. в /app/code/local/NameSpace/OurModule/
Видим в нем каталог controllers, заходим в него и создаем каталог с таким именем,
какое имеет контроллер перегружаемого нами модуля, т.е.создаем каталог Checkout.
Заходим в него и создаем наш собственный контроллер, имя которого идентично
имени перегружаемого контроллера,т.е. создаем файл OnepageController.php.
Теперь напишем класс нашего контроллера, который будет производным от
наследуемого нами Mage_Checkout_OnepageController.
В общем, здесь все просто.
<?php
// Подключаем класс родителя.
require_once 'Mage/Checkout/controllers/OnepageController.php';
// Наследуем его своим классом
class NameSpace_OurModule_Checkout_OnepageController extends Mage_Checkout_OnepageController
{
// Обеспечиваем вызов конструктора базового класса
public function _construct()
{
parent::_construct();
}
// Перегружаем наш метод saveBillingAction()
public function saveBillingAction()
{
// Сначала вызываем этот метод из базового класса
parent::saveBillingAction();
// А теперь здесь добавляем нужный нам функционал
Mage::log('Hello from overloaded Controller!');
}
}
?>
Теперь подкорректируем конфиг нашего модуля.
Идем в /app/code/local/NameSpace/OurModule/etc/config.xml
Между нодами <global>..</global> добавляем ноды <rewrite>..</rewrite>.
А уже между ними помещаем то, что нам надо.Выглядит это вот так:
<global>
...
<rewrite>
<!--
Здесь,в общем,после узла <rewrite> идет узел со следующим названием:
<пространство имен_имя модуля_имя перегружаемого модуля_имя контроллера(без слова Controller)_имя метода экшена(без слова Action)>
-->
<namespace_ourmodule_checkout_onepage_savebilling>
<from><![CDATA[#^/checkout/onepage/saveBilling/$#]]></from>
<to>/ourmodule/checkout_onepage/saveBilling/</to>
</namespace_ourmodule_checkout_onepage_savebilling>
</rewrite>
...
</global>
Отредактировав, заглянем еще в layout.
Идем в /app/design/frontend/default/default/layout/ourmodule.xml, причем,
default/default - это темы оформления, возможно у вас они могут быть другими.
Ниже привожу листинг этого ourmodule.xml:
<?xml version="1.0"?>
<layout version="0.1.0">
<checkout_onepage_index>
<reference name="checkout.onepage">
<action method="unsetChild">
<name>billing</name>
</action>
<block type="ourmodule/ourmodule" name="billing" template="ourmodule/ourmodule.phtml" />
</reference>
</checkout_onepage_index>
</layout>
В этом конфиге указано, что и каким шаблоном будет подменятьтя.
Здесь, ourmodule.phtml лежит в /app/design/frontend/default/default/template/ourmodule/ourmodule.phtml
Активируется модуль,если кто забыл, в /app/etc/modules/NameSpace_All.xml.
Вот,собственно, и все, контроллер перегружен.
Как-то вот так.
Контроллер перегружался на версии Magento 1.3.1
Дополнительно можете почитать статью Wiki, How to overload a controller, которую можно найти на оф. сайт (http://www.magentocommerce.com)