【问题标题】:Code amended from Datatables Custom Filter Not Working从数据表自定义过滤器修改的代码不起作用
【发布时间】:2019-04-14 09:09:35
【问题描述】:

我有一个使用 HTML5/PHP/Bootstrap 编写的业余体育俱乐部管理系统,并在各个地方使用 Datatables。

对于其中一张表,管理等待列表,我需要过滤一个数据库集的最大和最小年龄,所以使用了 Datatables 在以下链接中提供的代码 (https://www.datatables.net/examples/plug-ins/range_filtering.html)。

关于表格的所有内容都有效,除了更改最大值和最小值无效。

头部区域有以下Javascript(从Datatables复制)

        $.fn.dataTable.ext.search.push(
                function (settings, data, dataIndex) {
                    var min = parseInt($('#min').val(), 10);
                    var max = parseInt($('#max').val(), 10);
                    var age = parseFloat(data[2]) || 0; // use data for the age column

                    if ((isNaN(min) && isNaN(max)) ||
                            (isNaN(min) && age <= max) ||
                            (min <= age && isNaN(max)) ||
                            (min <= age && age <= max))
                    {
                        return true;
                    }
                    return false;
                }
        );

正文部分中的表格 (html/php)

            <table border="0" cellspacing="5" cellpadding="5">
                <tr>
                    <td>Minimum age:</td>
                    <td><input type="number" id="min" name="min" min="3" max="21"></td>
                    <td>Maximum age:</td>
                    <td><input type="number" id="max" name="max" min="3" max="21"></td>
                </tr>
            </table>

            <table id = "table" class = "display compact cell-border stripe" width="100%">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Gender</th>
                        <th>Age</th>
                        <th>Date Added</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                    $query = $conn->query("SELECT * FROM `waitlist` WHERE wl_status ='Active'") or die(mysqli_error());
                    while ($f_query = $query->fetch_array()) {

                        echo '<tr>';
                        echo '<td>' . $f_query['wl_Name'] . '</td>';
                        echo '<td>' . $f_query['wl_Gender'] . '</td>';
                        echo '<td>' . getAge($f_query['wl_DoB']) . '</td>';
                        echo '<td data-sort="' . $f_query['wl_DateAdded'] . '">' . date('d/m/Y', strtotime($f_query['wl_DateAdded'])) . '</td>';
                        echo '<td><center><a href = "wl_edit.php?wl_id=' . $f_query['wl_ID'] . '" class = "btn btn-warning btn-sm"><span class = "fa fa-edit"></span> Details</a>' . ' | <a onclick = "javascript:confirmationDelete($(this)); return false;" href = "wl_delete.php?wl_id=' . $f_query['wl_ID'] . '" class = "btn btn-danger btn-sm"><span class = "fa fa-trash"></span> Delete</a>' . ' | <a  href = "wl_transfer.php?wl_id=' . $f_query['wl_ID'] . '" class = "btn btn-primary btn-sm"><span class = "fa fa-paste"></span> To Member</a></center></td>';
                        echo '</tr>';
                    };
                    ?>
                </tbody>
            </table>

页面底部的Javascript包含:

        $(document).ready(function () {
            $('#table').DataTable({
                "lengthChange": false,
                "pageLength": 12,
                "pagingType": "full_numbers",
                "order": [[3, "asc"]]
            });

            var table = $('#table').DataTable();
            $('#min, #max').keyup(function () {
                table.draw();
            });
        });

keyup 函数部分是从 Datatables 链接复制的

getage PHP 函数是 PHP 标头的一部分

function getAge($date) { // Y-m-d format
return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));

我仍在努力使用 javascript,并认为这就是问题所在,但看不到我的问题的明显原因。谢谢

【问题讨论】:

    标签: javascript php jquery datatables


    【解决方案1】:

    问题在于您的getAge() 函数,如果您查看表中的年龄列,应该很明显。你的代码是:

    function getAge($date) 
    { 
        return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
    }
    

    PHP date() 函数返回格式为 'YYYMMDD' 的字符串。你有两个,然后减去它们。假设它们是'20190414''20020321',减去它们将得到170093,将最后两个字符加上substr() 得到93 对于2002 年出生的人的年龄。你没有注意到那个?

    所以,让我们编写一个更好的getAge() 函数。与时间准确地工作是困难的。然而,PHP 内部其实有一个函数可以计算日期差:

    https://www.php.net/manual/en/datetime.diff.php

    如果我们用它来创建我们得到的函数:

    function getAge($dateStr) 
    { 
        $birthDate = new DateTime($dateStr); // check the valid formats in the manual!
        $currentDate = new DateTime();
        return $birthDate->diff($currentDate, true)->y; // return difference in years
    }
    

    这个函数可以写在一行代码中,而不是三行,但这会更难阅读,所以不要这样做。

    这对你有用吗?您的代码中可能还有其他错误,调试 Javascript 错误的一个好方法是查看您的 developer tools

    【讨论】:

    • 谢谢你 - 我已经在一系列生日上测试过它,但没有发现它不起作用。但是,这并不能解决主要问题 - 当最大/最小输入之一发生更改时,数据表不会重写。
    • 我在JSFiddle 中测试了Custom filtering,它成功了。据我所知,您完全复制了该代码。所以我看不出这是哪里出了问题。您是否尝试过开发人员工具?你必须使用控制台和调试器来处理 Javascript。
    【解决方案2】:

    事实证明,我需要更改添加外部 jquery/bootstrap/datatables js 脚本的顺序。

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2019-06-27
      • 2012-08-19
      • 1970-01-01
      • 2017-07-25
      • 2012-08-22
      相关资源
      最近更新 更多