2013-01-14 53 views
1

我在爲我的博客模塊創建自定義路由時遇到了一些麻煩(我正在更好地學習Magento)。自定義slu M Magento

我到目前爲止所做的: 創建了一個也包含所需slu custom的自定義表。 加在我的config.xml中的下列

<default> 
    <web> <!-- what does this represent??? --> 
     <routers> 
      <namespace_blog_list> 
       <area>frontend</area> 
       <class>Namespace_Blog_Controller_Router</class> 
      </namespace_blog_list> 
     </routers> 
    </web> 
</default> 

所以,我創建了Namespace_Blog_Controller_Router類,並從CMS控制器複製match()方法,但不太清楚如何對其進行修改。

這是我到目前爲止有:

// $identifier is 'blog/view/my-slug-name'; 
$parts = explode('/', $identifier); 
    if ($parts[0] == 'blog') { 
     $post = Mage::getModel('namespace_blog/post'); 
     $routeInformation = $post->checkIdentifier($identifier); 

     $request->setModuleName('namespace_blog') 
      ->setControllerName($routeInformation['controller']) 
      ->setActionName($routeInformation['action']); 

     if (isset($routeInformation['params']) && count($routeInformation['params'])) { 
      foreach ($routeInformation['params'] as $key => $param) { 
       $request->setParam($key, $param); 
      } 
     } 

     $request->setAlias(
      Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, 
      $identifier 
     ); 
     return true; 
    } 

PS:$後> checkIdentifier返回以下陣列:

array(
    'controller' => 'index', 
    'action' => 'index', 
    'params' => array(
     'id' => 3 
    ) 
) 

的問題是,它會在一個無限循環,我發現以下報告:

a:5:{i:0;s:52:"Front controller reached 100 router match iterations";i:1;s:337:"#0 /var/www/app/code/core/Mage/Core/Controller/Varien/Front.php(183): Mage::throwException('Front controlle...') 
#1 /var/www/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch() 
#2 /var/www/app/Mage.php(683): Mage_Core_Model_App->run(Array) 
#3 /var/www/index.php(87): Mage::run('', 'store') 
#4 {main}";s:3:"url";s:21:"/index.php/blog/index";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:7:"default";}` 

任何想法?這是做這件事的最好方式,還是有另一種推薦的解決方案?

謝謝,

回答

2

CMS頁面路由是在controller_front_init_routers事件的幫助下添加的。所有的

首先,你需要定義你的模塊

<config> 
    <frontend> 
     <routers> 
      <mymodule> 
       <use>standard</use> 
       <args> 
        <module>My_Module</module> 
        <frontName>mymodule</frontName> 
       </args> 
      </mymodule> 
     </routers> 
    </frontend> 
</config> 

這使您可以發送請求作爲http://example.com/mymodule/controller/action/

這一下Mage_Core_Controller_Varien_Front::init()後標準前端路線。在這種方法中,magento收集standardadmin路由(這些是前端和管理路由的默認路由)。當這些路由器添加mageto火災事件controller_front_init_routers和使用這種全球性的活動,你可以註冊自己的潰敗:

<config> 
    <global> 
     <events> 
      <controller_front_init_routers> 
       <observers> 
        <mymodule> 
         <class>My_Module_Controller_Router</class> 
         <method>initControllerRouters</method> 
        </mymodule> 
       </observers> 
      </controller_front_init_routers> 
     </events> 
    </global> 
</config> 

和路線,你應該檢查是否標識您的需求相匹配,並且打電話給你的控制器

class My_Module_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract 
{ 

    /** 
    * Inject new route into the list of routes 
    * 
    * @param Varien_Event_Observer $observer 
    */ 
    public function initControllerRouters($observer) 
    { 
     $front = $observer->getEvent()->getFront(); 

     $route = new My_Module_Controller_Router(); 
     $front->addRouter('myroute', $route); 
    } 

    /** 
    * Compare current path with the route rules 
    * 
    * @param Zend_Controller_Request_Http $request 
    * @return boolean 
    */ 
    public function match(Zend_Controller_Request_Http $request) 
    { 

     if (!Mage::app()->isInstalled()) { 
      Mage::app()->getFrontController()->getResponse() 
        ->setRedirect(Mage::getUrl('install')) 
        ->sendResponse(); 
      return FALSE; 
     } 

     $route = 'myroute'; 

     $identifier = $request->getPathInfo(); 

     if (substr(str_replace("/", "", $identifier), 0, strlen($route)) == $route) { 
      if (str_replace("/", "", $identifier) == $route) { 
       $request->setModuleName('mymodule') 
         ->setControllerName('index') 
         ->setActionName('index'); 
       return TRUE; 
      } 

      $suffix = Mage::helper('catalog/product')->getProductUrlSuffix(); 
      $identifier = substr_replace($request->getPathInfo(), '', 0, strlen("/" . $route . "/")); 
      $identifier = str_replace($suffix, '', $identifier); 

      // here we make some check to make sure we have requested page 
      $mymodule = Mage::getModel('mymodule/mymodule'); 
      $module_id = $mymodule->checkIdentifier($identifier, Mage::app()->getStore()->getId()); 
      if (!$module_id) { 
       return FALSE; 
      } 

      // send request to the module's controller 
      $request->setModuleName('mymodule') 
        ->setControllerName('index') 
        ->setActionName('view') 
        ->setParam('id', $module_id); 

      return TRUE; 
     } else { 
      return FALSE; 
     } 
    } 

} 

就這樣。

<default> 
    <web> 
     <default> 
      <cms_home_page>home</cms_home_page> 
      <cms_no_route>no-route</cms_no_route> 
      <cms_no_cookies>enable-cookies</cms_no_cookies> 
      <front>cms</front> 
      <no_route>cms/index/noRoute</no_route> 
      <show_cms_breadcrumbs>1</show_cms_breadcrumbs> 
     </default> 
    </web> 
</default> 

這是cms模塊的默認部分。您可以在管理下的系統配置 - 網頁 - 默認頁面找到這些設置

+2

您可以參考Alan Storm的文章詳細瞭解如何在magento工程中路由http://alanstorm.com/category/magento#dispatch –

+0

非常感謝您抽出時間來幫助我,我實際上更瞭解了路由系統如何在magento中工作。我已經檢查了大部分Alan Storms教程,但這是我完全不理解的少數幾個內容之一 –