Magento中上一个/下一个产品按钮
现在,已经有好几个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。然而,这将要求在服务器上更多的负载,因为它需要一个或两个额外的数据库查询。此外,时不时地可能出现一些不合逻辑的上一个/下一个。因此,这个方法还有提升的空间。但要知道的是,这种方法并不会破坏什么。
电商网站开发服务。
版权声明:本站内容源自互联网,如有内容侵犯了你的权益,请联系删除相关内容。