Como criar um filtro de grade personalizado

8

Adicionei uma coluna de grade personalizada usando o URL do campo em um banco de dados personalizado:

$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(),
));

E criou este costume renderizado:

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

Bem como um modelo personalizado para o filtro 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')
        );
    }
}

Isso funciona bem, a menos que você tente filtrar. Eu acho que está tentando corresponder o valor 'Sim' ao valor de $row->getData($this->getColumn()->getIndex())(o campo URL na tabela do banco de dados). Mas, em vez de corresponder ao valor do campo URL, estou basicamente tentando filtrar ((bool)empty($url))para que o usuário possa filtrar se ou não, esta entrada do banco de dados tem uma URL ou não.

Como posso criar lógica personalizada para um filtro como este?

Tyler V.
fonte
tente alterar o código desta forma'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Respostas:

18

tente adicionar um retorno de chamada de filtro personalizado:

na sua grade:

$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')
));

e adicione um método como este:

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

note que não foi testado; pode ser necessário verificar se há vazio em vez de nulo no banco de dados; também verifique se você tem o alias da tabela correto (se o URL não estiver na tabela principal).

Laura
fonte
Obrigado! Por alguma razão, se eu tiver 'filter' => true na matriz addColumn, recebo um erro fatal, mas sem ele, isso funciona muito bem. Alguma idéia de por que não posso ter 'filter' => true?
Tyler V.
Pelo que pude entender, você só especifica um booleano na propriedade 'filter' quando deseja que o Magento não filtre essa coluna (ou seja, 'filter' => false). Caso contrário, você colocaria o nome de um bloco usado como filtro. Veja a classe Mage_Adminhtml_Block_Review_Grid_Filter_Type para um exemplo.
Laura
3

tente adicionar um retorno de chamada de filtro personalizado: aqui, adicionamos a nova coluna Nome da função à grade do usuário administrador.

na sua grade:

$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'),
));

e adicione um método 2 como este:

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

Adicionar este método ao filtro de função com o menu suspenso

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Kinjalkumar Prajapati
fonte