SitePoint Sponsor

User Tag List

Results 1 to 2 of 2
  1. #1
    SitePoint Enthusiast
    Join Date
    Jan 2007
    Location
    Shropshire, UK
    Posts
    90
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    including an RSS feed on a site

    Hi,
    I'm building a website for a friend that includes an RSS feed. What I want to do is each time there is a new feed I want it to insert into my database, then when you click the link to read more it takes you to another page within my site that displays the entired feed and the link to the external website.

    I've got all of this working using a script I found on the internet and modified it to insert into my database. The probem I'm having is that my script isn't pulling through the entire feed. Its only inserting the part it displays in my little news feed box. Can anyone tell me where in my script its limiting how much is pulled through?

    This is the main part of the script
    HTML Code:
    <?php
    
    class lastRSS {
    	// -------------------------------------------------------------------
    	// Public properties
    	// -------------------------------------------------------------------
    	var $default_cp = 'UTF-8';
    	var $CDATA = 'strip'; //CDATA Allows to set how to proceed CDATA information. nochange = default value; don't make any changes (get CDATA content including CDATA tag), strip = completely strip CDATA informationm, content = get CDATA content (without CDATA tag)
    	var $cp = '';
    	var $items_limit = 8;
    	var $stripHTML = 'True';
    	var $date_format = '';
    
    	// -------------------------------------------------------------------
    	// Private variables
    	// -------------------------------------------------------------------
    	var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs');
    	var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');
    	var $imagetags = array('title', 'url', 'link', 'width', 'height');
    	var $textinputtags = array('title', 'description', 'name', 'link');
    
    	// -------------------------------------------------------------------
    	// Parse RSS file and returns associative array.
    	// -------------------------------------------------------------------
    	function Get ($rss_url) {
    		// If CACHE ENABLED
    		if ($this->cache_dir != '') {
    			$cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url);
    			$timedif = @(time() - filemtime($cache_file));
    			if ($timedif < $this->cache_time) {
    				// cached file is fresh enough, return cached array
    				$result = unserialize(join('', file($cache_file)));
    				// set 'cached' to 1 only if cached file is correct
    				if ($result) $result['cached'] = 1;
    			} else {
    				// cached file is too old, create new
    				$result = $this->Parse($rss_url);
    				$serialized = serialize($result);
    				if ($f = @fopen($cache_file, 'w')) {
    					fwrite ($f, $serialized, strlen($serialized));
    					fclose($f);
    				}
    				if ($result) $result['cached'] = 0;
    			}
    		}
    		// If CACHE DISABLED >> load and parse the file directly
    		else {
    			$result = $this->Parse($rss_url);
    			if ($result) $result['cached'] = 0;
    		}
    		// return result
    		return $result;
    	}
    	
    	// -------------------------------------------------------------------
    	// Modification of preg_match(); return trimed field with index 1
    	// from 'classic' preg_match() array output
    	// -------------------------------------------------------------------
    	function my_preg_match ($pattern, $subject) {
    		// start regullar expression
    		preg_match($pattern, $subject, $out);
    
    		// if there is some result... process it and return it
    		if(isset($out[1])) {
    			// Process CDATA (if present)
    			if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag)
    				$out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
    			} elseif ($this->CDATA == 'strip') { // Strip CDATA
    				$out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
    			}
    
    			// If code page is set convert character encoding to required
    			if ($this->cp != '')
    				//$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
    				$out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);
    			// Return result
    			return trim($out[1]);
    		} else {
    		// if there is NO result, return empty string
    			return '';
    		}
    	}
    
    	// -------------------------------------------------------------------
    	// Replace HTML entities &something; by real characters
    	// -------------------------------------------------------------------
    	function unhtmlentities ($string) {
    		// Get HTML entities table
    		$trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
    		// Flip keys<==>values
    		$trans_tbl = array_flip ($trans_tbl);
    		// Add support for &apos; entity (missing in HTML_ENTITIES)
    		$trans_tbl += array('&apos;' => "'");
    		// Replace entities by values
    		return strtr ($string, $trans_tbl);
    	}
    
    	// -------------------------------------------------------------------
    	// Parse() is private method used by Get() to load and parse RSS file.
    	// Don't use Parse() in your scripts - use Get($rss_file) instead.
    	// -------------------------------------------------------------------
    	function Parse ($rss_url) {
    		// Open and load RSS file
    		if ($f = @fopen($rss_url, 'r')) {
    			$rss_content = '';
    			while (!feof($f)) {
    				$rss_content .= fgets($f, 4096);
    			}
    			fclose($f);
    
    			// Parse document encoding
    			$result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);
    			// if document codepage is specified, use it
    			if ($result['encoding'] != '')
    				{ $this->rsscp = $result['encoding']; } // This is used in my_preg_match()
    			// otherwise use the default codepage
    			else
    				{ $this->rsscp = $this->default_cp; } // This is used in my_preg_match()
    
    			// Parse CHANNEL info
    			preg_match("'<channel.*?>(.*?)</channel>'si", $rss_content, $out_channel);
    			foreach($this->channeltags as $channeltag)
    			{
    				$temp = $this->my_preg_match("'<$channeltag.*?>(.*?)</$channeltag>'si", $out_channel[1]);
    				if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty
    			}
    			// If date_format is specified and lastBuildDate is valid
    			if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {
    						// convert lastBuildDate to specified date format
    						$result['lastBuildDate'] = date($this->date_format, $timestamp);
    			}
    
    			// Parse TEXTINPUT info
    			preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);
    				// This a little strange regexp means:
    				// Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it's not beggining tag)
    			if (isset($out_textinfo[2])) {
    				foreach($this->textinputtags as $textinputtag) {
    					$temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)</$textinputtag>'si", $out_textinfo[2]);
    					if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
    				}
    			}
    			// Parse IMAGE info
    			preg_match("'<image.*?>(.*?)</image>'si", $rss_content, $out_imageinfo);
    			if (isset($out_imageinfo[1])) {
    				foreach($this->imagetags as $imagetag) {
    					$temp = $this->my_preg_match("'<$imagetag.*?>(.*?)</$imagetag>'si", $out_imageinfo[1]);
    					if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty
    				}
    			}
    			// Parse ITEMS
    			preg_match_all("'<item(| .*?)>(.*?)</item>'si", $rss_content, $items);
    			$rss_items = $items[2];
    			$i = 0;
    			$result['items'] = array(); // create array even if there are no items
    			foreach($rss_items as $rss_item) {
    				// If number of items is lower then limit: Parse one item
    				if ($i < $this->items_limit || $this->items_limit == 0) {
    					foreach($this->itemtags as $itemtag) {
    						$temp = $this->my_preg_match("'<$itemtag.*?>(.*?)</$itemtag>'si", $rss_item);
    						if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty
    					}
    					// Strip HTML tags and other ******** from DESCRIPTION
    					if ($this->stripHTML && $result['items'][$i]['description'])
    						$result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
    					// Strip HTML tags and other ******** from TITLE
    					if ($this->stripHTML && $result['items'][$i]['title'])
    						$result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));
    					// If date_format is specified and pubDate is valid
    					if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {
    						// convert pubDate to specified date format
    						$result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);
    					}
    					
    				
    					
    					// Item counter
    					$i++;
    				}
    			}
    
    			$result['items_count'] = $i;
    			return $result;
    		}
    		else // Error in opening return False
    		{
    			return False;
    		}
    	}
    	
    	function wordLimit($string, $length, $ellipsis = '') {
    	   return count($words = preg_split('/\s+/', ltrim($string), $length + 1)) > $length ?
    	   rtrim(substr($string, 0, strlen($string) - strlen(end($words)))) . $ellipsis :
    	   $string;
    	}
    		
    	function displayRSS($url,$itemlimit,$wordlimit,$linktitle,$linkreadmore){
    		$this->cache_dir = 'temprss';
    		$this->cache_time = 1200;
    		if ($rs = $this->get($url)) {
    
    		$count = 0;
    		
    		foreach($rs['items'] as $item) {
    		
    			if($count<$itemlimit){
    				echo "<p class='RSStext'>";
    				if($linktitle == 1){echo "<a href=\"$item[link]\">";}
    				echo "<span class='RSSheading'>".$item['title']."</span>";
    				if($linktitle == 1){echo "</a>";}
    				echo "<br />\n";
    				//if($wordlimit > 0){echo $this->wordLimit($item['description'],$wordlimit,'...');}else{echo $item['description'];}
    				echo $item['description'];
    				if($linkreadmore == 1){echo " <a class='RSSlink' href=\"$item[link]\">read more</a>";}
    				echo "</p>";
    				echo "<div class='clearboth RSSwrap'>&nbsp;</div>";
    			}
    		
    		++$count;
    		
    		}
    		
    		} else {
    			echo "<p>offline</p>";
    		}
    	}
    
    }
    
    ?>
    and this is the code to display the small news feed box

    HTML Code:
    <div id="rss">
    <h2>Latest Aerospace News</h2>
        <?php
    	 $date = date('Y-m-d H:i:s'); 
    	//echo $date;
    	 include "includes/rssnews.php";
    	 
         
            $rss = new lastRSS; $rss->cache_dir = 'temprss'; $rss->cache_time = 6000;
            if ($rs = $rss->get('http://www.flightglobal.com/feed/31ac9a63-ff18-4e6e-94ef-ef8dd4c317da/flight-ccp/headlines.xml')) {
            //echo "<p>$rs[description]</p><br />";
            
            $count = 0;
            
            foreach($rs['items'] as $item) {
    		
    			if($count<2){	
    				$rss_sql = "SELECT rss_title FROM rss_news WHERE rss_title = '".$item['title']."'";
    				$rss_result = mysql_query($rss_sql);
    				
    				$rss_numrow = mysql_num_rows($rss_result);
    				
    					if ($rss_numrow=='0') {
    					
    						$insert_sql = "INSERT INTO rss_news (rss_title,rss_content,rss_link,date_created,page_live) VALUES (
    						'".$item['title']."','".$item['description']."','".$item['link']."','".$date."','1')";
    						$insert_result = mysql_query($insert_sql);
    						
    					}
    					
    				
    				
    				
    				
    				
    					
    			}	
    			++$count;
    			}
    			
    			
    			$news_sql = "SELECT rss_id, rss_title, rss_content FROM rss_news ORDER BY rss_id DESC LIMIT 2";
    				//echo $news_sql;
    				$news_result = mysql_query($news_sql);
    			while($news_row = mysql_fetch_array($news_result)) { ?>
    					
    					
    					<h3><a href="rss_news.php?cat_id=<?php echo $news_row['rss_id']?>"><?=stripslashes($news_row['rss_title'])?></a></h3>
    					
    					<p><?php echo wordLimitsmall(stripslashes($news_row['rss_content']))?></p>
    					
    					<a href="rss_news.php?cat_id=<?php echo $news_row['rss_id']?>" class="read_more">read more...</a>
    					<br clear="all" />
    				<? 
    					}
    			
    		 } else {
                echo "<p>news: offline</p>";
            }  ?>
    </div>
    I am totally stumped with this. You can view what its doing on the site here:
    http://www.kb-client-preview.co.uk/aerorep/

  2. #2
    SitePoint Guru deepM's Avatar
    Join Date
    Dec 2007
    Location
    India
    Posts
    705
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    KirstyBurgoine, check this out.

    www.simplepie.org

    actually, i have worked on this fetching feed application. simplepie is the best technology as compare to others (for me at least) and they will help you properly,as i have got good support from them.


Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •