首页 文章

Magento - 根据数量/分层定价动态显示价格

提问于
浏览
2

我最近有几个人问我这个问题,我对他们没有太多的答案,也没有在其他地方找到太多信息 .

默认情况下,在产品页面上,显示的价格会根据自定义选项动态更新 . 根据分层定价结构动态更新价格会是一个很大的痛苦吗?基本上,如果用户转到具有分层定价的产品,并且他们输入的数量符合分层定价,则价格会根据所选的等级定价和数量进行更新 .

我认为一些jQuery voodoo不应该那么难以构建,所以价格会根据 Value 进行重新计算,但我很好奇其他人是否曾经这样做,如果他们知道这样做有任何潜在的陷阱 .

有没有一个很好的理由为什么不这样做...或者换句话说,有没有一个很好的理由为什么它不是作为Magento Core的一部分构建的?

6 回答

  • 2

    是的,您可以使用javascript执行此操作,您只需要将层数据放入模板中的 <script> 内的某些var中,这样的东西可以工作(如果您想使用jQuery):

    模板: catalog\product\view.phtml

    <script type="text/javascript">
        jQuery(function($){
            // probably you want a custom method in your block for getting a better and safer tierPrices array here
            // for example with formatted prices
            var tierPrices = <?php echo json_encode($_product->getTierPrice()) ?>;
            var getPrice = function(qty){
                qty = Number(qty);
                var i = tierPrices.length;
                while(i--)
                {
                    if(qty >= tierPrices[i]['price_qty']){
                        return tierPrices[i]['price'];
                    }
                }
                return null;
            };
            var updatePrice = function(price){
                $('.price').html(price);
            };
            // you can use more events here if you want a live response while the user is typing
            $('#qty').change(function(){
                var price = getPrice(this.value);
                if(price !== null){
                    updatePrice(price);
                }
            });
        });
    </script>
    
  • 0

    我找到了一个简单的解决方案,我检索货币汇率,它工作正常 . 守则如下

    <script type="text/javascript">
    jQuery(function($$){
        var inst_price_format = <?php echo Mage::helper('core')->jsonEncode( Mage::app()->getLocale()->getJsPriceFormat() ); ?>;
        var rate = <?php echo Mage::app()->getStore()->getCurrentCurrencyRate(); ?>;
        var tierPrices = <?php echo json_encode($_product->getTierPrice()) ?>;
        var getPrice = function(qty){
            qty = Number(qty);
            var i = tierPrices.length;
            while(i--)
            {
                if(qty >= tierPrices[i]['price_qty']){
                    return tierPrices[i]['price'];
                }
            }
            return null;
        };
        var updatePrice = function(price) { 
            $$('.price-box .price').html( formatCurrency( (price*rate), inst_price_format) ); 
        };
        var updateTotalPrice = function(price, qty) { 
            $$('.total-price').html( formatCurrency( ((price*rate) * qty), inst_price_format) ); 
        };
    
        $$('#qty').change( function(){
            var price = getPrice(this.value);
            var qty = this.value;
            if(price !== null) { 
                updatePrice(price); 
                updateTotalPrice(price, qty); 
            } else { 
                updatePrice(<?php echo $_product->getPrice(); ?>); 
                updateTotalPrice(<?php echo $_product->getPrice(); ?>, qty);
            }
        });
    });
    
  • 4

    我花了一些时间在周末并设法让这个工作,但我不喜欢我正在修改tierprices.phtml模板,以便我可以通过类获取'price_qty' . 我交换了它并使用$ _product-> getTierPrice()而不是你建议的那样 . 我最终得到的代码如下:

    ----编辑----我改写了一些东西也支持特价 .

    <script type="text/javascript">
        var $j = jQuery;
        var $p = {};
        var prices = {};
        //dom elements being used
        $p["old"] = $j(".price-box .old-price .price");
        $p["special"] = $j(".price-box .special-price .price");
        $p["regular"] = $j(".price-box .regular-price .price");
    
        //save original price to reset back if quantity is reset
        //Checking for special price
        if ($p["special"].html()) {
            var specialPrice = $p["special"].html();
            var oldPrice = $p["old"].html();
        } else {
            var originalPrice = $p["regular"].html();
        }
    
        //lets get to work.
        $j(function(){
            var tiers = <?php echo json_encode($_product->getTierPrice()) ?>;
            var h = tiers.length;
            while (h--) {
                var key = h;
                var line = {};
                //just build the prices object for use later
                line["qty"] = parseInt(tiers[h]["price_qty"]);
                line["price"] = parseFloat(tiers[h]["price"]).toFixed(2);
                prices[key] = line;
            }
            //keyup event works nicely here
            $j("#qty").on("keyup",function(){
                var quantity = $j(this).val();
                for (var i in prices) {
                    var z = i;
                    //save lowest tier for reset back to original price
                    var lowest = prices[0]["qty"];
                    //set the range
                    var bottom = prices[i]["qty"];
                    var top = prices[z++]["qty"];
                    //format to currency -- should probably switch to magento's helper method.
                    var price = "<?php echo Mage::app()->getLocale()->currency(Mage::app()->getStore()->
         getCurrentCurrencyCode())->getSymbol() ?>"+prices[i]["price"];
                    //check if the price needs to be reset after quantity is reset < lowest
                    if (quantity < lowest) {
                        if (specialPrice) {
                            $p["special"].html(specialPrice);
                            $p["old"].html(oldPrice);
                        } else {
                            $p["regular"].html(originalPrice);
                        }
                        break;
                    }
                    //check the ranges, set the price accordingly.
                    if (quantity >= bottom) {
                        if (quantity >= top) {
                            if (specialPrice) {
                                $p["special"].html(price);
                            } else {
                                $p["regular"].html(price);
                            }
                            continue;
                        } else {
                            break;
                        }
                    }
                }
            })
        })
    </script>
    

    我使用$ j(“#qty”) . on(“keyup”,function(){})代替实时反馈 . 我可以清理它以使用while而不是我设置的if结构,但它起作用,至少它是一种替代方法 .

    谢谢你的帮助 .

  • 0

    我现在为我们的多线系统完成了同样的事情 .

    如果你只有一个价格集我也添加了一个后备,我正在格式化输出以获得更好的用户体验 .

    随意使用此代码:

    <script type="text/javascript">
        jQuery(function($){
            // This was built using https://stackoverflow.com/questions/12647770/ and https://himansuboity.wordpress.com/2014/09/30/magento-tip-how-to-get-the-store-price-format-by-javascript/
            var inst_price_format = <?php echo Mage::helper('core')->jsonEncode( Mage::app()->getLocale()->getJsPriceFormat() ); ?>
    
            var tierPrices = <?php echo json_encode($_product->getTierPrice()) ?>;
    
            var getPrice = function(qty){
                qty = Number(qty);
                var i = tierPrices.length;
                while(i--)
                {
                    if(qty >= tierPrices[i]['price_qty']) { return tierPrices[i]['price']; }
                }
                return null;
            };
    
            var updatePrice = function(price, qty) { $('.price').html( formatCurrency( (price * qty), inst_price_format) ); };
    
            $('#qty').change( function() {
                var price = getPrice(this.value);
                var qty = this.value;
                if(price !== null) { updatePrice(price, qty); }
                // no tier prices set, use base price
                else { updatePrice(<?php echo $product->getPrice(); ?>, qty); }
            });
        });
    </script>
    
  • 0

    这对多线程不起作用 . 货币已更改,但价格以默认货币显示 .

  • 0

    此版本需要考虑产品选项和第一级价格:

    <script type="text/javascript">
    jQuery(function($){
        // probably you want a custom method in your block for getting a better and safer tierPrices array here
        // for example with formatted prices
        var tierPrices = <?php
            $_tier_json = json_encode($_product->getTierPrice());
            $_tier_json = substr($_tier_json,0,1) . '{"price":"'.$_product->getFinalPrice().'","price_qty":"1"},' . substr($_tier_json,1);
            echo $_tier_json;
    
         ?>;
        var getPrice = function(qty){
            qty = Number(qty);
            var i = tierPrices.length;
            while(i--)
            {
                if(qty >= tierPrices[i]['price_qty']){
                    return tierPrices[i]['price'];
                }
            }
            return null;
        };
    
        var formatPrice = function(price) {
            return '$' + parseFloat(price).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
        };
    
        var updatePrice = function(price){
    
            // if product has options, use optionsPrice functionality
            if ( typeof optionsPrice != 'undefined' && typeof optionsPrice.productPrice != 'undefined' ) {
                optionsPrice.productPrice = price;
                optionsPrice.reload();
            } else {
                // or if it is a simple product, change price directly in the html
                $(".price-box .price").html( formatPrice(price) );
            }
        };
    
        var updatePriceEvent = function() {
            var price = getPrice( $('#qty').val() );
            if(price !== null){
                updatePrice(price);
            }
        };
    
        $('#qty').change( updatePriceEvent );
        $('div.qty-changer .qty_inc, div.qty-changer .qty_dec').click( updatePriceEvent );
    
    });
    </script>
    

    如果它是可配置产品或具有自定义选项的产品,它将根据当前选择的选项调整价格 . 另外,$ _product-> getTierPrice()返回从第二层开始的价格,这将在较低的数量上显示错误的价格

相关问题