Я создал сетку в Magento, и есть столбец, который не приходит из базы данных, вместо этого я вычислил его значение из других столбцов с помощью рендерера.
Допустим, пользовательский столбец в сетке имеет значение total = columnA из DB - columnB из DB, необходимо отсортировать сетку на основе пользовательского столбца.
Я переопределил функцию 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 просто дает мне пустой объект коллекции (то же самое, что дает функция prepare коллекции)
_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();
}
Есть ли лучший способ добиться сортировки коллекции в пользовательском столбце, если не то, что я делаю неправильно при изменении коллекции, эта сетка становится пустой