diff options
-rw-r--r-- | classes/pref/filters.php | 157 | ||||
-rw-r--r-- | include/functions.php | 114 | ||||
-rw-r--r-- | js/functions.js | 14 | ||||
-rw-r--r-- | js/prefs.js | 14 |
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 " ("; - print "<b>" . $feed_title . "</b>"; - print "): "; - 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 " ("; + print "<b>" . $feed_title . "</b>"; + print "): "; + 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; |