西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > php教程 > magento教程 >

Magento中上一个/下一个产品按钮

时间:2017-01-03 11:03来源:未知 作者:好模板 点击:
已经有好几个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。然而,这将要求在服务器上更多的负载,因为它需要一个或两个额外的数据库查询。此外,时不时地可能出现一些不合逻辑的上一个/下一个。因此,这个方法还有提升的空间。但要知道的是,这种方法并不会破坏什么。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容