【问题标题】:Gernerate custom urls within Magento在 Magento 中生成自定义 url
【发布时间】:2010-11-11 12:48:57
【问题描述】:

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

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

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

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

我查看了有关路由的 alan Storm 文档,发现它仅与默认路由路径相关,或者信息有些过时。

您是否知道在magento 中控制路由的最佳方法以及可能易于遵循和相关的教程?如果是这样,请分享:D很多

【问题讨论】:

    标签: php magento clean-urls


    【解决方案1】:

    以下代码未经测试,但应该可以工作

    如果您不想为每个产品组合项定义自定义重写,只需按照以下步骤操作:

    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 中享受您的自定义路由:)

    【讨论】:

    • 我发现上面的解决方案可以满足我的需要,因此没有使用这个。感谢您抽出宝贵时间回答这个问题。
    • 别忘了为请求设置路由名称——它被用于布局句柄:$request->setRouteName('someRouteName')
    【解决方案2】:

    执行此操作的方法是使用 URL 重写。事实上,您找到的后缀配置可能被 Mage_Catalog 用来创建它的重写集。我是第一次接触这个特殊的功能,所以这个 sn-p 应该加一点盐......

    // 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,因为它可能是必要的。

    【讨论】:

    • 我会进一步调查,你知道从 xml 中的路由引用它的最佳方法吗?否则我会收到 404 错误消息?
    • 对不起,我不明白这个问题。
    • 当我点击投资组合/blah.html 时,它当前被转发到 404 错误页面,我认为这是因为路由不存在,因此它会导致问题,你知道我会去哪里吗需要将此代码作为 xml 文件中的方法引用还是只需要运行此代码一次?
    • 每个 URL 只需要运行一次。之后,您可以通过查看目录 > URL 重写管理来确认它是否存在。检查它的目标路径正是你想要的。我添加了一个id,因为我不知道你如何处理参数,id 将是典型的用法。
    • 在我的大脑开始运转后,我想出了如何实现这个系统,非常感谢你的解决方案。
    【解决方案3】:

    最简单的方法(当您不需要自动生成许多 url 时)是使用内置的 Url Rewrites 模块。转到管理后台 -> 目录 -> Url Rewrite management 并设置您喜欢的任何 url rewrite。

    【讨论】:

    • 嗨,我相信这只有在知道 url 而无需手动预先创建数千条规则的情况下才会真正起作用。谢谢你的投入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2013-03-17
    • 2021-02-16
    相关资源
    最近更新 更多