[英]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屬性仍為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
屬性作為數據源。 不幸的是,我現在無法解釋這種行為。
我發現的是,直到您實際調用getData()
,才設置集合_data
屬性,但是實際上設置了每個集合成員上的_data
,因此可以在迭代集合時訪問新添加的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.