使用Magento Admin Grid中的MySQL计算值过滤文本类型列

nev*_*ind 2 filter magento

假设网格中的一列有计算值:

setCollection():

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 'Yes', 'No')"),
Run Code Online (Sandbox Code Playgroud)

_prepareColumns():

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

如果管理员类型"是"然后过滤,那么为了使列具有"是"值,必须更改什么以及如何更改?

Vin*_*nai 5

Adminhtml网格列具有指定块类的过滤器属性.对于boolean yes/no字段通常是adminhtml/widget_grid_column_filter_select.
如果您的字段类型为"选项",它将自动使用.

试试这个_prepareCollection():

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 1, 0)"),
Run Code Online (Sandbox Code Playgroud)

_prepareColumns()使用中:

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

这仍然应该在列中将您的值呈现为"是"和"否",并且您将获得具有适当选项的选择作为过滤器下拉列表.

仅仅这一点是不够的,因为具有计算值的列不能由MySQL在WHERE子句中直接引用.Magento提供了两种解决方案.

列过滤器块具有一种方法getCondition(),该方法返回将用于过滤集合的条件.请参阅Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract::getCondition()示例.
因此,如果您需要自定义用于执行过滤器的SQL,请创建自己的列过滤器块,Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Select并根据需要调整返回的条件,即使用相同的计算值进行匹配.
您可以在定义中为列指定自定义过滤器addColumn():

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

如果您喜欢在Magento的ORM过滤器语法限制之外工作,则可以使用过滤器回调直接修改集合选择:

    'type'    => 'options',
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')),
    'filter_condition_callback' => array($this, '_applyMyFilter'),
Run Code Online (Sandbox Code Playgroud)

回调接收集合和列作为参数.以下是该方法的一个简单示例:

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);
}
Run Code Online (Sandbox Code Playgroud)

不用说,两种方法(过滤计算值)在MySQL中效率非常低.但在这种情况下,也许对你来说没问题.