カスタムグリッドフィルターを作成する方法


8

カスタムデータベースのフィールドURLを使用してカスタムグリッド列を追加しました。

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

そして、このカスタムレンダリングを作成しました:

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

また、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')
        );
    }
}

フィルターをかけようとしない限り、これは正常に機能します。値「はい」を$row->getData($this->getColumn()->getIndex())(データベーステーブルのURLフィールド)の値に一致させようとしていると思います。しかし、URLフィールドの値自体を照合する代わりに、基本的((bool)empty($url))にユーザーがフィルタリングできるようにフィルターをかけています。このデータベースエントリにURLがあるかどうか。

このようなフィルターのカスタムロジックを作成するにはどうすればよいですか?


このようなコードを変更してみてください'renderer' => Company_Module_Block_Adminhtml_Module_Grid_Renderer_HasUrl
MeenakshiSundaram R

回答:


18

カスタムフィルターコールバックを追加してみてください。

あなたのグリッドで:

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

次のようなメソッドを追加します。

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

テストされていないことに注意してください。データベースでnullではなく空を確認する必要がある場合があります。また、正しいテーブルエイリアスがあることを確認してください(URLがmain_tableにない場合)。


ありがとうございました!何らかの理由で、addColumn配列に 'filter' => trueを指定すると、致命的なエラーが発生しますが、それがなければ、これはうまく機能します。'filter' => trueにできない理由は何ですか?
タイラーV.

私が収集できるものから、Magentoにその列をフィルターしないように指示する場合(つまり、 'filter' => false)は、 'filter'プロパティでブール値を指定するだけです。それ以外の場合は、フィルターとして使用されるブロックの名前を入力します。例については、Mage_Adminhtml_Block_Review_Grid_Filter_Typeクラスを参照してください。
Laura

3

カスタムフィルターコールバックを追加してみてください。ここでは、新しいロール名列を管理ユーザーグリッドに追加します。

あなたのグリッドで:

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

次のような2つのメソッドを追加します。

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

このメソッドをドロップダウン付きのロールフィルターに追加します

public function getRoleName() {
    $rolename = array();
    $roles = Mage::getModel('admin/roles')->getCollection();
    foreach ($roles as $role):
        $rolename[$role->getId()] = $role->getRoleName();
    endforeach;
    return $rolename;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.