从Datatables Custom Filter Not Working修改的代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Datatables Custom Filter Not Working修改的代码相关的知识,希望对你有一定的参考价值。

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

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

除了更改max和min值之外,表的所有内容都有效。

头区域具有以下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,并期望问题出在哪里,但看不出问题的明显原因。谢谢

答案

问题在于你的getAge()函数,如果你查看表中的age列,它应该是显而易见的。你的代码是:

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

PHP date()函数返回格式为'YYYMMDD'的字符串。你有两个,你减去它们。假设他们是'20190414''20020321',减去它们将导致170093,用substr()取最后两个字符给你一个出生于2002年的人的93年龄。你没注意到吗?

所以,让我们写一个更好的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

另一答案

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

谢谢你的帮助。

以上是关于从Datatables Custom Filter Not Working修改的代码的主要内容,如果未能解决你的问题,请参考以下文章

在大表上使用 Django-Filter 以及 DataTables2

安全命名空间不支持装饰元素 [custom-filter]

黄聪:JQUERY的datatables插件,Date range filter时间段筛选功能

angularjs ngTable -Custom filter template-calendar

Define Custom Data Filter Using Pre-Query Trigger In Oracle Forms

Less(32)GET - Bypass custom filter adding slashes to dangerous chars