Come creare un filtro griglia personalizzato


8

Ho aggiunto una colonna della griglia personalizzata utilizzando l'URL del campo in un database personalizzato:

$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 creato questo rendering personalizzato:

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

Oltre a un modello personalizzato per il 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')
        );
    }
}

Funziona bene a meno che non provi a filtrare. Penso che stia cercando di far corrispondere il valore 'Sì' al valore di $row->getData($this->getColumn()->getIndex())(il campo URL nella tabella del database.) Ma invece di far corrispondere il valore del campo URL stesso, sto sostanzialmente cercando di filtrare in ((bool)empty($url))modo che l'utente possa filtrare se oppure no questa voce di database ha un URL o no.

Come posso creare una logica personalizzata per un filtro come questo?


prova a cambiare il codice in questo modo'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Risposte:


18

prova ad aggiungere un callback del filtro personalizzato:

nella tua griglia:

$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 aggiungi un metodo come questo:

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

nota che non è testato; potrebbe essere necessario controllare vuoto nel database anziché null; assicurati anche di avere l'alias di tabella corretto (se l'URL non è sulla tabella principale).


Grazie! Per qualche ragione se ho 'filter' => true nella matrice addColumn ottengo un errore fatale, ma senza di esso, funziona alla grande. Qualche idea sul perché non posso avere 'filter' => true?
Tyler V.

Da quello che posso raccogliere, specifichi un valore booleano nella proprietà 'filter' solo quando vuoi dire a Magento di non filtrare quella colonna (cioè, 'filter' => false). Altrimenti, inseriresti il ​​nome di un blocco utilizzato come filtro. Vedi la classe Mage_Adminhtml_Block_Review_Grid_Filter_Type per un esempio.
Laura,

3

prova ad aggiungere un callback del filtro personalizzato: qui aggiungiamo la nuova colonna Nome ruolo alla griglia utente amministratore.

nella tua griglia:

$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 aggiungi un metodo 2 come questo:

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

Aggiungi questo metodo per Filtro ruoli con menu a discesa

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.