如何将自定义数据添加到加载的Magento集合中

时间:2015-09-02 12:20:36

标签: php 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>';
}

问题在于,使用$banners打印getData()集合时,我看不到[product]属性,但如果我在没有getData()的情况下执行此操作,那么我看到它。

如果您有任何想法我会非常感激!

谢谢!

2 个答案:

答案 0 :(得分:2)

Developer_Banners_Model_Resource_Banner_CollectionMage_Core_Model_Resource_Db_Collection_Abstract继承并添加项目时,该项目不会添加到$ _data属性,而是添加到$ _items属性。

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

当您调用getData()方法时,$ _data属性仍为null。然后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属性作为数据源。 不幸的是,我现在无法解释这种行为。

答案 1 :(得分:0)

我发现的是,在你实际调用_data之前,集合getData()属性没有被设置,但每个集合成员上的_data实际上已经设置,所以它是可能的在迭代集合时访问新添加的属性。