如何在 Magento 中添加自定义排序选项。除了按价格排序外,我还想添加畅销书、评分最高和独家。请帮忙
3 回答
对于畅销书
挂在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
试试上面的代码。
添加日期
对于任何工作或关注,我与上述任何链接都没有关联,这只是为了知识目的并解决您的问题。
希望这对你有帮助。
感谢您的回答,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',这意味着核心功能不需要改变并加快整个排序过程。终于完成了!呵呵。
要解决自定义排序集合的分页问题,请重写其集合的资源模型
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; }
以上将解决自定义排序集合的计数问题。