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. Но, может быть, это не проблема для вас в этом случае.