Datatables如何将用户当前的datatable视图数据(包括排序)导出到另一个页面

Datatables how to export a user's current datatable view data (including ordering) to another page

Note: This question uses Datatables 1.11.50

我有一个非常大的数据tables table,它是由最终浏览器用户自定义订购的。我需要实现一个概念,使他们可以在浏览器页面上对他们的数据 table 数据进行排序,例如按年龄降序

排序工资流图

$(document).ready(function() {
    $('#example').DataTable({
dom: 'Bfrtip',
    buttons: [
        {
            text: 'View These rows on a Map'
             /* Do something here when the button is pressed to pass the
                currently displayed rows (only) primary id's (only) on 
                to another page to work with. */ 
        }
]
});
} );
@import url("https://cdn.datatables.net/1.11.5/css/jquery.dataTables.min.css");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script src="https://cdn.datatables.net/1.11.5/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.2.2/js/dataTables.buttons.min.js"></script>

<table id="example" class="display" style="width:100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
                <th>Office</th>
                <th>Age</th>
                <th>Start date</th>
                <th>Salary</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
                <td>Edinburgh</td>
                <td>61</td>
                <td>2011/04/25</td>
                <td>0,800</td>
            </tr>
            <tr>
                <td>Garrett Winters</td>
                <td>Accountant</td>
                <td>Tokyo</td>
                <td>63</td>
                <td>2011/07/25</td>
                <td>0,750</td>
            </tr>
            <tr>
                <td>Ashton Cox</td>
                <td>Junior Technical Author</td>
                <td>San Francisco</td>
                <td>66</td>
                <td>2009/01/12</td>
                <td>,000</td>
            </tr>
            <tr>
                <td>Cedric Kelly</td>
                <td>Senior Javascript Developer</td>
                <td>Edinburgh</td>
                <td>22</td>
                <td>2012/03/29</td>
                <td>3,060</td>
            </tr>
            <tr>
                <td>Airi Satou</td>
                <td>Accountant</td>
                <td>Tokyo</td>
                <td>33</td>
                <td>2008/11/28</td>
                <td>2,700</td>
            </tr>
            <tr>
                <td>Brielle Williamson</td>
                <td>Integration Specialist</td>
                <td>New York</td>
                <td>61</td>
                <td>2012/12/02</td>
                <td>2,000</td>
            </tr>
            <tr>
                <td>Herrod Chandler</td>
                <td>Sales Assistant</td>
                <td>San Francisco</td>
                <td>59</td>
                <td>2012/08/06</td>
                <td>7,500</td>
            </tr>
            <tr>
                <td>Rhona Davidson</td>
                <td>Integration Specialist</td>
                <td>Tokyo</td>
                <td>55</td>
                <td>2010/10/14</td>
                <td>7,900</td>
            </tr>
            <tr>
                <td>Colleen Hurst</td>
                <td>Javascript Developer</td>
                <td>San Francisco</td>
                <td>39</td>
                <td>2009/09/15</td>
                <td>5,500</td>
            </tr>
            <tr>
                <td>Sonya Frost</td>
                <td>Software Engineer</td>
                <td>Edinburgh</td>
                <td>23</td>
                <td>2008/12/13</td>
                <td>3,600</td>
            </tr>
            </tbody>
            </table>

我需要做的就是拿上面的例子来命令:

并以某种方式将此数据传递到另一个页面以供使用;接收页面是一张 Leaflet 地图,它将为 selected;

行的每个 id 值加载 lat/long 个位置

所以;例如上面的例子——让 sat view = 10 并按 age 降序排列,从 Ashton Cox (最旧的)下降到 Cedric Kelly 按此顺序 和然后按顺序获取这些 id(目前在数据 table 中的隐藏字段中)并在 leafletJS 地图上处理它们,然后在地图位置输出这些并且仅输出这些。

绝对清楚 - 数据table 本身非常大,有 50 多个字段和数千行。所有这些都来自数据库数据,但用户需要 select 某些行;即使用搜索框 select 某些类型的行,然后使用箭头对这些行进行相应排序。 然后这个最终结果可以以某种方式传递到另一个页面,该页面将使用这些数据点加载和填充传单 JS 地图。


我看过 "Select" plugin for Datatables 之类的东西,但看不到获取和导出 selected 数据的方法。

我完全没有想法,我在互联网上找不到任何参考点来开始探索这个问题;

如何将当前视图“导出”为 JSON 编码或任何格式,以便有人可以按 Datatables 按钮并完成上述请求?

非常感谢任何关于此的建议。

干杯

Note: this solution uses Datatables 1.11.50

最简洁的工作解决方案是添加一个按钮(使用 Datatables Buttons 插件 Here),自动获取所需数据并将其提交到硬编码目的地。

从数据表收集的数据有两个方面:

  • 导出原始数据
  • 导出数据的顺序。

导出数据的第一部分可以通过使用 Datatables Select 扩展来实现(Here) and native datatable API functionality can catch the current ordering 使用 table.order()

第二部分是必需的,因为默认数据表行可以按列值排序 ascendingdescending

这提供了两个 objects/arrays(数组是 Javascript 中的对象类型),通过一些处理工作可以将其作为变量导出为 URL 上的 GET 值或 POST 值在 AJAX 请求中。

下面是选择整个当前页面视图(并且仅选择整个当前页面视图)的代码,然后从该数据中保存 ID 号以及订购信息(为什么这些 ID 按此顺序排列)。

示例代码:

$(document).ready(function() {
    // set vars for saving data and ordering info.
    var saveData = [];
    var orderOfData = [];
    var tempvar = "";

    var t = $('#table').DataTable({
        buttons {[
          // button display text
          text: 'View These rows on a Map',

          // action to carry out clicking on this button
          action: function ( e, dt, node, config ) {
               // Clear any pre selected rows              
               if(dt.rows().length > 0 ) {
                  dt.rows({selected: true}).deselect();
               }
      
              // Select current page rows.         
              dt.rows({page: 'current'}).select();
              var RowobjectData = dt.rows( { selected: true } ).data();

              //set order by list from column headers.
              // this returns column number, needs to be turned into text (or id)
              var ordering = t.order();

              // Building ordering Text List.
              $.each(ordering, function(indexO, innerOrder) {
                    // Grab name reference for each column id.  
                    tempvar = $(t.column( innerOrder[0] ).header()).html();

                    // Text Processing; optional. 
                    tempvar = tempvar.replace('<br>',' ');
                    tempvar = encodeURIComponent(tempvar);
                    // add this to existing array.
                    orderOfData.push(tempvar+'-'+innerOrder[1]);
              });

              // Building row ID list.
              $.each(RowobjectData,function( index, currentElement ) {
                   $.each(currentElement,function( index, innerElement ) {
                        // Index value is the columns of the row, 
                        // so in this case we get the first column data.
                        // Which itself contains a DOM element containing the row
                        // id to export. 
                        //
                        // you could here export the whole row as a JSON.stringify
                        // object.  
                        if(index === 0 ) {
                            innerElement = $(innerElement).filter(".row_id_dom_container_html_element").text();
                            // Save this content value to the array.
                            saveData.push(innerElement);
                        }
                    });
                });

                // In THIS instance the array values should be turned into 
                // strings and used as GET parameters thus:
                // These will be processed by the recieving page 
                var dataString = saveData.join(':');
                var dataOrder = orderOfData.join(':');

                // Finally redirect to the desired destination point. 
                // Alternatively an AJAX call can be made here.
                window.location.href = '/customMap.php?data='+dataString+'&order='+dataOrder;
                return true;
            } // close action. 
         ]}, //close buttons.
     }); // close datatables
 
}); // close document ready.