我一直在努力将两个不同的集合合并在一起,我发现这很难做到。
实际上,我要做的唯一一件事就是为已经实例化的(我认为)集合添加另一个属性。
这是我的代码:
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
实际上是设置的,因此可以在迭代集合时访问新添加的属性。