2015-06-22 7 views
0

Итак, я посмотрел, как сделать глобальный пользовательский модуль привет, и я понимаю, что стандартная структура url выглядит как/modulefrontname/controller/action , но как я могу сделать некоторые пользовательские маршруты для моего конкретного модуля.Как я могу выполнять пользовательские маршруты?

Например /modulefrontname/{anyparamater} или /modulefrontname/контроллер/{anyparamater}

Я видел много вопросов на переполнение стека на это, но большинство из них либо без ответа, или они увернуться вопрос заявив, что это невозможно без переопределения основного маршрутизатора. Это правда?

ответ

0

Вам нужно будет добавить собственный маршрутизатор в список маршрутизаторов, используемых Magento. Для этого вам нужно будет отредактировать свой файл etc/config.xml файл. После того, как вы определили ваши маршрутизаторы frontName в разделе :

<frontend> 
<routers> 
    <modulename> 
     <use>standard</use> 
     <args> 
      <module>Package_Modulename</module> 
      <frontName>yourFrontName</frontName> 
     </args> 
    </modulename> 
</routers> 
</frontend> 

Вы можете добавить свой собственный маршрутизатор с помощью событий в разделе:

<global> 
<events> 
    <controller_front_init_routers> 
     <observers> 
      <your_observer_code> 
       <type>singleton</type> 
       <class>Package_Modulename_Controller_Router</class> 
       <method>initControllerRouters</method> 
      </your_observer_code> 
     </observers> 
    </controller_front_init_routers> 
</events> 
</global> 

Затем создать этот файл по адресу: Пакет/Modulename/Controller/Router.php и он должен распространяться от: Mage_Core_Controller_Varien_Router_Abstract:

класс Package_Modulename_Controller_Router расширяет Mage_Core_Controller_Varien_Router_Abstract {

}

Определите метод, который будет вызываться на событие: controller_front_init_routers:

public function initControllerRouters($observer) 
{ 
    $front = $observer->getEvent()->getFront(); 
    //Use the same class as Router 
    $yourRouter = new Package_Modulename_Controller_Observer(); 
    $front->addRouter('yourRouter', $yourRouter); 
} 

И вы должны реализовать метод: матч в так же, как и Observer, это также ваш пользовательский маршрутизатор:

public function match(Zend_Controller_Request_Http $request) 
{ 
    if (!Mage::isInstalled()) { 
     Mage::app()->getFrontController()->getResponse() 
      ->setRedirect(Mage::getUrl('install')) 
      ->sendResponse(); 
     exit; 
    } 
    $identifier = trim($request->getPathInfo(), '/'); 
    //Work with the $identifier and if it matches some of your custom defined URL's, you can set the found controller like this: 
    if ($identifier == 'some-of-yours/custom-urls') { 
     $request->setModuleName('modulename') //Your modulename 
        ->setControllerName('index') //Your controller: Package_Modulename_IndexController 
        ->setActionName('view') // The controller action 
        ->setParam('foo', 'bar'); //Set params 
     $request->setAlias(
      Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, 
      $identifier 
     ); 
     //You must return true if the identifier matches. 
     return true; 
    } 
    return false; 
} 

В методе сопоставления вы можете использовать модель своего модуля для поиска любых настраиваемых URL-адресов, хранящихся в базе данных. Посмотрите на этот маршрутизатор, как он работает: app/code/core/Mage/Cms/Controller/Router.php, который добавлен так же, как ваш.

Тогда в контроллере: приложение/код/​​местные/Упаковка/MODULENAME/Контроллеры/IndexController.php вы можете определить метод viewAction и использовать переданные параметры:

public function viewAction() 
{ 
    $foo = $this->getRequest()->getParam('foo'); 
    //Here goes your logic 
} 
Смежные вопросы