当前位置: 首页 > 知识库问答 >
问题:

如何根据php中的小计和运费计算总金额?

孟安民
2023-03-14

我在做购物车。我能根据数量计算产品价格。

现在我计算的总额取决于小计和运费与产品价格。

当我增加产品数量时,它会计算产品价格,但不会计算小计和总金额。

或者有没有其他安全的方法来处理这个问题?

你能帮我解决这个问题吗?

$('a.ddd').click(function() {

    var $productContainer = $(this).closest('div.sp-quantity');
    var $pro_list = $(this).closest('tr.pro-list');
    var productPrice = parseFloat($pro_list.find('span.price_cal').text());
    var $quantityInput = $productContainer.find('input.quntity-input');
    var newQuantity = parseFloat($quantityInput.val()) + parseFloat($(this).data('multi'));

    if (newQuantity>= 1) {

        // Refresh quantity input.
        $quantityInput.val(newQuantity);

        // Refresh total div.
        var lineTotal = productPrice*newQuantity;
        $pro_list.find('td.total_amount').data('price','£'+lineTotal).html('£'+lineTotal);
    }

});
.sp-quantity {
    width:124px;
    height:42px;
    float: left;
}
.sp-minus {
    width:40px;
    height:40px;
    border:1px solid #e1e1e1;
    float:left;
    text-align:center;
}
.sp-input {
    width:40px;
    height:40px;
    border:1px solid #e1e1e1;
    border-left:0px solid black;
    float:left;
}
.sp-plus {
    width:40px;
    height:40px;
    border:1px solid #e1e1e1;
    border-left:0px solid #e1e1e1;
    float:left;
    text-align:center;
}
.sp-input input {
    width:30px;
    height:34px;
    text-align:center;
    border: none;
}
.sp-input input:focus {
    border:1px solid #e1e1e1;
    border: none;
}
.sp-minus a, .sp-plus a {
    display: block;
    width: 100%;
    height: 100%;
    padding-top: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
	<table class="table cart-table">
                    <thead class="table-headings">
                        <tr>
                            <th class="pname">Product</th>
                            <th class="punit">Unit Price</th>
                            <th class="pquant">Quantity</th>
                            <th class="ptotal">Total price</th>
                        </tr>
                    </thead>
                    <?php if(!empty($_SESSION['products'])):
             foreach($_SESSION['products'] as $key=>$product):?>
                    <tbody>
                        <tr class="pro-list">
                            <td>
                                <div class="ordered-product cf">
                                    <div class="pro-img">
                                        <img src="admin/images/products/<?php echo $product['p_images'];?>" alt=" prodcut image">
                                    </div>
                                    <div class="pro-detail-name">
                                        <h3><?php echo $product['p_name'];?></h3>
                                    </div>
                                    <?php 
                                    $p_delete=$product['p_id'];
                                    //$decrypted_delete_id = decryptIt($p_delete);
  
                                    $encrypted_user_id = encryptIt($p_delete);
                                    $delete_product_id=urlencode($encrypted_user_id);
                                    ?>

                                    <a href="my-cart?action=empty&deletekey=<?php echo $delete_product_id;?>" class="cross-cta"><i class="fa fa-times" aria-hidden="true"></i></a>
                                </div>
                            </td>
                            <td>&#163;<span class="price_cal"><?php echo $product['p_currentprice'];?></span></td>
                            <td>

                                <div class="sp-quantity">
                                    <div class="sp-minus fff"><a class="ddd" href="javascript:void(0)" data-multi="-1">-</a></div>
                                    <div class="sp-input">
                                        <input type="text" class="quntity-input" value="<?php echo $product['qty'];?>" />
                                    </div>
                                    <div class="sp-plus fff"><a class="ddd" href="javascript:void(0)" data-multi="1">+</a></div>
                                </div>

                            </td>
                                <?php $single_total = $product['qty']*$product['p_currentprice'];?>
                                <td class='total_amount' data-price='&#163;<?php echo $single_total;?>'>&#163;<?php echo $single_total;?></td>

                        </tr>
                            <?php $total = $total+$single_total;
                            $_SESSION['total_cost']=$total;
                            endforeach;?>
                        <tr class="pro-list">
                            <td></td>
                            <td></td>
                            <td><span>Subtotal</span></td>
                            <td class='total_amount' data-price='&#163;<?php echo $single_total;?>'>&#163;<?php echo $single_total;?></td>
<!--                             <td><span>Shiping Cost</span></td>
                            <td><i class="fa fa-fighter-jet" aria-hidden="true"></i>&#163;<?php echo $total;?></td> -->
                        </tr>


                        <tr class="pro-list">
                            <td></td>
                            <td></td>
                            <td><span>Total Cost</span></td>
                            <td>&#163;<?php echo $total;?></td>
                        </tr>
                    </tbody>
                    <?php endif;?>
                </table>

共有1个答案

傅恺
2023-03-14

添加到下面的代码就可以了!

添加了一些类名,以便于查找值。使用jQuery将每个产品价格添加到小计,并显示在小计行中。然后在总数中加上20个运费。jQuery是非常不言自明的。

updateTotal();
$('a.ddd').click(function() {

  var $productContainer = $(this).closest('div.sp-quantity');
  var $pro_list = $(this).closest('tr.pro-list');
  var productPrice = parseFloat($pro_list.find('span.price_cal').text());
  var $quantityInput = $productContainer.find('input.quntity-input');
  var newQuantity = parseFloat($quantityInput.val()) + parseFloat($(this).data('multi'));

  if (newQuantity >= 1) {

    // Refresh quantity input.
    $quantityInput.val(newQuantity);

    // Refresh total div.
    var lineTotal = productPrice * newQuantity;
    $pro_list.find('td.total_amount').html('&#163;' + lineTotal);
    $pro_list.find('td.total_amount').data('price', lineTotal); //update data-price
  }
  updateTotal();
});

function updateTotal() {
  var subTotal = 0;
  var currencySymbol = "£";

  //start getting the total amounts from each product row.
  //add them as a subtotal.
  $("tr.pro-list > td.total_amount").each(function(index, element) {
    subTotal += parseFloat($(element).data("price")); //more secure to use data!
  });

  var total = subTotal + $("tr.pro-list.ship > td[data-price]").data("price");
  $("tr.pro-list.sub > td.subtotal").html(currencySymbol + "" + subTotal);
  $("tr.pro-list.total > td.total").html(currencySymbol + "" + total);
}
.sp-quantity {
  width: 124px;
  height: 42px;
  float: left;
}

.sp-minus {
  width: 40px;
  height: 40px;
  border: 1px solid #e1e1e1;
  float: left;
  text-align: center;
}

.sp-input {
  width: 40px;
  height: 40px;
  border: 1px solid #e1e1e1;
  border-left: 0px solid black;
  float: left;
}

.sp-plus {
  width: 40px;
  height: 40px;
  border: 1px solid #e1e1e1;
  border-left: 0px solid #e1e1e1;
  float: left;
  text-align: center;
}

.sp-input input {
  width: 30px;
  height: 34px;
  text-align: center;
  border: none;
}

.sp-input input:focus {
  border: 1px solid #e1e1e1;
  border: none;
}

.sp-minus a,
.sp-plus a {
  display: block;
  width: 100%;
  height: 100%;
  padding-top: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr class="pro-list">
      <td>
        <div class="ordered-product cf">
          <div class="pro-detail-name">
            <h3>ProductName</h3>
          </div>
        </div>
      </td>
      <td>&#163;<span class="price_cal">55</span></td>
      <td>
        <div class="sp-quantity">
          <div class="sp-minus fff"><a class="ddd" href="javascript:void(0)" data-multi="-1">-</a></div>
          <div class="sp-input">
            <input type="text" class="quntity-input" value="2" />
          </div>
          <div class="sp-plus fff"><a class="ddd" href="javascript:void(0)" data-multi="1">+</a></div>
        </div>
      </td>
      <td class='total_amount' data-price='110'>&#163;110</td>
    </tr>

    <tr class="pro-list">
      <td>
        <div class="ordered-product cf">
          <div class="pro-detail-name">
            <h3>ProductName</h3>
          </div>
        </div>
      </td>
      <td>&#163;<span class="price_cal">45</span></td>
      <td>
        <div class="sp-quantity">
          <div class="sp-minus fff"><a class="ddd" href="javascript:void(0)" data-multi="-1">-</a></div>
          <div class="sp-input">
            <input type="text" class="quntity-input" value="2" />
          </div>
          <div class="sp-plus fff"><a class="ddd" href="javascript:void(0)" data-multi="1">+</a></div>
        </div>
      </td>
      <td class='total_amount' data-price='90'>&#163;90</td>
    </tr>


    <tr class="pro-list sub">
      <td></td>
      <td></td>
      <td><span>Subtotal</span></td>
      <td class="subtotal">&#163;110</td>
    </tr>

    <tr class="pro-list ship">
      <td></td>
      <td></td>
      <td><span>Shipping charges</span></td>
      <td data-price="20">&#163;20</td>
    </tr>

    <tr class="pro-list total">
      <td></td>
      <td></td>
      <td><span>Total Amount</span></td>
      <td class="total">&#163;110</td>
    </tr>
  </tbody>
</table>
 类似资料:
  • 我想知道如何计算的累计总和在AnyLogic中。具体地说,我有一个循环事件,每周改变一个参数的值。从这个参数我想计算它收到的值的累计总和,我怎么做呢? 该事件是循环模式的超时。操作是: "name_parameter"=圆形(max(正常(10,200),0));

  • 问题内容: 我有这个MySQL查询: 返回如下内容: 我真正想要的是末尾的另一列以显示运行总计: 这可能吗? 问题答案: 也许对您来说是一个更简单的解决方案,并且可以防止数据库不得不执行大量查询。这仅执行一个查询,然后在一次通过中对结果进行一些数学运算。 这将为您提供一个额外的RT(运行总计)列。不要错过顶部的SET语句来首先初始化运行中的total变量,否则您将只获得一列NULL值。

  • 基于在WooCommerce回答代码中启用百分比费用的添加结账复选框字段,我在结账页面上创建了一个复选框。 当它被检查时,它收取15%的货运代理费。 目前,此费用是从小计中计算出来的,并与订单总值相加。 我需要一个解决方案,这个费用是从小计运费的总和计算出来的,并且没有添加到订单总价值中。 我将把“费用”改名为“押金”。 请查看屏幕截图:

  • 问题内容: 想象一下下表(称为): 我想要一个按日期顺序返回运行总计的查询,例如: 我知道在SQL Server 2000/2005/2008中可以通过多种方式进行此操作。 我对使用aggregating-set-statement技巧的这种方法特别感兴趣: …这是非常有效的,但是我听说周围存在一些问题,因为您不一定能保证该语句将以正确的顺序处理行。也许我们可以获得有关该问题的明确答案。 但是,人

  • 问题内容: 我有这个MySQL查询: 返回如下内容: 我真正想要的是末尾的另一列显示运行总计: 这可能吗? 问题答案: 也许这对您来说是一个更简单的解决方案,并且可以防止数据库不得不执行大量查询。这仅执行一个查询,然后在一次通过中对结果进行一点数学运算。 这将为您提供一个额外的RT(运行总计)列。不要错过顶部的SET语句来首先初始化运行的total变量,否则您将只获得一列NULL值。

  • 问题内容: 我正在尝试计算光盘上文件的大小。在Java的7本可以用做Files.walkFileTree如图我的答案在这里。 但是,如果我想使用java-8流来执行此操作,则它将适用于某些文件夹,但不适用于所有文件夹。 上面的代码可以很好地用于路径,但是会抛出以下异常 我了解它的来源以及如何使用Files.walkFileTree API避免它。 但是如何使用Files.walk() API 避免