Сортировка сетки Magento на визуализированном столбце - PullRequest
2 голосов
/ 09 октября 2011

Я создал сетку в 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();    
        }

Есть ли лучший способ добиться сортировки коллекции в пользовательском столбце, если не то, что я делаю неправильно при изменении коллекции, эта сетка становится пустой

Ответы [ 2 ]

1 голос
/ 09 октября 2011

На самом деле, вы должны расширить класс коллекции и добавить собственную сортировку в метод _afterLoad коллекции.Если по какой-то причине это невозможно - вы должны сделать это в методе grid _afterLoadCollection.В любом случае, вы не можете / не должны / не делали этого в методе collection _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;
}
0 голосов
/ 17 октября 2011

спасибо зява Я должен был сделать это как -

    $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.

Сортирует элементы в коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...