Cómo crear un filtro de cuadrícula personalizado

8

He agregado una columna de cuadrícula personalizada usando la URL del campo en una base de datos personalizada:

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

Y creó este renderizado personalizado:

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

Además de un modelo personalizado para el 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')
        );
    }
}

Esto funciona bien a menos que intentes filtrar. Creo que está tratando de hacer coincidir el valor 'Sí' con el valor de $row->getData($this->getColumn()->getIndex())(el campo URL en la tabla de la base de datos). Pero en lugar de hacer coincidir el valor del campo URL en sí, básicamente estoy tratando de filtrar ((bool)empty($url))para que el usuario pueda filtrar si o no esta entrada de la base de datos tiene una URL o no.

¿Cómo puedo crear una lógica personalizada para un filtro como este?

Tyler V.
fuente
intenta cambiar el código así'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Respuestas:

18

intente agregar una devolución de llamada de filtro personalizada:

en tu cuadrícula:

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

y agregue un 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;
}

tenga en cuenta que no está probado; puede que tenga que verificar si está vacío en lugar de nulo en la base de datos; también asegúrese de tener el alias de tabla correcto (si la URL no está en main_table).

Laura
fuente
¡Gracias! Por alguna razón si tengo 'filter' => true en la matriz addColumn me sale un error fatal, pero sin él, esto funciona muy bien. ¿Alguna idea de por qué no puedo tener 'filter' => true?
Tyler V.
Por lo que puedo deducir, solo especifica un booleano en la propiedad 'filtro' cuando desea decirle a Magento que no filtre esa columna (es decir, 'filtro' => falso). De lo contrario, pondría el nombre de un bloque que se utiliza como filtro. Vea la clase Mage_Adminhtml_Block_Review_Grid_Filter_Type para ver un ejemplo.
Laura
3

intente agregar una devolución de llamada de filtro personalizada: Aquí agregamos una nueva columna de Nombre de rol a la cuadrícula del usuario administrador.

en tu cuadrícula:

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

y agregue un 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 ;
}

Agregue este método para filtro de rol con menú desplegable

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
fuente