Cách tạo bộ lọc lưới tùy chỉnh


8

Tôi đã thêm một cột lưới tùy chỉnh bằng URL trường trong cơ sở dữ liệu tùy chỉnh:

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

Và tạo kết xuất tùy chỉnh này:

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

Cũng như một mô hình tùy chỉnh cho bộ lọc 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')
        );
    }
}

Điều này hoạt động tốt trừ khi bạn cố gắng để lọc. Tôi nghĩ rằng nó đang cố khớp giá trị 'Có' với giá trị của $row->getData($this->getColumn()->getIndex())(trường URL trong bảng cơ sở dữ liệu.) Nhưng thay vì khớp chính giá trị của trường URL, tôi về cơ bản đang cố gắng lọc ((bool)empty($url))để người dùng có thể lọc theo hoặc không mục cơ sở dữ liệu này có URL hay không.

Làm cách nào tôi có thể tạo logic tùy chỉnh cho bộ lọc như thế này?


hãy thử thay đổi mã như thế này'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

Câu trả lời:


18

thử thêm một cuộc gọi lại bộ lọc tùy chỉnh:

trong lưới của bạn:

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

và thêm một phương thức như thế này:

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

lưu ý rằng nó không được thử nghiệm; bạn có thể phải kiểm tra trống thay vì null trên cơ sở dữ liệu; cũng đảm bảo rằng bạn có bí danh bảng chính xác (nếu URL không nằm trên main_table).


Cảm ơn bạn! Vì một số lý do nếu tôi có 'bộ lọc' => đúng trong mảng addColumn, tôi gặp lỗi nghiêm trọng, nhưng không có nó, điều này hoạt động rất tốt. Có ai biết tại sao tôi không thể có 'bộ lọc' => đúng không?
Tyler V.

Từ những gì tôi có thể thu thập, bạn chỉ chỉ định một boolean trong thuộc tính 'bộ lọc' khi bạn muốn nói với Magento không lọc cột đó (tức là 'bộ lọc' => sai). Nếu không, bạn sẽ đặt tên của một khối được sử dụng làm bộ lọc. Xem lớp Mage_Adminhtml_Block_Review_Grid_Filter_Type để biết ví dụ.
Laura

3

thử thêm một cuộc gọi lại bộ lọc tùy chỉnh: Ở đây chúng tôi thêm cột Tên vai trò mới vào lưới người dùng quản trị viên.

trong lưới của bạn:

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

và thêm một phương thức 2 như thế này:

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

Thêm phương thức này cho Bộ lọc vai trò với trình đơn thả xuống

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.