当启用过滤器小部件和寻呼机插件时,我注意到
tablesorter
出现奇怪的行为。这是场景:
我有一个表,总共有 366 个条目,我已经应用了过滤器小部件和寻呼机插件。下面是我正在操作的表数据集的片段。
举例来说,我通过 Register
BIN_d_USE_RBLKS\s
过滤结果(其中 \s 只是表示我在搜索中包含了一个空格字符)...
如下面的屏幕截图所示,显示的过滤结果与之前显示的结果没有变化。然而,寻呼机已通过 Ajax 查询准确更新(如左上角所示),表明没有与这些搜索参数匹配的结果。
理想情况下,过滤搜索会返回一个空集,但事实并非如此。我该如何解决这个问题?有我缺少的设置吗?
更新1
我知道寻呼机将核心config.serverSideSorting
选项和
filter_serversideFiltering
小部件选项设置为 true。这意味着服务器负责根据寻呼机传递给服务器的过滤条件对数据进行排序。下面是用于生成 Ajax 响应的 PHP 服务器端代码片段。
$page = $_GET['page'];
$size = $_GET['size'];
$design_filter = stripslashes($_GET['filter'][0]);
$reg_filter = stripslashes($_GET['filter'][1]);
// row entry offset.
$offset = $page*$size;
try {
$con = new PDO( "mysql:host=$host;dbname=$dbname", $username, $passwd);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// If the filter is surrounded in quotes, treat it literally. Otherwise,
// match it as a substring.
$quote_regex = '/^([\"\']).*\1$/m';
$literal_design = preg_match($quote_regex, $design_filter);
$literal_reg = preg_match($quote_regex, $reg_filter);
// both filters specify literal interpretation
if ($literal_design && $literal_reg)
{
SELECT SOMETHING
}
// only treat design filter as a literal
if ($literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// only treat register filter as a literal
if (!$literal_design && $literal_reg)
{
SELECT SOMETHING
}
// no filters are literals
if (!$literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
我还通过手动检查 SQL 查询来验证过滤器是否适当地限制了从数据库返回的响应。除了我上面介绍的情况之外,我的过滤效果很好。
更新2
如果没有数据与搜索过滤器匹配,服务器不应使用 JSON 中的rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这可以确保当搜索在数据库服务器端没有匹配的条目时,过滤器小部件将清除表格。我在文档中没有看到这一点,我强烈建议在某处添加它。这会节省我几个小时的时间。
选项和
filter_serversideFiltering
小部件选项设置为
true
(src),因为客户端无法执行这些操作函数无需服务器输出,或者在客户端拥有整个数据库,但是您不需要阿贾克斯。 服务器应该对数据库进行排序,并使用ajax请求提供的过滤器,并将结果返回给分页器ajax函数进行显示。
rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这可以确保当搜索在数据库服务器端没有匹配的条目时,过滤器小部件将清除表格。我在文档中没有看到这一点,我强烈建议在某处添加它。这会节省我几个小时的时间。