Half constructed Magento objects

Magento 对象有个半构造状态。称之为半构造或许不恰当,但我一时找不到更合适的词来表达。

先说一个我以前碰到的问题:为什么在产品列表里的产品取不到自定义属性的值?因为此时产品处于半构造状态,半构造状态默认不加载自定义属性。只有在某产品所在的那一产品页,该产品才处于全构造状态。Magento 对象半构造主要是照顾速度。

再说另一个问题:甲产品是一个 bundled product,bundled items 里只有一个 option,该 option 里只有一个 selection,该 selection 是 20 件乙产品。我不明白 Magento 创造这么多名词干嘛,又是 option,又是 selection,暂且不管它,就按 Magento 层层 wrapper 来办。在甲产品的产品页上,要取得捆绑数量(20),可以这么办——

$_product = $this->getProduct(); //$_product is 甲产品
$_option = current($_product->getOptions());  //because only one option
$_selection = current($_option->getSelections()); //because only one selection
$_qty = $_selection->getSelectionQty(); 

如果甲产品是乙产品的相关产品,在乙产品的产品页上,要取得相关产品甲产品的捆绑数量,就无法按上述思路办,这是因为此时甲产品处于半构造状态。那么换个思路,这么来——

$_product = Mage::getModel('catalog/product')->loadByAttribute('sku',$sku); //$_product is 甲产品
$_productType = $_product->getTypeInstance();
$_optionCollection = $_productType->getOptionsCollection();
$_selectionCollection = $_productType->getSelectionsCollection($_productType->getOptionsIds());
$_option = current($_optionCollection->appendSelections($_selectionCollection));
$_selection = current($_option->getSelections());

以上代码微妙之处就在$_option = current($_optionCollection->appendSelections($_selectionCollection));,它把半构造状态的甲产品进一步prepare,于是就有了selections。

1 comment

  1. 我觉得我没有总结恰当:我创造了“半构造状态”这个词却把问题复杂化了。

    简言之,
    $product = Mage::getModel(‘catalog/product’)->loadByAttribute(‘sku’,$sku)

    $productId = Mage::getModel(‘catalog/product’)->loadByAttribute(‘sku’,$sku)->getId();
    $product = Mage::getModel(‘catalog/product’)->load($productId);
    得到的 $product 状态是不一样的,后者可以获取所有属性,前者不可。

Leave a comment

Your email address will not be published. Required fields are marked *