我在Magento中创建了一个网格,并且有一个不是来自数据库的列而是我使用渲染器从其他列计算了它的值。 让我们说网格中的自定义列是来自DB的total = columnA - 来自DB的columnB,必须根据自定义列对网格进行排序。 我在我的网格中覆盖了setCollectionToOrder函数。,对从prepareCollection函数接收的集合进行了排序,并将已排序的集合放入新的集合对象中,但是我的网格没有显示任何行,虽然我可以回显已排序的集合和它工作正常但没有行进入网格。
protected function _setCollectionOrder($column)
{
$collection = $this->getCollection();
if ($collection) {
switch ($column->getId()) {
case 'total':
$arr = array();
foreach($collection as $item) {
$colA= $item->getcolumnA();
$colB= $item->getcolumnB()
$total= $colA- $colB
$item->setTotal($total);
$arr[$i] = $item; $i++ ;
}
if($column->getDir()=='asc') {
$sorted = usort($arr, array('Grid_Class', '_cmpAscTotal'));
} else {
$sorted = usort($arr, array('Grid_Class', '_cmpDescTotal'));
}
$collection = $this->_tempCollection(); // A blank collection
for($i=0;$i<count($arr);$i++) {
$arr[$i]->setTotal(1);
$collection->addItem($arr[$i]);
}
$this->setCollection($collection);
break;
default:
parent::_setCollectionOrder($column);
break;
}
}
return $this;
}
tempCollection函数只给我一个空白的集合对象(与准备集合函数给出的相同) _cmpAscTotal是回调函数,它定义了我的自定义排序。
protected function _prepareCollection()
{
$collection = Mage::getModel('module/model')->getCollection();
$collection->getSelect()->joinLeft(array('table1' => 'table1'),
'table1.sku = main_table.sku_id',
Array('columnA, columnB, (1) as total')
);
$this->setCollection($collection);
return parent::_prepareCollection();
}
是否有更好的方法在自定义列上实现排序集合,如果不是我在修改集合时出错,那么网格变空了
答案 0 :(得分:1)
实际上,您应该扩展集合类并在集合_afterLoad
方法中添加自定义排序。如果由于某种原因无法实现 - 您应该在网格_afterLoadCollection
方法中执行此操作。在任何情况下,您都不能/不应该/不在集合_setCollectionOrder
方法中执行此操作。因为如果你查看Mage_Adminhtml_Block_Widget_Grid::_prepareCollection()
代码 - 你会看到在收集加载之前调用了_setCollectionOrder
。
<强>更新强>
protected function _afterLoadCollection()
{
foreach ($this->getCollection() as $item) {
$item->setTotal($item->getcolumnA() - $item->getcolumnB());
}
usort($this->getCollection()->getIterator(), array('Grid_Class', '_cmpAscTotal'));
return $this;
}
答案 1 :(得分:0)
谢谢Zyava 我不得不这样做 -
$arr = $this->getCollection()->getItems();
if($dir=='asc') {
$sorted = usort($arr, array('Grid_Class', '_cmpAscSuggestion'));
} else {
$sorted = usort($arr, array('Grid_Class', '_cmpDescSuggestion'));
}
$this->getCollection()->setItems($arrt); // created a set item function in collection class for this module.
它对集合中的项目进行排序。