From: dhawes Date: Sun, 23 Jan 2005 16:16:28 +0000 (+0000) Subject: latest changes to rss_client block. Now uses latest magpie file for fetch, parse... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=2965682a21d17212e7a5e9ba409cb66f78c3f36b;p=moodle.git latest changes to rss_client block. Now uses latest magpie file for fetch, parse and cache. Still caches the result string as well to avoid excessive file reads and network hits. Fixed bug where non-admin users were not seeing the add/edit feeds link within the block when all users are allowed to edit. Now uses moodles' format_text function on entire block contents. --- diff --git a/blocks/rss_client/block_rss_client.php b/blocks/rss_client/block_rss_client.php index ddc168144d..2458d6520a 100644 --- a/blocks/rss_client/block_rss_client.php +++ b/blocks/rss_client/block_rss_client.php @@ -62,21 +62,19 @@ class block_rss_client extends block_base { } } - if ($editing) { - $submitters = $CFG->block_rss_client_submitters; - - $isteacher = false; - $courseid = ''; - if ($this->instance->pagetype == MOODLE_PAGE_COURSE) { - $isteacher = isteacher($this->instance->pageid); - $courseid = $this->instance->pageid; - } + $submitters = $CFG->block_rss_client_submitters; - //if the user is an admin or course teacher then allow the user to - //assign categories to other uses than personal - if ( isadmin() || $submitters == 0 || ($submitters == 2 && $isteacher) ) { - $output .= '
'. get_string('block_rss_feeds_add_edit', 'block_rss_client') .'


'; - } + $isteacher = false; + $courseid = ''; + if ($this->instance->pagetype == MOODLE_PAGE_COURSE) { + $isteacher = isteacher($this->instance->pageid); + $courseid = $this->instance->pageid; + } + + //if the user is an admin, course teacher, or all user are allowed - + // then allow the user to add rss feeds + if ( isadmin() || $submitters == SUBMITTERS_ALL_ACCOUNT_HOLDERS || ($submitters == SUBMITTERS_ADMIN_AND_TEACHER && $isteacher) ) { + $output .= '
'. get_string('block_rss_feeds_add_edit', 'block_rss_client') .'


'; } // Daryl Hawes note: if count of rssidarray is greater than 1 @@ -86,7 +84,8 @@ class block_rss_client extends block_base { $numids = count($rssidarray); $count = 0; foreach ($rssidarray as $rssid) { - $output .= $this->get_rss_by_id($rssid, $display_description, $shownumentries, ($numids > 1) ? true : false); + $rssfeedstring = $this->get_rss_by_id($rssid, $display_description, $shownumentries, ($numids > 1) ? true : false); + $output .= format_text($rssfeedstring); if ($numids > 1 && $count != $numids -1) { $output .= '
'; } @@ -111,55 +110,67 @@ class block_rss_client extends block_base { } /** - * + * @param int $rssid The feed to be displayed + * @param bool $display_description Should the description information from the feed be displayed or simply the title? + * @param int $shownumentries The maximum number of feed entries to be displayed. + * @param bool $showtitle True if the feed title should be displayed above the feed entries. + * @return string|NULL */ function get_rss_by_id($rssid, $display_description, $shownumentries, $showtitle=false) { global $CFG; - $returnstring = ''; + $returnstring = ''; + $now = time(); + require_once($CFG->dirroot .'/rss/rsslib.php'); + require_once(MAGPIE_DIR .'rss_fetch.inc'); - // use rsslib.php function to verify that the cache feed file - // exists and has not timed out. - if (rss_cache_valid_by_id($rssid) && isset($this->config->{$rssid})) { - // If cache has not timed out and we have cached the display string - // in block config return that rather than opening and reading - // from file and reparsing the cached xml - return stripslashes_safe($this->config->{'rssid'.$rssid}); + // Check if there is a cached string which has not timed out. + if (isset($this->config->{'rssid'. $rssid}) && + isset($this->config->{'rssid'. $rssid .'timestamp'}) && + $this->config->{'rssid'. $rssid .'timestamp'} >= $now - $CFG->block_rss_timeout * 60) { + // If the cached string is not too stale + // use it rather than going any further + return stripslashes_safe($this->config->{'rssid'. $rssid}); } $rss_record = get_record('block_rss_client', 'id', $rssid); if (isset($rss_record) && isset($rss_record->id)) { - $rss = rss_get_feed($rss_record->id, $rss_record->url, $rss_record->type); - - if ($CFG->debug && (empty($rss) || !empty($rss->ERROR))) { - // There was a failure in loading the rss feed, print link to full error text - if (!empty($rss) && !empty($rss->ERROR)) { - print 'Error loading a feed.
'; + + // By capturing the output from fetch_rss this way + // error messages do not display and clutter up the moodle interface + // however, we do lose out on seeing helpful messages like "cache hit", etc. + ob_start(); + $rss = fetch_rss($rss_record->url); + $rsserror = ob_get_contents(); + ob_end_clean(); + + if ($rss === false) { + if ($CFG->debug && !empty($rsserror)) { + // There was a failure in loading the rss feed, print link to full error text + print 'Error loading a feed.
'; //Daryl Hawes note: localize this line } return; } if ($showtitle) { - $returnstring .= '

'. $rss_record->title .'

'; + $returnstring .= '

'. $rss_record->title .'

'; } if ($shownumentries > 0 && $shownumentries < count($rss->items) ) { - $count_to = $shownumentries; - } else { - $count_to = count($rss->items); + $rss->items = array_slice($rss->items, 0, $shownumentries); } - for ($y = 0; $y < $count_to; $y++) { - if ($rss->items[$y]['title'] == '') { - $rss->items[$y]['title'] = substr(strip_tags($rss->items[$y]['description']), 0, 20) . '...'; + foreach ($rss->items as $item) { + if ($item['title'] == '') { + $item['title'] = substr(strip_tags($item['description']), 0, 20) . '...'; } - if ($rss->items[$y]['link'] == '') { - $rss->items[$y]['link'] = $rss->items[$y]['guid']; + if ($item['link'] == '') { + $item['link'] = $item['guid']; } - $returnstring .= '' ."\n"; + $returnstring .= '' ."\n"; - if ($display_description && !empty($rss->items[$y]['description'])){ - $returnstring .= '
'.clean_text($rss->items[$y]['description']) . '
' ."\n"; + if ($display_description && !empty($item['description'])){ + $returnstring .= '
'.clean_text($item['description']) . '
' ."\n"; } } @@ -174,7 +185,8 @@ class block_rss_client extends block_base { $returnstring .= '
'; // store config setting for this rssid so we do not need to read from file each time - $this->config->{'rssid'.$rssid} = addslashes($returnstring); + $this->config->{'rssid'. $rssid} = addslashes($returnstring); + $this->config->{'rssid'. $rssid .'timestamp'} = $now; $this->instance_config_save($this->config); return $returnstring; } diff --git a/blocks/rss_client/block_rss_client_action.php b/blocks/rss_client/block_rss_client_action.php index 78e3d3a03e..5a5f5a1cb4 100644 --- a/blocks/rss_client/block_rss_client_action.php +++ b/blocks/rss_client/block_rss_client_action.php @@ -1,8 +1,8 @@ dirroot .'/rss/rsslib.php'); global $USER, $CFG; - require($CFG->dirroot .'/rss/rsslib.php'); require_login(); @@ -35,7 +35,7 @@ } //if the user is an admin or course teacher then allow the user to //assign categories to other uses than personal - if (! ( isadmin() || $submitters == 0 || ($submitters == 2 && $isteacher) ) ) { + if (! ( isadmin() || $submitters == SUBMITTERS_ALL_ACCOUNT_HOLDERS || ($submitters == SUBMITTERS_ADMIN_AND_TEACHER && $isteacher) ) ) { error(get_string('noguestpost', 'forum'), $referrer); } diff --git a/blocks/rss_client/config_global.html b/blocks/rss_client/config_global.html index 80ae8b0248..d107df6813 100644 --- a/blocks/rss_client/config_global.html +++ b/blocks/rss_client/config_global.html @@ -1,3 +1,6 @@ +dirroot .'/rss/rsslib.php'); +?> @@ -23,9 +26,9 @@ $selected = '0'; $CFG->block_rss_client_submitters = 0; } - $options = array ( '0' => 'All members', - '1' => 'Admins only', - '2' => 'Admins and teachers'); + $options = array ( SUBMITTERS_ALL_ACCOUNT_HOLDERS => get_string('everybody'), + SUBMITTERS_ADMIN_ONLY => get_string('administrators'), + SUBMITTERS_ADMIN_AND_TEACHER => get_string('administratorsandteachers') ); choose_from_menu ($options, 'block_rss_client_submitters', $selected); ?> diff --git a/blocks/rss_client/db/mysql.sql b/blocks/rss_client/db/mysql.sql index 7067cc9fd8..78da808b09 100644 --- a/blocks/rss_client/db/mysql.sql +++ b/blocks/rss_client/db/mysql.sql @@ -14,8 +14,8 @@ CREATE TABLE prefix_block_rss_client ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL default '0', `title` varchar(64) NOT NULL default '', + `preferredtitle` varchar(64) NOT NULL default '', `description` varchar(128) NOT NULL default '', `url` varchar(255) NOT NULL default '', - `type` char(1) NOT NULL default 'R', PRIMARY KEY (`id`) -) TYPE=MyISAM COMMENT='Cached remote news feeds'; \ No newline at end of file +) TYPE=MyISAM COMMENT='Remote news feed information. Contains the news feed id, the userid of the user who added the feed, the title of the feed itself and a description of the feed contents along with the url used to access the remote feed. Preferredtitle is a field for future use - intended to allow for custom titles rather than those found in the feed.'; \ No newline at end of file

block_rss_client_num_entries: