4

如何在 Magento 中添加自定义排序选项。除了按价格排序外,我还想添加畅销书、评分最高和独家。请帮忙

4

3 回答 3

8

对于畅销书

挂在code/local/Mage/Catalog/Block/Product/List/Toolbar.php方法 setCollection 中

public function setCollection($collection) {
    parent::setCollection($collection);
    if ($this->getCurrentOrder()) {
        if($this->getCurrentOrder() == 'saleability') {
            $this->getCollection()->getSelect()
                 ->joinLeft('sales_flat_order_item AS sfoi', 'e.entity_id = sfoi.product_id', 'SUM(sfoi.qty_ordered) AS ordered_qty')
                 ->group('e.entity_id')->order('ordered_qty' . $this->getCurrentDirectionReverse());
        } else {
            $this->getCollection()
                 ->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
        }
    }

    return $this;
}

在 setCollection 之后,我添加了这个方法:

public function getCurrentDirectionReverse() {
    if ($this->getCurrentDirection() == 'asc') {
        return 'desc';
    } elseif ($this->getCurrentDirection() == 'desc') {
        return 'asc';
    } else {
        return $this->getCurrentDirection();
    }
}

最后我将方法 setDefaultOrder 更改为

public function setDefaultOrder($field) {
    if (isset($this->_availableOrder[$field])) {
        $this->_availableOrder = array(
            'name'        => $this->__('Name'),
            'price'       => $this->__('Price'),
            'position'    => $this->__('Position'),
            'saleability' => $this->__('Saleability'),
        );
        $this->_orderField = $field;
    }

    return $this;
}

最高评价

http://www.fontis.com.au/blog/magento/sort-products-rating

试试上面的代码。

添加日期

Magento - 按添加日期排序

对于任何工作或关注,我与上述任何链接都没有关联,这只是为了知识目的并解决您的问题。

希望这对你有帮助。

于 2013-09-16T15:45:09.853 回答
1

感谢您的回答,Anuj,这是迄今为止我能找到的最好的工作模块。

只需在您的代码中添加一个额外的位,以解决由“分组依据”引起的无分页问题

将“/lib/varien/data/collection/Db.php”复制到“local/varien/data/collection/Db.php”。

将 getSize 函数更改为

public function getSize()
{

    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        //$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams); //============================>change behave of fetchOne to fetchAll

        //got array of all COUNT(DISTINCT e.entity_id), then sum 
        $result = $this->getConnection()->fetchAll($sql, $this->_bindParams);

        foreach ($result as $row) {//echo'<pre>'; print_r($row);
            $this->_totalRecords += reset($row);
        }

    }
    return intval($this->_totalRecords);
}

希望它可以帮助任何人。


更新过滤器部分也需要更新,否则只会在所有过滤器上显示 1 个项目。并且价格过滤器将不准确。

你需要做什么来修改 core/mage/catalog/model/layer/filter/attribute.php 和 price.php

底部的attribute.php getCount()

 $countArr = array();
    //print_r($connection->fetchall($select));
    foreach ($connection->fetchall($select) as $single)
    {  

        if (isset($countArr[$single['value']]))
        {
            $countArr[$single['value']] += $single['count'];
        }
        else
        {
             $countArr[$single['value']] = $single['count'];
        }


    }
    //print_r($countArr);//exit;
    return $countArr;
    //return $connection->fetchPairs($select);

Price.php getMaxPrice

$maxPrice = 0;
    foreach ($connection->fetchall($select) as $value)
    {
        if (reset($value) > $maxPrice)
        {
            $maxPrice = reset($value);
        }

    }
    return $maxPrice;

如果您遇到同样的问题并正在寻找问题,您就会明白我的意思。祝你好运,在那个最畅销的功能上花了 8 个小时。


再次更新,

刚刚找到了另一种实现方法,使用 cron 来收集每日保存在包含 product_id 和计算的基本销售数字的表中的最佳销售数据。然后简单地离开连接,不应用'group by',这意味着核心功能不需要改变并加快整个排序过程。终于完成了!呵呵。

于 2014-02-24T12:57:24.870 回答
0

要解决自定义排序集合的分页问题,​​请重写其集合的资源模型

app\code\core\Mage\Catalog\Model\Resource\Product\Collection.php
并从核心修改以下方法
     受保护的函数 _getSelectCountSql($select = null, $resetLeftJoins = true)
     {
        $this->_renderFilters();
        $countSelect = (is_null($select)) ?
        $this->_getClearSelect() :
        $this->_buildClearSelect($select);

    /*Added to reset count filters for Group*/ 
    if(count($countSelect->getPart(Zend_Db_Select::GROUP)) > 0) {
     $countSelect->reset(Zend_Db_Select::GROUP);
    }
    /*Added to reset count filters for Group*/  

    $countSelect->columns('COUNT(DISTINCT e.entity_id)');
    if ($resetLeftJoins) {
      $countSelect->resetJoinLeft();
    }
    return $countSelect;
   }

以上将解决自定义排序集合的计数问题。

于 2014-10-14T07:08:29.757 回答