Фильтрация столбца текстового типа с помощью MySQL-вычисленных значений в Magento Admin Grid - PullRequest
2 голосов
/ 02 марта 2012

Скажем, один столбец в сетке имеет вычисленные значения:

setCollection () :

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 'Yes', 'No')"),

_prepareColumns () :

$this->addColumnAfter('refunded', array(
    'header' => Mage::helper('helper')->__('Refunded'),
    'index'  => 'refunded',
    'type'   => 'text',
), 'qty');

Что и как нужно изменить, чтобы иметь столбцы со значениями «да», если администратор вводит «да», а затем фильтрует?

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Adminhtml столбцы сетки имеют свойство фильтра, которое определяет класс блока. Для логических полей да / нет, которые обычно бывают adminhtml/widget_grid_column_filter_select.
Он будет использоваться автоматически, если тип вашего поля будет «опции».

Попробуйте это в _prepareCollection():

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 1, 0)"),

А при _prepareColumns() используют:

$this->addColumnAfter('refunded', array(
    'header'  => Mage::helper('helper')->__('Refunded'),
    'index'   => 'refunded',
    'type'    => 'options',
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes'))
), 'qty');

Это все равно должно отображать ваши значения как "Да" и "Нет" в столбце, и вы получите выбор с соответствующими параметрами в качестве раскрывающегося списка фильтра.

Одного этого будет недостаточно, поскольку MySQL не может напрямую ссылаться на столбец с вычисленным значением в предложении WHERE. Magento предоставляет два варианта решения этой проблемы.

У блоков фильтра столбцов есть метод getCondition(), который возвращает условие, которое будет использоваться для фильтрации коллекции. См. Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract::getCondition() для примера.
Поэтому, если вам нужно настроить SQL, используемый для выполнения фильтра, создайте свой собственный блок фильтра столбцов с расширением Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select и при необходимости измените возвращаемое условие, т. Е. Используйте то же вычисленное значение, чтобы сопоставить его с *. 1022 * Ваш пользовательский фильтр может быть указан для столбца, как это в определении addColumn():

    'type'    => 'options',
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')),
    'filter'  => 'your_module/adminhtml_widget_grid_column_filter_custom',

Если вы предпочитаете работать вне ограничений синтаксиса фильтра ORM Magento, вы можете изменить выбранные коллекции напрямую, используя обратный вызов фильтра:

    'type'    => 'options',
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')),
    'filter_condition_callback' => array($this, '_applyMyFilter'),

Обратный вызов получает коллекцию и столбец в качестве аргументов. Вот простой пример для этого метода:

protected function _applyMyFilter(Varien_Data_Collection_Db $collection, Mage_Adminhtml_Block_Widget_Grid_Column $column)
{
    $select = $collection->getSelect();
    $field = $column->getIndex();
    $value = $column->getFilter()->getValue();
    $select->having("$field=?, $value);
}

Нет необходимости говорить, что оба подхода (фильтрация по вычисленному значению) очень неэффективны в MySQL. Но, может быть, это не проблема для вас в этом случае.

0 голосов
/ 05 марта 2012

Я опубликую рабочий пример, но я выберу ответ Винай за то, что он был таким подробным.

In Grid.php:

protected function _addColumnFilterToCollection($column) 
{
    if ($column->getId() == 'refunded' && $column->getFilter()->getValue()) {
        $val        = $column->getFilter()->getValue();
        $comparison = ($val === "No") ? 'lteq' : 'gt'; // lteg: <=; gt: >

        $this->getCollection()->addFieldToFilter('ois.qty_refunded', array($comparison => 0));
    } else {
        parent::_addColumnFilterToCollection($column);
    }

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