2015-06-22 43 views
0

所以我研究瞭如何做一個hello世界自定義模塊,我明白,標準的url結構看起來像/ modulefrontname/controller/action 但我怎麼能爲我的特定模塊做一些自定義路由。我該如何做自定義路線?

例如 /modulefrontname/{} anyparamater或 /modulefrontname /控制器/ {} anyparamater

我見過很多在這個堆棧溢出的問題,但大多數要麼是沒有答案或者閃避問題說它不可能不覆蓋主要路由器。這是真的?

回答

0

您需要將自己的路由器添加到Magento使用的路由器列表中。 要做到這一點,你需要編輯你的模塊etc/config.xml文件。您在部分定義後,你的路由器frontName

<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> 

然後在創建該文件:

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

您可以在部分通過事件添加自己的路由器: Package/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); 
} 

而且你必須實現的方法:比賽中同樣的原因,因爲它是一個觀察者,它也是你的自定義路由器:

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與你的相同。

然後在你的控制器:應用程序/代碼/本地/封裝/模塊名/控制器/ IndexController.php可以定義的viewAction方法和使用傳遞的參數:

public function viewAction() 
{ 
    $foo = $this->getRequest()->getParam('foo'); 
    //Here goes your logic 
}