2017-04-07 14 views
0

私はMagento AdminモジュールをGridで作成し、カスタムフィルタを持つフィールドを作成しました。Magento Admin Grid Fieldカスタムフィルタの問題

$this->addColumn('diff', array(
     'header' =>'Diff.', 
     'align'  =>'left', 
     'type' => 'number', 
     'index'  =>'diff', 
     'filter_condition_callback' => array($this, '_diffFilter'), 
    )); 

コレクションとして下記により基を有する:以下のように

$collection->getSelect()->group(array('main_table.order_id'));

カスタムフィルタ機能:

protected function _diffFilter($collection, $column) { 
    if (!$value = $column->getFilter()->getValue()) { 
     return $this; 
    } 
    $_filter_data = $column->getFilter()->getValue();    

    if($_filter_data["from"]!=''){ 
     $collection->getSelect()->having('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) >= ?', $_filter_data["from"]);   
    } 

    if($_filter_data["to"]!=''){ 
     $collection->getSelect()->having('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) <= ?', $_filter_data["to"]); 
    } 

    return $this; 
} 

私はそれがエラーの下に投げるのadminグリッドをロードする場合は、この機能を使用する: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'main_table.base_cost' in 'having clause'

しかし、これを使用して$collection->getSelect()というクエリを選択してからMySQLに直接実行すると、うまくいきますが、Magentoからのエラーだけがスローされます。

私は多くの研究をしましたが、Magentoではまったく動作しません。

答えて

0

HAVING句は、グループ化されたクエリの結果をフィルタリングするために使用されます。私が持っ句を使用理由ですので

protected function _diffFilter($collection, $column) { 
    if (!$value = $column->getFilter()->getValue()) { 
     return $this; 
    } 
    $_filter_data = $column->getFilter()->getValue();    

    if($_filter_data["from"]!=''){ 
     $collection->getSelect()->where('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) >= ?', $_filter_data["from"]);   
    } 

    if($_filter_data["to"]!=''){ 
     $collection->getSelect()->where('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) <= ?', $_filter_data["to"]); 
    } 

    return $this; 
} 
+0

申し訳ありませんが、それはSQLグループのクエリを持って、上記更新質問を参照してください:あなたは、テーブル内の列をフィルタリングしたい場合は、WHERE句を使用します。 –

+0

あなたがしようとしているフィルタリングは、まだ 'HAVING'節では適切ではありません。作成しようとしている完全なクエリをリストアップしてください。また、スタックトレースを見ると、データを読み込んだり結果を数えるときにエラーが発生しますか? –