Magento 向商品列表中的商品物件新增指定屬性
這裡以商品的SKU做例子:
因為商品的SKU在magento中是靜態屬性非eav屬性,所以列表中是沒有SKU這個屬性的,所以要新增這個屬性到列表中,這裡面新增的位置有兩個:
第一個方法:
$category = Mage::getModel('catalog/category')->load($category_id);
$products = $category->getProductCollection();
這裡是通過分類來得到分類下的商品集合,所以在得到商品集合這裡面進行新增SKU屬性:
這裡呼叫的方法是getProductCollection()
public function getProductCollection()
{
$collection = Mage::getResourceModel('catalog/product_collection')
->setStoreId($this->getStoreId())
->addCategoryFilter($this);
return $collection;
}
該方法裡面涉及到了Mage_Catalog_Model_Resource_Product_Collection類,在呼叫該Collection資源類的時候會自動呼叫_construct類,對資源模型進行初始化:
/**
* Initialize resources
*
*/
protected function _construct()
{
if ($this->isEnabledFlat()) {
$this->_init('catalog/product', 'catalog/product_flat');
}
else {
$this->_init('catalog/product');
}
$this->_initTables();
}
這裡面又呼叫了_init()方法:
/**
* Standard resource collection initalization
*
* @param string $model
* @param unknown_type $entityModel
* @return Mage_Catalog_Model_Resource_Product_Collection
*/
protected function _init($model, $entityModel = null)
{
if ($this->isEnabledFlat()) {
$entityModel = 'catalog/product_flat';
}
return parent::_init($model, $entityModel);
}
繼承父類是:
/**
* Standard resource collection initalization
*
* @param string $model
* @return Mage_Core_Model_Mysql4_Collection_Abstract
*/
protected function _init($model, $entityModel = null)
{
$this->setItemObjectClass(Mage::getConfig()->getModelClassName($model));
if ($entityModel === null) {
$entityModel = $model;
}
$entity = Mage::getResourceSingleton($entityModel);
$this->setEntity($entity);
return $this;
}
這裡設定了模型和資源模型。大多數集合繼承的抽象資料庫集合_initSelect()在其__construct()方法的末尾呼叫一個方法(也是在_constrct()呼叫之後)。
框架是magento,預設把init()定義為初始化函式,那麼magento會在執行其他程式之前執行init()函式,這實際上和php內建的建構函式有異曲同工的效果了. 在這種情況下你可以只定義init() 函式, 也可以只定義 __construct() 函式, 或者二者兼有.
(備註: __construct() 是PHP內建的建構函式, 是同 PHP 解析引擎自動呼叫的, 而 init() 則是由 PHP 框架自動呼叫的.)
/**
* Initialize factory
*
* @param Mage_Core_Model_Resource_Abstract $resource
* @param array $args
*/
public function __construct($resource = null, array $args = array())
{
parent::__construct($resource);
$this->_factory = !empty($args['factory']) ? $args['factory'] : Mage::getSingleton('catalog/factory');
}
繼承父類:
/**
* Collection constructor
*
* @param Mage_Core_Model_Resource_Abstract $resource
*/
public function __construct($resource = null)
{
parent::__construct();
$this->_construct();
$this->setConnection($this->getEntity()->getReadConnection());
$this->_prepareStaticFields();
$this->_initSelect();
}
這裡在最後呼叫了_initSelect(),該_initSelect方法設定集合的選擇查詢的主表。
/**
* Initialize collection select
* Redeclared for remove entity_type_id condition
* in catalog_product_entity we store just products
*
* @return Mage_Catalog_Model_Resource_Product_Collection
*/
protected function _initSelect()
{
if ($this->isEnabledFlat()) {
$this->getSelect()
->from(array(self::MAIN_TABLE_ALIAS => $this->getEntity()->getFlatTableName()), null)
->where('e.status = ?', new Zend_Db_Expr(Mage_Catalog_Model_Product_Status::STATUS_ENABLED));
$this->addAttributeToSelect(array('entity_id', 'type_id', 'attribute_set_id'));
if ($this->getFlatHelper()->isAddChildData()) {
$this->getSelect()
->where('e.is_child = ?', 0);
$this->addAttributeToSelect(array('child_id', 'is_child'));
}
} else {
$this->getSelect()->from(array(self::MAIN_TABLE_ALIAS => $this->getEntity()->getEntityTable()));
}
return $this;
}
在$this->addAttributeToSelect(array(‘entity_id’, ‘type_id’, ‘attribute_set_id’));可以新增想要新增的屬性。這裡也涉及到了magento中資源模型。
第二個方法:
Mage::getModel('catalog/layer')->prepareProductCollection($products);
這裡呼叫prepareProductCollection()方法:
/**
* Initialize product collection
*
* @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection $collection
* @return Mage_Catalog_Model_Layer
*/
public function prepareProductCollection($collection)
{
$collection
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addTaxPercents();
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
return $this;
}
在這裡可以在Collection集合類中新增sku屬性:
public function prepareProductCollection($collection)
{
$collection
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addTaxPercents()
->addAttributeToSelect('sku');
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
return $this;
}
通過該方法也可以在商品物件中新增上sku屬性