From e8181a56b410255c85ba176dcad34b694bec673a Mon Sep 17 00:00:00 2001 From: dhawes Date: Mon, 17 Jan 2005 18:03:15 +0000 Subject: [PATCH] moved functions from templib.php to rsslib.php for rss_client block --- rss/rsslib.php | 323 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) diff --git a/rss/rsslib.php b/rss/rsslib.php index 6003bc37731ef..27da3bf6d3fb7 100644 --- a/rss/rsslib.php +++ b/rss/rsslib.php @@ -321,4 +321,327 @@ function rss_full_tag($tag,$level=0,$endline=true,$content,$to_utf=true) { return $st.$co.$et; } +//////////////////// LIBRARY FUNCTIONS FOR RSS_CLIENT BLOCK //////////////// + +//initialize config vars for rss_client block if missing +if (empty($CFG->block_rss_client_submitters) ) { + $CFG->block_rss_client_submitters = 1; //default to admin only +} +if (empty($CFG->block_rss_client_num_entries) ) { + $CFG->block_rss_client_num_entries = 5; //default to 5 entries per block +} +if (empty($CFG->block_rss_timeout) ) { + $CFG->block_rss_timeout = 30; +} + +/** + * Determines whether or not to get a news feed remotely or from cache and reads it into a string + * @param int rssid - id of feed in blog_rss table + * @param string url - url of remote feed + * @param string type - either 'A' or 'R' where A is an atom feed and R is either rss or rdf + * @return Atom|MagpieRSS|null This function returns an Atom object in the case of an Atom feed, a MagpieRSS object in the case of an RDF/RSS feed or null if there was an error loading the remote feed. + * NOTE that this function requires allow_url_fopen be On in your php.ini file + * (it may be off for security by your web host) + */ +function rss_get_feed($rssid, $url, $type) { + + global $CFG; + $writetofile = false; + $urlfailurestring = 'Failed to open remote feed at: ' . $url .'
allow_url_fopen needs to be On in the php.ini file for this file wrapper call to work. Please refer to http://us2.php.net/filesystem'; + $filefailurestring = 'Could not open the file located at: '; + $secs = $CFG->block_rss_timeout * 60; + + // If moodle dataroot cache folder is missing create it + if (!file_exists($CFG->dataroot .'/cache/')) { + mkdir($CFG->dataroot .'/cache'); + } + // If moodle dataroot cache/rsscache folder is missing create it + if (!file_exists($CFG->dataroot .'/cache/rsscache/')) { + mkdir($CFG->dataroot .'/cache/rsscache'); + } + + $file = $CFG->dataroot .'/cache/rsscache/'. $rssid .'.xml'; +// echo "file = ". $file; //debug + + //if feed in cache + if (file_exists($file)) { + //check age of cache file + // echo "file exists $file"; //debug + if ($CFG->debug){ + $data = stat($file); + } else { + $data = @stat($file); + } + $now = time(); + if (($now - $data[10]) > $secs) { + // The cached file has expired. Attempt to read fresh from source + $xml = load_feed_from_url($url); + if ($xml) { + //success + $writetofile = true; + } else { + // Failed to load remote feed. Since the file exists attempt to read from cache + if ($CFG->debug) { + print $urlfailurestring; + } + $xml = load_feed_from_file($file); + if (!$xml) { + // Failed to load from cache as well! + if ($CFG->debug) { + print $filefailurestring . $file; + return; + } + } + } + } else { + // Cached file has not expired. Attempt to read from cached file. + $xml = load_feed_from_file($file); + if (!$xml) { + // Failed to load from cache, attempt to read from source + if ($CFG->debug) { + print $filefailurestring . $file; + } + $xml = load_feed_from_url($url); + if ($xml) { + // success + $writetofile = true; + } else { + // Failed to read from source as well! + if ($CFG->debug) { + print $urlfailurestring; + } + return; + } + } + } + } else { + // No cached fil at all, read from source + $xml = load_feed_from_url($url); + if ($xml) { + //success + $writetofile = true; + } else { + // Failed to read from source url! + if ($CFG->debug) { + print $urlfailurestring; + } + return; + } + } + + //print_object($xml); //debug + if ($CFG->debug){ + $xmlstr = implode(' ', $xml); + } else { + $xmlstr = @implode(' ', $xml); + } + + if ( $writetofile && !empty($xmlstr) ) { //write file to cache + // jlb: adding file:/ to the start of the file name fixed + // some caching problems that I was experiencing. + //$file="file:/" + $file; + file_put_contents($file, $xmlstr); + } + + if ($type == 'A') { + //note: Atom is being modified by a working group + //http://www.mnot.net/drafts/draft-nottingham-atom-format-02.html + include_once($CFG->dirroot .'/rss/class.Atom.php'); + $atom = new Atom($xmlstr); + $atom->channel = $atom->feed; + $atom->items = $atom->entries; + $atom->channel['description'] = $atom->channel['tagline']; + for($i=0;$iitems);$i++) { + $atom->items[$i]['description'] = $atom->items[$i]['content']; + } + return $atom; + } else { + include_once($CFG->dirroot .'/rss/class.RSS.php'); + $rss = new MagpieRSS($xmlstr); + return $rss; + } +} + +/** + * @param string $file The path to the cached feed to load + */ +function load_feed_from_file($file) { + global $CFG; +// echo "read from cache"; //debug + //read in from cache + if ($CFG->debug){ + $xml = file($file); + } else { + $xml = @file($file); + } + return $xml; +} + +/** + * @param string $url The url of the remote news feed to load + */ +function load_feed_from_url($url) { + global $CFG; +// echo "read from original"; //debug + //read from source + if ($CFG->debug){ + $xml = file($url); + } else { + $xml = @file($url); + } + return $xml; +} + +/** + * @param int $rssid . + */ +function rss_display_feeds($rssid='none') { + global $db, $USER, $CFG, $THEME; + global $blogid; //hackish, but if there is a blogid it would be good to preserve it + + $closeTable = false; + //Daryl Hawes note: convert this sql statement to a moodle function call + if ($rssid != 'none'){ + $sql = 'SELECT * FROM '. $CFG->prefix .'block_rss_client WHERE id='. $rssid; + } else { + $sql = 'SELECT * FROM '. $CFG->prefix .'block_rss_client'; + } + + $res = $db->Execute($sql); +// print_object($res); //debug + + if ($res->fields){ + $closeTable = true; + ?> + + + + + + + fields){ + while(!$res->EOF) { + $editString = ' '; + $deleteString = ' '; + if ($res->fields['userid'] == $USER->id || isadmin()){ + $editString = ''; + $editString .= ''. get_string('edit');
+$editString .= ''; + + $deleteString = ''; + $deleteString .= ''. get_string('delete');
+$deleteString .= ''; + } + print '' ."\n"; + print '' ."\n"; + print ''."\n"; + $res->MoveNext(); + } + } + if ($closeTable){ + print '
'. $res->fields['title'] .'
' ."\n"; + print $res->fields['description'] .' 
' ."\n"; + print $res->fields['url'] .'  ' ."\n"; + print '(Validate)'; + print '
'. $editString .''. $deleteString .'
'."\n"; + } +} + +/** + * @param string $act . + * @param string $url . + * @param int $rssid . + * @param string $rsstype . + * @param bool $printnow . + */ +function rss_get_form($act, $url, $rssid, $rsstype, $printnow=true) { + global $USER, $CFG, $_SERVER, $blockid, $blockaction; + global $blogid; //hackish, but if there is a blogid it would be good to preserve it + + $returnstring = '
'; + if ($act == 'rss_edit') { + $returnstring .= get_string('edit'); + } else { + $returnstring .= get_string('block_rss_add_new', 'block_rss_client'); + } + $returnstring .= ' '. get_string('block_rss_feed', 'block_rss_client'); + + $returnstring .= '
'; + + $returnstring .= '
'; + $returnstring .= 'URL:
'; + $returnstring .= ''; + $returnstring .= ' 
'; + + $returnstring .= '
    ' . get_string('block_rss_find_more_feeds', 'block_rss_client'); +// removed as this is possibly out of place here +// $returnstring .= '
  • syndic8
  • NewsIsFree'; + $returnstring .= '
'; + $returnstring .= '
'; + + if ($printnow){ + print $returnstring; + } + return $returnstring; +} + +/** + * added by Daryl Hawes for rss/atom feeds + * found at http://us4.php.net/manual/en/function.fwrite.php + * added check for moodle debug option. if off then use '@' to suppress error/warning messages + * @param string $filename . + * @param string $content . + */ +if (! function_exists('file_put_contents')){ + function file_put_contents($filename, $content) { + global $CFG; + $nr_of_bytes = 0; + if ($CFG->debug){ + if (($file = fopen($filename, 'w+')) === false) return false; + } else { + if (($file = @fopen($filename, 'w+')) === false) return false; + } + if ($CFG->debug){ + if ($nr_of_bytes = fwrite($file, $content, strlen($content)) === false) return false; + } else { + if ($nr_of_bytes = @fwrite($file, $content, strlen($content)) === false) return false; + } + fclose($file); + return $nr_of_bytes; + } +} ?>