Когда я core/Mage/Adminhtml/Block/
некоторые файлы core/Mage/Adminhtml/Block/
files в local/Mage/Adminhtml/Block/
все работает нормально, но если я local/Mage/Adminhtml/controllers
контроллер в local/Mage/Adminhtml/controllers
– основной контроллер все еще работает, а система не видит мой локальный / … контроллер.
Это потому, что контроллеры загружаются по-другому, чем другие классы классов. Вы не делаете этого, ссылаясь на класс 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 получает настоящий пул модулей модуля в этом случае. Вот почему простая копия не будет работать. Вы должны переписать контроллеры.
Если вы не знаете, как правильно переписать контроллер, дайте мне знать в комментариях. Я буду соответствующим образом обновлять этот ответ.
РЕДАКТИРОВАТЬ
Чтобы переписать контроллер, вам нужно создать новый модуль в локальном пуле кодов (или использовать существующий). Если вы не знаете, как создать модуль, проверьте эту тему. Предположим, что вы хотите переписать контрольный контролер 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> -->
Затем создайте контроллер в своем модуле в app / code / local / MyNamespace / MyModule / controller. Назовите его так же, как и контроллер, который переписывается. Вы должны использовать ту же структуру папок, что и 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, eg 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 автоматически посмотрит на контроллеры с одинаковым относительным путем и именем контроллера.