summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/pref/filters.php157
-rw-r--r--include/functions.php114
-rw-r--r--js/functions.js14
-rw-r--r--js/prefs.js14
4 files changed, 175 insertions, 124 deletions
diff --git a/classes/pref/filters.php b/classes/pref/filters.php
index 13b80ac4b..4c867c23f 100644
--- a/classes/pref/filters.php
+++ b/classes/pref/filters.php
@@ -8,97 +8,102 @@ class Pref_Filters extends Handler_Protected {
return array_search($method, $csrf_ignored) !== false;
}
-/* function filter_test($filter_type, $reg_exp,
- $action_id, $action_param, $filter_param, $inverse, $feed_id, $cat_id,
- $cat_filter) {
+ function testFilter() {
+ $filter = array();
- $result = db_query($this->link, "SELECT name FROM ttrss_filter_types WHERE
- id = " . $filter_type);
- $type_name = db_fetch_result($result, 0, "name");
+ $filter["enabled"] = true;
+ $filter["match_any_rule"] = sql_bool_to_bool(
+ checkbox_to_sql_bool(db_escape_string($_REQUEST["match_any_rule"])));
+ $filter["rules"] = array();
- $result = db_query($this->link, "SELECT name FROM ttrss_filter_actions WHERE
- id = " . $action_id);
- $action_name = db_fetch_result($result, 0, "name");
+ $result = db_query($this->link, "SELECT id,name FROM ttrss_filter_types");
+ $type_name = db_fetch_result($result, 0, "name");
- $filter["reg_exp"] = $reg_exp;
- $filter["action"] = $action_name;
- $filter["type"] = $type_name;
- $filter["action_param"] = $action_param;
- $filter["filter_param"] = $filter_param;
- $filter["inverse"] = $inverse;
+ $filter_types = array();
+ while ($line = db_fetch_assoc($result)) {
+ $filter_types[$line["id"]] = $line["name"];
+ }
- $filters[$type_name] = array($filter);
+ $rctr = 0;
+ foreach ($_REQUEST["rule"] AS $r) {
+ $rule = json_decode($r, true);
- if ($feed_id)
- $feed = $feed_id;
- else
- $feed = -4;
+ if ($rule && $rctr < 5) {
+ $rule["type"] = $filter_types[$rule["filter_type"]];
+ unset($rule["filter_type"]);
- $regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
- $filter['reg_exp']) !== FALSE;
+ if (strpos($rule["feed_id"], "CAT:") === 0) {
+ $rule["cat_id"] = (int) substr($rule["feed_id"], 4);
+ unset($rule["feed_id"]);
+ }
- print __("Articles matching this filter:");
+ array_push($filter["rules"], $rule);
- print "<div class=\"filterTestHolder\">";
- print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
+ ++$rctr;
+ } else {
+ break;
+ }
+ }
- if ($regexp_valid) {
+ $feed_title = getFeedTitle($this->link, $feed);
- $feed_title = getFeedTitle($this->link, $feed);
+ $qfh_ret = queryFeedHeadlines($this->link, -4, 30, "", false, false, false,
+ false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
- $qfh_ret = queryFeedHeadlines($this->link, $cat_filter ? $cat_id : $feed,
- 30, "", $cat_filter, false, false,
- false, "date_entered DESC", 0, $_SESSION["uid"], $filter);
+ $result = $qfh_ret[0];
- $result = $qfh_ret[0];
+ $articles = array();
+ $found = 0;
- $articles = array();
- $found = 0;
+ print __("Articles matching this filter:");
- while ($line = db_fetch_assoc($result)) {
+ print "<div class=\"filterTestHolder\">";
+ print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
- $entry_timestamp = strtotime($line["updated"]);
- $entry_tags = get_article_tags($this->link, $line["id"], $_SESSION["uid"]);
+ while ($line = db_fetch_assoc($result)) {
- $content_preview = truncate_string(
- strip_tags($line["content_preview"]), 100, '...');
+ $entry_timestamp = strtotime($line["updated"]);
+ $entry_tags = get_article_tags($this->link, $line["id"], $_SESSION["uid"]);
- if ($line["feed_title"])
- $feed_title = $line["feed_title"];
+ $content_preview = truncate_string(
+ strip_tags($line["content_preview"]), 100, '...');
- print "<tr>";
+ if ($line["feed_title"])
+ $feed_title = $line["feed_title"];
- print "<td width='5%' align='center'><input
- dojoType=\"dijit.form.CheckBox\" checked=\"1\"
- disabled=\"1\" type=\"checkbox\"></td>";
- print "<td>";
+ print "<tr>";
- print $line["title"];
- print "&nbsp;(";
- print "<b>" . $feed_title . "</b>";
- print "):&nbsp;";
- print "<span class=\"insensitive\">" . $content_preview . "</span>";
- print " " . mb_substr($line["date_entered"], 0, 16);
+ print "<td width='5%' align='center'><input
+ dojoType=\"dijit.form.CheckBox\" checked=\"1\"
+ disabled=\"1\" type=\"checkbox\"></td>";
+ print "<td>";
- print "</td></tr>";
+ print $line["title"];
+ print "&nbsp;(";
+ print "<b>" . $feed_title . "</b>";
+ print "):&nbsp;";
+ print "<span class=\"insensitive\">" . $content_preview . "</span>";
+ print " " . mb_substr($line["date_entered"], 0, 16);
- $found++;
- }
+ print "</td></tr>";
- if ($found == 0) {
- print "<tr><td align='center'>" .
- __("No articles matching this filter has been found.") . "</td></tr>";
- }
- } else {
- print "<tr><td align='center' class='error'>" .
- __("Invalid regular expression.") . "</td></tr>";
+ $found++;
+ }
+ if ($found == 0) {
+ print "<tr><td align='center'>" .
+ __("No recent articles matching this filter have been found.") . "</td></tr>";
}
- print "</table>";
+ print "</table></div>";
+
+ print "<div style='text-align : center'>";
+ print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('filterTestDlg').hide()\">".
+ __('Close this window')."</button>";
print "</div>";
- } */
+ }
+
function getfiltertree() {
$root = array();
@@ -239,11 +244,14 @@ class Pref_Filters extends Handler_Protected {
while ($line = db_fetch_assoc($rules_result)) {
if (sql_bool_to_bool($line["cat_filter"])) {
- unset($line["cat_filter"]);
$line["feed_id"] = "CAT:" . (int)$line["cat_id"];
- unset($line["cat_id"]);
}
+ unset($line["cat_filter"]);
+ unset($line["cat_id"]);
+ unset($line["filter_id"]);
+ unset($line["id"]);
+
$data = htmlspecialchars(json_encode($line));
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
@@ -283,6 +291,10 @@ class Pref_Filters extends Handler_Protected {
while ($line = db_fetch_assoc($actions_result)) {
$line["action_param_label"] = $line["action_param"];
+
+ unset($line["filter_id"]);
+ unset($line["id"]);
+
$data = htmlspecialchars(json_encode($line));
print "<li><input dojoType='dijit.form.CheckBox' type='checkbox' onclick='toggleSelectListRow2(this)'>".
@@ -321,8 +333,8 @@ class Pref_Filters extends Handler_Protected {
__('Remove')."</button>";
print "</div>";
-# print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
-# __('Test')."</button> ";
+ print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
+ __('Test')."</button> ";
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
__('Save')."</button> ";
@@ -379,6 +391,9 @@ class Pref_Filters extends Handler_Protected {
}
function editSave() {
+ if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
+ return $this->testFilter();
+ }
# print_r($_REQUEST);
@@ -491,6 +506,10 @@ class Pref_Filters extends Handler_Protected {
}
function add() {
+ if ($_REQUEST["savemode"] && $_REQUEST["savemode"] == "test") {
+ return $this->testFilter();
+ }
+
# print_r($_REQUEST);
$enabled = checkbox_to_sql_bool($_REQUEST["enabled"]);
@@ -689,8 +708,8 @@ class Pref_Filters extends Handler_Protected {
print "<div class=\"dlgButtons\">";
-# print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
-# __('Test')."</button> ";
+ print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">".
+ __('Test')."</button> ";
print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">".
__('Create')."</button> ";
diff --git a/include/functions.php b/include/functions.php
index 2845acb22..dd97522c4 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -2281,7 +2281,16 @@
}
if ($filter) {
- $filter_query_part = filter_to_sql($filter);
+
+ if (DB_TYPE == "pgsql") {
+ $query_strategy_part .= " AND updated > NOW() - INTERVAL '14 days' ";
+ } else {
+ $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL 14 DAY) ";
+ }
+
+ $override_order = "updated DESC";
+
+ $filter_query_part = filter_to_sql($filter) . " AND";
} else {
$filter_query_part = "";
}
@@ -5049,71 +5058,66 @@
}
function filter_to_sql($filter) {
- $query = "";
+ $query = array();
- $regexp_valid = preg_match('/' . $filter['reg_exp'] . '/',
- $filter['reg_exp']) !== FALSE;
+ if (DB_TYPE == "pgsql")
+ $reg_qpart = "~";
+ else
+ $reg_qpart = "REGEXP";
- if ($regexp_valid) {
+ foreach ($filter["rules"] AS $rule) {
+ $regexp_valid = preg_match('/' . $rule['reg_exp'] . '/',
+ $rule['reg_exp']) !== FALSE;
- if (DB_TYPE == "pgsql")
- $reg_qpart = "~";
- else
- $reg_qpart = "REGEXP";
-
- switch ($filter["type"]) {
- case "title":
- $query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
- $filter['reg_exp'] . "')";
- break;
- case "content":
- $query = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
- $filter['reg_exp'] . "')";
- break;
- case "both":
- $query = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
- $filter['reg_exp'] . "') OR LOWER(" .
- "ttrss_entries.content) $reg_qpart LOWER('" . $filter['reg_exp'] . "')";
- break;
- case "tag":
- $query = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
- $filter['reg_exp'] . "')";
- break;
- case "link":
- $query = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
- $filter['reg_exp'] . "')";
- break;
- case "date":
+ if ($regexp_valid) {
- if ($filter["filter_param"] == "before")
- $cmp_qpart = "<";
- else
- $cmp_qpart = ">=";
+ $rule['reg_exp'] = db_escape_string($rule['reg_exp']);
- $timestamp = date("Y-m-d H:N:s", strtotime($filter["reg_exp"]));
- $query = "ttrss_entries.date_entered $cmp_qpart '$timestamp'";
- break;
- case "author":
- $query = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
- $filter['reg_exp'] . "')";
- break;
- }
+ switch ($rule["type"]) {
+ case "title":
+ $qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "')";
+ break;
+ case "content":
+ $qpart = "LOWER(ttrss_entries.content) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "')";
+ break;
+ case "both":
+ $qpart = "LOWER(ttrss_entries.title) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "') OR LOWER(" .
+ "ttrss_entries.content) $reg_qpart LOWER('" . $rule['reg_exp'] . "')";
+ break;
+ case "tag":
+ $qpart = "LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "')";
+ break;
+ case "link":
+ $qpart = "LOWER(ttrss_entries.link) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "')";
+ break;
+ case "author":
+ $qpart = "LOWER(ttrss_entries.author) $reg_qpart LOWER('".
+ $rule['reg_exp'] . "')";
+ break;
+ }
- if ($filter["inverse"])
- $query = "NOT ($query)";
+ if (isset($rule["feed_id"])) {
+ $qpart .= " AND feed_id " . ($rule["feed_id"] ? '= ' . $rule["feed_id"] : 'IS NULL');
+ }
- if ($query) {
- if (DB_TYPE == "pgsql") {
- $query = " ($query) AND ttrss_entries.date_entered > NOW() - INTERVAL '14 days'";
- } else {
- $query = " ($query) AND ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL 14 DAY)";
+ if (isset($rule["cat_id"])) {
+ $qpart .= " AND cat_id " . ($rule["cat_id"] ? '= ' . $rule["cat_id"] : 'IS NULL');
}
- $query .= " AND ";
+
+ array_push($query, "($qpart)");
+
}
+ }
- return $query;
+ if (count($query) > 0) {
+ return "(" . join($filter["match_any_rule"] ? "OR" : "AND", $query) . ")";
} else {
- return false;
+ return "(false)";
}
}
diff --git a/js/functions.js b/js/functions.js
index 313cbe5c9..02aeb454f 100644
--- a/js/functions.js
+++ b/js/functions.js
@@ -1111,6 +1111,20 @@ function quickAddFilter() {
id: "filterEditDlg",
title: __("Create Filter"),
style: "width: 600px",
+ test: function() {
+ var query = "backend.php?" + dojo.formToQuery("filter_new_form") + "&savemode=test";
+
+ if (dijit.byId("filterTestDlg"))
+ dijit.byId("filterTestDlg").destroyRecursive();
+
+ var test_dlg = new dijit.Dialog({
+ id: "filterTestDlg",
+ title: "Test Filter",
+ style: "width: 600px",
+ href: query});
+
+ test_dlg.show();
+ },
selectRules: function(select) {
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
e.checked = select;
diff --git a/js/prefs.js b/js/prefs.js
index 72d253a95..d23d4a68b 100644
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -136,6 +136,20 @@ function editFilter(id) {
id: "filterEditDlg",
title: __("Edit Filter"),
style: "width: 600px",
+ test: function() {
+ var query = "backend.php?" + dojo.formToQuery("filter_edit_form") + "&savemode=test";
+
+ if (dijit.byId("filterTestDlg"))
+ dijit.byId("filterTestDlg").destroyRecursive();
+
+ var test_dlg = new dijit.Dialog({
+ id: "filterTestDlg",
+ title: "Test Filter",
+ style: "width: 600px",
+ href: query});
+
+ test_dlg.show();
+ },
selectRules: function(select) {
$$("#filterDlg_Matches input[type=checkbox]").each(function(e) {
e.checked = select;