#magento
#magento
Вопрос:
Я столкнулся с проблемой в наших установках Magento, которую мне было очень трудно отследить. Всякий раз, когда клиент переходит на страницу «Моя учетная запись» и нажимает ссылку «Адресная книга», он отправляет их на страницу CMS 404 по умолчанию. Я поискал в Google и нашел несколько похожих проблем, но они были не совсем одинаковыми. Однако одно из предложенных решений заключалось в том, что причиной был пользовательский модуль перенаправления входа.
Итак, я начал отключать все наши пользовательские модули один за другим, чтобы посмотреть, решит ли это проблему, и оказалось, что отключение нашего пользовательского контроллера учетной записи устраняет проблему. Я попытался отследить это дальше, используя Mage::log () в переопределенных методах, чтобы увидеть, вызывались ли они при попытке доступа к / customer / address / , но в журналах ничего не появилось.
Единственное, что у меня осталось, это проблема с конфигурацией моего контроллера. Это и есть тот самый config.xml Я настроил:
<?xml version="1.0"?>
<config>
<modules>
<mymodule_login>
<version>0.1.0</version>
</mymodule_login>
</modules>
<frontend>
<routers>
<mymodule_login>
<use>standard</use>
<args>
<module>MyModule_Login</module>
<frontName>customer</frontName>
</args>
</mymodule_login>
</routers>
</frontend>
<global>
<rewrite>
<mymodule_login>
<from><![CDATA[#^/account/#]]></from>
<to>/customer/account/</to>
</mymodule_login>
</rewrite>
<blocks>
<customer>
<rewrite>
<register-login>MyModule_Login_Block_View</register-login>
</rewrite>
</customer>
<login>
<class>RegisterLogin</class>
</login>
</blocks>
</global>
</config>
Я думаю, что это может быть проблема с перезаписью из #^/ account / # в / customer / account / , но я недостаточно знаю о перезаписях Magento, чтобы определить, является ли это точным или нет. Методы, которые я перезаписал, — это loginPostAction, _loginPostRedirect и _welcomeCustomer.
Комментарии:
1. Я думаю, вы уже ответили на свой собственный вопрос. Проблема, скорее всего, вызвана перезаписью ваших модулей или / и маршрутизаторов.
Ответ №1:
Дик Лоран был прав — это была моя конфигурация. Все, что я сделал, это добавил второй контроллер, который переопределил Mage_Customer_AddressController, и теперь он работает нормально. Проблема заключалась в том, что мое имя интерфейса было «customer», поэтому он ожидал найти соответствующий контроллер в моем пользовательском модуле, когда он переходил к URL / customer / address /.
Ответ №2:
Мне пришлось переопределить Mage_Customer_AccountController, однако вы не можете просто переопределить только один контроллер, вы должны переопределить весь модуль.
Итак, вот как вы решаете эту ситуацию. Вы создаете файлы, которые ссылаются на родительский файл.
ПРИМЕЧАНИЕ: Замените {Namespace} вашим пользовательским пространством имен.
Вот мой config.xml : (внутри папки app / code/local/{Namespace}/ Customer / etc)
<?xml version="1.0"?>
<config>
<modules>
<{Namespace}_Customer>
<version>0.1.0</version>
</{Namespace}_Customer>
</modules>
<frontend>
<routers>
<customer>
<use>standard</use>
<args>
<module before="Mage_Customer">{Namespace}_Customer</module>
<frontName>customer</frontName>
</args>
</customer>
</routers>
</frontend>
</config>
Теперь переопределяем Mage_Customer_AccountController: (внутри папки app / code/local/{Namespace}/Customer / controllers)
<?php
require_once ('Mage/Customer/controllers/AccountController.php');
class {Namespace}_Customer_AccountController extends Mage_Customer_AccountController
{
protected function _loginPostRedirect()
{
$session = $this->_getSession();
if($session->getBeforeAuthUrl() == Mage::getUrl('checkout/onepage/index')){
$session->setBeforeAuthUrl(Mage::getUrl('checkout/cart'));
$this->_redirectUrl($session->getBeforeAuthUrl(true));
return;
}
return parent::_loginPostRedirect();
}
}
Это перенаправляет клиента обратно на страницу корзины после входа в систему при оформлении заказа. Мы сделали это, потому что, если в их корзине есть товар из предыдущего сеанса, Magento объединит последние товары из корзины с товарами из предыдущего сеанса и перейдет к оплате, не сообщая клиенту. Поэтому, чтобы избежать жалоб клиентов, мы просто перенаправляем обратно в корзину, чтобы клиент мог видеть, что это происходит.
Теперь, поскольку мы переопределяем весь модуль, мы должны создать вышеупомянутые файлы, которые ссылаются на родительский. Двумя другими контроллерами в Mage_Customer являются Mage_Customer_AddressController и Mage_Customer_ReviewController. Ваш экземпляр Magento может меняться по мере изменения версий, поэтому обязательно проверьте родительскую папку, расположенную по адресу (app / code / core / Mage / Customer / controllers), и НИКОГДА НАПРЯМУЮ НЕ РЕДАКТИРУЙТЕ CORE!
Здесь мы ссылаемся на родительский элемент для Mage_Customer_AddressController: (внутри папки app / code /local/{Namespace}/Customer / controllers)
<?php
require_once ('Mage/Customer/controllers/AddressController.php');
class {Namespace}_Customer_AddressController extends Mage_Customer_AddressController
{
}
Аналогично для Mage_Customer_ReviewController: (то же расположение файла)
<?php
require_once ('Mage/Customer/controllers/ReviewController.php');
class {Namespace}_Customer_ReviewController extends Mage_Customer_ReviewController
{
}
Без этих файлов Magento просто не может найти контроллеры и выдает 404.
Наконец, создайте файл в app / etc / modules с именем {Namespace}_Customer.xml чтобы включить переопределение, и адресная книга больше не должна быть 404.