я пытаюсь вперед каждая страница категории на странице просмотра продукта с помощью наблюдателя событий. Но, похоже, не работает.
Сценарий: я сейчас играюсь с роутером 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
одинаковы (кажется, что оба содержат значение идентификатора категории) и, следовательно, строка $viewHelper->prepareAndRender($productId, $this, $params);
терпит неудачу, и, таким образом, я получаю 404 страницы.
Но в моем наблюдателе, вы можете видеть, что я устанавливаю оба category
а также id
параметры через этот раздел
$e = new Mage_Core_Controller_Varien_Exception();
$e->prepareForward($actionName, $controllerName, $moduleName, $params);
Я дважды проверил и подтвердил, что $params
(содержит правильный идентификатор продукта для id
и правильный идентификатор категории для category
) верны в моем наблюдателе.
Итак, мой вопрос, как это переписать по категории Id в процессе маршрутизатора в этом сценарии?
Как я могу заставить это работать?
Задача ещё не решена.
Других решений пока нет …