Magento默认提供了一些排序选项,例如:产品位置,名字,价格。在这篇文章中你将学会让产品按照销量来排序。

要做到这些,我们需要重写一些Magento的核心文件。重定义核心文件并不是一个好的尝试,所以我们创建一个自己的模块来完成同样的功能并保证能升级。

我假设你知道如何建立你自己的模块并创建对应的文件(app/etc/modules/Liuxgnu_Catalog.xml),所以Magento能识别我们的模块。

现在,我们有了自己的模块并且已经被Magento识别,让我们创建自己的config.xml,路径为Liuxgnu/Catalog/etc/config.xml:

<config>
    <modules>
        <Liuxgnu_Catalog>
            <version>0.1.0</version>
        </Liuxgnu_Catalog>
    </modules>
    <global>
        <blocks>
            <catalog>
                <rewrite>
                    <product_list_toolbar>Liuxgnu_Catalog_Block_Product_List_Toolbar</product_list_toolbar>
                </rewrite>
            </catalog>
        </blocks>
        <models>
            <catalog>
               <rewrite>
                    <config>Liuxgnu_Catalog_Model_Config</config>
                </rewrite>
            </catalog>
            <catalog_resource>
                <rewrite>
                    <product_collection>Liuxgnu_Catalog_Model_Resource_Product_Collection</product_collection>
                </rewrite>
            </catalog_resource>
        </models>
    </global>
</config>

也许你会想到,我们将要重写以下三个文件:

Mage_Catalog_Block_Product_List_Toolbar

Mage_Catalog_Model_Config

Mage_Catalog_Model_Resource_Product_Collection

我们的app/code/local/Liuxgnu_Catalog_Block_Product_List_Toolbar 应该这样:

<?php
class Liuxgnu_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()方法

我们的Liuxgnu_Catalog_Model_Config是相当简单的:

<?php
class Liuxgnu_Catalog_Model_Config extends Mage_Catalog_Model_Config
{
    public function getAttributeUsedForSortByArray()
    {
        return array_merge(
			parent::getAttributeUsedForSortByArray(),
			array('qty_ordered' => Mage::helper('catalog')->__('Sold quantity'))
		);
    }
}

到了这一步,产品的排序应该已经奏效,但我们在分页上有点小问题,无法显示正确的数目。我们可以在 Liuxgnu/Catalog/Model/Resource/Product/Collection.php中用以下代码来修复这个问题。

<?php
class Liuxgnu_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;
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注