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?

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

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