2015-09-02 54 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实际设置,所以它可以访问新添加的属性遍历集合时。

相关问题