我有这个脚本来显示动态SKU上选择选项,但我不能得到工作。
正在加载正确的sku,但在选择时什么也没发生。
这段代码在JavaScript上获取SKU列表,并在可配置产品视图上的产品选择选项上更新div。
<?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(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;?>
<?php
$conf = Mage::getModel('catalog/product_type_configurable')->setProduct($_product);
$col = $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions();
echo '<script type="text/javascript">';
echo '
document.observe("dom:loaded", function() {
$("sku-container").update("<strong>Product Id: </strong> Select an option to display Product Id");
});
';
echo ' function changeSku(sel){';
$itemId = array();
foreach($col as $simple_product){
$itemId[] = array($simple_product->getSelectLabel() => $simple_product->getSku());
}
//echo "<pre>";
//print_r($itemId);
//echo "</pre>";
foreach($itemId as $val){
foreach($val as $k => $v){
echo "\n".'if(sel.options[sel.selectedIndex].value == "'.$k.'"){'."\n";
echo '$("sku-container").update("<strong>Product Id: </strong>'.$v.'");'. "\n";
echo '}';
}
}
echo "\n".'if(sel.options[sel.selectedIndex].value == ""){'."\n";
echo '$("sku-container").update("<strong>Product Id: </strong> Select an option to display Product Id");'. "\n";
echo '}';
echo "}";
echo "\n</script>";
?>
字符串
我很感激任何帮助。
谢谢
2条答案
按热度按时间oyxsuwqo1#
脚本几乎是正确的,除了
$simple_product->getSelectLabel()
是一个错误的关键字。在一个简单的产品模型中不存在这样的方法/属性。为了使脚本工作,这个关键字应该被替换为正确的关键字-产品ID。利用产品ID,可以找到所选产品的SKU。因此,首先需要重新组织
itemId
数组,使其成为“productId => productSku”map:字符串
然后,您需要更改“onchange”函数调用,将Configurable的属性id传递给
changeSku()
函数。因此,底层逻辑能够搜索适当的简单产品属性。型
之后,您需要利用configurable的config来将选定的简单产品的属性idMap到选定的产品id:
型
为了供您参考,下面是整个模板的外观摘要(我稍微美化了一下):
型
这将完成您最初需要的任务。
还要注意以下几点
1.您的方法不适用于具有两个或多个可配置属性的可配置产品。对于该产品,最终的简单产品直到用户为所有选择输入选择值才知道。因此,应该更改方法以在输出前检查所有选择。
1.代码不考虑情况,当用户编辑产品配置时,而不是指定新产品的配置。您可以从购物车中单击编辑链接进入编辑模式。在这种情况下,所有选择输入都将预先填充先前选择的值。但文本将显示“选择一个选项以显示产品ID”。脚本在编辑模式下也可能产生其他JavaScript错误。代码应该稍微修改,以便也支持编辑模式。
1.模板被逻辑填充过多。Magento模板应该只有简单的打印和
foreach
-迭代。所有像$conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions()
这样的方法最好被移动到块中。这降低了代码的复杂性。希望对你有帮助。pdkcd3nj2#
为了显示所选产品的产品编号,您可以为
Magento\ConfigurableProduct\Block\Product\View\Type\Configurable::getJsonConfig()
创建一个Plugin (Interceptor),您需要为每个简单产品添加缺少的编号。根据属性的类型,可以在
vendor/magento/module-swatches/view/base/web/js/swatch-renderer.js
和vendor/magento/module-configurable-product/view/frontend/web/js/configurable.js
中实现在选择选项时切换属性。我做了免费的
VCT Change SKU Dynamically
模块,解决了这个问题。