Cara membuat filter kisi khusus


8

Saya telah menambahkan kolom kisi khusus menggunakan URL bidang dalam database khusus:

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

Dan membuat kustom ini dirender:

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

Serta model khusus untuk dropdwon filter:

class Company_Module_Model_Hasurl extends Varien_Object
{
    static public function getOptionArray()
    {
        return array(
            'Yes'   => Mage::helper('companymodule')->__('Yes'),
            'No'    => Mage::helper('companymodule')->__('No')
        );
    }
}

Ini berfungsi dengan baik kecuali jika Anda mencoba memfilter. Saya pikir ini mencoba mencocokkan nilai 'Ya' dengan nilai $row->getData($this->getColumn()->getIndex())(bidang URL dalam tabel basis data.) Tetapi alih-alih mencocokkan nilai bidang URL itu sendiri, saya pada dasarnya mencoba memfilter dengan ((bool)empty($url))sehingga pengguna dapat memfilter berdasarkan apakah atau tidak entri database ini memiliki URL atau tidak.

Bagaimana saya bisa membuat logika khusus untuk filter seperti ini?


coba ubah kode seperti ini'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Jawaban:


18

coba tambahkan callback filter khusus:

di kotak Anda:

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

dan tambahkan metode seperti ini:

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

perhatikan itu tidak diuji; Anda mungkin harus memeriksa kosong daripada nol pada database; juga pastikan Anda memiliki tabel alias yang benar (jika URL tidak pada main_table).


Terima kasih! Untuk beberapa alasan jika saya memiliki 'filter' => true di array addColumn saya mendapatkan kesalahan fatal, tetapi tanpa itu, ini berfungsi dengan baik. Adakah gagasan mengapa saya tidak dapat memiliki 'filter' => benar?
Tyler V.

Dari apa yang saya dapat kumpulkan, Anda hanya menentukan boolean di properti 'filter' ketika Anda ingin memberi tahu Magento untuk tidak memfilter kolom itu (yaitu, 'filter' => false). Jika tidak, Anda akan meletakkan nama blok yang digunakan sebagai filter. Lihat kelas Mage_Adminhtml_Block_Review_Grid_Filter_Type untuk contoh.
Laura

3

coba tambahkan callback filter khusus: Di sini kami menambahkan kolom Nama Peran baru ke kisi pengguna admin.

di kotak Anda:

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

dan tambahkan 2 metode seperti ini:

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

Tambahkan metode ini untuk Filter Peran dengan drop-down

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.