已经有好几个Magento的上一个/下一个插件。说实话,我并不知道它们功能如何,因为我没用过。我打算自己写这个功能,依靠分层导航筛选并按网格列表中的顺序排列。这儿是插件代码的示例(部分但是功能齐全) 首先我们创建Alwayly_Prevnext插件的config.xml ... <frontend> <events> <controller_action_postdispatch> <observers> <alwayly_prevnext_set_filtered_category_product_collection> <class>alwayly_prevnext/observer</class> <method>setAlwaylyFilteredCategoryProductCollection</method> </alwayly_prevnext_set_filtered_category_product_collection> </observers> </controller_action_postdispatch> </events> </frontend> ... 现在,我们实现观测方法。在这里,我抓取已经读取的产品集合,产品网格网格列表的最后一个产品。如你所见,我注重 “category” 控制器, “view”动作,从集合中提取产品ID并将它们设置到alwayly_filtered_category_product_collection的session关键字下。这样一来我就能获取最后被详细页最后被浏览的产品,然后确定它的前一个和后一个产品。 class Alwayly_Prevnext_Model_Observer { public function setAlwaylyFilteredCategoryProductCollection() { /** * There might be some illogical buggy behavior when coming directly * from "Related products" / "Recently viewed" products block. * Nothing that should break the page however. */ if (Mage::app()->getRequest()->getControllerName() == 'category' && Mage::app()->getRequest()->getActionName() == 'view') { $products = Mage::app()->getLayout() ->getBlockSingleton('Mage_Catalog_Block_Product_List') ->getLoadedProductCollection() ->getColumnValues('entity_id'); Mage::getSingleton('core/session') ->setAlwaylyFilteredCategoryProductCollection($products); unset($products); } return $this; } } 最后,助手类支持getPreviousProduct和getNextProduct方法 class Alwayly_Prevnext_Helper_Data extends Mage_Core_Helper_Abstract { /** * @return Mage_Catalog_Model_Product or FALSE */ public function getPreviousProduct() { $prodId = Mage::registry('current_product')->getId(); $positions = Mage::getSingleton('core/session')->getAlwaylyFilteredCategoryProductCollection(); if (!$positions) { $positions = array_reverse(array_keys(Mage::registry('current_category')->getProductsPosition())); } $cpk = @array_search($prodId, $positions); $slice = array_reverse(array_slice($positions, 0, $cpk)); foreach ($slice as $productId) { $product = Mage::getModel('catalog/product') ->load($productId); if ($product && $product->getId() && $product->isVisibleInCatalog() && $product->isVisibleInSiteVisibility()) { return $product; } } return false; } /** * @return Mage_Catalog_Model_Product or FALSE */ public function getNextProduct() { $prodId = Mage::registry('current_product')->getId(); $positions = Mage::getSingleton('core/session')->getAlwaylyFilteredCategoryProductCollection(); if (!$positions) { $positions = array_reverse(array_keys(Mage::registry('current_category')->getProductsPosition())); } $cpk = @array_search($prodId, $positions); $slice = array_slice($positions, $cpk + 1, count($positions)); foreach ($slice as $productId) { $product = Mage::getModel('catalog/product') ->load($productId); if ($product && $product->getId() && $product->isVisibleInCatalog() && $product->isVisibleInSiteVisibility()) { return $product; } } return false; } } 这个方法里有个问题,它不能弥补剩余类别产品中可能的页。事实是,抓去类别产品ID的时候我们仍然不知道其它可能页面中这个产品的ID。然而,这将要求在服务器上更多的负载,因为它需要一个或两个额外的数据库查询。此外,时不时地可能出现一些不合逻辑的上一个/下一个。因此,这个方法还有提升的空间。但要知道的是,这种方法并不会破坏什么。 (责任编辑:好模板) |