So erstellen Sie einen benutzerdefinierten Rasterfilter


8

Ich habe eine benutzerdefinierte Rasterspalte mithilfe der Feld-URL in einer benutzerdefinierten Datenbank hinzugefügt:

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

Und erstellt diese benutzerdefinierte gerendert:

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

Sowie ein benutzerdefiniertes Modell für den Filter 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')
        );
    }
}

Dies funktioniert einwandfrei, es sei denn, Sie versuchen zu filtern. Ich denke, es wird versucht, den Wert 'Ja' mit dem Wert von $row->getData($this->getColumn()->getIndex())(dem URL-Feld in der Datenbanktabelle) abzugleichen. Aber anstatt den URL-Feldwert selbst abzugleichen, versuche ich im Grunde, nach zu filtern, ((bool)empty($url))damit der Benutzer nach ob filtern kann oder nicht, dieser Datenbankeintrag hat eine URL oder nicht.

Wie kann ich eine benutzerdefinierte Logik für einen Filter wie diesen erstellen?


versuchen Sie, den Code wie 'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
folgt

Antworten:


18

Versuchen Sie, einen benutzerdefinierten Filter-Rückruf hinzuzufügen:

in Ihrem Raster:

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

und fügen Sie eine Methode wie die folgende hinzu:

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

Beachten Sie, dass es nicht getestet wurde. Möglicherweise müssen Sie die Datenbank auf leer anstatt auf null prüfen. Stellen Sie außerdem sicher, dass Sie den richtigen Tabellenalias haben (wenn sich die URL nicht in der main_table befindet).


Vielen Dank! Aus irgendeinem Grund, wenn ich 'filter' => true im addColumn-Array habe, wird ein schwerwiegender Fehler angezeigt, aber ohne diesen funktioniert dies hervorragend. Irgendeine Idee, warum ich 'filter' nicht haben kann => true?
Tyler V.

Soweit ich das beurteilen kann, geben Sie in der Eigenschaft 'filter' nur dann einen Booleschen Wert an, wenn Sie Magento anweisen möchten, diese Spalte nicht zu filtern (dh 'filter' => false). Andernfalls würden Sie den Namen eines Blocks eingeben, der als Filter verwendet wird. Ein Beispiel finden Sie in der Klasse Mage_Adminhtml_Block_Review_Grid_Filter_Type.
Laura

3

Versuchen Sie, einen benutzerdefinierten Filter-Rückruf hinzuzufügen: Hier fügen wir dem Administrator-Benutzerraster eine neue Spalte mit dem Rollennamen hinzu.

in Ihrem Raster:

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

und fügen Sie eine 2-Methode wie folgt hinzu:

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

Fügen Sie diese Methode für den Rollenfilter mit Dropdown-Liste hinzu

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.