在 Grocery CRUD 2.0.1 中显示 DataTable 列的总和

问题描述 投票:0回答:1

我正在使用 Grocery CRUD 2.0.1 和 Code Igniter 4.5.1 下的 DataTables 主题

结果表的每列底部都有一个自动过滤器,并且根据使用的关键字,动态过滤显示的行。

我有一列(总计),我想计算所有显示(过滤后)结果的总和并将其显示在特定的 div 中。

我尝试了很多方法,但我无法找到实现它的方法。

我在 datatables.js 文件中使用了以下代码

$(document).ready(function() {
    console.log("Script running!");
    function calculateGrandTotal(table) {
        console.log("table:", table); // Log the table object
        var totalElements = table.column('.total').data().toArray(); // Get data from "total" column
        if (!totalElements) {
            console.error("Could not calculate totalElements!");
            return;
        }
        console.log("totalElements:", totalElements); // Log the data array
        var grandTotal = 0;
        for (var i = 0; i < totalElements.length; i++) {
            var price = parseFloat(totalElements[i]);
            grandTotal += price;
        }
        return grandTotal.toFixed(2);
    }
    var grandTotalElement = document.getElementById("grand-total-display"); //The div id in the View
    var table = $('.groceryCrudTable').DataTable; // Get DataTable instance from the event target
    if (table) {
        console.log("DataTable instance found!");
        grandTotalElement.textContent = "Grand Total: " + calculateGrandTotal(table) + " DA";
    } else {
        console.error("DataTables not found on the table!");
    }
});

然后控制台返回以下内容:

enter image description here

这是我在到处尝试、修补和搜索后所能得到的最接近的结果。

初始化的 DataTable 实例似乎无法识别列方法,并且我不知道如何访问这些列值以便对它们求和。有关信息,我可以使用控制器中的以下代码将名为 .total 的特定 css 类分配给我的目标列:

$crud->callbackColumn('Total', function ($value, $row) {return "<p class=\"total\">$value</p>";

但是如果你有更好的主意,我洗耳恭听。

Grocery CRUD 2.0.1 使用的 DataTables 版本似乎不是最新的(我认为是 1.9.2),所以我发现的许多建议想法并不适用或导致不兼容问题,或者可能只是我的问题...

如果杂货 CRUD 和 Javascript 方面的任何专家可以提供帮助,我将不胜感激。

javascript jquery datatables codeigniter-4 grocery-crud
1个回答
0
投票

您可以使用数据表回调,如下所示:

$(function() {
  $('#groceryCrudTable').DataTable({
    "footerCallback": function(row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api
        .column(3)
        .data()
        .reduce(function(a, b) {
          return parseInt(a) + parseInt(b);
        }, 0).toFixed(2);

      $('#grand-total-display').val(total);
    }
  });

});
<link rel="stylesheet" href="https://cdn.datatables.net/2.0.7/css/dataTables.dataTables.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/2.0.7/js/dataTables.min.js"></script>
<table id="groceryCrudTable" class="table table-striped first-table" style="width:100%">
  <thead>
    <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Office</th>
      <th>Salary</th>

    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tiger Nixon</td>
      <td>System Architect</td>
      <td>Edinburgh</td>
      <td>45000</td>
    </tr>
    <tr>
      <td>Cedric Kelly</td>
      <td>Senior Javascript Developer</td>
      <td>Edinburgh</td>
      <td>55000</td>
    </tr>

  </tbody>
</table>

<br>
<br>
<input type="text" id="grand-total-display">

© www.soinside.com 2019 - 2024. All rights reserved.