数据表中具有单个变量 + defaultColumns 的列数组

Posted

技术标签:

【中文标题】数据表中具有单个变量 + defaultColumns 的列数组【英文标题】:Array of columns with a single variable + defaultColumns in Datatables 【发布时间】:2021-09-11 09:56:45 【问题描述】:

我正在尝试在我的数据表中创建动态 columns

假设我想创建 4 列 + 默认列(2 个按钮)。好吧,我们将执行以下操作(可行):

$('#tablaUsuarios').DataTable(
     "columns": [
          "data": "usuario",
          "data": "apellido1",
          "data": "apellido2",
          "data": "email",
          "defaultContent": "<div class='text-center'><div class='btn-group'><button class='btn btn-primary btn-sm btnEditar' value='edit'><i class='material-icons'>edit</i></button><button class='btn btn-danger btn-sm btnBorrar'><i class='material-icons' value='delete'>delete</i></button></div></div>"
      ],
);

现在假设我想做同样的事情,但只有一个值,如下所示:

var dataHeader = <?=$fields?>;

$('#tablaUsuarios').DataTable(
     "columns": [
          dataHeader,
          "defaultContent": "<div class='text-center'><div class='btn-group'><button class='btn btn-primary btn-sm btnEditar' value='edit'><i class='material-icons'>edit</i></button><button class='btn btn-danger btn-sm btnBorrar'><i class='material-icons' value='delete'>delete</i></button></div></div>"
      ],
);

dataHeader 包含以下内容:

0: data: "id", mData: "id"
1: data: "usuario", mData: "usuario"
2: data: "apellido1", mData: "apellido1"
3: data: "apellido2", mData: "apellido2"
4: data: "email", mData: "email"
length: 5
__proto__: Array(0)

(是我浏览器中 console.log 的复制粘贴,因为我需要信誉才能上传图片)。

正如大家所见,它具有相同的格式,但不显示 defaultColumns,我不知道为什么。我没有收到任何类型的错误。

有谁知道是否可以做这样的事情?

这是我的完整代码:

<?php

include_once(DIR_PLUGINS.'/alexcrudgenerator/main.php');

    $test = new GenerateCrud($_POST['tableName'], $_POST['id'], $_POST['tableFields']);

    switch($_POST['action'])
        
        case 'datosTabla':
            
            $res = json_decode($_POST['datos']);
            echo json_encode($res, JSON_UNESCAPED_UNICODE);
            
            break;

        case 'showtable':

            $res = getEntireTable($_POST['tableName'], $_POST['id'], $_POST['tableFields']);
            
            foreach ($res as $data)
                $resultados['data'][] = $data;
                       
            $resultados = json_encode($resultados);
            
            foreach(json_decode($_POST['tableFields']) as $columnsDB)
                $fields[] = array('data'=>$columnsDB);;
            
            $fields = json_encode($fields);
?>
            <div class="container caja">
                <div class="row">
                    <div class="col-lg-12 col-sm-12">
                        <div>
                            <table id="tablaUsuarios" class="table table-striped table-bordered table-condensed" style="width:100%" >
                                <thead class="text-center">
                                </thead>
                                <tbody>
                                </tbody>
                            </table>
                        </div>
                  </div>
            </div>

            <script>
            
                $(document).ready(function() 
                    var datos = '<?=$resultados?>';
                    var dataHeader = <?=$fields?>;
                    

                    console.log(dataHeader);
                    
                    $('#tablaUsuarios').DataTable(
                        "language": "url": "//cdn.datatables.net/plug-ins/1.10.20/i18n/Spanish.json",
                        "paging": true,
                        "lengthChange": true,
                        "searching": true,
                        "info": true,
                        "autoWidth": true,
                        "scrollX": true,

                        "ajax":            
                            "url": '<?=SITE_URL_ADMIN?>/alexcrudgenerator/crud/res/',
                            "method": 'POST',
                            "data":action: "datosTabla", datos: datos
                        ,

                        "columns":
                            dataHeader,
                            "defaultContent": "<div class='text-center'><div class='btn-group'><button class='btn btn-primary btn-sm btnEditar' value='edit'><i class='material-icons'>edit</i></button><button class='btn btn-danger btn-sm btnBorrar'><i class='material-icons' value='delete'>delete</i></button></div></div>",
                        
                        success: function() 
                            alert("Hello, successful!");
                        
                    );
                )
            </script>
<?php
        break;      

?>

另外,作为一个附加问题,我如何在我的 TH 中添加值?我的意思是,为每一列添加一个标题。

另外,作为一个附加问题,我如何在我的 TH 中添加值?我的意思是,为每一列添加一个标题。

我尝试在我的&lt;thead&gt;&lt;/thead&gt; 中添加&lt;tr&gt;&lt;td&gt;Test 1&lt;/td&gt;&lt;/tr&gt;,但什么也没...

提前谢谢你们,伙计们。

【问题讨论】:

【参考方案1】:

出现问题是因为dataHeader 变量是一个数组,所以它实际上看起来是这样的:

var dataHeader = [
   "data": "id" ,
   "data": "usuario" ,
   "data": "apellido1" ,
   "data": "apellido2" ,
   "data": "email" 
];

旁注:我简化了您的变量,因为它似乎同时包含 datamData 选项:

 data: "id", mData: "id" , ...

而它只需要包含data 选项:

 data: "id" , ...

mDatadata 的旧名称 - 因此这些选项是等效的。


如果您将此数组添加到您的 DataTable 中,您最终会得到 columns 选项的以下结构:

"columns": [
  [
     "data": "id" ,
     "data": "usuario" ,
     "data": "apellido1" ,
     "data": "apellido2" ,
     "data": "email" 
  ],
  "defaultContent": "<div class='text-center'>...</div>"
],

这不是你想要的——你在columns 数组中有那个额外的数组。这对 DataTables 无效。

解决方案:

您可以通过将该 html 字符串添加到 PHP 提供的数组中来解决此问题:

var defaultContent =  defaultContent: "<div class='text-center'>...</div>" 

var dynamicColumns= <?=$fields?>;

dynamicColumns.push(defaultContent);

push() 函数将defaultContent 对象添加到dynamicColumns 数组的末尾。

现在您可以在 DataTable 中使用这个新变量 dynamicColumns

$('#tablaUsuarios').DataTable(
  "columns": dynamicColumns
);

【讨论】:

以上是关于数据表中具有单个变量 + defaultColumns 的列数组的主要内容,如果未能解决你的问题,请参考以下文章

具有单个输入变量的 kmeans 聚类图

vuejs 在单个文件 vue 组件中具有范围 css 的多个主题

如何从 MongoDB 中具有多个集合的数据库中访问单个集合数据

--数据分析的多变量分析

使用具有单个 sqlalchemy 模型的多个数据库

如何从数据框中丢弃具有单个字符的名称?