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。
Leave a Reply