2012-09-28 56 views
2

我最近有几个人问我这个问题,我对他们没有太多的答案,并且在这个问题上找不到太多的信息别处。Magento - 根据数量/分层定价动态显示价格

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

我会认为一些jQuery voodoo不应该那么难构建,所以价格会根据这些值重新计算,但我很好奇,如果其他人之前做过这些,并且他们知道任何潜在的陷阱这样做。

是否有充分的理由为什么不是要做到这一点...或者换句话说,有没有一个非常好的理由说明,这不是作为Magento Core的一部分构建的?

回答

4

是的,你可以用JavaScript做到这一点,你只需要把层数据到一些变种内<script>在你的模板,这样的事情可以工作(如果你想使用jQuery):

模板: 目录\产品\ 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

它的工作..但货币符号丢失.... –

+0

我刚刚'var tierPrices = [] ;'在HTML中。我错过了什么吗? – rybo111

0

我花了一些时间在周末,并设法得到这个工作,但我不喜欢,我是修改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(){})代替实时反馈。我可以清理这些,而不是使用ifs结构,但它起作用,所以至少它是一种替代方法。

感谢您的协助。

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

这并不适用于MultiStore的工作。 货币已更改,但价格以默认货币显示。

2

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

<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); 
     } 
    }); 
}); 

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()返回第二层开始价格,这将显示错误的价格在较低的数量