该脚本几乎是正确的,除了$simple_product->getSelectLabel()
是一个错误的钥匙。简单的产品模型中不存在这样的方法/属性。为了使脚本正常工作,应将此密钥替换为正确的密钥 - 产品 ID。利用产品 ID,可以找到所选产品的 sku。
所以,首先你需要重新组织itemId
数组使其成为“productId => ProductSku”映射:
$productMap = array();
foreach($col as $simpleProduct){
$productMap[$simpleProduct->getId()] = $simpleProduct->getSku();
}
然后您需要更改“onchange”函数调用以将 Configurable 的属性 id 传递给changeSku()
功能。因此,底层逻辑能够搜索适当的简单产品属性。
onchange="return changeSku(<?php echo $_attribute->getAttributeId() ?>, this);">
之后,您需要利用可配置的配置来将选定的简单产品的属性 id 映射到所选的产品 id:
function changeSku(confAttributeId, sel) {
var productMap = <?php echo Mage::helper('core')->jsonEncode($productMap);?>;
var selectedAttributeId = sel.options[sel.selectedIndex].value;
if (selectedAttributeId) {
var options = spConfig.config.attributes[confAttributeId].options;
var productId = options.find(function (option) {return option.id == selectedAttributeId}).products[0]
$("sku-container").update("<strong>Product Id: </strong>" + productMap[productId]);
} else {
$("sku-container").update("<strong>Product Id: </strong> Select an option to display Product Id");
}
}
为了供您参考,下面是整个模板的外观摘要(我对其进行了一些美化):
<?php
$_product = $this->getProduct();
$_attributes = Mage::helper('core')->decorateArray($this->getAllowAttributes());
?>
<?php if ($_product->isSaleable() && count($_attributes)):?>
<dl>
<?php foreach($_attributes as $_attribute): ?>
<dt><label class="required"><em>*</em><?php echo $_attribute->getLabel() ?></label></dt>
<dd<?php if ($_attribute->decoratedIsLast){?> class="last"<?php }?>>
<div class="input-box">
<select name="super_attribute[<?php echo $_attribute->getAttributeId() ?>]" id="attribute<?php echo $_attribute->getAttributeId() ?>" class="required-entry super-attribute-select"
onchange="return changeSku(<?php echo $_attribute->getAttributeId() ?>, this);">
<option><?php echo $this->__('Choose an Option...') ?></option>
</select>
</div>
</dd>
<?php endforeach; ?>
</dl>
<script type="text/javascript">
var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>
<?php endif;?>
<div id="sku-container"></div>
<?php
$conf = Mage::getModel('catalog/product_type_configurable')->setProduct($_product);
$col = $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions();
$productMap = array();
foreach($col as $simpleProduct){
$productMap[$simpleProduct->getId()] = $simpleProduct->getSku();
}
?>
<script type="text/javascript">
document.observe("dom:loaded", function() {
$("sku-container").update("<strong>Product Id: </strong> Select an option to display Product Id");
});
function changeSku(confAttributeId, sel) {
var productMap = <?php echo Mage::helper('core')->jsonEncode($productMap);?>;
var selectedAttributeId = sel.options[sel.selectedIndex].value;
if (selectedAttributeId) {
var options = spConfig.config.attributes[confAttributeId].options;
var productId = options.find(function (option) {return option.id == selectedAttributeId}).products[0]
$("sku-container").update("<strong>Product Id: </strong>" + productMap[productId]);
} else {
$("sku-container").update("<strong>Product Id: </strong> Select an option to display Product Id");
}
}
</script>
这将完成您最初需要的任务。
另请注意以下事项
-
您的方法不适用于具有两个或多个可配置属性的可配置产品。对于该产品,直到用户为所有选择输入选择值后才知道最终的简单产品。因此,应该改变一种方法,在输出 SKU 之前检查所有选择。
-
该代码不考虑用户编辑产品配置时的情况,而不是为新产品指定配置。您可以单击“编辑”链接从购物车进入编辑模式。在这种情况下,所有选择输入都将预先填充先前选择的值。但文本会显示“选择一个选项来显示产品 ID”。该脚本还可能在编辑模式下产生其他 Javascript 错误。应稍微修改代码以支持编辑模式。
-
该模板充满了逻辑。 Magento 模板应该只有简单的打印内容
foreach
-迭代。所有方法都像$conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions()
最好移动到块。这降低了代码复杂性。
希望能帮助到你。