2015-09-02 62 views
1

我一直在努力將兩個不同的集合合併在一起,我發現它很難做到。如何將自定義數據添加到加載的Magento集合

其實,我正在嘗試做的唯一事情是將另一個屬性添加到已經實例化(我認爲)的集合。

這是我的代碼:

private function _addProductsToBanners() 
{ 
    $skus = $this->_getBannersSkus(); 

    $products = Mage::getResourceModel('catalog/product_collection') 
     ->addFieldToFilter('sku', array('in' => $skus)) 
     ->addAttributeToSelect(array('name')); 

    /** @var Developer_Banners_Model_Resource_Banner_Collection $banners */ 
    $banners = $this->banners; 

    foreach ($banners as $banner) { 
     foreach ($products as $product) { 
      if ($banner->getSku() == $product->getSku()) 
      { 
       $banner->setData('product', 1); 
      } 
     } 
    } 
    echo '<pre>'; 
    print_r($banners->getData()); 
    echo '</pre>'; 
} 

這裏的問題是,與getData()打印$banners集合時,我看不到[product]財產,但如果我這樣做沒有getData()然後我看到它。

如果您有任何想法,我將不勝感激!

謝謝!

回答

2

Developer_Banners_Model_Resource_Banner_Collection繼承自Mage_Core_Model_Resource_Db_Collection_Abstract並且您添加項目時,該項目不會添加到$ _data屬性,而是添加到$ _items屬性。

protected function _addItem($item) 
{ 
    $this->_items[] = $item; 
    return $this; 
} 

當您調用getData()方法時,$ _data屬性仍爲空。然後getData()方法將從數據庫中獲取數據並返回結果。

public function getData() 
{ 
    if ($this->_data === null) { 


     $this->_renderFilters() 
      ->_renderOrders() 
      ->_renderLimit(); 
     /** 
     * Prepare select for execute 
     * @var string $query 
     */ 
     $query  = $this->_prepareSelect($this->getSelect()); 
     $this->_data = $this->_fetchAll($query, $this->_bindParams); 
     $this->_afterLoadData(); 
    } 
    return $this->_data; 
} 

通過只是在對象上迭代each()方法被執行:

public function each($obj_method, $args=array()) 
    { 
     foreach ($args->_items as $k => $item) { 
      $args->_items[$k] = call_user_func($obj_method, $item); 
     } 
    } 

此方法使用$_items屬性作爲數據源。 不幸的是我現在無法解釋這種行爲。

+0

謝謝!當你有時間的時候 - 你能解釋爲什麼不是用於集合的_data屬性,因爲它最終會被_items最初填充的相同數據填充? – Wowca

+1

我會稍後嘗試添加解釋。 – smiggle

0

我發現的事情是,收集_data屬性沒有被設置,直到你實際調用getData(),但每個集合成員的_data實際設置,所以它可以訪問新添加的屬性遍歷集合時。

相關問題