Display Dynamic SKU on configurable product view Magento

后端 未结 1 1670
小蘑菇
小蘑菇 2021-01-03 10:37

I have this script to show the dynamic sku on select option, but i cannot get working.

Is loading the correct sku, but on select nothing happen.

This code ge

1条回答
  •  时光取名叫无心
    2021-01-03 11:19

    The script is almost correct except for $simple_product->getSelectLabel() being a wrong key. No such method/property exists in a simple product model. In order to make the script work, this key should be replaced with a right one - a Product Id. Utilizing product id, it is possible to find the sku of the product being selected.


    So, first of all you need to reorganize itemId array to make it a "productId => productSku" map:

    $productMap = array();
    foreach($col as $simpleProduct){
        $productMap[$simpleProduct->getId()] = $simpleProduct->getSku();
    }
    


    Then you need to change the "onchange" function call to pass Configurable's attribute id to the changeSku() function. Thus the underlying logic is able to search appropriate simple product's attributes.

    onchange="return changeSku(getAttributeId() ?>, this);">
    


    And after that you need utilize configurable's config in order to map selected simple product's attribute id to the product id selected:

    function changeSku(confAttributeId, sel) {
        var productMap = 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("Product Id: " + productMap[productId]);
        } else {
            $("sku-container").update("Product Id:  Select an option to display Product Id");
        }
    }
    


    For your reference, below is the summary of how the whole template looks like (I've beautified it a little):

    getProduct();
    $_attributes = Mage::helper('core')->decorateArray($this->getAllowAttributes());
    ?>
    isSaleable() && count($_attributes)):?>
    
    decoratedIsLast){?> class="last">
    setProduct($_product); $col = $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions(); $productMap = array(); foreach($col as $simpleProduct){ $productMap[$simpleProduct->getId()] = $simpleProduct->getSku(); } ?>

    This will do the task you originally needed.


    Also note the following

    1. Your approach won't work for a configurable product with two or more configurable attributes. For that product a final simple product is not known until a user selects values for all the select inputs. So an approach should be changed to check all the selects before outputting SKU.
    2. The code doesn't consider a case, when user edits product configuration, rather than specifying configuration for a new product. You can go to editing mode from the Shopping Cart clicking the Edit link. In such a case all the select inputs will be pre-filled with previously chosen values. But the text will say "Select an option to display Product Id". The script might also produce other Javascript errors in Edit mode. The code should be slightly modified in order to support Edit mode as well.
    3. The template is overfilled with logic. A Magento template should have only simple prints and foreach-iterations. All the methods like $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions() are better to be moved to block. This reduces code complexity. Hope it helps.

    0 讨论(0)
提交回复
热议问题