我正在尝试使用事件观察者将每个类别页面转发到产品视图页面。但似乎没有用。
场景:我现在正在玩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页。
但在我的观察员中,您可以看到我通过此部分设置category
和id
个参数
$e = new Mage_Core_Controller_Varien_Exception();
$e->prepareForward($actionName, $controllerName, $moduleName, $params);
我仔细检查并确认$params
(保留id
的正确产品ID和category
的正确类别ID)在我的观察者中是正确的。
所以我的问题是在这种情况下如何通过路由器进程中的类别ID进行重写?
我怎样才能让它发挥作用?