从类别页面转发到产品视图页面不工作

时间:2015-09-10 06:25:28

标签: php magento router magento-1.9 forward

我正在尝试使用事件观察者将每个类别页面转发到产品视图页面。但似乎没有用。

场景:我现在正在玩Magento路由器。作为其中的一部分,我试图将Magento实例中的每个类别页面转发到产品页面。要为类别加载的产品页面是该类别中第一个产品的页面。

我尝试了什么:我观察了事件controller_action_predispatch_catalog_category_view,并将下面的代码添加到我的观察者方法中。

public function forwardSingleProCategory(Varien_Event_Observer $observer)
{
    //get event data
    $action = $observer->getControllerAction();
    $request = $action->getRequest();

    //get category id
    $categoryId = (int)$request->getParam('id', false);

    //grab category collection
    $layer = Mage::getModel('catalog/layer')->setCurrentCategory($categoryId);
    $collection = $layer->getProductCollection();

    //check whether category count is 1. If YES, then do magic
    if ($collection->getSize() > 0) {

        //prepare parameters that needs for the action `catalog/product/view`
        $product = $collection->getFirstItem();
        $actionName = 'view';
        $controllerName = 'product';
        $moduleName = 'catalog';
        $params = array(
            'category' => $categoryId,
            'id'       => $product->getId()
        );

        //tells no to category page router processing further
        $request->setDispatched(false);

        //throw exception with a clear message we need a product page.
        $e = new Mage_Core_Controller_Varien_Exception();
        $e->prepareForward($actionName, $controllerName, $moduleName, $params);
        throw $e;

    }

    return $this;
}

查看我在代码中添加的注释。如果我的代码中有不清楚的地方,请告诉我。我可以解释一下

但我为每个类别页面请求获取 404 Page 。哎呀!!!

我调试了多少:404页面是从Mage_Catalog_ProductController本身触发的(这意味着观察者工作正常)。问题在于本节:

 public function viewAction()
{
    // Get initial data from request
    $categoryId = (int) $this->getRequest()->getParam('category', false);
    $productId  = (int) $this->getRequest()->getParam('id');
    $specifyOptions = $this->getRequest()->getParam('options');
    ...
    try {
        $viewHelper->prepareAndRender($productId, $this, $params);
    } catch (Exception $e) {
        if ($e->getCode() == $viewHelper->ERR_NO_PRODUCT_LOADED) {
            if (isset($_GET['store'])  && !$this->getResponse()->isRedirect()) {
                $this->_redirect('');
            } elseif (!$this->getResponse()->isRedirect()) {
                $this->_forward('noRoute');
            }
        } else {
            Mage::logException($e);
            $this->_forward('noRoute');
        }
    }

问题是$productId$categoryId相同(似乎两者都包含类别ID值),因此行$viewHelper->prepareAndRender($productId, $this, $params);失败,因此我得到404页。

但在我的观察员中,您可以看到我通过此部分设置categoryid个参数

$e = new Mage_Core_Controller_Varien_Exception();
$e->prepareForward($actionName, $controllerName, $moduleName, $params);

我仔细检查并确认$params(保留id的正确产品ID和category的正确类别ID)在我的观察者中是正确的。

所以我的问题是在这种情况下如何通过路由器进程中的类别ID进行重写?

我怎样才能让它发挥作用?

0 个答案:

没有答案