jquery 数据表加载多行

jquery Datatable loading multiple rows

我正在使用 jquery 数据 table 将数据加载到我的 table: https://datatables.net/examples/data_sources/server_side

我已经设置了一个 class 其中 returns 格式化的 json 字符串:

$columns = array(
  array( 'db' => 'first_name', 'dt' => 0 ),
  array( 'db' => 'last_name', 'dt' => 1 ),
  array( 'db' => 'position', 'dt' => 2 ),
  array( 'db' => 'office', 'dt' => 3 ),
  array(
    'db' => 'start_date',
    'dt' => 4,
    'formatter' => function( $d, $row ) {
      return date( 'jS M y', strtotime($d));
    }
  ),
  array(
    'db' => 'salary',
    'dt' => 5,
    'formatter' => function( $d, $row ) {
      return '$'.number_format($d);
    }
  )
);

如何在数组中获取多个数据库?例如,我想在一个列中组合 first_namelast_name

你可以这样做,但我认为从服务器端来看它很复杂,至少使用数据表提供的 class 是这样。我也为您提供了从客户端执行此操作的选项,这要简单得多,但您选择

方案一,来自服务器端

如果您使用此处使用的代码参考,则不能这样做。 查看代码会发现传递给 SSP::simple 函数的 $columns 列表包含在反引号中,因此即使您尝试使用连接函数,它也会被视为列名,从而引发错误。

正如数据表本身在代码中所说:

The static functions in this class are just helper functions (...) These functions obviously do not represent all that can be done with server-side processing, they are intentionally simple to show how it works.

因此,为了更加“定制化”,您可以编写自己的 server-side 处理器,它允许您生成带有函数的查询。

看起来像这样(基于当前的 ssp.class.php):

  1. 首先你改变了line 558中定义的pluck函数,所以当你传递一个数组时,它会调用concatenate函数
    static function pluck ( $a, $prop )
    {
        $out = array();
    
        for ( $i=0, $len=count($a) ; $i<$len ; $i++ ) {
            if ( empty($a[$i][$prop]) && $a[$i][$prop] !== 0 ) {
                continue;
            }
            // NEW CODE HERE, if an array is received, then concatenate it in the query
            if (is_array($a[$i][$prop])) {
                $out[$i] = "CONCAT(".implode(",",$a[$i][$prop]).") AS ".$prop;
            }else {
                //removing the $out array index confuses the filter method in doing proper binding,
                //adding it ensures that the array data are mapped correctly
                $out[$i] = $a[$i][$prop];
            }
        }
        return $out;
    }
  1. 然后更改 line 260 中的串联逻辑,删除反引号,以便列列表可以接受函数(这会降低安全性,并且会为包含空格的列抛出错误,如果您担心的话,您会必须做更多的改变)
    $data = self::sql_exec( $db, $bindings,
        "SELECT ".implode(", ", self::pluck($columns, 'db'))."
         FROM `$table`
         $where
         $order
         $limit"
    );
  1. 最后你会像这样使用它
    $columns = array(
        array( 'db' => 'normal_column', 'dt' => 0 ),
        array( 'db' => array('first_name', 'second_name'), 'dt' => 0 )
    )

来自客户端的选项 2

这样更简单,因为 datatables 提供了一个呈现函数,您可以为您的列数据调用该函数,并且它可以访问所有其他列,因此您可以轻松地在前端连接它们。我看到的唯一缺点是你要从客户端处理它,如果你想从客户端卸载最大可能并在数据库上做大部分处理,你将不得不选择选项 1 ......但是我不认为几个连接会给你的前端增加很多开销

您可以在此处阅读:https://datatables.net/examples/advanced_init/column_render.html 您可以在配置中为所需的列声明一个行呈现函数。它看起来像这样(当然可以根据您的需要更改变量)

    $(document).ready(function() {
        $('#example').DataTable( {
            "processing": true,
            "serverSide": true,
            "ajax": "../server_side/scripts/server_processing.php",
            "columnDefs": [
                {
                    "render": function ( data, type, row ) {
                        return `${row["first_name"]} ${row["last_name"]}`;
                        // return `${row[1]} ${row[2]}`; // if your data is sequential
                    },
                    "targets": 0 // index of your target column
                }
            ]
        } );
    } );

如果你想要这个,不是在单元格中而是在详细信息行中,数据表站点中也有一个很好的例子 https://datatables.net/examples/server_side/row_details.html

祝你好运