Extended Actions to include Select by tag (add local modifications, fix

display for tags starting with a number)
This commit is contained in:
Craig Meyer 2011-08-11 18:51:00 -04:00 committed by Andrew Dolgov
parent 8efb5f62e8
commit 147f563228
7 changed files with 173 additions and 41 deletions

View file

@ -263,6 +263,8 @@
@$vgroup_last_feed = db_escape_string($_REQUEST["vgrlf"]); @$vgroup_last_feed = db_escape_string($_REQUEST["vgrlf"]);
$order_by = db_escape_string($_REQUEST["order_by"]); $order_by = db_escape_string($_REQUEST["order_by"]);
if (is_numeric($feed)) $feed = (int) $feed;
/* Feed -5 is a special case: it is used to display auxiliary information /* Feed -5 is a special case: it is used to display auxiliary information
* when there's nothing to load - e.g. no stuff in fresh feed */ * when there's nothing to load - e.g. no stuff in fresh feed */
@ -277,10 +279,10 @@
$label_feed = -11-$feed; $label_feed = -11-$feed;
$result = db_query($link, "SELECT id FROM ttrss_labels2 WHERE $result = db_query($link, "SELECT id FROM ttrss_labels2 WHERE
id = '$label_feed' AND owner_uid = " . $_SESSION['uid']); id = '$label_feed' AND owner_uid = " . $_SESSION['uid']);
} else if (!$cat_view && $feed > 0) { } else if (!$cat_view && is_numeric($feed) && $feed > 0) {
$result = db_query($link, "SELECT id FROM ttrss_feeds WHERE $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
id = '$feed' AND owner_uid = " . $_SESSION['uid']); id = '$feed' AND owner_uid = " . $_SESSION['uid']);
} else if ($cat_view && $feed > 0) { } else if ($cat_view && is_numeric($feed) && $feed > 0) {
$result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE
id = '$feed' AND owner_uid = " . $_SESSION['uid']); id = '$feed' AND owner_uid = " . $_SESSION['uid']);
} }

22
db.php
View file

@ -3,14 +3,14 @@
require_once "config.php"; require_once "config.php";
function db_connect($host, $user, $pass, $db) { function db_connect($host, $user, $pass, $db) {
if (DB_TYPE == "pgsql") { if (DB_TYPE == "pgsql") {
$string = "dbname=$db user=$user"; $string = "dbname=$db user=$user";
if ($pass) { if ($pass) {
$string .= " password=$pass"; $string .= " password=$pass";
} }
if ($host) { if ($host) {
$string .= " host=$host"; $string .= " host=$host";
} }
@ -30,10 +30,10 @@ function db_connect($host, $user, $pass, $db) {
} else if (DB_TYPE == "mysql") { } else if (DB_TYPE == "mysql") {
$link = mysql_connect($host, $user, $pass); $link = mysql_connect($host, $user, $pass);
if ($link) { if ($link) {
$result = mysql_select_db($db, $link); $result = mysql_select_db($db, $link);
if (!$result) { if (!$result) {
die("Can't select DB: " . mysql_error($link)); die("Can't select DB: " . mysql_error($link));
} }
return $link; return $link;
} else { } else {
die("Connection failed: " . mysql_error($link)); die("Connection failed: " . mysql_error($link));
@ -44,7 +44,7 @@ function db_connect($host, $user, $pass, $db) {
function db_escape_string($s, $strip_tags = true) { function db_escape_string($s, $strip_tags = true) {
if ($strip_tags) $s = strip_tags($s); if ($strip_tags) $s = strip_tags($s);
if (DB_TYPE == "pgsql") { if (DB_TYPE == "pgsql") {
return pg_escape_string($s); return pg_escape_string($s);
} else { } else {
return mysql_real_escape_string($s); return mysql_real_escape_string($s);
@ -57,7 +57,7 @@ function db_query($link, $query, $die_on_error = true) {
if (!$result) { if (!$result) {
$query = htmlspecialchars($query); // just in case $query = htmlspecialchars($query); // just in case
if ($die_on_error) { if ($die_on_error) {
die("Query <i>$query</i> failed [$result]: " . pg_last_error($link)); die("Query <i>$query</i> failed [$result]: " . pg_last_error($link));
} }
} }
return $result; return $result;
@ -131,4 +131,8 @@ function db_last_error($link) {
} }
} }
function db_quote($str){
return("'$str'");
}
?> ?>

View file

@ -1619,4 +1619,54 @@ function showFeedsWithErrors() {
} }
/* new support functions for SelectByTag */
function get_all_tags(selObj){
try {
if( !selObj ) return "";
var result = "";
var len = selObj.options.length;
for (var i=0; i < len; i++){
if (selObj.options[i].selected) {
result += selObj[i].value + "%2C"; // is really a comma
}
}
if (result.length > 0){
result = result.substr(0, result.length-3); // remove trailing %2C
}
return(result);
} catch (e) {
exception_error("get_all_tags", e);
}
}
function get_radio_checked(radioObj) {
try {
if (!radioObj) return "";
var len = radioObj.length;
if (len == undefined){
if(radioObj.checked){
return(radioObj.value);
} else {
return("");
}
}
for( var i=0; i < len; i++ ){
if( radioObj[i].checked ){
return( radioObj[i].value);
}
}
} catch (e) {
exception_error("get_radio_checked", e);
}
return("");
}

View file

@ -2153,7 +2153,7 @@
} }
// try to remove possible duplicates from feed counter cache // try to remove possible duplicates from feed counter cache
ccache_cleanup($link, $_SESSION["uid"]); // ccache_cleanup($link, $_SESSION["uid"]);
} }
} else { } else {
@ -3250,7 +3250,7 @@
return "Unknown label ($label_id)"; return "Unknown label ($label_id)";
} }
} else if ($id > 0) { } else if (is_numeric($id) && $id > 0) {
$result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$id'"); $result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$id'");
if (db_num_rows($result) == 1) { if (db_num_rows($result) == 1) {
return db_fetch_result($result, 0, "title"); return db_fetch_result($result, 0, "title");
@ -3427,6 +3427,7 @@
return $search_query_part; return $search_query_part;
} }
function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false) { function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false) {
if (!$owner_uid) $owner_uid = $_SESSION["uid"]; if (!$owner_uid) $owner_uid = $_SESSION["uid"];
@ -3626,7 +3627,7 @@
if ($cat_view) { if ($cat_view) {
$feed_title = getCategoryTitle($link, $feed); $feed_title = getCategoryTitle($link, $feed);
} else { } else {
if ((int)$feed == $feed && $feed > 0) { if (is_numeric($feed) && $feed > 0) {
$result = db_query($link, "SELECT title,site_url,last_error $result = db_query($link, "SELECT title,site_url,last_error
FROM ttrss_feeds WHERE id = '$feed' AND owner_uid = $owner_uid"); FROM ttrss_feeds WHERE id = '$feed' AND owner_uid = $owner_uid");
@ -3699,31 +3700,66 @@
} else { } else {
// browsing by tag // browsing by tag
$feed_kind = "Tags"; $select_qpart = "SELECT DISTINCT " .
"date_entered," .
"guid," .
"note," .
"ttrss_entries.id as id," .
"title," .
"updated," .
"unread," .
"feed_id," .
"orig_feed_id," .
"marked," .
"link," .
"last_read," .
SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms," .
$vfeed_query_part .
$content_query_part .
SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms," .
"score ";
$result = db_query($link, "SELECT DISTINCT $feed_kind = "Tags";
date_entered, $all_tags = explode(",", $feed);
guid, if ($search_mode == 'any') {
note, $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")";
ttrss_entries.id as id,title, $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags ";
updated, $where_qpart = " WHERE " .
unread,feed_id,orig_feed_id, "ref_id = ttrss_entries.id AND " .
marked,link,last_read, "ttrss_user_entries.owner_uid = $owner_uid AND " .
".SUBSTRING_FOR_DATE."(last_read,1,19) as last_read_noms, "post_int_id = int_id AND $tag_sql AND " .
$vfeed_query_part $view_query_part .
$content_query_part $search_query_part .
".SUBSTRING_FOR_DATE."(updated,1,19) as updated_noms, $query_strategy_part . " ORDER BY $order_by " .
score $limit_query_part;
FROM
ttrss_entries,ttrss_user_entries,ttrss_tags } else {
WHERE $i = 1;
ref_id = ttrss_entries.id AND $sub_selects = array();
ttrss_user_entries.owner_uid = '$owner_uid' AND $sub_ands = array();
post_int_id = int_id AND tag_name = '$feed' AND foreach ($all_tags as $term) {
$view_query_part 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");
$search_query_part $i++;
$query_strategy_part ORDER BY $order_by }
$limit_query_part"); 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); return array($result, $feed_title, $feed_site_url, $last_error);
@ -4976,7 +5012,7 @@
catchupArticlesById($link, $ids, $cmode); catchupArticlesById($link, $ids, $cmode);
} */ } */
if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) { if ($subop == "ForceUpdate" && $feed && is_numeric($feed) > 0) {
update_rss_feed($link, $feed, true); update_rss_feed($link, $feed, true);
} }
@ -4996,7 +5032,7 @@
// FIXME: might break tag display? // FIXME: might break tag display?
if ($feed > 0 && !$cat_view) { if (is_numeric($feed) && $feed > 0 && !$cat_view) {
$result = db_query($link, $result = db_query($link,
"SELECT id FROM ttrss_feeds WHERE id = '$feed' LIMIT 1"); "SELECT id FROM ttrss_feeds WHERE id = '$feed' LIMIT 1");
@ -5041,6 +5077,11 @@
if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H0", $timing_info); if ($_REQUEST["debug"]) $timing_info = print_checkpoint("H0", $timing_info);
// error_log("format_headlines_list: [" . $feed . "] subop [" . $subop . "]");
if( $search_mode == '' && $subop != '' ){
$search_mode = $subop;
}
// error_log("search_mode: " . $search_mode);
$qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view,
$search, $search_mode, $match_on, $override_order, $offset); $search, $search_mode, $match_on, $override_order, $offset);

View file

@ -737,8 +737,38 @@
print "</div>"; print "</div>";
print "]]></content>"; print "]]></content>";
}
//return; if ($id == 'printTagSelect') {
print "<title>" . __('Select item(s) by tags') . "</title>";
print "<content><![CDATA[";
print __("Match:"). "&nbsp;" .
"<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" checked value=\"any\" name=\"tag_mode\">&nbsp;Any&nbsp;";
print "<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" value=\"all\" name=\"tag_mode\">&nbsp;All&nbsp;";
print "&nbsp;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']."
AND 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')),
get_radio_checked($('tag_mode')));\">" . __('Display entries') . "</button>";
print "&nbsp;";
print "<button dojoType=\"dijit.form.Button\"
onclick=\"return closeInfoBox()\">" .
__('Close this window') . "</button>";
print "</div>";
print "]]></content>";
} }
if ($id == "emailArticle") { if ($id == "emailArticle") {

View file

@ -350,6 +350,10 @@ function quickMenuGo(opid) {
displayDlg("printTagCloud"); displayDlg("printTagCloud");
} }
if (opid == "qmcTagSelect") {
displayDlg("printTagSelect");
}
if (opid == "qmcSearch") { if (opid == "qmcSearch") {
search(); search();
return; return;

View file

@ -171,6 +171,7 @@
<div dojoType="dijit.MenuItem" disabled="1"><?php echo __('Other actions:') ?></div> <div dojoType="dijit.MenuItem" disabled="1"><?php echo __('Other actions:') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcDigest')"><?php echo __('Switch to digest...') ?></div> <div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcDigest')"><?php echo __('Switch to digest...') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcTagCloud')"><?php echo __('Show tag cloud...') ?></div> <div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcTagCloud')"><?php echo __('Show tag cloud...') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcTagSelect')"><?php echo __('Select by tags...') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcAddLabel')"><?php echo __('Create label...') ?></div> <div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcAddLabel')"><?php echo __('Create label...') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcAddFilter')"><?php echo __('Create filter...') ?></div> <div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcAddFilter')"><?php echo __('Create filter...') ?></div>
<div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcHKhelp')"><?php echo __('Keyboard shortcuts help') ?></div> <div dojoType="dijit.MenuItem" onclick="quickMenuGo('qmcHKhelp')"><?php echo __('Keyboard shortcuts help') ?></div>