2010-11-11 152 views
10

我目前正在尝试使用magento来生成自定义的URL /路由,目前我已经在本地模块的config.xml中设置了默认路由。Magento中的Gernerate自定义网址

<frontend> 
<routers> 
     <portfolios> 
      <use>standard</use> 
      <args> 
       <module>Custom_Portfolios</module> 
       <frontName>portfolios</frontName> 
      </args> 
     </portfolios> 
    </routers> 
    <default> 
     <router>portfolios</router> 
    </default> 
</frontend> 

目前,这是与magento默认路由/ portfolio/index/action/custom-string的url路径一起使用。 我试图实现的是有/portfolios/custom-string.html我试图使用mod_rewrite规则没有成功,我已经找到了一些有关使用自定义后缀的.html我已添加到相同的config.xml文件。

<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default> 

我已经看过有关艾伦风暴文档来路由,发现它相应和,只默认的路由路径或信息是有点过时。

你知道最好的方法来控制magento内的路由,可能容易遵循和相关的教程吗?如果是的话请分享:D很多

回答

8

要做到这一点的方法是URL重写。事实上,你找到的后缀配置可能被Mage_Catalog用来创建它的重写集。我接近这个特殊的功能,第一次使这个段应与少许盐采取...

// Creating a rewrite 
/* @var $rewrite Mage_Core_Model_Url_Rewrite */ 
$rewrite = Mage::getModel('core/url_rewrite'); 
$rewrite->setStoreId($store_id) 
     ->setIdPath('portfolios/'.$url_key) 
     ->setRequestPath('portfolios/'.$url_key.'.html') 
     ->setTargetPath('portfolios/index/action/id/'.$url_key) 
     ->setIsSystem(true) 
     ->save(); 

需要对每一个可能的路径的新重写。

编辑;我添加了setIdPath,因为它可能是必需的。

+0

我将作进一步调查,你会知道从路线参考它的最好办法在XML内,否则我会得到一个404错误消息出来? – Ryan 2010-11-11 17:46:37

+0

对不起,我不明白这个问题。 – clockworkgeek 2010-11-11 17:55:46

+0

当我打组合/ blah.html它当前获得转发到404错误页面,我认为这是导致路由不存在,并因此它导致的问题,你知道我需要引用此代码作为方法内的XML文件,或者我只需要运行此代码一次? – Ryan 2010-11-11 18:25:27

0

最简单的方法(当你不需要自动生成很多网址时)是使用内置的Url Rewrites模块。转到管理后端 - >目录 - >Url重写管理并设置任何URL重写你喜欢。下面

+2

嗨,我相信这只会在没有手动预先创建成千上万个规则的情况下知道网址时才有效。尽管感谢你的输入。 – Ryan 2010-11-11 17:47:49

15

代码是未经测试,但应该工作

如果你不想定义自定义改写为每个protfolio项目,只需按以下步骤操作:

  1. 编写自定义类路由器从Mage_Core_Controller_Varien_Router_Standard延伸并实现match方法:

    public function match(Zend_Controller_Request_Http $request) 
    { 
        $path = explode('/', trim($request->getPathInfo(), '/')); 
        // If path doesn't match your module requirements 
        if (count($path) > 2 && $path[0] != 'portfolios') { 
         return false; 
        } 
        // Define initial values for controller initialization 
        $module = $path[0]; 
        $realModule = 'Custom_Portfolios'; 
        $controller = 'index'; 
        $action = 'action'; 
        $controllerClassName = $this->_validateControllerClassName(
         $realModule, 
         $controller 
        );    
        // If controller was not found 
        if (!$controllerClassName) { 
         return false; 
        }    
        // Instantiate controller class 
        $controllerInstance = Mage::getControllerInstance(
         $controllerClassName, 
         $request, 
         $this->getFront()->getResponse() 
        ); 
        // If action is not found 
        if (!$controllerInstance->hasAction($action)) { 
         return false; // 
        }    
        // Set request data 
        $request->setModuleName($module); 
        $request->setControllerName($controller); 
        $request->setActionName($action); 
        $request->setControllerModule($realModule);    
        // Set your custom request parameter 
        $request->setParam('url_path', $path[1]); 
        // dispatch action 
        $request->setDispatched(true); 
        $controllerInstance->dispatch($action); 
        // Indicate that our route was dispatched 
        return true; 
    } 
    
  2. 定义自定义路由器的config.xml:

    <stores> 
        <default> 
         <web> 
          <routers>        
           <your_custom> 
            <area>frontend</area> 
            <class>Custom_Portfolios_Controller_Router_Custom</class> 
           </your_custom> 
          </routers> 
         </web> 
        </default> 
    </stores> 
    
  3. 享受您的自定义路由在Magento :)

+0

我发现上面的解决方案适合我的需求,因此没有使用这个。感谢您花时间回答这个问题。 – Ryan 2010-11-12 11:00:16

+1

不要忘记为请求设置路由名称 - 它用于布局句柄:$ request-> setRouteName('someRouteName') – 2011-12-08 11:05:49