当启用过滤器小部件和寻呼机插件时,我注意到tablesorter
的奇怪行为。这是场景:
我有一个表格,共有366个条目,我已经应用了过滤器小部件和分页器插件。下面是我正在操作的表数据集的片段。
比如说我按寄存器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;
}
这可确保当搜索在数据库服务器端没有匹配的条目时,过滤器小部件将清除表。我没有在文档中的任何地方看到这一点,我强烈建议在某处添加它。这样可以节省我几个小时的时间。
答案 0 :(得分:0)
当使用带有ajax的寻呼机时,寻呼机会将核心config.serverSideSorting
option和filter_serversideFiltering
widget option设置为true
(src),因为客户端无法使用在没有服务器输出的情况下执行这些功能,或者在客户端使用整个数据库,但是你不需要ajax。
服务器应该对数据库进行排序并使用ajax请求提供的过滤器,并将结果返回给寻呼机ajax函数进行显示。
答案 1 :(得分:0)
如果没有数据与搜索过滤器匹配,则服务器不应使用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;
}
这可确保当搜索在数据库服务器端没有匹配的条目时,过滤器小部件将清除表。我没有在文档中的任何地方看到这一点,我强烈建议在某处添加它。这样可以节省我几个小时的时间。