如何创建自定义网格过滤器


8

我使用自定义数据库中的字段URL添加了自定义网格列:

$this->addColumn('url', array(
    'header'   => Mage::helper('companymodule')->__('Has Website'),
    'align'    => 'left',
    'index'    => 'url',
    'renderer' => new Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl(),
    'type'      => 'options',
    'options'   => Mage::getSingleton('companymodule/hasurl')->getOptionArray(),
));

并创建此自定义呈现:

class Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
{
    public function render(Varien_Object $row)
    {
        $value = trim((string)$row->getData($this->getColumn()->getIndex()));
        if (empty($value)) {
            return 'No';
        } else {
            return 'Yes';
        }
    }
}

以及过滤器dropdwon的自定义模型:

class Company_Module_Model_Hasurl extends Varien_Object
{
    static public function getOptionArray()
    {
        return array(
            'Yes'   => Mage::helper('companymodule')->__('Yes'),
            'No'    => Mage::helper('companymodule')->__('No')
        );
    }
}

除非您尝试过滤,否则此方法效果很好。我认为它正在尝试将值“是”与$row->getData($this->getColumn()->getIndex())(数据库表中的URL字段)的值进行匹配。但是,与匹配URL字段值本身不同,我基本上是在尝试进行过滤,((bool)empty($url))以便用户可以根据是否该数据库条目是否具有URL。

如何为这样的过滤器创建自定义逻辑?


尝试像这样更改代码'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Answers:


18

尝试添加自定义过滤器回调:

在您的网格中:

$this->addColumn('url', array(
    'header'   => Mage::helper('companymodule')->__('Has Website'),
    'align'    => 'left',
    'index'    => 'url',
    'renderer' => new Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl(),
    'type'      => 'options',
    'options'   => Mage::getSingleton('companymodule/hasurl')->getOptionArray(),
    'filter_condition_callback' => array($this, '_filterHasUrlConditionCallback')
));

并添加如下方法:

protected function _filterHasUrlConditionCallback($collection, $column)
{
    if (!$value = $column->getFilter()->getValue()) {
        return $this;
    }
    if (empty($value)) {
        $this->getCollection()->getSelect()->where(
             "main_table.url IS NULL");
    }
    else {
        $this->getCollection()->getSelect()->where(
             "main_table.url IS NOT NULL");
    }

    return $this;
}

注意它没有经过测试;您可能必须检查数据库中是否为空而不是空;还要确保您具有正确的表别名(如果URL不在main_table上)。


谢谢!由于某种原因,如果我在addColumn数组中具有'filter'=> true,则会收到一个致命错误,但是如果没有它,那么效果很好。知道为什么我不能使用'filter'=> true吗?
Tyler V.

据我所知,仅当您想告诉Magento不要过滤该列时(即'filter'=> false),才在'filter'属性中指定一个布尔值。否则,您将放置用作过滤器的块的名称。有关示例,请参见类Mage_Adminhtml_Block_Review_Grid_Filter_Type。
劳拉2014年

3

尝试添加自定义过滤器回调:在这里,我们向管理员用户网格添加新的角色名称列。

在您的网格中:

$this->addColumn('role_name', array(
    'header' => Mage::helper('adminhtml')->__('Role Name'),
    'index' => 'role_name',
    'type' => 'options',
    'options' => $this->getRoleName(),
    //'filter' => false,
    'renderer' =>  'Company_Module_Block_Adminhtml_Permissions_User_Grid_Renderer_Role',
    'filter_condition_callback' => array($this, '_roleFilter'),
));

并添加2这样的方法:

protected function _roleFilter($collection, $column) {
    $filterroleid = $column->getFilter()->getValue();        
    if (!$value = $column->getFilter()->getValue()) {
        return $this;
    }        
    $this->getCollection()->addFieldToFilter('parent_id', array('eq' => $filterroleid));
    return ;
}

通过下拉菜单为角色过滤器添加此方法

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.