【问题标题】:Magento 2 - Reload totals cart after ajax change quantityMagento 2 - ajax 更改数量后重新加载总计购物车
【发布时间】:2017-02-21 12:19:45
【问题描述】:

我想使用 ajax 来更改购物车 magento 2 购物车页面上一件商品的数量。

我已经添加了这个javascript:

$('.cart.item .qty').on({
    change: function() {
        var post_url = $(this).attr('data-post-url');

        $.post(post_url, $(this).serialize(), function(data) {
            $(".form-cart").replaceWith(data.cart_html);
            $("#cart-totals").replaceWith(data.totals_html);
            $("#cart-totals").trigger('contentUpdated');
        }, "json");
    }
});

data.totals_html的值为

<div id="cart-totals" class="cart-totals" data-bind="scope:'block-totals'">
<!-- ko template: getTemplate() --><!-- /ko -->
<script type="text/x-magento-init">
        {
            "#cart-totals": {
                "Magento_Ui/js/core/app": {"components":{"block-totals":....}
</script>

当我更改数量时,总组件内容不刷新..

有谁知道替换html代码后动态更新总组件的想法吗?

【问题讨论】:

    标签: php jquery ajax knockout.js magento2


    【解决方案1】:

    ajax 更改数量后重新加载总计购物车

    1. 步骤

    在您的自定义中创建 (Magento_Theme/layout/checkout_cart_index.xml)

    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="Magento\Framework\View\Element\Template" name="cart.ajax.qty.update"  template="Magento_Theme::js.phtml" after="-"/>
        </referenceContainer>
    </body>
    

    2.步骤

    创建 js.phtml 文件 (Magento_Theme/templates/js.phtml)

    <script>
    require ([
            'jquery',
        ],
        function ($) {
           $(window).on("load", function () {
                require([
                    'custom'
                ]);
            });
        });
    

    3. 步骤 在主题 web 文件夹 ( Namespace/Yourtheme/web/js/custom.js ) 中创建 custom.js 文件

        define([
        'jquery',
        'Magento_Checkout/js/action/get-totals',
        'Magento_Customer/js/customer-data'
         ], function ($, getTotalsAction, customerData) {
    
        $(document).ready(function(){
        $(document).on('change', 'input[name$="[qty]"]', function(){
            var form = $('form#form-validate');
            $.ajax({
                url: form.attr('action'),
                data: form.serialize(),
                showLoader: true,
                success: function (res) {
                    var parsedResponse = $.parseHTML(res);
                    var result = $(parsedResponse).find("#form-validate");
                    var sections = ['cart'];
    
                    $("#form-validate").replaceWith(result);
    
                    // The mini cart reloading
                    customerData.reload(sections, true);
    
                    // The totals summary block reloading
                    var deferred = $.Deferred();
                    getTotalsAction([], deferred);
                },
                error: function (xhr, status, error) {
                    var err = eval("(" + xhr.responseText + ")");
                    console.log(err.Message);
                }
            });
           });
          });
        });
    

    4.Step(映射你的js文件)

    在主题根目录 (Namespace/yourtheme/requirejs-config.js) 上创建 requirejs-config.js

    var config = {
       map: {
        '*': {
            custom:'js/custom'
        }
      }
    };
    

    现在使用 ajax 进行数量更新 如果有任何问题,请在评论中提出。

    【讨论】:

    • 伟大而简单的答案:)。但是,由于某种原因,以这种方式重新加载购物车时,它永远不会有估计的运输成本。它总是为零:(
    • 我们在哪里应用数量增量和减量。
    • 如果我运行此代码,数量增量减量不起作用。你知道如何解决这个问题
    【解决方案2】:

    您可以咨询这种方式来在购物车中重新加载块总数:

    define([
        "jquery",
        'Magento_Checkout/js/action/get-payment-information',
        'Magento_Checkout/js/model/totals'
    ], function($, getPaymentInformationAction, totals) {
        $('.cart.item .qty').on({
            change: function() {
                var post_url = $(this).attr('data-post-url');
                $.post(post_url, $(this).serialize(), function(data) {
                    //custom your update
                    $(".form-cart").replaceWith(data.cart_html);
                    $("#cart-totals").replaceWith(data.totals_html);
                    //reload block total
                    var deferred = $.Deferred();
                    totals.isLoading(true);
                    getPaymentInformationAction(deferred);
                    $.when(deferred).done(function() {
                        totals.isLoading(false);
                    });
                    //end
                }, "json");
            }
        });
    });
    

    【讨论】:

      【解决方案3】:

      只需运行以下js代码-

      require(
      [
         'Magento_Checkout/js/model/quote',
         'Magento_Checkout/js/model/cart/totals-processor/default'
      ],
      function(
         quote,
         totalsDefaultProvider
      ) {
           totalsDefaultProvider.estimateTotals(quote.shippingAddress());
        }
      );
      

      更多信息请参考this article

      免责声明:我是 MexBS(发表本文的公司)的 CEO

      【讨论】:

      • 这对 Magento 2.2.6 仍然适用吗?我试过这个 - 但与 Surendra 的回答不同,它不会触发重新加载购物车中的总计块。
      【解决方案4】:

      把cartQtyUpdate.js中的代码改成这个

      define([
      'jquery',
      'Magento_Checkout/js/action/get-totals',
      'Magento_Customer/js/customer-data'
      ], function ($, getTotalsAction, customerData) {
      
      $(document).ready(function(){
          $(document).on('change', 'input[name$="[qty]"]', function(){
              var form = $('form#form-validate');
              $.ajax({
                  url: form.attr('action'),
                  data: form.serialize(),
                  showLoader: true,
                  success: function (res) {
                      var parsedResponse = $.parseHTML(res);
                      var result = $(parsedResponse).find("#form-validate");
                      var sections = ['cart'];
      
                      $("#form-validate").replaceWith(result);
      
                      /* Minicart reloading */
                      customerData.reload(sections, true);
      
                      /* Totals summary reloading */
                      var deferred = $.Deferred();
                      getTotalsAction([], deferred);
                  },
                  error: function (xhr, status, error) {
                      var err = eval("(" + xhr.responseText + ")");
                      console.log(err.Message);
                  }
              });
          });
          $(document).on('click', '.alo_qty', function() {
              var form = $('form#form-validate');
              $.ajax({
                  url: form.attr('action'),
                  data: form.serialize(),
                  showLoader: true,
                  success: function (res) {
                      var parsedResponse = $.parseHTML(res);
                      var result = $(parsedResponse).find("#form-validate");
                      var sections = ['cart'];
      
                      $("#form-validate").replaceWith(result);
      
                      /* Minicart reloading */
                      customerData.reload(sections, true);
      
                      /* Totals summary reloading */
                      var deferred = $.Deferred();
                      getTotalsAction([], deferred);
                  },
                  error: function (xhr, status, error) {
                      var err = eval("(" + xhr.responseText + ")");
                      console.log(err.Message);
                  }
              });
          });
      });
      });
      

      现在效果很好

      【讨论】:

        猜你喜欢
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2021-04-19
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多