2012-01-11 59 views
2

我重寫法師/ Adminhtml /銷售/訂單/ Grid.php並添加一些數據到prepareCollection。這就是我如何將客戶的EAV屬性campaign_id包含在集合中,但這有點不合理。我想知道是否有更好的方法。更好的方式來增加屬性集合

protected function _prepareCollection() 
{ 
    $collection = Mage::getResourceModel($this->_getCollectionClass()); 
    foreach ($collection as &$object){ 
     $customer = Mage::getModel('customer/customer') 
      ->setId($object->getCustomerId()) 
      ->load(); 
     $object->setCampaignId($customer->getCampaignId()); 

    } 
    $this->setCollection($collection); 
    return parent::_prepareCollection(); 
} 
+0

你拿這個數據做什麼?你是否也添加了一列來顯示? – benmarks 2012-01-11 19:37:15

+0

是的,也添加一列。 – 2012-01-12 17:13:30

回答

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 2012-01-31 13:53:12

+0

我希望同樣的事情。如果你有一個更好的解決辦法,我很樂意看到它。 – 2012-01-31 20:27:44

+1

我發佈了一個更靈活的解決方案作爲答案。在'sales_order_grid_collection_load_before'事件上使用事件觀察者來激發您所需的字段。這是Magento集合類中自動觸發事件的主要用途。 – benmarks 2012-02-01 18:33:06

相關問題