Magento默认提供了一些排序选项,例如:产品位置,名字,价格。在这篇文章中你将学会让产品按照销量来排序。 要做到这些,我们需要重写一些Magento的核心文件。重定义核心文件并不是一个好的尝试,所以我们创建一个自己的模块来完成同样的功能并保证能升级。 我假设你知道如何建立你自己的模块并创建对应的文件(app/etc/modules/Alwayly_Catalog.xml),所以Magento能识别我们的模块。 现在,我们有了自己的模块并且已经被Magento识别,让我们创建自己的config.xml,路径为Alwayly/Catalog/etc/config.xml: <config> <modules> <Alwayly_Catalog> <version>0.1.0</version> </Alwayly_Catalog> </modules> <global> <blocks> <catalog> <rewrite> <product_list_toolbar>Alwayly_Catalog_Block_Product_List_Toolbar</product_list_toolbar> </rewrite> </catalog> </blocks> <models> <catalog> <rewrite> <config>Alwayly_Catalog_Model_Config</config> </rewrite> </catalog> <catalog_resource> <rewrite> <product_collection>Alwayly_Catalog_Model_Resource_Product_Collection</product_collection> </rewrite> </catalog_resource> </models> </global> </config> 也许你会想到,我们将要重写以下三个文件:
我们的app/code/local/Alwayly_Catalog_Block_Product_List_Toolbar 应该这样: <?php class Alwayly_Catalog_Block_Product_List_Toolbar extends Mage_Catalog_Block_Product_List_Toolbar { public function setCollection($collection) { parent::setCollection($collection); if ($this->getCurrentOrder()) { if($this->getCurrentOrder() == 'qty_ordered') { $this->getCollection()->getSelect() ->joinLeft( array('sfoi' => $collection->getResource()->getTable('sales/order_item')), 'e.entity_id = sfoi.product_id', array('qty_ordered' => 'SUM(sfoi.qty_ordered)') ) ->group('e.entity_id') ->order('qty_ordered ' . $this->getCurrentDirection()); } else { $this->getCollection() ->setOrder($this->getCurrentOrder(), $this->getCurrentDirection())->getSelect(); } } return $this; } } 我们继承了Mage_Catalog_Block_Product_List_Toolbar中所有的功能和方法但我们自己重写了setCollection()方法 我们的Alwayly_Catalog_Model_Config是相当简单的: <?php class Alwayly_Catalog_Model_Config extends Mage_Catalog_Model_Config { public function getAttributeUsedForSortByArray() { return array_merge( parent::getAttributeUsedForSortByArray(), array('qty_ordered' => Mage::helper('catalog')->__('Sold quantity')) ); } } 到了这一步,产品的排序应该已经奏效,但我们在分页上有点小问题,无法显示正确的数目。我们可以在 Alwayly/Catalog/Model/Resource/Product/Collection.php中用以下代码来修复这个问题。 <?php class Alwayly_Catalog_Model_Resource_Product_Collection extends Mage_Catalog_Model_Resource_Product_Collection { protected function _getSelectCountSql($select = null, $resetLeftJoins = true) { $this->_renderFilters(); $countSelect = (is_null($select)) ? $this->_getClearSelect() : $this->_buildClearSelect($select); if(count($countSelect->getPart(Zend_Db_Select::GROUP)) > 0) { $countSelect->reset(Zend_Db_Select::GROUP); } $countSelect->columns('COUNT(DISTINCT e.entity_id)'); if ($resetLeftJoins) { $countSelect->resetJoinLeft(); } return $countSelect; } } 就是这样,在4个简单的步骤之后,我们的Magento网站中的商品就能按销量来排序了。 希望你乐在其中~~~ (责任编辑:最模板) |