在可配置的产品视图Magento上显示动态SKU

Dar*_*Dar 3 dynamic magento

我有这个脚本来显示选择选项的动态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>";
?>
Run Code Online (Sandbox Code Playgroud)

我感谢任何帮助.

谢谢

And*_*kus 8

除了$simple_product->getSelectLabel()错误的密钥外,该脚本几乎是正确的.简单的产品模型中不存在这样的方法/属性.为了使脚本正常工作,应使用正确的密钥替换此密钥 - 产品ID.利用产品ID,可以找到所选产品的sku.


所以,首先你需要重新组织itemId数组,使其成为"productId => productSku"地图:

$productMap = array();
foreach($col as $simpleProduct){
    $productMap[$simpleProduct->getId()] = $simpleProduct->getSku();
}
Run Code Online (Sandbox Code Playgroud)


然后,您需要更改"onchange"函数调用以将Configurable的属性id传递给该changeSku()函数.因此,底层逻辑能够搜索适当的简单产品属性.

onchange="return changeSku(<?php echo $_attribute->getAttributeId() ?>, this);">
Run Code Online (Sandbox Code Playgroud)


之后,您需要利用可配置的配置,以便将选定的简单产品的属性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");
    }
}
Run Code Online (Sandbox Code Playgroud)


供您参考,以下是整个模板的外观总结(我已经美化了一点):

<?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>
Run Code Online (Sandbox Code Playgroud)

这将完成您最初需要的任务.


另请注意以下内容

  1. 您的方法不适用于具有两个或更多可配置属性的可配置产品.对于该产品,在用户选择所有选择输入的值之前,不知道最终的简单产品.因此,在输出SKU之前,应该更改方法以检查所有选择.
  2. 当用户编辑产品配置时,代码不考虑这种情况,而不是为新产品指定配置.您可以单击编辑链接从购物车进入编辑模式.在这种情况下,所有选择输入都将预填充先前选择的值.但文本将显示"选择显示产品ID的选项".该脚本还可能在编辑模式下产生其他Javascript错误.应稍微修改代码以便支持编辑模式.
  3. 模板过满了逻辑.Magento模板应该只有简单的打印和foreach设置.所有类似的方法$conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions()都可以更好地移动到阻止.这降低了代码复杂性.希望能帮助到你.