Magento 产品页面重定向

Magento Product Page redirection

如果我想将某个产品视图页面重定向到另一个 url,我需要覆盖 Magento 中的哪个控制器?

我想使用以下代码进行重定向。还有其他类似 Magento 的方法吗?

if($this->getProductId() == 10) {
    header("Location: /mymodule");
    die();  
}

Magento Admin 在 Catalog > URL Rewrite Management 下有一个功能。使用以下步骤创建新产品重写:

  1. 单击右上角的 添加 URL 重写 按钮。
  2. Select“自定义”来自创建URL重写.
  3. 选择合适的店铺.
  4. 请求路径设置成这样catalog/product/view/id/10(假设10是您产品的ID)。
  5. 目标路径设置为您要将请求发送到的任何路由或URL。
  6. 重定向设置为可能的“临时(302)”。

找到解决办法。可能不是最好的,但它有效:

Observer.php:

class Namespace_Mymodule_Model_Observer  {
    public function redirect(){
        //request object
        $request = Mage::app()->getRequest();
        //only redirect in the frontend/catalog
        $storeId = Mage::app()->getStore()->getId();
        if(in_array($request->getModuleName(), array("catalog")) && $storeId != 0) {
            $response = Mage::app()->getResponse();
            $params = Mage::app()->getRequest()->getParams();
            //check the product id
            if($params[id] == 10) {
                return $response->setRedirect("/mymodule", 301)->sendHeaders();
            }
        }
    }
}

以及 global/events 部分中的 config.xml:

<controller_action_predispatch> 
    <observers> 
        <namespace_mymodule_observer>
           <type>singleton</type>
           <class>namespace_mymodule/observer</class> 
           <method>redirect</method>
        </namespace_mymodule_observer> 
    </observers> 
</controller_action_predispatch>

我认为更好的方法是实际利用观察者事件,因为这里已经包含了您需要的所有内容。此外,答案不区分产品和类别,因为 in_array($request->getModuleName(), array("catalog")) 对两者都是正确的。

class Namespace_Mymodule_Model_Observer {

    public function redirect(Varien_Event_Observer $observer) {

        $actionName = $observer->getEvent()->getControllerAction()->getFullActionName();
        $productId = $observer->getEvent()->getControllerAction()->getRequest()->getParam('id');

        if($actionName == 'catalog_product_view' && $productId == 10) {

            $response = $observer->getEvent()->getControllerAction()->getResponse();
            $response->setRedirect('/mymodule', 301)->sendHeaders();

        }
    }
}