2012-03-02 11 views
2

セイグリッド内の1つの列が計算された値を持つテキスト型カラムフィルタリング:Magentoの管理グリッド内のMySQL計算値

setCollection()

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 'Yes', 'No')"), 

_prepareColumns()ました:

$this->addColumnAfter('refunded', array(
    'header' => Mage::helper('helper')->__('Refunded'), 
    'index' => 'refunded', 
    'type' => 'text', 
), 'qty'); 

「はい」の値を持つ列を使用するには、どのように変更する必要がありますか? 「はい」と入力してフィルタリングしますか?

+0

はい/いいえの列に 'options'という型を使用しない理由はありますか? –

+0

@JürgenThelen - はい、マジェンタの初心者です。しかし、私はあなたの提案を試みるでしょう。 – nevvermind

+0

嫌悪感はありません。私はあなたが何らかの理由でそれを避けていると思った。 –

答えて

4

Adminhtmlグリッド列には、ブロッククラスを指定するfilterプロパティがあります。ブール値yes/noフィールドの場合、通常はadminhtml/widget_grid_column_filter_selectとなります。
フィールドタイプが「オプション」の場合、自動的に使用されます。

_prepareCollection()でこれを試してみてください:これはまだ列に "いいえ" "はい" と自分の価値観をレンダリングしなければならない

$this->addColumnAfter('refunded', array(
    'header' => Mage::helper('helper')->__('Refunded'), 
    'index' => 'refunded', 
    'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')) 
), 'qty'); 

、および:

'refunded' => new Zend_Db_Expr("IF(qty_refunded > 0, 1, 0)"), 

そして_prepareColumns()使用中フィルタドロップダウンとして適切なオプションが選択されます。

計算された値を持つ列は、MySQLによってWHERE節で直接参照できないため、これだけでは不十分です。 Magentoには、これを回避するための2つのオプションがあります。

カラムフィルタブロックには、コレクションをフィルタリングするために使用される条件を返すメソッドgetCondition()があります。例については、Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Abstract::getCondition()を参照してください。
フィルタの実行に使用するSQLをカスタマイズする必要がある場合は、Mage_Adminhtml_Block_Widget_Grid_Column_Filter_Selectまで拡張した独自の列フィルタブロックを作成し、必要に応じて返された条件を調整します。
カスタムフィルタがaddColumn()定義で、このような列に指定することができます。

'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')), 
    'filter' => 'your_module/adminhtml_widget_grid_column_filter_custom', 

あなたはMagentoののORMフィルタの構文の制限の外で作業するprefere場合は、コレクションは使用して直接選択し、変更することができますフィルタのコールバック:

'type' => 'options', 
    'options' => array(0 => $this->__('No'), 1 => $this->__('Yes')), 
    'filter_condition_callback' => array($this, '_applyMyFilter'), 

コールバックは引数としてコレクションと列を受け取ります。ここでその方法のための簡単な例である:(計算値に対してフィルタリング)両方のアプローチは、MySQLで非常に非効率的であることは言うまでもない

protected function _applyMyFilter(Varien_Data_Collection_Db $collection, Mage_Adminhtml_Block_Widget_Grid_Column $column) 
{ 
    $select = $collection->getSelect(); 
    $field = $column->getIndex(); 
    $value = $column->getFilter()->getValue(); 
    $select->having("$field=?, $value); 
} 


。しかし、おそらくそれはあなたにとってこの問題ではありません。

0

私は実際の例を投稿しますが、私はVinaiの答えを細かく選択します。

グリッド内。php:

protected function _addColumnFilterToCollection($column) 
{ 
    if ($column->getId() == 'refunded' && $column->getFilter()->getValue()) { 
     $val  = $column->getFilter()->getValue(); 
     $comparison = ($val === "No") ? 'lteq' : 'gt'; // lteg: <=; gt: > 

     $this->getCollection()->addFieldToFilter('ois.qty_refunded', array($comparison => 0)); 
    } else { 
     parent::_addColumnFilterToCollection($column); 
    } 

    return $this; 
} 
関連する問題