1. 程式人生 > >Magento 向商品列表中的商品物件新增指定屬性

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屬性