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?

Tyler V.
la source
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).

Laura
la source
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;
}
Kinjalkumar Prajapati
la source