validFeedList = FALSE;
$this->newsList = array();
$this->feedList = array();
$this->feedIcon = array();
$this->lastProcessed = 0;
$this->truncateCount = 150; // Set a pref for these two later
$this->truncateMore = '...';
$this->useCache = $e107->ecache->UserCacheActive; // Have our own local copy - should be faster to access
}
// Ensures the feed list is loaded - uses cache if available
function readFeedList($force=FALSE)
{
$sql = e107::getDb();
if ($this->validFeedList && !$force)
{
return; // Already got list
}
if($this->useCache) // Cache enabled - try to read from that first
{
$eArrayStorage = e107::getArrayStorage();
global $e107;
if (!$force && $temp = $e107->ecache->retrieve(NEWSFEED_LIST_CACHE_TAG))
{
$this->feedList = $eArrayStorage->ReadArray($temp);
return;
}
}
$fieldList = '*';
if ($this->useCache)
{ // Get all fields except the actual news
$fieldList = 'newsfeed_id, newsfeed_name, newsfeed_url, newsfeed_timestamp, newsfeed_description, newsfeed_image, newsfeed_active, newsfeed_updateint';
}
if ($sql -> db_Select("newsfeed", $fieldList, '`newsfeed_active` > 0')) // Read in all the newsfeed info on the first go
{
while ($row = $sql->db_Fetch(MYSQL_ASSOC))
{
$nfID = $row['newsfeed_id'];
if (isset($row['newsfeed_data']))
{
$this->newsList[$nfID]['newsfeed_data'] = $row['newsfeed_data']; // Pull out the actual news - might as well since we're here
$this->newsList[$nfID]['newsfeed_timestamp'] = $row['newsfeed_timestamp'];
unset($row['newsfeed_data']); // Don't keep this in memory twice!
}
$this->feedList[$nfID] = $row; // Put the rest into the feed data
}
$this->validFeedList = TRUE;
}
if ($this->useCache)
{ // Cache enabled - we need to save some updated info
$temp = $eArrayStorage->WriteArray($this->feedList, FALSE);
$e107->ecache->set(NEWSFEED_LIST_CACHE_TAG,$temp);
}
}
// Returns the info for a single feed - from cache or memory as appropriate. If time expired, updates the feed.
function getFeed($feedID, $force = FALSE)
{
global $e107, $admin_log;
$tp = e107::getParser();
$sql = e107::getDb();
$eArrayStorage = e107::getArrayStorage();
$this->readFeedList(); // Make sure we've got the feed data.
if (!isset($this->feedList[$feedID]))
{
if (NEWSFEED_DEBUG) echo "Invalid feed number: {$feedID}
";
return FALSE;
}
if(strpos($this->newsList[$feedID]['newsfeed_data'],'MagpieRSS')) //BC Fix to update newsfeed_data from v1 to v2 spec.
{
$force = true;
}
if ($force || !isset($this->newsList[$feedID]['newsfeed_data']) || !$this->newsList[$feedID]['newsfeed_data'])
{ // No data already in memory
if ($force || !($this->newsList[$feedID]['newsfeed_data'] = $e107->ecache->retrieve(NEWSFEED_NEWS_CACHE_TAG.$feedID, $this->feedList[$feedID]['newsfeed_updateint']/60)))
{ // Need to re-read from source - either no cached data yet, or cache expired
if (NEWSFEED_DEBUG)
{
$admin_log->e_log_event(10,debug_backtrace(),"DEBUG","Newsfeed update","Refresh item: ".$feedID,FALSE,LOG_TO_ROLLING);
}
require_once(e_HANDLER.'xml_class.php');
$xml = new xmlClass;
require_once(e_HANDLER.'magpie_rss.php');
$dbData = array(); // In case we need to update DB
if($rawData = $xml->getRemoteFile($this->feedList[$feedID]['newsfeed_url'])) // Need to update feed
{
$rss = new MagpieRSS( $rawData );
list($newsfeed_image, $newsfeed_showmenu, $newsfeed_showmain) = explode("::", $this->feedList[$feedID]['newsfeed_image']);
$temp['channel'] = $rss->channel;
if (($newsfeed_showmenu == 0) || ($newsfeed_showmain == 0))
{
$temp['items'] = $rss->items; // Unlimited items
}
else
{
$temp['items'] = array_slice($rss->items, 0, max($newsfeed_showmenu, $newsfeed_showmain)); // Limited items
}
$newsfeed_des = FALSE;
if($this->feedList[$feedID]['newsfeed_description'] == 'default')
{
$temp['newsfeed_description'] = 'default'; // This prevents db writes if no better data found
if($rss->channel['description'])
{
$newsfeed_des = $tp -> toDB($rss->channel['description']);
$temp['newsfeed_description'] = $newsfeed_des;
}
elseif($rss->channel['tagline'])
{
$newsfeed_des = $tp -> toDB($rss -> channel['tagline']);
$temp['newsfeed_description'] = $newsfeed_des;
}
if ($temp['newsfeed_description'] != $this->feedList[$feedID]['newsfeed_description'])
{ // Need to write updated feed name to DB
$this->feedList[$feedID]['newsfeed_description'] = $temp['newsfeed_description'];
$dbData['newsfeed_description'] = $temp['newsfeed_description'];
if ($this->useCache)
{
$e107->ecache->clear(NEWSFEED_LIST_CACHE_TAG); // Clear the newsfeed cache so its re-read next time
}
}
}
if ($newsfeed_image == 'default')
{
$temp['newsfeed_image_link'] = "";
}
else
{
$temp['newsfeed_image_link'] = "
";
}
$serializedArray = $eArrayStorage->WriteArray($temp, FALSE);
$now = time();
$this->newsList[$feedID]['newsfeed_data'] = $serializedArray;
$this->newsList[$feedID]['newsfeed_timestamp'] = $now;
if ($this->useCache)
{
$e107->ecache->set(NEWSFEED_NEWS_CACHE_TAG.$feedID,$serializedArray);
}
else
{
$dbData['newsfeed_data'] =addslashes($serializedArray);
$dbData['newsfeed_timestamp'] = $now;
}
if (count($dbData)) // Only write the feed data to DB if not using cache. Write description if changed
{
if(FALSE === $sql->db_UpdateArray('newsfeed', $dbData, " WHERE newsfeed_id=".$feedID))
{
if (NEWSFEED_DEBUG) echo NFLAN_48."
".var_dump($dbData);
}
}
unset($rss);
}
else
{
if (NEWSFEED_DEBUG) echo $xml -> error;
return FALSE;
}
}
}
return $eArrayStorage->ReadArray($this->newsList[$feedID]['newsfeed_data']);
}
// Return text for the required news feeds (loads info as necessary)
// Uses different templates for main and menu areas
function newsfeedInfo($which, $where = 'main')
{
$tp = e107::getParser();
$sql = e107::getDb();
global $NEWSFEED_MAIN_START, $NEWSFEED_MAIN, $NEWSFEED_MAIN_END;
global $NEWSFEED_MENU_START, $NEWSFEED_MENU, $NEWSFEED_MENU_END;
if($which == 'all')
{
$filter = 0;
}
else
{
$filter = intval($which);
}
$text = "";
$this->readFeedList(); // Make sure we've got all the news feeds loaded
/* get template */
if (file_exists(THEME."newsfeed_menu_template.php"))
{
include(THEME."newsfeed_menu_template.php");
}
else
{
include(e_PLUGIN."newsfeed/templates/newsfeed_menu_template.php");
}
foreach($this->feedList as $nfID => $feed)
{
if (($filter == 0) || ($filter == $feed['newsfeed_id']))
{
if (($rss = $this->getFeed($nfID))) // Call ensures that feed is updated if necessary
{
list($newsfeed_image, $newsfeed_showmenu, $newsfeed_showmain) = explode("::", $feed['newsfeed_image']);
$numtoshow = intval($where == 'main' ? $newsfeed_showmain : $newsfeed_showmenu);
$numtoshow = ($numtoshow > 0 ? $numtoshow : 999);
$FEEDNAME = "".$tp->toHtml($feed['newsfeed_name'],false,'TITLE')."";
$FEEDDESCRIPTION = $feed['newsfeed_description'];
$FEEDIMAGE = $rss['newsfeed_image_link'];
$FEEDLANGUAGE = $rss['channel']['language'];
if($rss['channel']['lastbuilddate'])
{
$pubbed = $rss['channel']['lastbuilddate'];
}
else if($rss['channel']['dc']['date'])
{
$pubbed = $rss['channel']['dc']['date'];
}
else
{
$pubbed = NFLAN_34;
}
$FEEDLASTBUILDDATE = NFLAN_33.$pubbed;
$FEEDCOPYRIGHT = $tp -> toHTML(vartrue($rss['channel']['copyright']), FALSE);
$FEEDTITLE = "".vartrue($rss['channel']['title'])."";
$FEEDLINK = $rss['channel']['link'];
if($feed['newsfeed_active'] == 2 or $feed['newsfeed_active'] == 3)
{
$LINKTOMAIN = "".NFLAN_39."";
}
else
{
$LINKTOMAIN = "";
}
$data = "";
$numtoshow = min($numtoshow, count($rss['items']));
$i = 0;
while($i < $numtoshow)
{
$item = $rss['items'][$i];
$FEEDITEMLINK = "".$tp -> toHTML($item['title'], FALSE)."\n";
$FEEDITEMLINK = str_replace('&', '&', $FEEDITEMLINK);
$feeditemtext = preg_replace("#\[[a-z0-9=]+\]|\[\/[a-z]+\]|\{[A-Z_]+\}#si", "", strip_tags($item['description']));
$FEEDITEMCREATOR = $tp -> toHTML(vartrue($item['author']), FALSE);
if ($where == 'main')
{
if($NEWSFEED_COLLAPSE)
{
$FEEDITEMLINK = "".$tp -> toHTML($item['title'], FALSE)."