2016-10-22 7 views
1

Magento受注グリッドに顧客のメールを表示したいと思います。ローカルメールモジュールのMage_Adminhtml_Block_Sales_Order_Gridを書き換えて、顧客の電子メールの新しい列を追加する必要があります。私は注文ごとに電子メールの価値を持っていますが、ソートとフィルタリングは期待通りに機能しません。受注グリッドMagentoでフィルタとソートが機能しない

私はこの問題をソートするのに1日以上を費やしましたが運はありませんでした。また、私はあまりにも答えのいくつかを参照してください。

以下

私はreferring this answerを試してみましたあるコードで、

public function setCollection($collection) 
{ 
    $collection->getSelect()->joinLeft(
     array('sfo'=>'sales_flat_order'), 
     'main_table.entity_id=' . 'sfo' . '.entity_id', 
     array('*') 
    ); 

    $collection->getSelect()->joinLeft(
     array('sfoa'=>'sales_flat_order_address'), 
     'main_table.entity_id=' . 'sfoa' . '.parent_id', 
     array('email') 
    ); 

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

    $collection->addFilterToMap('increment_id', 'main_table.increment_id'); 

    parent::setCollection($collection); 
} 

protected function _prepareColumns() 
{ 
    $this->addColumnAfter('email', array(
     'header' => Mage::helper('sales')->__('Customer Email'), 
     'width' => '80px', 
     'type' => 'text', 
     'index' => 'email', 
     'filter_index' => 'sfoa.email', 
     'filter_condition_callback' => 'filter_last_login', 
     'order_callback'   => 'sort_last_login', 
    ), 'erp_confirm_order'); 

    return parent::_prepareColumns(); 
} 



public function getGridUrl() 
{ 
    return $this->getUrl('*/*/grid', array('_current'=>true)); 
} 

function filter_last_login($collection, $column) 
{ 
    if (!$column->getFilter()->getCondition()) { 
     return; 
    } 

    $condition = $collection->getConnection() 
     ->prepareSqlCondition('sfoa.email', $column->getFilter()->getCondition()); 
    $collection->getSelect()->where($condition); 
} 

function sort_last_login($collection, $column) 
{ 
    $collection->getSelect()->order($column->getIndex() . ' ' . strtoupper($column->getDir())); 
} 

protected function _setCollectionOrder($column) 
{ 
    if ($column->getOrderCallback()) { 
     call_user_func($column->getOrderCallback(), $this->getCollection(), $column); 

     return $this; 
    } 

    return parent::_setCollectionOrder($column); 
} 

編集1

私は顧客の電子メールの列をフィルタリング&をソートするときに何も働かない、私も、私はエラーを取得しています残りのデフォルトのグリッド列をクリックします。

Integrity constraint violation: 1052 Column 'increment_id' in order clause is ambiguous, query was: SELECT `main_table`.*, `sfo`.*, `sfoa`.`email` FROM `sales_flat_order_grid` AS `main_table` 
LEFT JOIN `sales_flat_order` AS `sfo` ON main_table.entity_id=sfo.entity_id 
LEFT JOIN `sales_flat_order_address` AS `sfoa` ON main_table.entity_id=sfoa.parent_id GROUP BY `main_table`.`entity_id` ORDER BY increment_id ASC LIMIT 20 

ご迷惑をおかけして申し訳ありません。 ありがとう、

+0

あなたはすべてのエラーメッセージを取得してくださいか、それは単にまったく何もしないのですか? – Ian

+1

@Ian並べ替えとフィルタリングは何も起こりません。親切に編集を確認する1.ありがとう。 –

答えて

1

元の回答とは異なる問題は、あいまいな名前のフィールドに参加していることです。フィルタリングするフィールドを指定する必要があります。私は自分の前でこれに直面してきました。

sales_flat_orderから列を追加するときは、カスタムフィルタまたは並べ替えコールバックを行う必要はありません。これは、最後のログイン日の元の例のように、より複雑なフィルタリング/並べ替えクエリが必要な場合にのみ必要です。あなたの 'filter_index'が設定されていることを確認してください。正常に動作します。以下の例では、請求先住所から顧客の電子メールを追加しています。ここで

class My_Namespace_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid 
{ 
    public function setCollection($collection) 
    { 
     $collection->join(['sfoa' => 'sales/order_address'], 'main_table.entity_id=sfoa.parent_id AND sfoa.address_type="billing"', ['billing_email' => 'sfoa.email']); 

     parent::setCollection($collection); 
    } 

    public function _prepareColumns() 
    { 
     parent::_prepareColumns(); 

     foreach ($this->getColumns() as $column) { 
      if (!$column->getFilterIndex()) { 
       $column->setFilterIndex('main_table.'.$column->getIndex()); 
      } 
     } 

     $this->addColumnAfter('customer_email', [ 
      'header' => Mage::helper('customer')->__('Customer Email'), 
      'width' => '50px', 
      'index' => 'billing_email', 
      'filter_index' => 'sfoa.email', 
     ], 'shipping_name'); 

     $this->sortColumnsByOrder(); 
     return $this; 
    } 
} 

は、注文テーブル自体からの例です:

class My_Namespace_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid 
{ 
    public function setCollection($collection) 
    { 
     $collection->join(['sfo' => 'sales/order'], 'main_table.entity_id=sfo.entity_id', 'customer_email'); 

     parent::setCollection($collection); 
    } 

    public function _prepareColumns() 
    { 
     parent::_prepareColumns(); 

     foreach ($this->getColumns() as $column) { 
      if (!$column->getFilterIndex()) { 
       $column->setFilterIndex('main_table.'.$column->getIndex()); 
      } 
     } 

     $this->addColumnAfter('customer_email', [ 
      'header' => Mage::helper('customer')->__('Customer Email'), 
      'width' => '50px', 
      'index' => 'customer_email', 
      'filter_index' => 'sfo.customer_email', 
     ], 'shipping_name'); 

     $this->sortColumnsByOrder(); 
     return $this; 
    } 
} 
+0

素晴らしいです!ご協力いただき誠にありがとうございます。 –

関連する問題