Comment créer un filtre de grille personnalisé


8

J'ai ajouté une colonne de grille personnalisée en utilisant l'URL du champ dans une base de données personnalisée:

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

Et créé ce rendu personnalisé:

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

Ainsi qu'un modèle personnalisé pour le filtre 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')
        );
    }
}

Cela fonctionne bien, sauf si vous essayez de filtrer. Je pense qu'il essaie de faire correspondre la valeur «Oui» à la valeur de $row->getData($this->getColumn()->getIndex())(le champ URL dans la table de base de données.) Mais au lieu de faire correspondre la valeur du champ URL lui-même, j'essaie essentiellement de filtrer par ((bool)empty($url))afin que l'utilisateur puisse filtrer si cette entrée de base de données a ou non une URL.

Comment puis-je créer une logique personnalisée pour un filtre comme celui-ci?


essayez de changer le code comme ceci'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Réponses:


18

essayez d'ajouter un rappel de filtre personnalisé:

dans votre grille:

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

et ajoutez une méthode comme celle-ci:

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

notez qu'il n'est pas testé; vous devrez peut-être vérifier vide plutôt que null dans la base de données; assurez-vous également que vous disposez du bon alias de table (si l'URL n'est pas sur la table principale).


Je vous remercie! Pour une raison quelconque, si j'ai 'filter' => true dans le tableau addColumn, j'obtiens une erreur fatale, mais sans cela, cela fonctionne très bien. Une idée pourquoi je ne peux pas avoir 'filter' => true?
Tyler V.

D'après ce que je peux comprendre, vous ne spécifiez un booléen dans la propriété 'filter' que lorsque vous voulez dire à Magento de ne pas filtrer cette colonne (c'est-à-dire, 'filter' => false). Sinon, vous mettriez le nom d'un bloc utilisé comme filtre. Voir la classe Mage_Adminhtml_Block_Review_Grid_Filter_Type pour un exemple.
Laura

3

essayez d'ajouter un rappel de filtre personnalisé: ici, nous ajoutons une nouvelle colonne de nom de rôle à la grille d'utilisateurs admin.

dans votre grille:

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

et ajoutez une méthode 2 comme celle-ci:

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

Ajouter cette méthode pour le filtre de rôle avec liste déroulante

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.