Пользовательский маршрутизатор Magento
У меня есть пользовательский модуль с IndexController
и indexAction
. У этого есть маршрут с fronName
, установленным в config.xml
(например, angular-app
). На этой странице у меня есть приложение angular с собственной маршрутизацией. Все работает нормально, пока я не обновлю браузер. После обновления я получаю 404.
Как я могу настроить маршрутизатор magento для обработки каждого запроса в angular-app
с помощью IndexController:indexAction
.
Итак, чего бы я хотел:
- запрос:
http://domain.com/angular-app
->IndexController:indexAction
- запрос:
http://domain.com/angular-app/x/y/z
->IndexController:indexAction
гдеx
,y
,z
являются динамическими параметрами.
1 answers
Я не эксперт в приложении angular, но, насколько я понимаю, вы хотите отправлять все угловые запросы с префиксом angular-app
в своем URL.
Итак, вам нужно создать новый пользовательский маршрутизатор . Чтобы понять пользовательский маршрут, перейдите по ссылке ниже.
В вашем случае, используя controller_front_init_routers
, добавьте пользовательский маршрутизатор в систему с помощью $front->addRouter('addangularapp',$this);
в функции initControllerRouters
класса modulenamespace_модуленами_контроллер_роутер
<!-- define route --> <frontend> <routers> <angularapp> <!-- router identifier --> <use>standard</use> <args> <modules> <module>ModuleNameSpace_ModuleName</module> <frontName>angularapp</frontName> </modules> </args> </angularapp> </routers> </frontend> <global> <!-- event for add a router --> <events> <controller_front_init_routers> <observers> <add_angularapp_route> <!-- observer identifier --> <class>ModuleNameSpace_ModuleName_Controller_Router</class> <method>initControllerRouters</method> </add_angularapp_route> </observers> </controller_front_init_routers> </events> </global>
Затем в match()
проверьте и измените http-запрос (Zend_Controller_Request_Http). и если запрос содержит angular-app
, то он внутренне устанавливает IndexController
как controller
как indexAction
как действие запроса и устанавливает ваш модуль в качестве модуля запроса.
$request->setModuleName('YOURROUTE')
->setControllerName('index')
->setActionName('index');
Код контроллера может выглядеть так:
<?php
class ModuleNameSpace_ModuleName_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract{
/**
* Initialize Controller Router
*
* @param Varien_Event_Observer $observer
*/
public function initControllerRouters($observer){
$front=$observer->getEvent()->getFront();
$front->addRouter('addangularapp',$this);
}
/* validate and modify the request
* Params Zend_Controller_Request_Htt
*/
public function match(Zend_Controller_Request_Http $request){
/* If Magento Magento is not install then
* redirect to installer url
*/
If(!Mage::isInstalled()):
Mage::app()->getFrontController()->getResponse()
->setRedirect(Mage::getUrl('install'))
->sendResponse();
exit;
endif;
$requestPathInfo=trim($request->getPathInfo(),'/');
Mage::log('aaa'.$requestPathInfo.'StoreId'.Mage::app()->getStore()->getId(), null, 'logfile.log');
/* check -review-form not exit
* then immediate return false
*/
if(strpos($requestPathInfo,'angular-app')==false):
return false;
endif;
/* get productut from url
by substr
*/
$producturl=str_replace('angular-app','',$requestPathInfo);
$condition=new Varien_Object(array('product_url'=>$producturl,
'continue'=>true));
Mage::dispatchEvent('angular_app_controller_router_match_before', array(
'router' => $this,
'condition' => $condition
));
if($condition->getRedirectUrl()){
Mage::app()->getResponse()
->setRedirect($condition->getReDirectUrl())
->sendResponse();
$request->setDispatched(true);
return true;
}
if(!$condition->getContinue()){
return false;
}
$request->setModuleName('YOURROUTE')
->setControllerName('index')
->setActionName('index')
->setParam('customparam', $requestPathInfo);
$request->setAlias(
Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
$requestPathInfo
);
return true;
}
}
Примечание: код не тестируется.
То же самое имеет место в https://magento.stackexchange.com/a/70619/4564 ответ