2013-11-06 5 views
1

Когда я копирую core/Mage/Adminhtml/Block/ файлы в local/Mage/Adminhtml/Block/, все работает нормально, но если я копирую контроллер на local/Mage/Adminhtml/controllers - основной контроллер все еще работает, а система не видит мой локальный/... контроллер.Контроллер копирования Magento на локальный

ответ

8

Это потому, что контроллеры загружаются иным способом, чем другие классы классов. Вы не делаете этого, ссылаясь на класс Mage. Чтобы узнать, как они загружены, давайте посмотрим на стандартный Magento маршрутизатор и способ его getControllerFileName():


// Mage_Core_Controller_Varien_Router_Standard 
public function getControllerFileName($realModule, $controller) 
{ 
    $parts = explode('_', $realModule); 
    $realModule = implode('_', array_splice($parts, 0, 2)); 
    $file = Mage::getModuleDir('controllers', $realModule); 
    if (count($parts)) { 
     $file .= DS . implode(DS, $parts); 
    } 
    $file .= DS.uc_words($controller, DS).'Controller.php'; 
    return $file; 
} 

Тогда давайте посмотрим на Mage_Core_Model_Config::getModuleDir() метод (класс конфигурации ссылается внутри Mage::getModuleDir()):


public function getModuleDir($type, $moduleName) 
{ 
    $codePool = (string)$this->getModuleConfig($moduleName)->codePool; 
    $dir = $this->getOptions()->getCodeDir().DS.$codePool.DS.uc_words($moduleName, DS); 

    (...) 
} 

Как вы можете см. в этом случае Magento получает настоящий пул модулей модуля. Вот почему простая копия не будет работать. Вы должны переписать контроллеры.

Если вы не знаете, как правильно переписать контроллер, дайте мне знать в комментариях. Я буду соответствующим образом обновлять этот ответ.

EDIT

Переписать контроллер вам необходимо создать новый модуль в локальном пуле коды (или использовать существующий). Если вы не знаете, как создать модуль, проверьте this. Предположим, что вы хотите переписать контрольный контролер Magento Onepage.

В config.xml модуля добавьте это:


<frontend> 
    <routers> 
     <checkout> 
      <args> 
       <modules> 
        <mynamespace_mymodule before="Mage_Checkout">MyNamespace_MyModule</mynamespace_mymodule> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 
</frontend> 
<!-- rewrite of admin controllers are the same. instead of <frontend> use <admin> --> 

Далее создайте контроллер в вашем модуле в приложение/код/​​местные/MyNamespace/MyModule/контроллеров. Назовите его так же, как и контроллер, который переписывается. Вы должны использовать ту же структуру папок, что и Magento. В нашем случае мы создаем OnepageController.php в папке контроллеров.


//you have to manually include the controller being rewritten, because Magento autoloader cannot automatically resolve it. 
require_once Mage::getModuleDir('controllers', 'Mage_Checkout') . DS . 'OnepageController.php'; 

class MyNamespace_MyModule_OnepageController extends Mage_Checkout_OnepageController 
{ 
    //copy a method you want to rewrite, e.g. 
    public function saveOrderAction() 
    { 
     //Method body 
    } 
} 

И все! Обратите внимание, что после этого вам нужно очистить кеш Magento. Контроллеры администратора очень похожи на переписывание. Просто измените <frontend> на <admin>, и вы хорошо пойдете. Обычно рекомендуется установить контроллеры администратора в Adminhtml вложенную папку controllers. Так пример config.xml будет выглядеть следующим образом:


<admin> 
    <routers> 
     <adminhtml> 
      <args> 
       <modules> 
        <mynamespace_mymodule before="Mage_Checkout">MyNamespace_MyModule_Adminhtml</mynamespace_mymodule> 
       </modules> 
      </args> 
     </adminhtml> 
    </routers> 
</admin> 

Обратите внимание, что путь управления изменился на MyNamespace_MyModule_Adminhtml, но он не содержит controllers.

Magento автоматически рассмотрит контроллеры с одинаковым относительным путем и именем контроллера.

+0

Так как я могу переписать контроллер? –

+0

Мне нужно добавить некоторые функции в 'Mage_Adminhtml_Promo_CatalogController' ->' saveAction() ' –

+1

Использовать поиск, есть несколько руководств о том, как, например: http://goo.gl/apwb3 – Axel

Смежные вопросы