Как создать собственный фильтр сетки

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

Ответы:

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).

Лаура
источник
Спасибо! По какой-то причине, если у меня есть «filter» => true в массиве addColumn, я получаю фатальную ошибку, но без нее это прекрасно работает. Любая идея, почему я не могу иметь «фильтр» => правда?
Тайлер В.
Из того, что я могу собрать, вы указываете логическое значение в свойстве «filter» только тогда, когда хотите сказать Magento не фильтровать этот столбец (т. Е. «Filter» => false). В противном случае вы бы указали имя блока, который используется в качестве фильтра. См. Пример класса Mage_Adminhtml_Block_Review_Grid_Filter_Type.
Лора
3

попробуйте добавить пользовательский фильтр обратного вызова: здесь мы добавляем новый столбец Role Name в сетку администратора.

в вашей сетке:

$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 ;
}

Добавить этот метод для Role Filter с выпадающим

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Киньялкумар Праджапати
источник