Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Помогите перегрузить контроллер
 
Max (Kogr-8)
Jr. Member
 
Total Posts:  4
Joined:  2009-01-14
 

Потратил уже много времени на то, чтобы перегрузить контроллер и не добился никаких результатов.
Чего только не пробовал, например сделал все вот по этой доке (http://www.magentocommerce.com/wiki/how_to_overload_a_controller), в результате 404 ошибка при обращении к /checkout/cart/.
Работал с версией Magento 1.1.8, обновился до 1.2.0.2, по прежнему не удается перегрузить контроллер.

Есть ли у кого-нибудь 100% рабочий пример перегрузки любого контроллера? Или кто может подсказать как перегрузить конкретно Mage_Catalog_Product_CompareController?
Интересует перегрузка метода addAction, создание обсервера не подходит, т.к. нужно добавить условие в методе addAction и в одном из вариантов нужно отменить добавление товара в сравнение.

Заранее благодарю.

 
Magento Community Magento Community
Magento Community
Magento Community
 
varyous
Sr. Member
 
Total Posts:  221
Joined:  2008-10-18
Russia
 

выложил сдесь пример выдранный из одно из моих модулей:
http://varyous-simbir.blogspot.com/

возможно, это тебе поможет найти причину ошибки

 
Magento Community Magento Community
Magento Community
Magento Community
 
paulborsky
Member
 
Avatar
Total Posts:  31
Joined:  2009-01-14
Russia
 

У самого проблема с перегрузкой контролера,
В итоге я получаю 404 error
После поиска по форумам пришел к выводу, что проблема кроется в корректном указании какой именно Action перегружается
Перегружаю AccountControler.php

require_once 'Mage/Customer/controllers/AccountController.php';
 
class 
paul_borsky_Customer_AccountController extends Mage_Customer_AccountController
{
public function createPostAction()
   

    
die ('finally i did it!');
   
}
}

соответсвенно мой config.xml

<config>
          <
modules>
              <
paul_borsky>
                  <
version>0.1</version>
              </
paul_borsky>
          </
modules>
    <global>
        <
rewrite>
            <
paul_borsky_customer_accountcontroller>
                <
from><![CDATA[#^/customer/account/create/?#]]></from>
                
<to>/borsky/customer_account/</to>
            </
paul_borsky_customer_accountcontroller>
        </
rewrite>
    </global>
</
config>

У кого-нибудь есть идеи, как можно перегрузить createPostAction()?

 
Magento Community Magento Community
Magento Community
Magento Community
 
alexweb
Sr. Member
 
Avatar
Total Posts:  79
Joined:  2008-09-26
Gomel, Belarus
 
paulborsky - 28 January 2009 06:18 AM

У самого проблема с перегрузкой контролера,
В итоге я получаю 404 error
После поиска по форумам пришел к выводу, что проблема кроется в корректном указании какой именно Action перегружается
Перегружаю AccountControler.php

require_once 'Mage/Customer/controllers/AccountController.php';
 
class 
paul_borsky_Customer_AccountController extends Mage_Customer_AccountController
{
public function createPostAction()
   

    
die ('finally i did it!');
   
}
}

соответсвенно мой config.xml
<config>
          <
modules>
              <
paul_borsky>
                  <
version>0.1</version>
              </
paul_borsky>
          </
modules>
    <global>
        <
rewrite>
            <
paul_borsky_customer_accountcontroller>
                <
from><![CDATA[#^/customer/account/create/?#]]></from>
                
<to>/borsky/customer_account/</to>
            </
paul_borsky_customer_accountcontroller>
        </
rewrite>
    </global>
</
config>

У кого-нибудь есть идеи, как можно перегрузить createPostAction()?

Думаю вместо #^/customer/account/create/?# нужно написать #^/customer/account/createPost/?# или также, но без знака вопроса.

 
Magento Community Magento Community
Magento Community
Magento Community
 
R a y
Jr. Member
 
Avatar
Total Posts:  1
Joined:  2009-06-10
 

Написал что-то вроде маленького обзора по перегрузке контроллера.
Может кому-то пригодится/поможет

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

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top