2012-01-11 6 views
2

私はMage/Adminhtml/Sales/Order/Grid.phpをオーバーライドしてprepareCollectionにデータを追加しています。これは、顧客のEAV属性campaign_idをコレクションに含める方法ですが、それは一種のハッキーです。私はもっ​​と良い方法があるのだろうかと思っていた。コレクションに属性を追加する方が良い

+0

このデータはどうしていますか?表示する列も追加していますか? – benmarks

+0

はい、列も追加しています。 –

答えて

8

顧客レコードのデータをロードされる前に注文コレクションに追加する必要があります。

ロードイベント後に&の前にコレクションを確認できます。 sales/order_grid_collectionコレクションについては、これらのイベントはsales_order_grid_collection_load_beforesales_order_grid_collection_load_afterです。前者を使用します。コレクションは_before_loadイベントオブザーバー$observer->getOrderGridCollection()でアクセスできます。

0
protected function _prepareCollection() { 

    $collection = Mage::getResourceModel($this->_getCollectionClass()); 
    $class = get_class($collection); 
    $attribute = Mage::getModel('eav/config') 
       ->getAttribute('customer', 'campaign_id'); 
    $attributeId = $attribute->getAttributeId(); 
    $backendType = $attribute->getBackendType(); //probably varchar 

    $tableName = Mage::getSingleton('core/resource') 
      ->getTableName('customer_entity_' . $backendType); 

    $collection->getSelect() 
       ->joinLeft(array('v' => $tableName), 
         'main_table.customer_id = v.entity_id AND attribute_id = 153', 
         array('v.value', 'v.attribute_id')); 

    $this->setCollection($collection); 

    return parent::_prepareCollection(); 
    } 
+0

このグリッドクラスを書き直す必要はもうないと思います。 – benmarks

+0

私は同じことを望んでいます。もっと良い解決策があれば、それを見てみたいです。 –

+1

上記のより柔軟なソリューションを回答として投稿しました。 'sales_order_grid_collection_load_before'イベントでイベントオブザーバーを使用して、必要なフィールドを叩きます。これは、Magentoコレクションクラスの自動起動イベントの主なユーティリティです。 – benmarks

関連する問題