diff --git a/classes/opml.php b/classes/opml.php index 0671053c..2c2c2ac0 100644 --- a/classes/opml.php +++ b/classes/opml.php @@ -181,13 +181,37 @@ class Opml extends Handler_Protected { $cat_filter = sql_bool_to_bool($tmp_line["cat_filter"]); - if ($cat_filter && $tmp_line["cat_id"] || $tmp_line["feed_id"]) { - $tmp_line["feed"] = Feeds::getFeedTitle( - $cat_filter ? $tmp_line["cat_id"] : $tmp_line["feed_id"], - $cat_filter); - } else { - $tmp_line["feed"] = ""; - } + if (!$tmp_line["match_on"]) { + if ($cat_filter && $tmp_line["cat_id"] || $tmp_line["feed_id"]) { + $tmp_line["feed"] = Feeds::getFeedTitle( + $cat_filter ? $tmp_line["cat_id"] : $tmp_line["feed_id"], + $cat_filter); + } else { + $tmp_line["feed"] = ""; + } + } else { + $match = []; + foreach (json_decode($tmp_line["match_on"], true) as $feed_id) { + + if (strpos($feed_id, "CAT:") === 0) { + $feed_id = (int)substr($feed_id, 4); + if ($feed_id) { + array_push($match, [Feeds::getCategoryTitle($feed_id), true, false]); + } else { + array_push($match, [0, true, true]); + } + } else { + if ($feed_id) { + array_push($match, [Feeds::getFeedTitle((int)$feed_id), false, false]); + } else { + array_push($match, [0, false, true]); + } + } + } + + $tmp_line["match"] = $match; + unset($tmp_line["match_on"]); + } $tmp_line["cat_filter"] = sql_bool_to_bool($tmp_line["cat_filter"]); $tmp_line["inverse"] = sql_bool_to_bool($tmp_line["inverse"]); @@ -346,28 +370,71 @@ class Opml extends Handler_Protected { $feed_id = "NULL"; $cat_id = "NULL"; - if (!$rule["cat_filter"]) { - $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feeds - WHERE title = '".$this->dbh->escape_string($rule["feed"])."' AND owner_uid = ".$_SESSION["uid"]); - if ($this->dbh->num_rows($tmp_result) > 0) { - $feed_id = $this->dbh->fetch_result($tmp_result, 0, "id"); - } - } else { - $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feed_categories - WHERE title = '".$this->dbh->escape_string($rule["feed"])."' AND owner_uid = ".$_SESSION["uid"]); + if ($rule["match"]) { - if ($this->dbh->num_rows($tmp_result) > 0) { - $cat_id = $this->dbh->fetch_result($tmp_result, 0, "id"); - } - } + $match_on = []; - $cat_filter = bool_to_sql_bool($rule["cat_filter"]); - $reg_exp = $this->dbh->escape_string($rule["reg_exp"]); - $filter_type = (int)$rule["filter_type"]; - $inverse = bool_to_sql_bool($rule["inverse"]); + foreach ($rule["match"] as $match) { + list ($name, $is_cat, $is_id) = $match; - $this->dbh->query("INSERT INTO ttrss_filters2_rules (feed_id,cat_id,filter_id,filter_type,reg_exp,cat_filter,inverse) - VALUES ($feed_id, $cat_id, $filter_id, $filter_type, '$reg_exp', $cat_filter,$inverse)"); + if ($is_id) { + array_push($match_on, ($is_cat ? "CAT:" : "") . $name); + } else { + + $match_id = false; + + if (!$is_cat) { + $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feeds + WHERE title = '" . $this->dbh->escape_string($name) . "' AND owner_uid = " . $_SESSION["uid"]); + if ($this->dbh->num_rows($tmp_result) > 0) { + $match_id = $this->dbh->fetch_result($tmp_result, 0, "id"); + } + } else { + $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feed_categories + WHERE title = '" . $this->dbh->escape_string($name) . "' AND owner_uid = " . $_SESSION["uid"]); + + if ($this->dbh->num_rows($tmp_result) > 0) { + $match_id = 'CAT:' . $this->dbh->fetch_result($tmp_result, 0, "id"); + } + } + + if ($match_id) array_push($match_on, $match_id); + } + } + + $reg_exp = $this->dbh->escape_string($rule["reg_exp"]); + $filter_type = (int)$rule["filter_type"]; + $inverse = bool_to_sql_bool($rule["inverse"]); + $match_on = $this->dbh->escape_string(json_encode($match_on)); + + $this->dbh->query("INSERT INTO ttrss_filters2_rules (feed_id,cat_id,match_on,filter_id,filter_type,reg_exp,cat_filter,inverse) + VALUES (NULL, NULL, '$match_on',$filter_id, $filter_type, '$reg_exp', false, $inverse)"); + + } else { + + if (!$rule["cat_filter"]) { + $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feeds + WHERE title = '" . $this->dbh->escape_string($rule["feed"]) . "' AND owner_uid = " . $_SESSION["uid"]); + if ($this->dbh->num_rows($tmp_result) > 0) { + $feed_id = $this->dbh->fetch_result($tmp_result, 0, "id"); + } + } else { + $tmp_result = $this->dbh->query("SELECT id FROM ttrss_feed_categories + WHERE title = '" . $this->dbh->escape_string($rule["feed"]) . "' AND owner_uid = " . $_SESSION["uid"]); + + if ($this->dbh->num_rows($tmp_result) > 0) { + $cat_id = $this->dbh->fetch_result($tmp_result, 0, "id"); + } + } + + $cat_filter = bool_to_sql_bool($rule["cat_filter"]); + $reg_exp = $this->dbh->escape_string($rule["reg_exp"]); + $filter_type = (int)$rule["filter_type"]; + $inverse = bool_to_sql_bool($rule["inverse"]); + + $this->dbh->query("INSERT INTO ttrss_filters2_rules (feed_id,cat_id,filter_id,filter_type,reg_exp,cat_filter,inverse) + VALUES ($feed_id, $cat_id, $filter_id, $filter_type, '$reg_exp', $cat_filter,$inverse)"); + } } foreach ($filter["actions"] as $action) { diff --git a/classes/pref/filters.php b/classes/pref/filters.php index e5abf462..989159bd 100755 --- a/classes/pref/filters.php +++ b/classes/pref/filters.php @@ -75,18 +75,20 @@ class Pref_Filters extends Handler_Protected { $rule["type"] = $filter_types[$rule["filter_type"]]; unset($rule["filter_type"]); - if (strpos($rule["feed_id"], "CAT:") === 0) { - $rule["cat_id"] = (int) substr($rule["feed_id"], 4); - unset($rule["feed_id"]); - } + $scope_inner_qparts = []; + foreach ($rule["feed_id"] as $feed_id) { - if (isset($rule["feed_id"]) && $rule['feed_id'] > 0) { - array_push($scope_qparts, "feed_id = " . $rule["feed_id"]); - } else if (isset($rule["cat_id"])) { - array_push($scope_qparts, "cat_id = " . $rule["cat_id"]); - } else { - array_push($scope_qparts, "true"); - } + if (strpos($feed_id, "CAT:") === 0) { + $cat_id = (int) substr($feed_id, 4); + array_push($scope_inner_qparts, "cat_id = " . $cat_id); + } else if ($feed_id > 0) { + array_push($scope_inner_qparts, "feed_id = " . $feed_id); + } + } + + if (count($scope_inner_qparts) > 0) { + array_push($scope_qparts, "(" . implode(" OR ", $scope_inner_qparts) . ")"); + } array_push($filter["rules"], $rule); @@ -96,6 +98,8 @@ class Pref_Filters extends Handler_Protected { } } + if (count($scope_qparts) == 0) $scope_qparts = ["true"]; + $glue = $filter['match_any_rule'] ? " OR " : " AND "; $scope_qpart = join($glue, $scope_qparts); @@ -207,6 +211,7 @@ class Pref_Filters extends Handler_Protected { private function getfilterrules_concise($filter_id) { $result = $this->dbh->query("SELECT reg_exp, inverse, + match_on, feed_id, cat_id, cat_filter, @@ -221,10 +226,32 @@ class Pref_Filters extends Handler_Protected { while ($line = $this->dbh->fetch_assoc($result)) { - $where = sql_bool_to_bool($line["cat_filter"]) ? - Feeds::getCategoryTitle($line["cat_id"]) : - ($line["feed_id"] ? - Feeds::getFeedTitle($line["feed_id"]) : __("All feeds")); + if ($line["match_on"]) { + $feeds = json_decode($line["match_on"], true); + $feeds_fmt = []; + + foreach ($feeds as $feed_id) { + + if (strpos($feed_id, "CAT:") === 0) { + $feed_id = (int)substr($feed_id, 4); + array_push($feeds_fmt, Feeds::getCategoryTitle($feed_id)); + } else { + if ($feed_id) + array_push($feeds_fmt, Feeds::getFeedTitle((int)$feed_id)); + else + array_push($feeds_fmt, __("All feeds")); + } + } + + $where = implode(", ", $feeds_fmt); + + } else { + + $where = sql_bool_to_bool($line["cat_filter"]) ? + Feeds::getCategoryTitle($line["cat_id"]) : + ($line["feed_id"] ? + Feeds::getFeedTitle($line["feed_id"]) : __("All feeds")); + } # $where = $line["cat_id"] . "/" . $line["feed_id"]; @@ -376,17 +403,26 @@ class Pref_Filters extends Handler_Protected { WHERE filter_id = '$filter_id' ORDER BY reg_exp, id"); while ($line = $this->dbh->fetch_assoc($rules_result)) { - if (sql_bool_to_bool($line["cat_filter"])) { - $line["feed_id"] = "CAT:" . (int)$line["cat_id"]; - } + if ($line["match_on"]) { + $line["feed_id"] = json_decode($line["match_on"], true); + } else { + if (sql_bool_to_bool($line["cat_filter"])) { + $feed_id = "CAT:" . (int)$line["cat_id"]; + } else { + $feed_id = (int)$line["cat_id"]; + } - unset($line["cat_filter"]); - unset($line["cat_id"]); - unset($line["filter_id"]); - unset($line["id"]); - if (!sql_bool_to_bool($line["inverse"])) unset($line["inverse"]); + $line["feed_id"] = ["" . $feed_id]; // set item type to string for in_array() + } - $data = htmlspecialchars(json_encode($line)); + unset($line["cat_filter"]); + unset($line["cat_id"]); + unset($line["filter_id"]); + unset($line["id"]); + if (!sql_bool_to_bool($line["inverse"])) unset($line["inverse"]); + unset($line["match_on"]); + + $data = htmlspecialchars(json_encode($line)); print "