Пользовательский маршрутизатор 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 являются динамическими параметрами.
Author: 7ochem, 2016-03-24

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 ответ

 1
Author: Amit Bera, 2017-04-13 12:55:02