function hook_prefs_tab($args) { if ($args != "prefFeeds") { return; } print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"" . __('af_readability settings') . "\">"; print_notice("Enable the plugin for specific feeds in the feed editor."); print "<form dojoType=\"dijit.form.Form\">"; print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">\n\t\t\tevt.preventDefault();\n\t\t\tif (this.validate()) {\n\t\t\t\tconsole.log(dojo.objectToQuery(this.getValues()));\n\t\t\t\tnew Ajax.Request('backend.php', {\n\t\t\t\t\tparameters: dojo.objectToQuery(this.getValues()),\n\t\t\t\t\tonComplete: function(transport) {\n\t\t\t\t\t\tnotify_info(transport.responseText);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t//this.reset();\n\t\t\t}\n\t\t\t</script>"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pluginhandler\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"save\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"plugin\" value=\"af_readability\">"; $enable_share_anything = $this->host->get($this, "enable_share_anything"); $enable_share_anything_checked = $enable_share_anything ? "checked" : ""; print "<input dojoType=\"dijit.form.CheckBox\"\n\t\t\t{$enable_share_anything_checked} name=\"enable_share_anything\" id=\"enable_share_anything\">\n\t\t\t<label for=\"enable_share_anything\">" . __("Use Readability for pages shared via bookmarklet.") . "</label>"; print "<p><button dojoType=\"dijit.form.Button\" type=\"submit\">" . __("Save") . "</button>"; print "</form>"; $enabled_feeds = $this->host->get($this, "enabled_feeds"); if (!is_array($enabled_feeds)) { $enabled_feeds = array(); } $enabled_feeds = $this->filter_unknown_feeds($enabled_feeds); $this->host->set($this, "enabled_feeds", $enabled_feeds); if (count($enabled_feeds) > 0) { print "<h3>" . __("Currently enabled for (click to edit):") . "</h3>"; print "<ul class=\"browseFeedList\" style=\"border-width : 1px\">"; foreach ($enabled_feeds as $f) { print "<li>" . "<img src='images/pub_set.png'\n\t\t\t\t\t\tstyle='vertical-align : middle'> <a href='#'\n\t\t\t\t\t\tonclick='editFeed({$f})'>" . getFeedTitle($f) . "</a></li>"; } print "</ul>"; } print "</div>"; }
function filter_test($filter_type, $reg_exp, $action_id, $action_param, $filter_param, $inverse, $feed_id, $cat_id, $cat_filter) { $result = db_query($this->link, "SELECT name FROM ttrss_filter_types WHERE\n\t\t\tid = " . $filter_type); $type_name = db_fetch_result($result, 0, "name"); $result = db_query($this->link, "SELECT name FROM ttrss_filter_actions WHERE\n\t\t\tid = " . $action_id); $action_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; $filters[$type_name] = array($filter); if ($feed_id) { $feed = $feed_id; } else { $feed = -4; } $regexp_valid = preg_match('/' . $filter['reg_exp'] . '/', $filter['reg_exp']) !== FALSE; print __("Articles matching this filter:"); print "<div class=\"filterTestHolder\">"; print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">"; if ($regexp_valid) { $feed_title = getFeedTitle($this->link, $feed); $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]; $articles = array(); $found = 0; while ($line = db_fetch_assoc($result)) { $entry_timestamp = strtotime($line["updated"]); $entry_tags = get_article_tags($this->link, $line["id"], $_SESSION["uid"]); $content_preview = truncate_string(strip_tags($line["content_preview"]), 100, '...'); if ($line["feed_title"]) { $feed_title = $line["feed_title"]; } print "<tr>"; print "<td width='5%' align='center'><input\n\t\t\t\t\tdojoType=\"dijit.form.CheckBox\" checked=\"1\"\n\t\t\t\t\tdisabled=\"1\" type=\"checkbox\"></td>"; print "<td>"; 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></tr>"; $found++; } 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>"; } print "</table>"; print "</div>"; }
function digestupdate() { $feed_id = db_escape_string($_REQUEST['feed_id']); $offset = db_escape_string($_REQUEST['offset']); $seq = db_escape_string($_REQUEST['seq']); if (!$feed_id) { $feed_id = -4; } if (!$offset) { $offset = 0; } $reply = array(); $reply['seq'] = $seq; $headlines = API::api_get_headlines($this->link, $feed_id, 30, $offset, '', $feed_id == -4, true, false, "unread", "updated DESC", 0, 0); $reply['headlines'] = array(); $reply['headlines']['title'] = getFeedTitle($this->link, $feed_id); $reply['headlines']['content'] = $headlines; print json_encode($reply); }
private function feedlist_init_feed($feed_id, $title = false, $unread = false, $error = '', $updated = '') { $obj = array(); $feed_id = (int) $feed_id; if (!$title) { $title = getFeedTitle($this->link, $feed_id, false); } if ($unread === false) { $unread = getFeedUnread($this->link, $feed_id, false); } $obj['id'] = 'FEED:' . $feed_id; $obj['name'] = $title; $obj['unread'] = (int) $unread; $obj['type'] = 'feed'; $obj['error'] = $error; $obj['updated'] = $updated; $obj['icon'] = getFeedIcon($feed_id); $obj['bare_id'] = $feed_id; return $obj; }
function hook_prefs_tab($args) { if ($args != "prefFeeds") { return; } print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"" . __('af_readability settings') . "\">"; print_notice("Enable the plugin for specific feeds in the feed editor."); $enabled_feeds = $this->host->get($this, "enabled_feeds"); if (!array($enabled_feeds)) { $enabled_feeds = array(); } $enabled_feeds = $this->filter_unknown_feeds($enabled_feeds); $this->host->set($this, "enabled_feeds", $enabled_feeds); if (count($enabled_feeds) > 0) { print "<h3>" . __("Currently enabled for (click to edit):") . "</h3>"; print "<ul class=\"browseFeedList\" style=\"border-width : 1px\">"; foreach ($enabled_feeds as $f) { print "<li>" . "<img src='images/pub_set.png'\n\t\t\t\t\t\tstyle='vertical-align : middle'> <a href='#'\n\t\t\t\t\t\tonclick='editFeed({$f})'>" . getFeedTitle($f) . "</a></li>"; } print "</ul>"; } print "</div>"; }
function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false) { if (!$owner_uid) { $owner_uid = $_SESSION["uid"]; } $ext_tables_part = ""; if ($search) { if (SPHINX_ENABLED) { $ids = join(",", @sphinx_search($search, 0, 500)); if ($ids) { $search_query_part = "ref_id IN ({$ids}) AND "; } else { $search_query_part = "ref_id = -1 AND "; } } else { $search_query_part = search_to_sql($link, $search, $match_on); $search_query_part .= " AND "; } } else { $search_query_part = ""; } if ($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($link, $filter, $owner_uid); // Try to check if SQL regexp implementation chokes on a valid regexp $result = db_query($link, "SELECT true AS true_val FROM ttrss_entries,\n\t\t\t\t\tttrss_user_entries, ttrss_feeds, ttrss_feed_categories\n\t\t\t\t\tWHERE {$filter_query_part} LIMIT 1", false); if ($result) { $test = db_fetch_result($result, 0, "true_val"); if (!$test) { $filter_query_part = "false AND"; } else { $filter_query_part .= " AND"; } } else { $filter_query_part = "false AND"; } } else { $filter_query_part = ""; } if ($since_id) { $since_id_part = "ttrss_entries.id > {$since_id} AND "; } else { $since_id_part = ""; } $view_query_part = ""; if ($view_mode == "adaptive" || $view_query_part == "noscores") { if ($search) { $view_query_part = " "; } else { if ($feed != -1) { $unread = getFeedUnread($link, $feed, $cat_view); if ($cat_view && $feed > 0 && $include_children) { $unread += getCategoryChildrenUnread($link, $feed); } if ($unread > 0) { $view_query_part = " unread = true AND "; } } } } if ($view_mode == "marked") { $view_query_part = " marked = true AND "; } if ($view_mode == "published") { $view_query_part = " published = true AND "; } if ($view_mode == "unread") { $view_query_part = " unread = true AND "; } if ($view_mode == "updated") { $view_query_part = " (last_read is null and unread = false) AND "; } if ($limit > 0) { $limit_query_part = "LIMIT " . $limit; } $allow_archived = false; $vfeed_query_part = ""; // override query strategy and enable feed display when searching globally if ($search && $search_mode == "all_feeds") { $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; /* tags */ } else { if (!is_numeric($feed)) { $query_strategy_part = "true"; $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n\t\t\t\t\tid = feed_id) as feed_title,"; } else { if ($search && $search_mode == "this_cat") { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; if ($feed > 0) { if ($include_children) { $subcats = getChildCategories($link, $feed, $owner_uid); array_push($subcats, $feed); $cats_qpart = join(",", $subcats); } else { $cats_qpart = $feed; } $query_strategy_part = "ttrss_feeds.cat_id IN ({$cats_qpart})"; } else { $query_strategy_part = "ttrss_feeds.cat_id IS NULL"; } } else { if ($feed > 0) { if ($cat_view) { if ($feed > 0) { if ($include_children) { # sub-cats $subcats = getChildCategories($link, $feed, $owner_uid); array_push($subcats, $feed); $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")"; } else { $query_strategy_part = "cat_id = '{$feed}'"; } } else { $query_strategy_part = "cat_id IS NULL"; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { $query_strategy_part = "feed_id = '{$feed}'"; } } else { if ($feed == 0 && !$cat_view) { // archive virtual feed $query_strategy_part = "feed_id IS NULL"; $allow_archived = true; } else { if ($feed == 0 && $cat_view) { // uncategorized $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -1) { // starred virtual feed $query_strategy_part = "marked = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; } else { if ($feed == -2) { // published virtual feed OR labels category if (!$cat_view) { $query_strategy_part = "published = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_read DESC, updated DESC"; } } else { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; } } else { if ($feed == -6) { // recently read $query_strategy_part = "unread = false AND last_read IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_read DESC"; } } else { if ($feed == -3) { // fresh virtual feed $query_strategy_part = "unread = true AND score >= 0"; $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE", $owner_uid); if (DB_TYPE == "pgsql") { $query_strategy_part .= " AND updated > NOW() - INTERVAL '{$intl} hour' "; } else { $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) "; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -4) { // all articles virtual feed $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed <= -10) { // labels $label_id = -$feed - 11; $query_strategy_part = "label_id = '{$label_id}' AND\n\t\t\t\t\tttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; $allow_archived = true; } else { $query_strategy_part = "true"; } } } } } } } } } } } } if (get_pref($link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) { $date_sort_field = "updated"; } else { $date_sort_field = "date_entered"; } if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) { $order_by = "{$date_sort_field}"; } else { $order_by = "{$date_sort_field} DESC"; } if ($view_mode != "noscores") { $order_by = "score DESC, {$order_by}"; } if ($override_order) { $order_by = $override_order; } $feed_title = ""; if ($search) { $feed_title = T_sprintf("Search results: %s", $search); } else { if ($cat_view) { $feed_title = getCategoryTitle($link, $feed); } else { if (is_numeric($feed) && $feed > 0) { $result = db_query($link, "SELECT title,site_url,last_error\n\t\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}"); $feed_title = db_fetch_result($result, 0, "title"); $feed_site_url = db_fetch_result($result, 0, "site_url"); $last_error = db_fetch_result($result, 0, "last_error"); } else { $feed_title = getFeedTitle($link, $feed); } } } $content_query_part = "content as content_preview, cached_content, "; if (is_numeric($feed)) { if ($feed >= 0) { $feed_kind = "Feeds"; } else { $feed_kind = "Labels"; } if ($limit_query_part) { $offset_query_part = "OFFSET {$offset}"; } // proper override_order applied above if ($vfeed_query_part && !$ignore_vfeed_group && get_pref($link, 'VFEED_GROUP_BY_FEED', $owner_uid)) { if (!$override_order) { $order_by = "ttrss_feeds.title, {$order_by}"; } else { $order_by = "ttrss_feeds.title, {$override_order}"; } } if (!$allow_archived) { $from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds{$ext_tables_part}"; $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND"; } else { $from_qpart = "ttrss_entries{$ext_tables_part},ttrss_user_entries\n\t\t\t\t\t\tLEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)"; } $query = "SELECT DISTINCT\n\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tttrss_entries.id,ttrss_entries.title,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\talways_display_enclosures,\n\t\t\t\t\t\tsite_url,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\tcomments,\n\t\t\t\t\t\tint_id,\n\t\t\t\t\t\tunread,feed_id,marked,published,link,last_read,orig_feed_id,\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms,\n\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms,\n\t\t\t\t\t\tauthor,score\n\t\t\t\t\tFROM\n\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\tWHERE\n\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\tttrss_user_entries.ref_id = ttrss_entries.id AND\n\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t{$filter_query_part}\n\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part} {$offset_query_part}"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($link, $query); } else { // browsing by tag $select_qpart = "SELECT DISTINCT " . "date_entered," . "guid," . "note," . "ttrss_entries.id as id," . "title," . "updated," . "unread," . "feed_id," . "orig_feed_id," . "marked," . "num_comments, " . "comments, " . "tag_cache," . "label_cache," . "link," . "last_read," . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms," . $since_id_part . $vfeed_query_part . $content_query_part . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms," . "score "; $feed_kind = "Tags"; $all_tags = explode(",", $feed); if ($search_mode == 'any') { $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")"; $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags "; $where_qpart = " WHERE " . "ref_id = ttrss_entries.id AND " . "ttrss_user_entries.owner_uid = {$owner_uid} AND " . "post_int_id = int_id AND {$tag_sql} AND " . $view_query_part . $search_query_part . $query_strategy_part . " ORDER BY {$order_by} " . $limit_query_part; } else { $i = 1; $sub_selects = array(); $sub_ands = array(); foreach ($all_tags as $term) { array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = {$owner_uid}) as A{$i}"); $i++; } if ($i > 2) { $x = 1; $y = 2; do { array_push($sub_ands, "A{$x}.post_int_id = A{$y}.post_int_id"); $x++; $y++; } while ($y < $i); } array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = {$owner_uid}"); array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id"); $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries"; $where_qpart = " WHERE " . implode(" AND ", $sub_ands); } // error_log("TAG SQL: " . $tag_sql); // $tag_sql = "tag_name = '$feed'"; DEFAULT way // error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]"); $result = db_query($link, $select_qpart . $from_qpart . $where_qpart); } return array($result, $feed_title, $feed_site_url, $last_error); }
private function getRuleName($rule) { if (!$rule) { $rule = json_decode($_REQUEST["rule"], true); } $feed_id = $rule["feed_id"]; if (strpos($feed_id, "CAT:") === 0) { $feed_id = (int) substr($feed_id, 4); $feed = getCategoryTitle($feed_id); } else { $feed_id = (int) $feed_id; if ($rule["feed_id"]) { $feed = getFeedTitle((int) $rule["feed_id"]); } else { $feed = __("All feeds"); } } $result = $this->dbh->query("SELECT description FROM ttrss_filter_types\n\t\t\tWHERE id = " . (int) $rule["filter_type"]); $filter_type = $this->dbh->fetch_result($result, 0, "description"); return T_sprintf("%s on %s in %s %s", strip_tags($rule["reg_exp"]), $filter_type, $feed, isset($rule["inverse"]) ? __("(inverse)") : ""); }
function search() { $this->params = explode(":", $this->dbh->escape_string($_REQUEST["param"]), 2); $active_feed_id = sprintf("%d", $this->params[0]); $is_cat = $this->params[1] != "false"; print "<div class=\"dlgSec\">" . __('Look for') . "</div>"; print "<div class=\"dlgSecCont\">"; print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>"; print "<hr/>" . __('Limit search to:') . " "; print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>"; $feed_title = getFeedTitle($active_feed_id); if (!$is_cat) { $feed_cat_title = getFeedCatTitle($active_feed_id); } else { $feed_cat_title = getCategoryTitle($active_feed_id); } if ($active_feed_id && !$is_cat) { print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>"; } else { print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>"; } if ($is_cat) { $cat_preselected = "selected=\"1\""; } if (get_pref('ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) { print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>"; } else { //print "<option disabled>".__('This category')."</option>"; } print "</select>"; print "</div>"; print "<div class=\"dlgButtons\">"; if (count(PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH)) == 0) { print "<div style=\"float : left\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/wiki/SearchSyntax\">" . __("Search syntax") . "</a>\n\t\t\t\t</div>"; } print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t</div>"; }
function hook_prefs_tab($args) { if ($args != "prefFeeds") { return; } print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"" . __('Mark similar articles as read') . "\">"; if (DB_TYPE != "pgsql") { print_error("Database type not supported."); } $result = db_query("select 'similarity'::regproc"); if (db_num_rows($result) == 0) { print_error("pg_trgm extension not found."); } $similarity = $this->host->get($this, "similarity"); $min_title_length = $this->host->get($this, "min_title_length"); $enable_globally = $this->host->get($this, "enable_globally"); if (!$similarity) { $similarity = '0.75'; } if (!$min_title_length) { $min_title_length = '32'; } $enable_globally_checked = $enable_globally ? "checked" : ""; print "<form dojoType=\"dijit.form.Form\">"; print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">\n\t\t\tevt.preventDefault();\n\t\t\tif (this.validate()) {\n\t\t\t\tconsole.log(dojo.objectToQuery(this.getValues()));\n\t\t\t\tnew Ajax.Request('backend.php', {\n\t\t\t\t\tparameters: dojo.objectToQuery(this.getValues()),\n\t\t\t\t\tonComplete: function(transport) {\n\t\t\t\t\t\tnotify_info(transport.responseText);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t//this.reset();\n\t\t\t}\n\t\t\t</script>"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pluginhandler\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"save\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"plugin\" value=\"af_psql_trgm\">"; print_notice("PostgreSQL trigram extension returns string similarity as a floating point number (0-1). Setting it too low might produce false positives, zero disables checking."); print "<br/>"; print_notice("Enable the plugin for specific feeds in the feed editor."); print "<h3>" . __("Global settings") . "</h3>"; print "<table>"; print "<tr><td width=\"40%\">" . __("Minimum similarity:") . "</td>"; print "<td>\n\t\t\t<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\tplaceholder=\"0.75\"\n\t\t\trequired=\"1\" name=\"similarity\" value=\"{$similarity}\"></td></tr>"; print "<tr><td width=\"40%\">" . __("Minimum title length:") . "</td>"; print "<td>\n\t\t\t<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\tplaceholder=\"32\"\n\t\t\trequired=\"1\" name=\"min_title_length\" value=\"{$min_title_length}\"></td></tr>"; print "<tr><td width=\"40%\">" . __("Enable for all feeds:") . "</td>"; print "<td>\n\t\t\t<input dojoType=\"dijit.form.CheckBox\"\n\t\t\t{$enable_globally_checked} name=\"enable_globally\"></td></tr>"; print "</table>"; print "<p><button dojoType=\"dijit.form.Button\" type=\"submit\">" . __("Save") . "</button>"; print "</form>"; $enabled_feeds = $this->host->get($this, "enabled_feeds"); if (!array($enabled_feeds)) { $enabled_feeds = array(); } $enabled_feeds = $this->filter_unknown_feeds($enabled_feeds); $this->host->set($this, "enabled_feeds", $enabled_feeds); if (count($enabled_feeds) > 0) { print "<h3>" . __("Currently enabled for (click to edit):") . "</h3>"; print "<ul class=\"browseFeedList\" style=\"border-width : 1px\">"; foreach ($enabled_feeds as $f) { print "<li>" . "<img src='images/pub_set.png'\n\t\t\t\t\t\tstyle='vertical-align : middle'> <a href='#'\n\t\t\t\t\t\tonclick='editFeed({$f})'>" . getFeedTitle($f) . "</a></li>"; } print "</ul>"; } print "</div>"; }
private function getRuleName($rule) { if (!$rule) { $rule = json_decode($_REQUEST["rule"], true); } $feed_id = $rule["feed_id"]; if (strpos($feed_id, "CAT:") === 0) { $feed_id = (int) substr($feed_id, 4); $feed = getCategoryTitle($this->link, $feed_id); } else { $feed_id = (int) $feed_id; if ($rule["feed_id"]) { $feed = getFeedTitle($this->link, (int) $rule["feed_id"]); } else { $feed = __("All feeds"); } } $result = db_query($this->link, "SELECT description FROM ttrss_filter_types\n\t\t\tWHERE id = " . (int) $rule["filter_type"]); $match_on = db_fetch_result($result, 0, "description"); return T_sprintf("%s on %s in %s", $rule["reg_exp"], $match_on, $feed); }
<?php $fd = $facebook_data['data']; $arrLen = count($fd); for ($i = 0; $i < $arrLen; $i++) { print PHP_EOL . ' <entry>' . PHP_EOL; print ' <id>tag:facebook.com,' . date("Y-m-d", strtotime($fd[$i]['created_time'])) . ':/' . $fd[$i]['from']['name'] . '/statuses/' . $fd[$i]['id'] . '</id>' . PHP_EOL; if (isset($fd[$i]['link']) && $fd[$i]['type'] == 'photo') { print ' <link href="' . $fd[$i]['link'] . '" rel="alternate" type="text/html"/>' . PHP_EOL; } else { print ' <link href="http://facebook.com/' . $fd[$i]['id'] . '" rel="alternate" type="text/html"/>' . PHP_EOL; } print ' <title>' . getFeedTitle($fd[$i]) . '</title>' . PHP_EOL; -(print ' <summary type="html"><![CDATA[' . $fd[$i]['message'] . ']]></summary>' . PHP_EOL); $text = ' <content type="html"><![CDATA[<p>' . processString(nl2br($fd[$i]['message'] . ' ' . $fd[$i]['link'])) . '</p>' . (isset($fd[$i]['picture']) ? '<img src="' . $fd[$i]['picture'] . '"/>' : '') . ']]></content>'; print $text . PHP_EOL; print ' <pubdate>' . date('c', strtotime($fd[$i]['created_time'])) . '</pubdate>' . PHP_EOL; print ' <updated>' . date('c', strtotime($fd[$i]['updated_time'])) . '</updated>' . PHP_EOL; print ' <author><name>' . $fd[$i]['from']['name'] . '</name></author>' . PHP_EOL; print ' </entry>' . PHP_EOL; } print '</feed>' . PHP_EOL; print '<!-- vim:ft=xml -->'; function getFeedTitle($feed) { $title = ""; if (isset($feed['message'])) { appendStringToTitle($feed['message'], $title); } if (isset($feed['link']) && isset($feed['name'])) { appendStringToTitle($feed['name'], $title);
if (!$cat_id || $cat_id == -2) { $counters = getLabelCounters($link, true); foreach (array_keys($counters) as $id) { $unread = $counters[$id]["counter"]; if ($unread || !$unread_only) { $row = array("id" => $id, "title" => $counters[$id]["description"], "unread" => $counters[$id]["counter"], "cat_id" => -2); array_push($feeds, $row); } } } /* Virtual feeds */ if (!$cat_id || $cat_id == -1) { foreach (array(-1, -2, -3, -4, 0) as $i) { $unread = getFeedUnread($link, $i); if ($unread || !$unread_only) { $title = getFeedTitle($link, $i); $row = array("id" => $i, "title" => $title, "unread" => $unread, "cat_id" => -1); array_push($feeds, $row); } } } print json_encode($feeds); break; case "getCategories": $unread_only = (bool) db_escape_string($_REQUEST["unread_only"]); $result = db_query($link, "SELECT \n\t\t\t\t\tid, title FROM ttrss_feed_categories \n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"]); $cats = array(); while ($line = db_fetch_assoc($result)) { $unread = getFeedUnread($link, $line["id"], true); if ($unread || !$unread_only) { array_push($cats, array("id" => $line["id"], "title" => $line["title"], "unread" => $unread));
function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0) { if (!$owner_uid) { $owner_uid = $_SESSION["uid"]; } if ($search) { $search_query_part = getSearchSql($search, $match_on); $search_query_part .= " AND "; } else { $search_query_part = ""; } $view_query_part = ""; if ($view_mode == "adaptive" || $view_query_part == "noscores") { if ($search) { $view_query_part = " "; } else { if ($feed != -1) { $unread = getFeedUnread($link, $feed, $cat_view); if ($unread > 0) { $view_query_part = " unread = true AND "; } } } } if ($view_mode == "marked") { $view_query_part = " marked = true AND "; } if ($view_mode == "unread") { $view_query_part = " unread = true AND "; } if ($view_mode == "updated") { $view_query_part = " (last_read is null and unread = false) AND "; } if ($limit > 0) { $limit_query_part = "LIMIT " . $limit; } $vfeed_query_part = ""; // override query strategy and enable feed display when searching globally if ($search && $search_mode == "all_feeds") { $query_strategy_part = "ttrss_entries.id > 0"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; /* tags */ } else { if (preg_match("/^-?[0-9][0-9]*\$/", $feed) == false) { $query_strategy_part = "ttrss_entries.id > 0"; $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n\t\t\t\t\tid = feed_id) as feed_title,"; } else { if ($feed > 0 && $search && $search_mode == "this_cat") { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $tmp_result = false; if ($cat_view) { $tmp_result = db_query($link, "SELECT id \n\t\t\t\t\t\tFROM ttrss_feeds WHERE cat_id = '{$feed}'"); } else { $tmp_result = db_query($link, "SELECT id\n\t\t\t\t\t\tFROM ttrss_feeds WHERE cat_id = (SELECT cat_id FROM ttrss_feeds \n\t\t\t\t\t\t\tWHERE id = '{$feed}') AND id != '{$feed}'"); } $cat_siblings = array(); if (db_num_rows($tmp_result) > 0) { while ($p = db_fetch_assoc($tmp_result)) { array_push($cat_siblings, "feed_id = " . $p["id"]); } $query_strategy_part = sprintf("(feed_id = %d OR %s)", $feed, implode(" OR ", $cat_siblings)); } else { $query_strategy_part = "ttrss_entries.id > 0"; } } else { if ($feed > 0) { if ($cat_view) { if ($feed > 0) { $query_strategy_part = "cat_id = '{$feed}'"; } else { $query_strategy_part = "cat_id IS NULL"; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { $tmp_result = db_query($link, "SELECT id \n\t\t\t\t\t\tFROM ttrss_feeds WHERE parent_feed = '{$feed}'\n\t\t\t\t\t\tORDER BY cat_id,title"); $parent_ids = array(); if (db_num_rows($tmp_result) > 0) { while ($p = db_fetch_assoc($tmp_result)) { array_push($parent_ids, "feed_id = " . $p["id"]); } $query_strategy_part = sprintf("(feed_id = %d OR %s)", $feed, implode(" OR ", $parent_ids)); $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { $query_strategy_part = "feed_id = '{$feed}'"; } } } else { if ($feed == 0) { // starred virtual feed $query_strategy_part = "feed_id IS NULL"; } else { if ($feed == -1) { // starred virtual feed $query_strategy_part = "marked = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -2) { // published virtual feed OR labels category if (!$cat_view) { $query_strategy_part = "published = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; } } else { if ($feed == -3) { // fresh virtual feed $query_strategy_part = "unread = true"; $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE", $owner_uid); if (DB_TYPE == "pgsql") { $query_strategy_part .= " AND updated > NOW() - INTERVAL '{$intl} hour' "; } else { $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) "; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -4) { // all articles virtual feed $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed <= -10) { // labels $label_id = -$feed - 11; $query_strategy_part = "label_id = '{$label_id}' AND\n\t\t\t\t\tttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; } else { $query_strategy_part = "id > 0"; // dumb } } } } } } } } } } if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) { $order_by = "updated"; } else { $order_by = "updated DESC"; } if ($view_mode != "noscores") { $order_by = "score DESC, {$order_by}"; } if ($override_order) { $order_by = $override_order; } $feed_title = ""; if ($search) { $feed_title = "Search results"; } else { if ($cat_view) { $feed_title = getCategoryTitle($link, $feed); } else { if ((int) $feed == $feed && $feed > 0) { $result = db_query($link, "SELECT title,site_url,last_error \n\t\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}"); $feed_title = db_fetch_result($result, 0, "title"); $feed_site_url = db_fetch_result($result, 0, "site_url"); $last_error = db_fetch_result($result, 0, "last_error"); } else { $feed_title = getFeedTitle($link, $feed); } } } $content_query_part = "content as content_preview,"; if (preg_match("/^-?[0-9][0-9]*\$/", $feed) != false) { if ($feed >= 0) { $feed_kind = "Feeds"; } else { $feed_kind = "Labels"; } if ($limit_query_part) { $offset_query_part = "OFFSET {$offset}"; } if ($vfeed_query_part && get_pref($link, 'VFEED_GROUP_BY_FEED', $owner_uid)) { if (!$override_order) { $order_by = "ttrss_feeds.title, {$order_by}"; } } if ($feed != "0") { $from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds{$ext_tables_part}"; $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND"; } else { $from_qpart = "ttrss_entries,ttrss_user_entries{$ext_tables_part}\n\t\t\t\t\t\tLEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)"; } $query = "SELECT DISTINCT \n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tttrss_entries.id,ttrss_entries.title,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tunread,feed_id,marked,published,link,last_read,orig_feed_id,\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms,\n\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms,\n\t\t\t\t\t\tauthor,score\n\t\t\t\t\tFROM\n\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\tWHERE\n\t\t\t\t\t{$group_limit_part}\n\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\tttrss_user_entries.ref_id = ttrss_entries.id AND\n\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part} {$offset_query_part}"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($link, $query); } else { // browsing by tag $feed_kind = "Tags"; $result = db_query($link, "SELECT\n\t\t\t\t\tguid,\n\t\t\t\t\tnote,\n\t\t\t\t\tttrss_entries.id as id,title,\n\t\t\t\t\tupdated,\n\t\t\t\t\tunread,feed_id,orig_feed_id,\n\t\t\t\t\tmarked,link,last_read,\t\t\t\t\n\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms,\n\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms,\n\t\t\t\t\tscore\n\t\t\t\t\tFROM\n\t\t\t\t\t\tttrss_entries,ttrss_user_entries,ttrss_tags\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tref_id = ttrss_entries.id AND \n\t\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t\tpost_int_id = int_id AND tag_name = '{$feed}' AND\n\t\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part}"); } return array($result, $feed_title, $feed_site_url, $last_error); }
function render_search_form($link, $active_feed_id = false, $is_cat = false) { print "<div id=\"heading\">"; print __("Search") . " <span id=\"headingAddon\">\n\t\t\t\t(<a href=\"index.php\">" . __("Go back") . "</a>)</span></div>"; print "<form method=\"GET\" action=\"index.php\" class=\"searchForm\">"; print "<input type=\"hidden\" name=\"go\" value=\"vf\">"; print "<input type=\"hidden\" name=\"id\" value=\"{$active_feed_id}\">"; print "<input type=\"hidden\" name=\"cat\" value=\"{$is_cat}\">"; print "<table><tr><td>" . __('Search:') . "</td><td>"; print "<input name=\"query\"></td></tr>"; print "<tr><td>" . __('Where:') . "</td><td>"; print "<select name=\"search_mode\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>"; $feed_title = getFeedTitle($link, $active_feed_id); if (!$is_cat) { $feed_cat_title = getFeedCatTitle($link, $active_feed_id); } else { $feed_cat_title = getCategoryTitle($link, $active_feed_id); } if ($active_feed_id && !$is_cat) { print "<option selected value=\"this_feed\">{$feed_title}</option>"; } else { print "<option disabled>" . __('This feed') . "</option>"; } if ($is_cat) { $cat_preselected = "selected"; } if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) { print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>"; } else { //print "<option disabled>".__('This category')."</option>"; } print "</select></td></tr>"; print "<tr><td>" . __('Match on:') . "</td><td>"; $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content")); print_select_hash("match_on", 3, $search_fields); print "</td></tr></table>"; print "<input type=\"submit\" value=\"" . __('Search') . "\">"; print "</form>"; print "</div>"; }
function render_article($link, $id, $feed_id, $cat_id) { $query = "SELECT title,link,content,feed_id,comments,int_id,\n\t\t\tmarked,unread,published,\n\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\tauthor\n\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\tWHERE\tid = '{$id}' AND ref_id = id AND owner_uid = " . $_SESSION["uid"]; $result = db_query($link, $query); if (db_num_rows($result) != 0) { $line = db_fetch_assoc($result); $tmp_result = db_query($link, "UPDATE ttrss_user_entries \n\t\t\t\tSET unread = false,last_read = NOW() \n\t\t\t\tWHERE ref_id = '{$id}'\n\t\t\t\tAND owner_uid = " . $_SESSION["uid"]); if (get_pref($link, 'HEADLINES_SMART_DATE')) { $updated_fmt = smart_date_time(strtotime($line["updated"])); } else { $short_date = get_pref($link, 'SHORT_DATE_FORMAT'); $updated_fmt = date($short_date, strtotime($line["updated"])); } $title = $line["title"]; $article_link = $line["link"]; $feed_title = getFeedTitle($link, $feed_id, false); print "<div class=\"panel\" id=\"article-{$id}\" title=\"{$title}\" \n\t\t\t\tselected=\"true\"\n\t\t\t\tmyBackLabel='{$feed_title}' myBackHref='feed.php?id={$feed_id}&cat={$cat_id}'>"; print "<h2><a target='_blank' href='{$article_link}'>{$title}</a></h2>"; print "<fieldset>"; /* print "<div class=\"row\">"; print "<label id='title'><a target='_blank' href='$article_link'>$title</a></label>"; print "</div>"; */ $is_starred = sql_bool_to_bool($line["marked"]) ? "true" : "false"; $is_published = sql_bool_to_bool($line["published"]) ? "true" : "false"; print "<div class=\"row\">"; print "<label id='updated'>Updated:</label>"; print "<input enabled='false' name='updated' disabled value='{$updated_fmt}'/>"; print "</div>"; print "</fieldset>"; $content = sanitize_rss($link, $line["content"]); $content = preg_replace("/href=/i", "target=\"_blank\" href=", $content); if (!mobile_get_pref($link, "SHOW_IMAGES")) { $content = preg_replace('/<img[^>]+>/is', '', $content); } print "<p>{$content}</p>"; print "<fieldset>"; print "<div class=\"row\">\n\t <label>Starred</label>\n\t <div class=\"toggle\" onclick=\"toggleMarked({$id}, this)\" toggled=\"{$is_starred}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t </div>"; print "<div class=\"row\">\n\t <label>Published</label>\n\t <div class=\"toggle\" onclick=\"togglePublished({$id}, this)\" toggled=\"{$is_published}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t </div>"; print "</fieldset>"; print "</div>"; } }
function queryFeedHeadlines($params) { $feed = $params["feed"]; $limit = isset($params["limit"]) ? $params["limit"] : 30; $view_mode = $params["view_mode"]; $cat_view = isset($params["cat_view"]) ? $params["cat_view"] : false; $search = isset($params["search"]) ? $params["search"] : false; $search_language = isset($params["search_language"]) ? $params["search_language"] : ""; $override_order = isset($params["override_order"]) ? $params["override_order"] : false; $offset = isset($params["offset"]) ? $params["offset"] : 0; $owner_uid = isset($params["owner_uid"]) ? $params["owner_uid"] : $_SESSION["uid"]; $since_id = isset($params["since_id"]) ? $params["since_id"] : 0; $include_children = isset($params["include_children"]) ? $params["include_children"] : false; $ignore_vfeed_group = isset($params["ignore_vfeed_group"]) ? $params["ignore_vfeed_group"] : false; $override_strategy = isset($params["override_strategy"]) ? $params["override_strategy"] : false; $override_vfeed = isset($params["override_vfeed"]) ? $params["override_vfeed"] : false; $start_ts = isset($params["start_ts"]) ? $params["start_ts"] : false; $check_first_id = isset($params["check_first_id"]) ? $params["check_first_id"] : false; $api_request = isset($params["api_request"]) ? $params["api_request"] : false; $ext_tables_part = ""; $query_strategy_part = ""; $search_words = array(); if ($search) { foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH) as $plugin) { list($search_query_part, $search_words) = $plugin->hook_search($search); break; } // fall back in case of no plugins if (!$search_query_part) { list($search_query_part, $search_words) = search_to_sql($search, $search_language); } $search_query_part .= " AND "; } else { $search_query_part = ""; } if ($since_id) { $since_id_part = "ttrss_entries.id > {$since_id} AND "; } else { $since_id_part = ""; } $view_query_part = ""; $disable_offsets = false; if ($view_mode == "adaptive") { if ($search) { $view_query_part = " "; } else { if ($feed != -1) { $unread = getFeedUnread($feed, $cat_view); if ($cat_view && $feed > 0 && $include_children) { $unread += getCategoryChildrenUnread($feed); } if ($unread > 0) { $view_query_part = " unread = true AND "; $disable_offsets = !$api_request && get_pref("CDM_AUTO_CATCHUP") && get_pref("CDM_EXPANDED"); } } } } if ($view_mode == "marked") { $view_query_part = " marked = true AND "; } if ($view_mode == "has_note") { $view_query_part = " (note IS NOT NULL AND note != '') AND "; } if ($view_mode == "published") { $view_query_part = " published = true AND "; } if ($view_mode == "unread" && $feed != -6) { $view_query_part = " unread = true AND "; $disable_offsets = !$api_request && get_pref("CDM_AUTO_CATCHUP") && get_pref("CDM_EXPANDED"); } if ($limit > 0) { $limit_query_part = "LIMIT " . $limit; } $allow_archived = false; $vfeed_query_part = ""; /* tags */ if (!is_numeric($feed)) { $query_strategy_part = "true"; $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n\t\t\t\t\tid = feed_id) as feed_title,"; } else { if ($feed > 0) { if ($cat_view) { if ($feed > 0) { if ($include_children) { # sub-cats $subcats = getChildCategories($feed, $owner_uid); array_push($subcats, $feed); $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")"; } else { $query_strategy_part = "cat_id = '{$feed}'"; } } else { $query_strategy_part = "cat_id IS NULL"; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { $query_strategy_part = "feed_id = '{$feed}'"; } } else { if ($feed == 0 && !$cat_view) { // archive virtual feed $query_strategy_part = "feed_id IS NULL"; $allow_archived = true; } else { if ($feed == 0 && $cat_view) { // uncategorized $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -1) { // starred virtual feed $query_strategy_part = "marked = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_marked DESC, date_entered DESC, updated DESC"; } } else { if ($feed == -2) { // published virtual feed OR labels category if (!$cat_view) { $query_strategy_part = "published = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_published DESC, date_entered DESC, updated DESC"; } } else { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = "ttrss_labels2,ttrss_user_labels2,"; $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; } } else { if ($feed == -6) { // recently read $query_strategy_part = "unread = false AND last_read IS NOT NULL"; if (DB_TYPE == "pgsql") { $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '1 DAY' "; } else { $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL 1 DAY) "; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; $ignore_vfeed_group = true; if (!$override_order) { $override_order = "last_read DESC"; } } else { if ($feed == -3) { // fresh virtual feed $query_strategy_part = "unread = true AND score >= 0"; $intl = get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid); if (DB_TYPE == "pgsql") { $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '{$intl} hour' "; } else { $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) "; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed == -4) { // all articles virtual feed $allow_archived = true; $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } else { if ($feed <= LABEL_BASE_INDEX) { // labels $label_id = feed_to_label_id($feed); $query_strategy_part = "label_id = '{$label_id}' AND\n\t\t\t\t\tttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\tttrss_user_labels2.article_id = ref_id"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = "ttrss_labels2,ttrss_user_labels2,"; $allow_archived = true; } else { $query_strategy_part = "true"; } } } } } } } } } } $order_by = "score DESC, date_entered DESC, updated DESC"; if ($override_order) { $order_by = $override_order; } if ($override_strategy) { $query_strategy_part = $override_strategy; } if ($override_vfeed) { $vfeed_query_part = $override_vfeed; } $feed_title = ""; if ($search) { $feed_title = T_sprintf("Search results: %s", $search); } else { if ($cat_view) { $feed_title = getCategoryTitle($feed); } else { if (is_numeric($feed) && $feed > 0) { $result = db_query("SELECT title,site_url,last_error,last_updated\n\t\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}"); $feed_title = db_fetch_result($result, 0, "title"); $feed_site_url = db_fetch_result($result, 0, "site_url"); $last_error = db_fetch_result($result, 0, "last_error"); $last_updated = db_fetch_result($result, 0, "last_updated"); } else { $feed_title = getFeedTitle($feed); } } } $content_query_part = "content, "; if ($limit_query_part) { $offset_query_part = "OFFSET {$offset}"; } else { $offset_query_part = ""; } if (is_numeric($feed)) { // proper override_order applied above if ($vfeed_query_part && !$ignore_vfeed_group && get_pref('VFEED_GROUP_BY_FEED', $owner_uid)) { if (!$override_order) { $order_by = "ttrss_feeds.title, {$order_by}"; } else { $order_by = "ttrss_feeds.title, {$override_order}"; } } if (!$allow_archived) { $from_qpart = "{$ext_tables_part}ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id),ttrss_feeds"; $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND"; } else { $from_qpart = "{$ext_tables_part}ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id)\n\t\t\t\t\t\tLEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)"; } if ($vfeed_query_part) { $vfeed_query_part .= "favicon_avg_color,"; } if ($start_ts) { $start_ts_formatted = date("Y/m/d H:i:s", strtotime($start_ts)); $start_ts_query_part = "date_entered >= '{$start_ts_formatted}' AND"; } else { $start_ts_query_part = ""; } $first_id = 0; $first_id_query_strategy_part = $query_strategy_part; if ($feed == -3) { $first_id_query_strategy_part = "true"; } if (DB_TYPE == "pgsql") { $sanity_interval_qpart = "date_entered >= NOW() - INTERVAL '1 hour' AND"; } else { $sanity_interval_qpart = "date_entered >= DATE_SUB(NOW(), INTERVAL 1 hour) AND"; } if (!$search && !$disable_offsets) { // if previous topmost article id changed that means our current pagination is no longer valid $query = "SELECT DISTINCT\n\t\t\t\t\t\t\tttrss_feeds.title,\n\t\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\t\tguid,\n\t\t\t\t\t\t\tttrss_entries.id,\n\t\t\t\t\t\t\tttrss_entries.title,\n\t\t\t\t\t\t\tupdated,\n\t\t\t\t\t\t\tscore,\n\t\t\t\t\t\t\tmarked,\n\t\t\t\t\t\t\tpublished,\n\t\t\t\t\t\t\tlast_marked,\n\t\t\t\t\t\t\tlast_published,\n\t\t\t\t\t\t\tlast_read\n\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t\t{$start_ts_query_part}\n\t\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t\t{$sanity_interval_qpart}\n\t\t\t\t\t\t{$first_id_query_strategy_part} ORDER BY {$order_by} LIMIT 1"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($query); if ($result && db_num_rows($result) > 0) { $first_id = (int) db_fetch_result($result, 0, "id"); if ($offset > 0 && $first_id && $check_first_id && $first_id != $check_first_id) { return array(-1, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id); } } } if ($disable_offsets) { $offset_query_part = ""; } $query = "SELECT DISTINCT\n\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tttrss_entries.id,ttrss_entries.title,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\talways_display_enclosures,\n\t\t\t\t\t\tsite_url,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\tcomments,\n\t\t\t\t\t\tint_id,\n\t\t\t\t\t\tuuid,\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\thide_images,\n\t\t\t\t\t\tunread,feed_id,marked,published,link,last_read,orig_feed_id,\n\t\t\t\t\t\tlast_marked, last_published,\n\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\tauthor,score\n\t\t\t\t\tFROM\n\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\tWHERE\n\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t{$start_ts_query_part}\n\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part} {$offset_query_part}"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($query); } else { // browsing by tag $query = "SELECT DISTINCT\n\t\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\t\tguid,\n\t\t\t\t\t\t\tnote,\n\t\t\t\t\t\t\tttrss_entries.id as id,\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tupdated,\n\t\t\t\t\t\t\tunread,\n\t\t\t\t\t\t\tfeed_id,\n\t\t\t\t\t\t\torig_feed_id,\n\t\t\t\t\t\t\tmarked,\n\t\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\t\tcomments,\n\t\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\t\tlink,\n\t\t\t\t\t\t\tlang,\n\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\tlast_read,\n\t\t\t\t\t\t\t(SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images,\n\t\t\t\t\t\t\tlast_marked, last_published,\n\t\t\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\t\tauthor, score\n\t\t\t\t\t\tFROM ttrss_entries, ttrss_user_entries, ttrss_tags\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\tref_id = ttrss_entries.id AND\n\t\t\t\t\t\t\tttrss_user_entries.owner_uid = {$owner_uid} AND\n\t\t\t\t\t\t\tpost_int_id = int_id AND\n\t\t\t\t\t\t\ttag_name = '{$feed}' AND\n\t\t\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t\t\t{$limit_query_part} {$offset_query_part}"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($query); } return array($result, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id); }
function update_debugger() { header("Content-type: text/html"); $feed_id = (int) $_REQUEST["feed_id"]; @($do_update = $_REQUEST["action"] == "do_update"); $csrf_token = $_REQUEST["csrf_token"]; $refetch_checked = isset($_REQUEST["force_refetch"]) ? "checked" : ""; $rehash_checked = isset($_REQUEST["force_rehash"]) ? "checked" : ""; ?> <html> <head> <link rel="stylesheet" type="text/css" href="css/utility.css"> <title>Feed Debugger</title> </head> <body class="small_margins"> <h1>Feed Debugger: <?php echo "{$feed_id}: " . getFeedTitle($feed_id); ?> </h1> <form method="GET" action=""> <input type="hidden" name="op" value="feeds"> <input type="hidden" name="method" value="update_debugger"> <input type="hidden" name="xdebug" value="1"> <input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?> "> <input type="hidden" name="action" value="do_update"> <input type="hidden" name="feed_id" value="<?php echo $feed_id; ?> "> <input type="checkbox" name="force_refetch" value="1" <?php echo $refetch_checked; ?> > Force refetch<br/> <input type="checkbox" name="force_rehash" value="1" <?php echo $rehash_checked; ?> > Force rehash<br/> <p/><button type="submit">Continue</button> </form> <hr> <pre><?php if ($do_update) { include "rssfuncs.php"; update_rss_feed($feed_id, true, true); } ?> </pre> </body> </html> <?php }
function render_article($link, $id, $feed_id, $cat_id, $is_cat) { $query = "SELECT title,link,content,feed_id,comments,int_id,\n\t\t\tmarked,unread,published,\n\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\tauthor\n\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\tWHERE\tid = '{$id}' AND ref_id = id AND owner_uid = " . $_SESSION["uid"]; $result = db_query($link, $query); if (db_num_rows($result) != 0) { $line = db_fetch_assoc($result); $tmp_result = db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\tWHERE ref_id = '{$id}'\n\t\t\t\tAND owner_uid = " . $_SESSION["uid"]); $updated_fmt = make_local_datetime($link, $line['updated'], false); $title = $line["title"]; $article_link = $line["link"]; if (!$is_cat) { $feed_title = getFeedTitle($link, $feed_id); } else { $feed_title = getCategoryTitle($link, $feed_id); } print "<div class=\"panel\" id=\"article-{$id}\" title=\"{$title}\"\n\t\t\t\tselected=\"true\"\n\t\t\t\tmyBackLabel='{$feed_title}' myBackHref='feed.php?id={$feed_id}&cat={$cat_id}&is_cat={$is_cat}'>"; if ($line['feed_id'] != $feed_id) { $real_feed_title = getFeedTitle($link, $line['feed_id']); $real_feed_id = $line['feed_id']; $feed_link = "(<a href=\"feed.php?id={$real_feed_id}\">{$real_feed_title}</a>)"; } // print "<fieldset>"; print "<div style='float : right'>({$updated_fmt})</div>"; print "<h2><a target='_blank' href='{$article_link}'>{$title}</a> {$feed_link}</h2>"; print "<hr>"; /* print "<div class=\"row\">"; print "<label id='title'><a target='_blank' href='$article_link'>$title</a></label>"; print "</div>"; */ $is_starred = sql_bool_to_bool($line["marked"]) ? "true" : "false"; $is_published = sql_bool_to_bool($line["published"]) ? "true" : "false"; //print "<div class=\"row\">"; //print "<label id='updated'>Updated:</label>"; //print "<input type='text' enabled='false' name='updated' disabled value='$updated_fmt'/>"; //print "</div>"; // print "</fieldset>"; $content = sanitize($link, $line["content"]); $content = preg_replace("/href=/i", "target=\"_blank\" href=", $content); if (!mobile_get_pref($link, "SHOW_IMAGES")) { $content = preg_replace('/<img[^>]+>/is', '', $content); } print "<p>{$content}</p>"; print "<div class='nav'>\n <label>Navigation</label>\n <div class='button left' onclick='goPrev({$id}, {$feed_id}, this)'>Prev</div>\n <div class='button right' onclick='goNext({$id}, {$feed_id}, this)'>Next</div>\n </div>"; print "<fieldset>"; print "<div class=\"row\">\n\t <label>Starred</label>\n\t <div class=\"toggle\" onclick=\"toggleMarked({$id}, this)\" toggled=\"{$is_starred}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t </div>"; print "<div class=\"row\">\n\t <label>Published</label>\n\t <div class=\"toggle\" onclick=\"togglePublished({$id}, this)\" toggled=\"{$is_published}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t </div>"; print "<div class=\"row\">\n\t <label>Unread</label>\n\t <div class=\"toggle\" onclick=\"toggleUnread({$id}, this)\" toggled=\"{$is_unread}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t </div>"; print "</fieldset>"; print "</div>"; } }
function module_popup_dialog($link) { $id = $_REQUEST["id"]; $param = db_escape_string($_REQUEST["param"]); if ($id == "importOpml") { print "<div id=\"infoBoxTitle\">" . __('OPML Import') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<div class=\"prefFeedCatHolder\">"; $owner_uid = $_SESSION["uid"]; db_query($link, "BEGIN"); /* create Imported feeds category just in case */ $result = db_query($link, "SELECT id FROM\n\t\t\t\tttrss_feed_categories WHERE title = 'Imported feeds' AND\n\t\t\t\towner_uid = '{$owner_uid}' LIMIT 1"); if (db_num_rows($result) == 0) { db_query($link, "INSERT INTO ttrss_feed_categories\n\t\t\t\t\t(title,owner_uid) \n\t\t\t\t\t\tVALUES ('Imported feeds', '{$owner_uid}')"); } db_query($link, "COMMIT"); /* Handle OPML import by DOMXML/DOMDocument */ if (function_exists('domxml_open_file')) { print "<ul class='nomarks'>"; print "<li>" . __("Importing using DOMXML.") . "</li>"; require_once "modules/opml_domxml.php"; opml_import_domxml($link, $owner_uid); print "</ul>"; } else { if (PHP_VERSION >= 5) { print "<ul class='nomarks'>"; print "<li>" . __("Importing using DOMDocument.") . "</li>"; require_once "modules/opml_domdoc.php"; opml_import_domdoc($link, $owner_uid); print "</ul>"; } else { print_error(__("DOMXML extension is not found. It is required for PHP versions below 5.")); } } print "</div>"; print "<div align='center'>"; print "<button onclick=\"return opmlImportDone()\">" . __('Close this window') . "</button>"; print "</div>"; print "<script type=\"text/javascript\">"; print "parent.opmlImportHandler(this)"; print "</script>"; print "</div></div>"; return; } if ($id == "editPrefProfiles") { print "<div id=\"infoBoxTitle\">" . __('Settings Profiles') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<div><input id=\"fadd_profile\" \n\t\t\t\t\tonkeypress=\"return filterCR(event, addPrefProfile)\"\n\t\t\t\t\tsize=\"40\">\n\t\t\t\t\t<button onclick=\"javascript:addPrefProfile()\">" . __('Create profile') . "</button></div>"; print "<p>"; $result = db_query($link, "SELECT title,id FROM ttrss_settings_profiles\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title"); print __('Select:') . " \n\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', true)\">" . __('All') . "</a>,\n\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', false)\">" . __('None') . "</a>"; print "<div class=\"prefFeedCatHolder\">"; print "<form id=\"profile_edit_form\" onsubmit=\"return false\">"; print "<table width=\"100%\" class=\"prefFeedCatList\" \n\t\t\t\tcellspacing=\"0\" id=\"prefFeedCatList\">"; print "<tr class=\"odd\" id=\"FCATR-0\">"; print "<td width='5%' align='center'><input \n\t\t\t\tonclick='toggleSelectPrefRow(this, \"fcat\");' \n\t\t\t\ttype=\"checkbox\" id=\"FCCHK-0\"></td>"; if (!$_SESSION["profile"]) { $is_active = __("(active)"); } else { $is_active = ""; } print "<td><span id=\"FCATT-0\">" . __("Default profile") . " {$is_active}</span></td>"; print "</tr>"; $lnum = 1; while ($line = db_fetch_assoc($result)) { $class = $lnum % 2 ? "even" : "odd"; $cat_id = $line["id"]; $this_row_id = "id=\"FCATR-{$cat_id}\""; print "<tr class=\"{$class}\" {$this_row_id}>"; $edit_title = htmlspecialchars($line["title"]); print "<td width='5%' align='center'><input \n\t\t\t\t\tonclick='toggleSelectPrefRow(this, \"fcat\");' \n\t\t\t\t\ttype=\"checkbox\" id=\"FCCHK-{$cat_id}\"></td>"; if ($_SESSION["profile"] == $line["id"]) { $is_active = __("(active)"); } else { $is_active = ""; } print "<td><span id=\"FCATT-{$cat_id}\">" . $edit_title . "</span> {$is_active}</td>"; print "</tr>"; ++$lnum; } print "</table>"; print "</form>"; print "</div>"; print "<div class='dlgButtons'>\n\t\t\t\t<div style='float : left'>\n\t\t\t\t<button onclick=\"return removeSelectedPrefProfiles()\">" . __('Remove') . "</button>\n\t\t\t\t<button onclick=\"return activatePrefProfile()\">" . __('Activate') . "</button>\n\t\t\t\t</div>"; print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div></div>"; return; } if ($id == "pubUrl") { print "<div id=\"infoBoxTitle\">" . __('Published Articles') . "</div>"; print "<div class=\"infoBoxContents\">"; $url_path = article_publish_url($link); print __("Your Published articles feed URL is:"); print "<div class=\"tagCloudContainer\">"; print "<a id='pub_feed_url' href='{$url_path}' target='_blank'>{$url_path}</a>"; print "</div>"; print "<div align='center'>"; print "<button onclick=\"return pubRegenKey()\">" . __('Generate new URL') . "</button> "; print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">"; print "</div></div>"; return; } if ($id == "pubOPMLUrl") { print "<div id=\"infoBoxTitle\">" . __('Public OPML URL') . "</div>"; print "<div class=\"infoBoxContents\">"; $url_path = opml_publish_url($link); print __("Your Public OPML URL is:"); print "<div class=\"tagCloudContainer\">"; print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>"; print "</div>"; print "<div align='center'>"; print "<button onclick=\"return opmlRegenKey()\">" . __('Generate new URL') . "</button> "; print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">"; print "</div></div>"; return; } if ($id == "explainError") { print "<div id=\"infoBoxTitle\">" . __('Notice') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<div class=\"errorExplained\">"; if ($param == 1) { print __("Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner."); $stamp = (int) read_stampfile("update_daemon.stamp"); print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp); } if ($param == 2) { $msg = check_for_update($link); if (!$msg) { print __("You are running the latest version of Tiny Tiny RSS. The fact that you are seeing this dialog is probably a bug."); } else { print $msg; } } if ($param == 3) { print __("Update daemon is taking too long to perform a feed update. This could indicate a problem like crash or a hang. Please check the daemon process or contact instance owner."); $stamp = (int) read_stampfile("update_daemon.stamp"); print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp); } print "</div>"; print "<div align='center'>"; print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">"; print "</div></div>"; return; } if ($id == "quickAddFeed") { print "<div id=\"infoBoxTitle\">" . __('Subscribe to Feed') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<form id='feed_add_form' onsubmit='return false'>"; print "<input type=\"hidden\" name=\"op\" value=\"rpc\">"; print "<input type=\"hidden\" name=\"subop\" value=\"addfeed\">"; //print "<input type=\"hidden\" name=\"from\" value=\"tt-rss\">"; print "<div class=\"dlgSec\">" . __("Feed") . "</div>"; print "<div class=\"dlgSecCont\">"; print __("URL:") . " "; print "<input size=\"40\"\n\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\"\n\t\t\t\t\tname=\"feed\" id=\"feed_url\"></td></tr>"; print "<br/>"; if (get_pref($link, 'ENABLE_FEED_CATS')) { print __('Place in category:') . " "; print_feed_cat_select($link, "cat"); } print "</div>"; print "<div id='fadd_login_container' style='display:none'>\n\t\n\t\t\t\t\t<div class=\"dlgSec\">" . __("Authentication") . "</div>\n\t\t\t\t\t<div class=\"dlgSecCont\">" . __('Login:'******'login' size=\"20\" \n\t\t\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\"> " . __('Password:'******'password'\n\t\t\t\t\t\t\tname='pass' size=\"20\" \n\t\t\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\">\n\t\t\t\t</div></div>"; print "<div style=\"clear : both\">\t\t\t\t\n\t\t\t\t<input type=\"checkbox\" id=\"fadd_login_check\" \n\t\t\t\t\t\tonclick='checkboxToggleElement(this, \"fadd_login_container\")'>\n\t\t\t\t\t<label for=\"fadd_login_check\">" . __('This feed requires authentication.') . "</div>"; print "</form>"; print "<div class=\"dlgButtons\">\n\t\t\t\t<button class=\"button\" id=\"fadd_submit_btn\"\n\t\t\t\t\tonclick=\"return subscribeToFeed()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button onclick=\"return displayDlg('feedBrowser')\">" . __('More feeds') . "</button>\n\t\t\t\t<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button></div>"; return; } if ($id == "feedBrowser") { print "<div id=\"infoBoxTitle\">" . __('Feed Browser') . "</div>"; print "<div class=\"infoBoxContents\">"; $browser_search = db_escape_string($_REQUEST["search"]); print "<form onsubmit='return false;' display='inline' \n\t\t\t\tname='feed_browser' id='feed_browser'>"; print "<input type=\"hidden\" name=\"op\" value=\"rpc\">"; print "<input type=\"hidden\" name=\"subop\" value=\"updateFeedBrowser\">"; print "\n\t\t\t\t<div style='float : right'>\n\t\t\t\t<img style='display : none' \n\t\t\t\t\tid='feed_browser_spinner' src='" . theme_image($link, 'images/indicator_white.gif') . "'>\n\t\t\t\t<input name=\"search\" size=\"20\" type=\"search\"\n\t\t\t\t\tonchange=\"javascript:updateFeedBrowser()\" value=\"{$browser_search}\">\n\t\t\t\t<button onclick=\"javascript:updateFeedBrowser()\">" . __('Search') . "</button>\n\t\t\t</div>"; print " <select name=\"mode\" onchange=\"updateFeedBrowser()\">\n\t\t\t\t<option value='1'>" . __('Popular feeds') . "</option>\n\t\t\t\t<option value='2'>" . __('Feed archive') . "</option>\n\t\t\t\t</select> "; print __("limit:"); print " <select name=\"limit\" onchange='updateFeedBrowser()'>"; foreach (array(25, 50, 100, 200) as $l) { $issel = $l == $limit ? "selected" : ""; print "<option {$issel}>{$l}</option>"; } print "</select> "; print "<p>"; $owner_uid = $_SESSION["uid"]; /* print __('Select:')." <a href=\"javascript:selectPrefRows('fbrowse', true)\">".__('All')."</a>, <a href=\"javascript:selectPrefRows('fbrowse', false)\">".__('None')."</a>"; */ print "<ul class='browseFeedList' id='browseFeedList'>"; print_feed_browser($link, $search, 25); print "</ul>"; print "<div align='center'>\n\t\t\t\t<button onclick=\"feedBrowserSubscribe()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button style='display : none' id='feed_archive_remove' onclick=\"feedArchiveRemove()\">" . __('Remove') . "</button>\n\t\t\t\t<button onclick=\"closeInfoBox()\" >" . __('Cancel') . "</button></div>"; print "</div>"; return; } if ($id == "search") { print "<div id=\"infoBoxTitle\">" . __('Search') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<form id='search_form' onsubmit='return false'>"; #$active_feed_id = db_escape_string($_REQUEST["param"]); $params = split(":", db_escape_string($_REQUEST["param"])); $active_feed_id = sprintf("%d", $params[0]); $is_cat = $params[1] == "true"; print "<div class=\"dlgSec\">" . __('Look for') . "</div>"; print "<div class=\"dlgSecCont\">"; print "<input onkeypress=\"return filterCR(event, search)\"\n\t\t\t\tname=\"query\" size=\"20\" type=\"search\"\tvalue=''>"; print " " . __('match on') . " "; $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content")); print_select_hash("match_on", 3, $search_fields); print "<br/>" . __('Limit search to:') . " "; print "<select name=\"search_mode\">\n\t\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>"; $feed_title = getFeedTitle($link, $active_feed_id); if (!$is_cat) { $feed_cat_title = getFeedCatTitle($link, $active_feed_id); } else { $feed_cat_title = getCategoryTitle($link, $active_feed_id); } if ($active_feed_id && !$is_cat) { print "<option selected value=\"this_feed\">{$feed_title}</option>"; } else { print "<option disabled>" . __('This feed') . "</option>"; } if ($is_cat) { $cat_preselected = "selected"; } if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) { print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>"; } else { //print "<option disabled>".__('This category')."</option>"; } print "</select>"; print "</div>"; print "</form>"; print "<div class=\"dlgButtons\">\n\t\t\t<button onclick=\"javascript:search()\">" . __('Search') . "</button>\n\t\t\t<button onclick=\"javascript:closeInfoBox(true)\">" . __('Cancel') . "</button>\n\t\t\t</div>"; print "</div>"; return; } if ($id == "quickAddFilter") { $active_feed_id = db_escape_string($_REQUEST["param"]); print "<div id=\"infoBoxTitle\">" . __('Create Filter') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<form id=\"filter_add_form\" onsubmit='return false'>"; print "<input type=\"hidden\" name=\"op\" value=\"pref-filters\">"; print "<input type=\"hidden\" name=\"quiet\" value=\"1\">"; print "<input type=\"hidden\" name=\"subop\" value=\"add\">"; $result = db_query($link, "SELECT id,description \n\t\t\t\tFROM ttrss_filter_types ORDER BY description"); $filter_types = array(); while ($line = db_fetch_assoc($result)) { //array_push($filter_types, $line["description"]); $filter_types[$line["id"]] = __($line["description"]); } print "<div class=\"dlgSec\">" . __("Match") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<span id=\"filter_dlg_date_mod_box\" style=\"display : none\">"; print __("Date") . " "; $filter_params = array("before" => __("before"), "after" => __("after")); print_select_hash("filter_date_modifier", "before", $filter_params); print " </span>"; print "<input onkeypress=\"return filterCR(event, createFilter)\"\n\t\t\t\t name=\"reg_exp\" size=\"30\" value=\"{$reg_exp}\">"; print "<span id=\"filter_dlg_date_chk_box\" style=\"display : none\">"; print " <input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return filterDlgCheckDate()\" \n\t\t\t\tvalue=\"" . __('Check it') . "\">"; print "</span>"; print "<br/> " . __("on field") . " "; print_select_hash("filter_type", 1, $filter_types, 'onchange="filterDlgCheckType(this)"'); print "<br/>"; print __("in") . " "; print_feed_select($link, "feed_id", $active_feed_id); print "</div>"; print "<div class=\"dlgSec\">" . __("Perform Action") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<select name=\"action_id\"\n\t\t\t\tonchange=\"filterDlgCheckAction(this)\">"; $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions \n\t\t\t\tORDER BY name"); while ($line = db_fetch_assoc($result)) { printf("<option value='%d'>%s</option>", $line["id"], __($line["description"])); } print "</select>"; print "<span id=\"filter_dlg_param_box\" style=\"display : none\">"; print " " . __("with parameters:") . " "; print "<input size=\"20\"\n\t\t\t\t\tonkeypress=\"return filterCR(event, createFilter)\"\n\t\t\t\t\tname=\"action_param\">"; print_label_select($link, "action_param_label", $action_param); print "</span>"; print " "; // tiny layout hack print "</div>"; print "<div class=\"dlgSec\">" . __("Options") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<div style=\"line-height : 100%\">"; print "<input type=\"checkbox\" name=\"enabled\" id=\"enabled\" checked=\"1\">\n\t\t\t\t\t<label for=\"enabled\">" . __('Enabled') . "</label><br/>"; print "<input type=\"checkbox\" name=\"inverse\" id=\"inverse\">\n\t\t\t\t<label for=\"inverse\">" . __('Inverse match') . "</label>"; print "</div>"; print "</div>"; print "</form>"; print "<div class=\"dlgButtons\">"; print "<button onclick=\"return createFilter()\">" . __('Create') . "</button> "; print "<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button>"; print "</div>"; // print "</td></tr></table>"; return; } if ($id == "feedUpdateErrors") { print "<div id=\"infoBoxTitle\">" . __('Update Errors') . "</div>"; print "<div class=\"infoBoxContents\">"; print __("These feeds have not been updated because of errors:"); $result = db_query($link, "SELECT id,title,feed_url,last_error\n\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]); print "<ul class='feedErrorsList'>"; while ($line = db_fetch_assoc($result)) { print "<li><b>" . $line["title"] . "</b> (" . $line["feed_url"] . "): " . "<em>" . $line["last_error"] . "</em>"; } print "</ul>"; print "<div align='center'>"; print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; return; } if ($id == "editArticleTags") { print "<div id=\"infoBoxTitle\">" . __('Edit Tags') . "</div>"; print "<div class=\"infoBoxContents\">"; print "<form id=\"tag_edit_form\" onsubmit='return false'>"; print __("Tags for this article (separated by commas):") . "<br>"; $tags = get_article_tags($link, $param); $tags_str = join(", ", $tags); print "<table width='100%'>"; print "<tr><td colspan='2'><input type=\"hidden\" name=\"id\" value=\"{$param}\"></td></tr>"; print "<tr><td colspan='2'><textarea rows='4' class='iedit' id='tags_str' \n\t\t\t\tname='tags_str'>{$tags_str}</textarea>\n\t\t\t<div class=\"autocomplete\" id=\"tags_choices\" \n\t\t\t\t\tstyle=\"display:none\"></div>\t\n\t\t\t</td></tr>"; print "</table>"; print "</form>"; print "<div align='right'>"; print "<button onclick=\"return editTagsSave()\">" . __('Save') . "</button> "; print "<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button>"; print "</div>"; return; } if ($id == "printTagCloud") { print "<div id=\"infoBoxTitle\">" . __('Tag Cloud') . "</div>"; print "<div class=\"infoBoxContents\">"; print __("Showing most popular tags ") . " (<a \n\t\t\thref='javascript:toggleTags(true)'>" . __('more tags') . "</a>):<br/>"; print "<div class=\"tagCloudContainer\">"; printTagCloud($link); print "</div>"; print "<div align='center'>"; print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "</div>"; return; } /* if ($id == "offlineDownload") { print "<div id=\"infoBoxTitle\">".__('Download articles')."</div>"; print "<div class=\"infoBoxContents\">"; print "<form name='download_ops_form' id='download_ops_form'>"; print "<div class=\"dlgSec\">".__("Download")."</div>"; print "<div class=\"dlgSecCont\">"; $amount = array( 50 => 50, 100 => 100, 250 => 250, 500 => 500); print_select_hash("amount", 50, $amount); print " " . __("latest articles for offline reading."); print "<br/>"; print "<input checked='yes' type='checkbox' name='unread_only' id='unread_only'>"; print "<label for='unread_only'>".__('Only include unread articles')."</label>"; print "</div>"; print "</form>"; print "<div class=\"dlgButtons\"> <input class=\"button\" type=\"submit\" onclick=\"return initiate_offline_download(0, this)\" value=\"".__('Download')."\"> <input class=\"button\" type=\"submit\" onclick=\"return closeInfoBox()\" value=\"".__('Cancel')."\"></div>"; print "</div>"; return; } */ print "<div id='infoBoxTitle'>Internal Error</div>\n\t\t\t<div id='infoBoxContents'>\n\t\t\t<p>Unknown dialog <b>{$id}</b></p>\n\t\t\t</div></div>"; }
function module_popup_dialog($link) { $id = $_REQUEST["id"]; $param = db_escape_string($_REQUEST["param"]); print "<dlg id=\"{$id}\">"; if ($id == "importOpml") { print "<div class=\"prefFeedOPMLHolder\">"; header("Content-Type: text/html"); # required for iframe $owner_uid = $_SESSION["uid"]; db_query($link, "BEGIN"); /* create Imported feeds category just in case */ $result = db_query($link, "SELECT id FROM\n\t\t\t\tttrss_feed_categories WHERE title = 'Imported feeds' AND\n\t\t\t\towner_uid = '{$owner_uid}' LIMIT 1"); if (db_num_rows($result) == 0) { db_query($link, "INSERT INTO ttrss_feed_categories\n\t\t\t\t\t(title,owner_uid)\n\t\t\t\t\t\tVALUES ('Imported feeds', '{$owner_uid}')"); } db_query($link, "COMMIT"); /* Handle OPML import by DOMXML/DOMDocument */ if (function_exists('domxml_open_file')) { print "<ul class='nomarks'>"; print "<li>" . __("Importing using DOMXML.") . "</li>"; require_once "opml_domxml.php"; opml_import_domxml($link, $owner_uid); print "</ul>"; } else { if (PHP_VERSION >= 5) { print "<ul class='nomarks'>"; print "<li>" . __("Importing using DOMDocument.") . "</li>"; require_once "opml_domdoc.php"; opml_import_domdoc($link, $owner_uid); print "</ul>"; } else { print_error(__("DOMXML extension is not found. It is required for PHP versions below 5.")); } } print "</div>"; print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('opmlImportDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; print "</div>"; //return; } if ($id == "editPrefProfiles") { print "<div dojoType=\"dijit.Toolbar\">"; # TODO: depends on selectTableRows() being broken for this list # print "<div dojoType=\"dijit.form.DropDownButton\">". # "<span>" . __('Select')."</span>"; # print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">"; # print "<div onclick=\"selectTableRows('prefFeedProfileList', 'all')\" # dojoType=\"dijit.MenuItem\">".__('All')."</div>"; # print "<div onclick=\"selectTableRows('prefFeedProfileList', 'none')\" # dojoType=\"dijit.MenuItem\">".__('None')."</div>"; # print "</div></div>"; # print "<div style='float : right'>"; print "<input name=\"newprofile\" dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\trequired=\"1\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('profileEditDlg').addProfile()\">" . __('Create profile') . "</button></div>"; # print "</div>"; $result = db_query($link, "SELECT title,id FROM ttrss_settings_profiles\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title"); print "<div class=\"prefFeedCatHolder\">"; print "<form id=\"profile_edit_form\" onsubmit=\"return false\">"; print "<table width=\"100%\" class=\"prefFeedProfileList\"\n\t\t\t\tcellspacing=\"0\" id=\"prefFeedProfileList\">"; print "<tr class=\"\" id=\"FCATR-0\">"; #odd print "<td width='5%' align='center'><input\n\t\t\t\tonclick='toggleSelectRow2(this);'\n\t\t\t\tdojoType=\"dijit.form.CheckBox\"\n\t\t\t\ttype=\"checkbox\"></td>"; if (!$_SESSION["profile"]) { $is_active = __("(active)"); } else { $is_active = ""; } print "<td><span>" . __("Default profile") . " {$is_active}</span></td>"; print "</tr>"; $lnum = 1; while ($line = db_fetch_assoc($result)) { $class = $lnum % 2 ? "even" : "odd"; $profile_id = $line["id"]; $this_row_id = "id=\"FCATR-{$profile_id}\""; print "<tr class=\"\" {$this_row_id}>"; $edit_title = htmlspecialchars($line["title"]); print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);'\n\t\t\t\t\tdojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>"; if ($_SESSION["profile"] == $line["id"]) { $is_active = __("(active)"); } else { $is_active = ""; } print "<td><span dojoType=\"dijit.InlineEditBox\"\n\t\t\t\t\twidth=\"300px\" autoSave=\"false\"\n\t\t\t\t\tprofile-id=\"{$profile_id}\">" . $edit_title . "<script type=\"dojo/method\" event=\"onChange\" args=\"item\">\n\t\t\t\t\t\tvar elem = this;\n\t\t\t\t\t\tdojo.xhrPost({\n\t\t\t\t\t\t\turl: 'backend.php',\n\t\t\t\t\t\t\tcontent: {op: 'rpc', subop: 'saveprofile',\n\t\t\t\t\t\t\t\tvalue: this.value,\n\t\t\t\t\t\t\t\tid: this.srcNodeRef.getAttribute('profile-id')},\n\t\t\t\t\t\t\t\tload: function(response) {\n\t\t\t\t\t\t\t\t\telem.attr('value', response);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t</script>\n\t\t\t\t</span> {$is_active}</td>"; print "</tr>"; ++$lnum; } print "</table>"; print "</form>"; print "</div>"; print "<div class='dlgButtons'>\n\t\t\t\t<div style='float : left'>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').removeSelected()\">" . __('Remove selected profiles') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').activateProfile()\">" . __('Activate profile') . "</button>\n\t\t\t\t</div>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; } if ($id == "pubOPMLUrl") { print "<title>" . __('Public OPML URL') . "</title>"; print "<content><![CDATA["; $url_path = opml_publish_url($link); print __("Your Public OPML URL is:"); print "<div class=\"tagCloudContainer\">"; print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>"; print "</div>"; print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"return opmlRegenKey()\">" . __('Generate new URL') . "</button> "; print "<button dojoType=\"dijit.form.Button\" onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "]]></content>"; //return; } if ($id == "explainError") { print "<title>" . __('Notice') . "</title>"; print "<content><![CDATA["; print "<div class=\"errorExplained\">"; if ($param == 1) { print __("Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner."); $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp"); print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp); } if ($param == 3) { print __("Update daemon is taking too long to perform a feed update. This could indicate a problem like crash or a hang. Please check the daemon process or contact instance owner."); $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp"); print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp); } print "</div>"; print "<div align='center'>"; print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "]]></content>"; //return; } if ($id == "quickAddFeed") { print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"addfeed\">"; print "<div class=\"dlgSec\">" . __("Feed") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<input style=\"font-size : 16px; width : 20em;\"\n\t\t\t\tplaceHolder=\"" . __("Feed URL") . "\"\n\t\t\t\tdojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"feed\" id=\"feedDlg_feedUrl\">"; print "<hr/>"; if (get_pref($link, 'ENABLE_FEED_CATS')) { print __('Place in category:') . " "; print_feed_cat_select($link, "cat", false, 'dojoType="dijit.form.Select"'); } print "</div>"; print '<div id="feedDlg_feedsContainer" style="display : none"> <div class="dlgSec">' . __('Available feeds') . '</div> <div class="dlgSecCont">' . '<select id="feedDlg_feedContainerSelect" dojoType="dijit.form.Select" size="3"> <script type="dojo/method" event="onChange" args="value"> dijit.byId("feedDlg_feedUrl").attr("value", value); </script> </select>' . '</div></div>'; print "<div id='feedDlg_loginContainer' style='display : none'>\n\n\t\t\t\t\t<div class=\"dlgSec\">" . __("Authentication") . "</div>\n\t\t\t\t\t<div class=\"dlgSecCont\">" . " <input dojoType=\"dijit.form.TextBox\" name='login'\"\n\t\t\t\t\t\tplaceHolder=\"" . __("Login") . "\"\n\t\t\t\t\t\tstyle=\"width : 10em;\"> " . " <input\n\t\t\t\t\t\tplaceHolder=\"" . __("Password") . "\"\n\t\t\t\t\t\tdojoType=\"dijit.form.TextBox\" type='password'\n\t\t\t\t\t\tstyle=\"width : 10em;\" name='pass'\">\n\t\t\t\t</div></div>"; print "<div style=\"clear : both\">\n\t\t\t\t<input type=\"checkbox\" dojoType=\"dijit.form.CheckBox\" id=\"feedDlg_loginCheck\"\n\t\t\t\t\t\tonclick='checkboxToggleElement(this, \"feedDlg_loginContainer\")'>\n\t\t\t\t\t<label for=\"feedDlg_loginCheck\">" . __('This feed requires authentication.') . "</div>"; print "</form>"; print "<div class=\"dlgButtons\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').execute()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return feedBrowser()\">" . __('More feeds') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').hide()\">" . __('Cancel') . "</button>\n\t\t\t\t</div>"; //return; } if ($id == "feedBrowser") { $browser_search = db_escape_string($_REQUEST["search"]); # print "<form onsubmit='return false;' display='inline' # name='feed_browser' id='feed_browser'>"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"updateFeedBrowser\">"; print "<div dojoType=\"dijit.Toolbar\">\n\t\t\t\t<div style='float : right'>\n\t\t\t\t<img style='display : none'\n\t\t\t\t\tid='feed_browser_spinner' src='" . theme_image($link, 'images/indicator_white.gif') . "'>\n\t\t\t\t<input name=\"search\" dojoType=\"dijit.form.TextBox\" size=\"20\" type=\"search\"\n\t\t\t\t\tonchange=\"dijit.byId('feedBrowserDlg').update()\" value=\"{$browser_search}\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').update()\">" . __('Search') . "</button>\n\t\t\t</div>"; print " <select name=\"mode\" dojoType=\"dijit.form.Select\" onchange=\"dijit.byId('feedBrowserDlg').update()\">\n\t\t\t\t<option value='1'>" . __('Popular feeds') . "</option>\n\t\t\t\t<option value='2'>" . __('Feed archive') . "</option>\n\t\t\t\t</select> "; print __("limit:"); print " <select dojoType=\"dijit.form.Select\" name=\"limit\" onchange=\"dijit.byId('feedBrowserDlg').update()\">"; foreach (array(25, 50, 100, 200) as $l) { $issel = $l == $limit ? "selected=\"1\"" : ""; print "<option {$issel} value=\"{$l}\">{$l}</option>"; } print "</select> "; print "</div>"; $owner_uid = $_SESSION["uid"]; print "<ul class='browseFeedList' id='browseFeedList'>"; print make_feed_browser($link, $search, 25); print "</ul>"; print "<div align='center'>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').execute()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" style='display : none' id='feed_archive_remove' onclick=\"dijit.byId('feedBrowserDlg').removeFromArchive()\">" . __('Remove') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').hide()\" >" . __('Cancel') . "</button></div>"; } if ($id == "search") { $params = explode(":", db_escape_string($_REQUEST["param"]), 2); $active_feed_id = sprintf("%d", $params[0]); $is_cat = $params[1] != "false"; print "<div class=\"dlgSec\">" . __('Look for') . "</div>"; print "<div class=\"dlgSecCont\">"; if (!SPHINX_ENABLED) { print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\tstyle=\"font-size : 16px; width : 12em;\"\n\t\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>"; print " " . __('match on') . " "; $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content")); print_select_hash("match_on", 3, $search_fields, 'dojoType="dijit.form.Select"'); } else { print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>"; } print "<hr/>" . __('Limit search to:') . " "; print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>"; $feed_title = getFeedTitle($link, $active_feed_id); if (!$is_cat) { $feed_cat_title = getFeedCatTitle($link, $active_feed_id); } else { $feed_cat_title = getCategoryTitle($link, $active_feed_id); } if ($active_feed_id && !$is_cat) { print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>"; } else { print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>"; } if ($is_cat) { $cat_preselected = "selected=\"1\""; } if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) { print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>"; } else { //print "<option disabled>".__('This category')."</option>"; } print "</select>"; print "</div>"; print "<div class=\"dlgButtons\">"; if (!SPHINX_ENABLED) { print "<div style=\"float : left\">\n\t\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/redmine/wiki/tt-rss/SearchSyntax\">Search syntax</a>\n\t\t\t\t\t</div>"; } print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t\t</div>"; } if ($id == "quickAddFilter") { $active_feed_id = db_escape_string($_REQUEST["param"]); print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pref-filters\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"quiet\" value=\"1\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"add\">"; $result = db_query($link, "SELECT id,description\n\t\t\t\tFROM ttrss_filter_types ORDER BY description"); $filter_types = array(); while ($line = db_fetch_assoc($result)) { //array_push($filter_types, $line["description"]); $filter_types[$line["id"]] = __($line["description"]); } print "<div class=\"dlgSec\">" . __("Match") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<span id=\"filterDlg_dateModBox\" style=\"display : none\">"; $filter_params = array("before" => __("before"), "after" => __("after")); print_select_hash("filter_date_modifier", "before", $filter_params, 'dojoType="dijit.form.Select"'); print " </span>"; print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t required=\"true\" id=\"filterDlg_regExp\"\n\t\t\t\t style=\"font-size : 16px\"\n\t\t\t\t name=\"reg_exp\" value=\"{$reg_exp}\"/>"; print "<span id=\"filterDlg_dateChkBox\" style=\"display : none\">"; print " <button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return filterDlgCheckDate()\">" . __('Check it') . "</button>"; print "</span>"; print "<hr/>" . __("on field") . " "; print_select_hash("filter_type", 1, $filter_types, 'onchange="filterDlgCheckType(this)" dojoType="dijit.form.Select"'); print "<hr/>"; print __("in") . " "; print_feed_select($link, "feed_id", $active_feed_id, 'dojoType="dijit.form.FilteringSelect"'); print "</div>"; print "<div class=\"dlgSec\">" . __("Perform Action") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<select name=\"action_id\" dojoType=\"dijit.form.Select\"\n\t\t\t\tonchange=\"filterDlgCheckAction(this)\">"; $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions\n\t\t\t\tORDER BY name"); while ($line = db_fetch_assoc($result)) { printf("<option value='%d'>%s</option>", $line["id"], __($line["description"])); } print "</select>"; print "<span id=\"filterDlg_paramBox\" style=\"display : none\">"; print " " . __("with parameters:") . " "; print "<input dojoType=\"dijit.form.TextBox\"\n\t\t\t\tid=\"filterDlg_actionParam\"\n\t\t\t\tname=\"action_param\">"; print_label_select($link, "action_param_label", $action_param, 'id="filterDlg_actionParamLabel" dojoType="dijit.form.Select"'); print "</span>"; print " "; // tiny layout hack print "</div>"; print "<div class=\"dlgSec\">" . __("Options") . "</div>"; print "<div class=\"dlgSecCont\">"; print "<input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" name=\"enabled\" id=\"enabled\" checked=\"1\">\n\t\t\t\t\t<label for=\"enabled\">" . __('Enabled') . "</label><hr/>"; print "<input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" name=\"inverse\" id=\"inverse\">\n\t\t\t\t<label for=\"inverse\">" . __('Inverse match') . "</label>"; print "</div>"; 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').execute()\">" . __('Create') . "</button> "; print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').hide()\">" . __('Cancel') . "</button>"; print "</div>"; //return; } if ($id == "inactiveFeeds") { if (DB_TYPE == "pgsql") { $interval_qpart = "NOW() - INTERVAL '3 months'"; } else { $interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)"; } $result = db_query($link, "SELECT ttrss_feeds.title, ttrss_feeds.site_url,\n\t\t\t \t\tttrss_feeds.feed_url, ttrss_feeds.id, MAX(updated) AS last_article\n\t\t\t\tFROM ttrss_feeds, ttrss_entries, ttrss_user_entries WHERE\n\t\t\t\t\t(SELECT MAX(updated) FROM ttrss_entries, ttrss_user_entries WHERE\n\t\t\t\t\t\tttrss_entries.id = ref_id AND\n\t\t\t\t\t\t\tttrss_user_entries.feed_id = ttrss_feeds.id) < {$interval_qpart}\n\t\t\t\tAND ttrss_feeds.owner_uid = " . $_SESSION["uid"] . " AND\n\t\t\t\t\tttrss_user_entries.feed_id = ttrss_feeds.id AND\n\t\t\t\t\tttrss_entries.id = ref_id\n\t\t\t\tGROUP BY ttrss_feeds.title, ttrss_feeds.id, ttrss_feeds.site_url, ttrss_feeds.feed_url\n\t\t\t\tORDER BY last_article"); print __("These feeds have not been updated with new content for 3 months (oldest first):"); print "<div class=\"inactiveFeedHolder\">"; print "<table width=\"100%\" cellspacing=\"0\" id=\"prefInactiveFeedList\">"; $lnum = 1; while ($line = db_fetch_assoc($result)) { $class = $lnum % 2 ? "even" : "odd"; $feed_id = $line["id"]; $this_row_id = "id=\"FUPDD-{$feed_id}\""; print "<tr class=\"\" {$this_row_id}>"; $edit_title = htmlspecialchars($line["title"]); print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);' dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>"; print "<td>"; print "<a class=\"visibleLink\" href=\"#\" " . "title=\"" . __("Click to edit feed") . "\" " . "onclick=\"editFeed(" . $line["id"] . ")\">" . htmlspecialchars($line["title"]) . "</a>"; print "</td><td class=\"insensitive\" align='right'>"; print make_local_datetime($link, $line['last_article'], false); print "</td>"; print "</tr>"; ++$lnum; } print "</table>"; print "</div>"; print "<div class='dlgButtons'>"; print "<div style='float : left'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('inactiveFeedsDlg').removeSelected()\">" . __('Unsubscribe from selected feeds') . "</button> "; print "</div>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('inactiveFeedsDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; } if ($id == "feedsWithErrors") { # print "<title>".__('Feeds with update errors')."</title>"; # print "<content><![CDATA["; print __("These feeds have not been updated because of errors:"); $result = db_query($link, "SELECT id,title,feed_url,last_error,site_url\n\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]); print "<div class=\"inactiveFeedHolder\">"; print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">"; $lnum = 1; while ($line = db_fetch_assoc($result)) { $class = $lnum % 2 ? "even" : "odd"; $feed_id = $line["id"]; $this_row_id = "id=\"FUPDD-{$feed_id}\""; print "<tr class=\"\" {$this_row_id}>"; $edit_title = htmlspecialchars($line["title"]); print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);' dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>"; print "<td>"; print "<a class=\"visibleLink\" href=\"#\" " . "title=\"" . __("Click to edit feed") . "\" " . "onclick=\"editFeed(" . $line["id"] . ")\">" . htmlspecialchars($line["title"]) . "</a>: "; print "<span class=\"insensitive\">"; print htmlspecialchars($line["last_error"]); print "</span>"; print "</td>"; print "</tr>"; ++$lnum; } print "</table>"; print "</div>"; print "<div class='dlgButtons'>"; print "<div style='float : left'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('errorFeedsDlg').removeSelected()\">" . __('Unsubscribe from selected feeds') . "</button> "; print "</div>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('errorFeedsDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; } if ($id == "editArticleTags") { # print "<form id=\"tag_edit_form\" onsubmit='return false'>"; print __("Tags for this article (separated by commas):") . "<br>"; $tags = get_article_tags($link, $param); $tags_str = join(", ", $tags); print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"{$param}\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setArticleTags\">"; print "<table width='100%'><tr><td>"; print "<textarea dojoType=\"dijit.form.SimpleTextarea\" rows='4'\n\t\t\t\tstyle='font-size : 12px; width : 100%' id=\"tags_str\"\n\t\t\t\tname='tags_str'>{$tags_str}</textarea>\n\t\t\t<div class=\"autocomplete\" id=\"tags_choices\"\n\t\t\t\t\tstyle=\"display:none\"></div>"; print "</td></tr></table>"; # print "</form>"; print "<div class='dlgButtons'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editTagsDlg').execute()\">" . __('Save') . "</button> "; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editTagsDlg').hide()\">" . __('Cancel') . "</button>"; print "</div>"; } if ($id == "printTagCloud") { print "<title>" . __('Tag Cloud') . "</title>"; print "<content><![CDATA["; # print __("Showing most popular tags ")." (<a # href='javascript:toggleTags(true)'>".__('more tags')."</a>):<br/>"; print "<div class=\"tagCloudContainer\">"; printTagCloud($link); print "</div>"; print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "]]></content>"; } if ($id == 'printTagSelect') { print "<title>" . __('Select item(s) by tags') . "</title>"; print "<content><![CDATA["; print __("Match:") . " " . "<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" checked value=\"any\" name=\"tag_mode\"> Any "; print "<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" value=\"all\" name=\"tag_mode\"> All "; print " tags."; print "<select id=\"all_tags\" name=\"all_tags\" title=\"" . __('Which Tags?') . "\" multiple=\"multiple\" size=\"10\" style=\"width : 100%\">"; $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags WHERE owner_uid = " . $_SESSION['uid'] . "\n\t\t\t\tAND LENGTH(tag_name) <= 30 ORDER BY tag_name ASC"); while ($row = db_fetch_assoc($result)) { $tmp = htmlspecialchars($row["tag_name"]); print "<option value=\"" . str_replace(" ", "%20", $tmp) . "\">{$tmp}</option>"; } print "</select>"; print "<div align='right'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"viewfeed(get_all_tags(\$('all_tags')),\n\t\t\t\tget_radio_checked(\$('tag_mode')));\">" . __('Display entries') . "</button>"; print " "; print "<button dojoType=\"dijit.form.Button\"\n\t\t\tonclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "]]></content>"; } if ($id == "emailArticle") { $secretkey = sha1(uniqid(rand(), true)); $_SESSION['email_secretkey'] = $secretkey; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"secretkey\" value=\"{$secretkey}\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"sendEmail\">"; $result = db_query($link, "SELECT email, full_name FROM ttrss_users WHERE\n\t\t\t\tid = " . $_SESSION["uid"]); $user_email = htmlspecialchars(db_fetch_result($result, 0, "email")); $user_name = htmlspecialchars(db_fetch_result($result, 0, "full_name")); if (!$user_name) { $user_name = $_SESSION['name']; } $_SESSION['email_replyto'] = $user_email; $_SESSION['email_fromname'] = $user_name; require_once "lib/MiniTemplator.class.php"; $tpl = new MiniTemplator(); $tpl_t = new MiniTemplator(); $tpl->readTemplateFromFile("templates/email_article_template.txt"); $tpl->setVariable('USER_NAME', $_SESSION["name"]); $tpl->setVariable('USER_EMAIL', $user_email); $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]); // $tpl->addBlock('header'); $result = db_query($link, "SELECT link, content, title\n\t\t\t\tFROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND\n\t\t\t\tid IN ({$param}) AND owner_uid = " . $_SESSION["uid"]); if (db_num_rows($result) > 1) { $subject = __("[Forwarded]") . " " . __("Multiple articles"); } while ($line = db_fetch_assoc($result)) { if (!$subject) { $subject = __("[Forwarded]") . " " . htmlspecialchars($line["title"]); } $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"])); $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"])); $tpl->addBlock('article'); } $tpl->addBlock('email'); $content = ""; $tpl->generateOutputToString($content); print "<table width='100%'><tr><td>"; print __('From:'); print "</td><td>"; print "<input dojoType=\"dijit.form.TextBox\" disabled=\"1\" style=\"width : 30em;\"\n\t\t\t\t\tvalue=\"{$user_name} <{$user_email}>\">"; print "</td></tr><tr><td>"; print __('To:'); print "</td><td>"; print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"true\"\n\t\t\t\t\tstyle=\"width : 30em;\"\n\t\t\t\t\tname=\"destination\" id=\"emailArticleDlg_destination\">"; print "<div class=\"autocomplete\" id=\"emailArticleDlg_dst_choices\"\n\t\t\t\t\tstyle=\"z-index: 30; display : none\"></div>"; print "</td></tr><tr><td>"; print __('Subject:'); print "</td><td>"; print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"true\"\n\t\t\t\t\tstyle=\"width : 30em;\"\n\t\t\t\t\tname=\"subject\" value=\"{$subject}\" id=\"subject\">"; print "</td></tr>"; print "<tr><td colspan='2'><textarea dojoType=\"dijit.form.SimpleTextarea\" style='font-size : 12px; width : 100%' rows=\"20\"\n\t\t\t\tname='content'>{$content}</textarea>"; print "</td></tr></table>"; print "<div class='dlgButtons'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('emailArticleDlg').execute()\">" . __('Send e-mail') . "</button> "; print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('emailArticleDlg').hide()\">" . __('Cancel') . "</button>"; print "</div>"; //return; } if ($id == "generatedFeed") { print "<title>" . __('View as RSS') . "</title>"; print "<content><![CDATA["; $params = explode(":", $param, 3); $feed_id = db_escape_string($params[0]); $is_cat = (bool) $params[1]; $key = get_feed_access_key($link, $feed_id, $is_cat); $url_path = htmlspecialchars($params[2]) . "&key=" . $key; print __("You can view this feed as RSS using the following URL:"); print "<div class=\"tagCloudContainer\">"; print "<a id='gen_feed_url' href='{$url_path}' target='_blank'>{$url_path}</a>"; print "</div>"; print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"return genUrlChangeKey('{$feed_id}', '{$is_cat}')\">" . __('Generate new URL') . "</button> "; print "<button dojoType=\"dijit.form.Button\" onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>"; print "</div>"; print "]]></content>"; //return; } if ($id == "newVersion") { $version_data = check_for_update($link); $version = $version_data['version']; $id = $version_data['version_id']; print "<div class='tagCloudContainer'>"; print T_sprintf("New version of Tiny Tiny RSS is available (%s).", "<b>{$version}</b>"); print "</div>"; $details = "http://tt-rss.org/redmine/versions/show/{$id}"; $download = "http://tt-rss.org/#Download"; print "<div style='text-align : center'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return window.open('{$details}')\">" . __("Details") . "</button>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return window.open('{$download}')\">" . __("Download") . "</button>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return dijit.byId('newVersionDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; } if ($id == "customizeCSS") { $value = get_pref($link, "USER_STYLESHEET"); $value = str_replace("<br/>", "\n", $value); print T_sprintf("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here. <a target=\"_blank\" class=\"visibleLink\" href=\"%s\">This file</a> can be used as a baseline.", "tt-rss.css"); print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setpref\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"key\" value=\"USER_STYLESHEET\">"; print "<table width='100%'><tr><td>"; print "<textarea dojoType=\"dijit.form.SimpleTextarea\"\n\t\t\t\tstyle='font-size : 12px; width : 100%; height: 200px;'\n\t\t\t\tplaceHolder='body#ttrssMain { font-size : 14px; };'\n\t\t\t\tname='value'>{$value}</textarea>"; print "</td></tr></table>"; print "<div class='dlgButtons'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('cssEditDlg').execute()\">" . __('Save') . "</button> "; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('cssEditDlg').hide()\">" . __('Cancel') . "</button>"; print "</div>"; } if ($id == "editArticleNote") { $result = db_query($link, "SELECT note FROM ttrss_user_entries WHERE\n\t\t\t\tref_id = '{$param}' AND owner_uid = " . $_SESSION['uid']); $note = db_fetch_result($result, 0, "note"); print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"{$param}\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setNote\">"; print "<table width='100%'><tr><td>"; print "<textarea dojoType=\"dijit.form.SimpleTextarea\"\n\t\t\t\tstyle='font-size : 12px; width : 100%; height: 100px;'\n\t\t\t\tplaceHolder='body#ttrssMain { font-size : 14px; };'\n\t\t\t\tname='note'>{$note}</textarea>"; print "</td></tr></table>"; print "<div class='dlgButtons'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editNoteDlg').execute()\">" . __('Save') . "</button> "; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editNoteDlg').hide()\">" . __('Cancel') . "</button>"; print "</div>"; } if ($id == "about") { print "<table width='100%'><tr><td align='center'>"; print "<img src=\"images/logo_big.png\">"; print "</td>"; print "<td width='70%'>"; print "<h1>Tiny Riny RSS</h1>\n\t\t\t\t<strong>Version " . VERSION . "</strong>\n\t\t\t\t<p>Copyright © 2005-" . date('Y') . "\n\t\t\t\t<a target=\"_blank\" class=\"visibleLink\"\n\t\t\t\thref=\"http://fakecake.org/\">Andrew Dolgov</a>\n\t\t\t\tand other contributors.</p>\n\t\t\t\t<p class=\"insensitive\">Licensed under GNU GPL version 2.</p>"; print "<p class=\"insensitive\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\"\n\t\t\t\t\thref=\"http://tt-rss.org/\">Official site</a> —\n\t\t\t\t<a href=\"http://tt-rss.org/redmine/wiki/tt-rss/Donate\"\n\t\t\t\ttarget=\"_blank\" class=\"visibleLink\">\n\t\t\t\tSupport the project.</a></p>"; print "</td></tr>"; print "</table>"; print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\ttype=\"submit\">" . __('Close this window') . "</button>"; print "</div>"; } if ($id == "addInstance") { print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pref-instances\">"; print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"add\">"; print "<div class=\"dlgSec\">" . __("Instance") . "</div>"; print "<div class=\"dlgSecCont\">"; /* URL */ print __("URL:") . " "; print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"\n\t\t\t\tplaceHolder=\"" . __("Instance URL") . "\"\n\t\t\t\tregExp='^(http|https)://.*'\n\t\t\t\tstyle=\"font-size : 16px; width: 20em\" name=\"access_url\">"; print "<hr/>"; $access_key = sha1(uniqid(rand(), true)); /* Access key */ print __("Access key:") . " "; print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"\n\t\t\t\tplaceHolder=\"" . __("Access key") . "\" regExp='\\w{40}'\n\t\t\t\tstyle=\"width: 20em\" name=\"access_key\" id=\"instance_add_key\"\n\t\t\t\tvalue=\"{$access_key}\">"; print "<p class='insensitive'>" . __("Use one access key for both linked instances."); print "</div>"; print "<div class=\"dlgButtons\">\n\t\t\t\t<div style='float : left'>\n\t\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').regenKey()\">" . __('Generate new key') . "</button>\n\t\t\t\t</div>\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').execute()\">" . __('Create link') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').hide()\"\">" . __('Cancel') . "</button></div>"; return; } if ($id == "shareArticle") { $result = db_query($link, "SELECT uuid, ref_id FROM ttrss_user_entries WHERE int_id = '{$param}'\n\t\t\t\tAND owner_uid = " . $_SESSION['uid']); if (db_num_rows($result) == 0) { print "Article not found."; } else { $uuid = db_fetch_result($result, 0, "uuid"); $ref_id = db_fetch_result($result, 0, "ref_id"); if (!$uuid) { $uuid = db_escape_string(sha1(uniqid(rand(), true))); db_query($link, "UPDATE ttrss_user_entries SET uuid = '{$uuid}' WHERE int_id = '{$param}'\n\t\t\t\t\t\tAND owner_uid = " . $_SESSION['uid']); } print __("You can share this article by the following unique URL:"); $url_path = get_self_url_prefix(); $url_path .= "/public.php?op=share&key={$uuid}"; print "<div class=\"tagCloudContainer\">"; print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>"; print "</div>"; /* if (!label_find_id($link, __('Shared'), $_SESSION["uid"])) label_create($link, __('Shared'), $_SESSION["uid"]); label_add_article($link, $ref_id, __('Shared'), $_SESSION['uid']); */ } print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('shareArticleDlg').hide()\">" . __('Close this window') . "</button>"; print "</div>"; return; } print "</dlg>"; }
static function api_get_feeds($cat_id, $unread_only, $limit, $offset, $include_nested = false) { $feeds = array(); /* Labels */ if ($cat_id == -4 || $cat_id == -2) { $counters = getLabelCounters(true); foreach (array_values($counters) as $cv) { $unread = $cv["counter"]; if ($unread || !$unread_only) { $row = array("id" => (int) $cv["id"], "title" => $cv["description"], "unread" => $cv["counter"], "cat_id" => -2); array_push($feeds, $row); } } } /* Virtual feeds */ if ($cat_id == -4 || $cat_id == -1) { foreach (array(-1, -2, -3, -4, -6, 0) as $i) { $unread = getFeedUnread($i); if ($unread || !$unread_only) { $title = getFeedTitle($i); $row = array("id" => $i, "title" => $title, "unread" => $unread, "cat_id" => -1); array_push($feeds, $row); } } } /* Child cats */ if ($include_nested && $cat_id) { $result = db_query("SELECT\n\t\t\t\t\tid, title FROM ttrss_feed_categories\n\t\t\t\t\tWHERE parent_cat = '{$cat_id}' AND owner_uid = " . $_SESSION["uid"] . " ORDER BY id, title"); while ($line = db_fetch_assoc($result)) { $unread = getFeedUnread($line["id"], true) + getCategoryChildrenUnread($line["id"]); if ($unread || !$unread_only) { $row = array("id" => (int) $line["id"], "title" => $line["title"], "unread" => $unread, "is_cat" => true); array_push($feeds, $row); } } } /* Real feeds */ if ($limit) { $limit_qpart = "LIMIT {$limit} OFFSET {$offset}"; } else { $limit_qpart = ""; } if ($cat_id == -4 || $cat_id == -3) { $result = db_query("SELECT\n\t\t\t\t\tid, feed_url, cat_id, title, order_id, " . SUBSTRING_FOR_DATE . "(last_updated,1,19) AS last_updated\n\t\t\t\t\t\tFROM ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY cat_id, title " . $limit_qpart); } else { if ($cat_id) { $cat_qpart = "cat_id = '{$cat_id}'"; } else { $cat_qpart = "cat_id IS NULL"; } $result = db_query("SELECT\n\t\t\t\t\tid, feed_url, cat_id, title, order_id, " . SUBSTRING_FOR_DATE . "(last_updated,1,19) AS last_updated\n\t\t\t\t\t\tFROM ttrss_feeds WHERE\n\t\t\t\t\t\t{$cat_qpart} AND owner_uid = " . $_SESSION["uid"] . " ORDER BY cat_id, title " . $limit_qpart); } while ($line = db_fetch_assoc($result)) { $unread = getFeedUnread($line["id"]); $has_icon = feed_has_icon($line['id']); if ($unread || !$unread_only) { $row = array("feed_url" => $line["feed_url"], "title" => $line["title"], "id" => (int) $line["id"], "unread" => (int) $unread, "has_icon" => $has_icon, "cat_id" => (int) $line["cat_id"], "last_updated" => (int) strtotime($line["last_updated"]), "order_id" => (int) $line["order_id"]); array_push($feeds, $row); } } return $feeds; }
function search() { $this->params = explode(":", db_escape_string($_REQUEST["param"]), 2); $active_feed_id = sprintf("%d", $this->params[0]); $is_cat = $this->params[1] != "false"; print "<div class=\"dlgSec\">" . __('Look for') . "</div>"; print "<div class=\"dlgSecCont\">"; if (!SPHINX_ENABLED) { print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\tstyle=\"font-size : 16px; width : 12em;\"\n\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>"; print " " . __('match on') . " "; $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content")); print_select_hash("match_on", 3, $search_fields, 'dojoType="dijit.form.Select"'); } else { print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>"; } print "<hr/>" . __('Limit search to:') . " "; print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>"; $feed_title = getFeedTitle($this->link, $active_feed_id); if (!$is_cat) { $feed_cat_title = getFeedCatTitle($this->link, $active_feed_id); } else { $feed_cat_title = getCategoryTitle($this->link, $active_feed_id); } if ($active_feed_id && !$is_cat) { print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>"; } else { print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>"; } if ($is_cat) { $cat_preselected = "selected=\"1\""; } if (get_pref($this->link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) { print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>"; } else { //print "<option disabled>".__('This category')."</option>"; } print "</select>"; print "</div>"; print "<div class=\"dlgButtons\">"; if (!SPHINX_ENABLED) { print "<div style=\"float : left\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/redmine/wiki/tt-rss/SearchSyntax\">Search syntax</a>\n\t\t\t\t</div>"; } print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t</div>"; }
function opml_export($name, $owner_uid, $hide_private_feeds = false, $include_settings = true) { if (!$owner_uid) { return; } if (!isset($_REQUEST["debug"])) { header("Content-type: application/xml+opml"); header("Content-Disposition: attachment; filename=" . $name); } else { header("Content-type: text/xml"); } $out = "<?xml version=\"1.0\" encoding=\"utf-8\"?" . ">"; $out .= "<opml version=\"1.0\">"; $out .= "<head>\n\t\t\t<dateCreated>" . date("r", time()) . "</dateCreated>\n\t\t\t<title>Tiny Tiny RSS Feed Export</title>\n\t\t</head>"; $out .= "<body>"; $out .= $this->opml_export_category($owner_uid, false, $hide_private_feeds); # export tt-rss settings if ($include_settings) { $out .= "<outline text=\"tt-rss-prefs\" schema-version=\"" . SCHEMA_VERSION . "\">"; $result = db_query($this->link, "SELECT pref_name, value FROM ttrss_user_prefs WHERE\n\t\t\t profile IS NULL AND owner_uid = " . $_SESSION["uid"] . " ORDER BY pref_name"); while ($line = db_fetch_assoc($result)) { $name = $line["pref_name"]; $value = htmlspecialchars($line["value"]); $out .= "<outline pref-name=\"{$name}\" value=\"{$value}\"/>"; } $out .= "</outline>"; $out .= "<outline text=\"tt-rss-labels\" schema-version=\"" . SCHEMA_VERSION . "\">"; $result = db_query($this->link, "SELECT * FROM ttrss_labels2 WHERE\n\t\t\t\towner_uid = " . $_SESSION['uid']); while ($line = db_fetch_assoc($result)) { $name = htmlspecialchars($line['caption']); $fg_color = htmlspecialchars($line['fg_color']); $bg_color = htmlspecialchars($line['bg_color']); $out .= "<outline label-name=\"{$name}\" label-fg-color=\"{$fg_color}\" label-bg-color=\"{$bg_color}\"/>"; } $out .= "</outline>"; $out .= "<outline text=\"tt-rss-filters\" schema-version=\"" . SCHEMA_VERSION . "\">"; $result = db_query($this->link, "SELECT * FROM ttrss_filters2\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY id"); while ($line = db_fetch_assoc($result)) { foreach (array('enabled', 'match_any_rule') as $b) { $line[$b] = sql_bool_to_bool($line[$b]); } $line["rules"] = array(); $line["actions"] = array(); $tmp_result = db_query($this->link, "SELECT * FROM ttrss_filters2_rules\n\t\t\t\t\tWHERE filter_id = " . $line["id"]); while ($tmp_line = db_fetch_assoc($tmp_result)) { unset($tmp_line["id"]); unset($tmp_line["filter_id"]); $cat_filter = sql_bool_to_bool($tmp_line["cat_filter"]); if ($cat_filter && $tmp_line["cat_id"] || $tmp_line["feed_id"]) { $tmp_line["feed"] = getFeedTitle($this->link, $cat_filter ? $tmp_line["cat_id"] : $tmp_line["feed_id"], $cat_filter); } else { $tmp_line["feed"] = ""; } $tmp_line["cat_filter"] = sql_bool_to_bool($tmp_line["cat_filter"]); unset($tmp_line["feed_id"]); unset($tmp_line["cat_id"]); array_push($line["rules"], $tmp_line); } $tmp_result = db_query($this->link, "SELECT * FROM ttrss_filters2_actions\n\t\t\t\t\tWHERE filter_id = " . $line["id"]); while ($tmp_line = db_fetch_assoc($tmp_result)) { unset($tmp_line["id"]); unset($tmp_line["filter_id"]); array_push($line["actions"], $tmp_line); } unset($line["id"]); unset($line["owner_uid"]); $filter = json_encode($line); $out .= "<outline filter-type=\"2\"><![CDATA[{$filter}]]></outline>"; } $out .= "</outline>"; } $out .= "</body></opml>"; // Format output. $doc = new DOMDocument(); $doc->formatOutput = true; $doc->preserveWhiteSpace = false; $doc->loadXML($out); $xpath = new DOMXpath($doc); $outlines = $xpath->query("//outline[@title]"); // cleanup empty categories foreach ($outlines as $node) { if ($node->getElementsByTagName('outline')->length == 0) { $node->parentNode->removeChild($node); } } $res = $doc->saveXML(); /* // saveXML uses a two-space indent. Change to tabs. $res = preg_replace_callback('/^(?: )+/mu', create_function( '$matches', 'return str_repeat("\t", intval(strlen($matches[0])/2));'), $res); */ print $res; }
function queryFeedHeadlines($feed, $limit, $view_mode, $cat_view, $search, $search_mode, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false, $start_ts = false) { if (!$owner_uid) { $owner_uid = $_SESSION["uid"]; } $ext_tables_part = ""; $search_words = array(); $search_query_part = ""; if ($search) { // adjust $search_query_part foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH) as $plugin) { list($search_query_part, $search_words) = $plugin->hook_search($search); break; } // fall back in case of no plugins if (!$search_query_part) { list($search_query_part, $search_words) = search_to_sql($search); } $search_query_part .= " AND "; } $filter_query_part = ""; if ($filter) { // adjust $filter_query_part 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, $owner_uid); // Try to check if SQL regexp implementation chokes on a valid regexp $result = db_query("SELECT true AS true_val\n FROM ttrss_entries\n JOIN ttrss_user_entries ON ttrss_entries.id = ttrss_user_entries.ref_id\n JOIN ttrss_feeds ON ttrss_feeds.id = ttrss_user_entries.feed_id\n WHERE {$filter_query_part} LIMIT 1", false); if ($result) { $test = db_fetch_result($result, 0, "true_val"); if (!$test) { $filter_query_part = "false AND"; } else { $filter_query_part .= " AND"; } } else { $filter_query_part = "false AND"; } } $since_id_part = ""; if ($since_id) { // adjust $since_id_part $since_id_part = "ttrss_entries.id > {$since_id} AND "; } $view_query_part = ""; if ($view_mode == "adaptive") { // adjust $view_query_part if ($search) { $view_query_part = " "; } elseif ($feed != -1) { $unread = getFeedUnread($feed, $cat_view); if ($cat_view && $feed > 0 && $include_children) { $unread += getCategoryChildrenUnread($feed); } if ($unread > 0) { $view_query_part = " unread = true AND "; } } } elseif ($view_mode == "marked") { $view_query_part = " marked = true AND "; } elseif ($view_mode == "has_note") { $view_query_part = " (note IS NOT NULL AND note != '') AND "; } elseif ($view_mode == "published") { $view_query_part = " published = true AND "; } elseif ($view_mode == "unread" && $feed != -6) { $view_query_part = " unread = true AND "; } if ($limit > 0) { $limit_query_part = "LIMIT " . $limit; } $allow_archived = false; $vfeed_query_part = ""; // override query strategy and enable feed display when searching globally if ($search && $search_mode == "all_feeds") { $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; /* tags */ } elseif (!is_numeric($feed)) { $query_strategy_part = "true"; $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n id = feed_id) as feed_title,"; } elseif ($search && $search_mode == "this_cat") { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; if ($feed > 0) { if ($include_children) { $subcats = getChildCategories($feed, $owner_uid); array_push($subcats, $feed); $cats_qpart = join(",", $subcats); } else { $cats_qpart = $feed; } $query_strategy_part = "ttrss_feeds.cat_id IN ({$cats_qpart})"; } else { $query_strategy_part = "ttrss_feeds.cat_id IS NULL"; } } elseif ($feed > 0) { if ($cat_view) { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; if ($include_children) { # sub-cats $subcats = getChildCategories($feed, $owner_uid); array_push($subcats, $feed); $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")"; } else { $query_strategy_part = "cat_id = '{$feed}'"; } } else { $query_strategy_part = "feed_id = '{$feed}'"; } } elseif ($feed == 0 && !$cat_view) { // archive virtual feed $query_strategy_part = "feed_id IS NULL"; $allow_archived = true; } elseif ($feed == 0 && $cat_view) { // uncategorized $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } elseif ($feed == -1) { // starred virtual feed $query_strategy_part = "marked = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_marked DESC, date_entered DESC, updated DESC"; } } elseif ($feed == -2) { // published virtual feed OR labels category if (!$cat_view) { $query_strategy_part = "published = true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; if (!$override_order) { $override_order = "last_published DESC, date_entered DESC, updated DESC"; } } else { $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n ttrss_user_labels2.article_id = ref_id"; } } elseif ($feed == -6) { // recently read $query_strategy_part = "unread = false AND last_read IS NOT NULL"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; $ignore_vfeed_group = true; if (!$override_order) { $override_order = "last_read DESC"; } /*} elseif ($feed == -7) { // shared $query_strategy_part = "uuid != ''"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $allow_archived = true; */ } elseif ($feed == -3) { // fresh virtual feed $query_strategy_part = "unread = true AND score >= 0"; $intl = get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid); if (DB_TYPE == "pgsql") { $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '{$intl} hour' "; } else { $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) "; } $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } elseif ($feed == -4) { // all articles virtual feed $allow_archived = true; $query_strategy_part = "true"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; } elseif ($feed <= LABEL_BASE_INDEX) { // labels $label_id = feed_to_label_id($feed); $query_strategy_part = "label_id = '{$label_id}' AND\n ttrss_labels2.id = ttrss_user_labels2.label_id AND\n ttrss_user_labels2.article_id = ref_id"; $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2"; $allow_archived = true; } else { $query_strategy_part = "true"; } $order_by = "score DESC, date_entered DESC, updated DESC"; if ($view_mode == "unread_first") { $order_by = "unread DESC, {$order_by}"; } if ($override_order) { $order_by = $override_order; } if ($override_strategy) { $query_strategy_part = $override_strategy; } if ($override_vfeed) { $vfeed_query_part = $override_vfeed; } $feed_title = ""; if ($search) { $feed_title = T_sprintf("Search results: %s", $search); } elseif ($cat_view) { $feed_title = getCategoryTitle($feed); } elseif (is_numeric($feed) && $feed > 0) { $result = db_query("SELECT title,site_url,last_error,last_updated\n FROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}"); $feed_title = db_fetch_result($result, 0, "title"); $feed_site_url = db_fetch_result($result, 0, "site_url"); $last_error = db_fetch_result($result, 0, "last_error"); $last_updated = db_fetch_result($result, 0, "last_updated"); } else { $feed_title = getFeedTitle($feed); } $content_query_part = "content, "; if (is_numeric($feed)) { if ($feed >= 0) { $feed_kind = "Feeds"; } else { $feed_kind = "Labels"; } if ($limit_query_part) { $offset_query_part = "OFFSET {$offset}"; } // proper override_order applied above if ($vfeed_query_part && !$ignore_vfeed_group && get_pref('VFEED_GROUP_BY_FEED', $owner_uid)) { if (!$override_order) { $order_by = "ttrss_feeds.title, {$order_by}"; } else { $order_by = "ttrss_feeds.title, {$override_order}"; } } if (!$allow_archived) { $from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds{$ext_tables_part}"; $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND"; } else { $from_qpart = "ttrss_entries{$ext_tables_part},ttrss_user_entries\n LEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)"; } if ($vfeed_query_part) { $vfeed_query_part .= "favicon_avg_color,"; } if ($start_ts) { $start_ts_formatted = date("Y/m/d H:i:s", strtotime($start_ts)); $start_ts_query_part = "date_entered >= '{$start_ts_formatted}' AND"; } else { $start_ts_query_part = ""; } $query = "SELECT DISTINCT\n date_entered,\n guid,\n ttrss_entries.id,ttrss_entries.title,\n updated,\n label_cache,\n tag_cache,\n always_display_enclosures,\n site_url,\n note,\n num_comments,\n comments,\n int_id,\n uuid,\n lang,\n hide_images,\n unread,feed_id,marked,published,link,last_read,orig_feed_id,\n last_marked, last_published,\n {$vfeed_query_part}\n {$content_query_part}\n author,score\n FROM\n {$from_qpart}\n WHERE\n {$feed_check_qpart}\n ttrss_user_entries.ref_id = ttrss_entries.id AND\n ttrss_user_entries.owner_uid = '{$owner_uid}' AND\n {$search_query_part}\n {$start_ts_query_part}\n {$filter_query_part}\n {$view_query_part}\n {$since_id_part}\n {$query_strategy_part} ORDER BY {$order_by}\n {$limit_query_part} {$offset_query_part}"; if ($_REQUEST["debug"]) { print $query; } $result = db_query($query); } else { // browsing by tag $select_qpart = "SELECT DISTINCT " . "date_entered," . "guid," . "note," . "ttrss_entries.id as id," . "title," . "updated," . "unread," . "feed_id," . "orig_feed_id," . "marked," . "num_comments, " . "comments, " . "tag_cache," . "label_cache," . "link," . "lang," . "uuid," . "last_read," . "(SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images," . "last_marked, last_published, " . $since_id_part . $vfeed_query_part . $content_query_part . "score "; $feed_kind = "Tags"; $all_tags = explode(",", $feed); if ($search_mode == 'any') { $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")"; $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags "; $where_qpart = " WHERE " . "ref_id = ttrss_entries.id AND " . "ttrss_user_entries.owner_uid = {$owner_uid} AND " . "post_int_id = int_id AND {$tag_sql} AND " . $view_query_part . $search_query_part . $query_strategy_part . " ORDER BY {$order_by} " . $limit_query_part; } else { $i = 1; $sub_selects = array(); $sub_ands = array(); foreach ($all_tags as $term) { array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = {$owner_uid}) as A{$i}"); $i++; } if ($i > 2) { $x = 1; $y = 2; do { array_push($sub_ands, "A{$x}.post_int_id = A{$y}.post_int_id"); $x++; $y++; } while ($y < $i); } array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = {$owner_uid}"); array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id"); $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries"; $where_qpart = " WHERE " . implode(" AND ", $sub_ands); } // error_log("TAG SQL: " . $tag_sql); // $tag_sql = "tag_name = '$feed'"; DEFAULT way // error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]"); $result = db_query($select_qpart . $from_qpart . $where_qpart); } return array($result, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words); }