如何在Magento中添加自定义排序选项。除了按价格排序外,我想添加畅销商品,评分最高和独家。请帮忙
答案 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
尝试上面的代码。
添加日期
我与任何上述链接无关,因为任何工作或关注只是出于知识目的和解决您的问题。
希望这对您有所帮助。
答案 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; }
上面将解决自定义排序集合的计数问题。