如何添加自定义数据加载Magento集合


How to add custom data to loaded Magento collection

我一直在努力将两个不同的集合合并在一起,我发现这很难做到。

实际上,我要做的唯一一件事就是为已经实例化的(我认为)集合添加另一个属性。

这是我的代码:

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()的情况下这样做,那么我就会看到它。

如果你有任何想法,我将不胜感激!

谢谢!

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()方法将从DB中获取数据并返回结果。

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属性作为数据源。遗憾的是,我现在无法解释这种行为

我发现的事情是,在实际调用getData()之前,没有设置集合_data属性,但是每个集合成员上的_data实际上是设置的,因此可以在迭代集合时访问新添加的属性。