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?


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


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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.