Magento自定义排序选项

时间:2013-09-16 15:27:28

标签: magento magento-1.7

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

3 个答案:

答案 0 :(得分: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();
    }
}

最后我将mehod 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 - Sort by Date Added

我与任何上述链接无关,因为任何工作或关注只是出于知识目的和解决您的问题。

希望这对您有所帮助。

答案 1 :(得分:2)

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

只需在代码中添加一个额外的位即可解决“group by”

引起的分页问题

复制'/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' 这意味着核心功能不需要改变并加快整个分拣过程。 终于完成了!和合

答案 2 :(得分:0)

要为自定义排序集合挑选分页问题,​​请从

重写其集合的资源模型

 app\code\core\Mage\Catalog\Model\Resource\Product\Collection.php 
    并从核心修改以下方法     
     protected function _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;
   }

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