Magento 对象有个半构造状态。称之为半构造或许不恰当,但我一时找不到更合适的词来表达。
先说一个我以前碰到的问题:为什么在产品列表里的产品取不到自定义属性的值?因为此时产品处于半构造状态,半构造状态默认不加载自定义属性。只有在某产品所在的那一产品页,该产品才处于全构造状态。Magento 对象半构造主要是照顾速度。
再说另一个问题:甲产品是一个 bundled product,bundled items 里只有一个 option,该 option 里只有一个 selection,该 selection 是 20 件乙产品。我不明白 Magento 创造这么多名词干嘛,又是 option,又是 selection,暂且不管它,就按 Magento 层层 wrapper 来办。在甲产品的产品页上,要取得捆绑数量(20),可以这么办——
1234 $_product
=
$this
->getProduct();
//$_product is 甲产品
$_option
= current(
$_product
->getOptions());
//because only one option
$_selection
= current(
$_option
->getSelections());
//because only one selection
$_qty
=
$_selection
->getSelectionQty();
如果甲产品是乙产品的相关产品,在乙产品的产品页上,要取得相关产品甲产品的捆绑数量,就无法按上述思路办,这是因为此时甲产品处于半构造状态。那么换个思路,这么来——
123456 $_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