假设网格中的一列有计算值:
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)
如果管理员类型"是"然后过滤,那么为了使列具有"是"值,必须更改什么以及如何更改?
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中效率非常低.但在这种情况下,也许对你来说没问题.