cowboysdude Posted December 29, 2015 Share Posted December 29, 2015 I'm currently parsing multiple rss/xml feeds using this: class Feed_Amalgamator { public $urls = array(); public $data = array(); public function addFeeds( array $feeds ) { $this->urls = array_merge( $this->urls, array_values($feeds) ); } public function grabRss() { foreach ( $this->urls as $feed ) { $data = @new SimpleXMLElement( $feed, 0, true ); if ( !$data ) throw new Exception( 'Could not load: ' . $feed ); foreach ( $data->channel->item as $item ) { $this->data[] = $item; } } } public function amalgamate() { shuffle( $this->data ); $temp = array(); foreach ( $this->data as $item ) { if ( !in_array($item->link, $this->links($temp)) ) { $temp[] = $item; } } $this->data = $temp; shuffle( $this->data ); } private function links( array $items ) { $links = array(); foreach ( $items as $item ) { $links[] = $item->link; } return $links; } } /********* Feeds *********/ $urls = array('http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml',); /********* Feeds *********/ try { $feeds = new Feed_Amalgamator; $feeds->addFeeds( $urls ); $feeds->grabRss(); $feeds->amalgamate(); } catch ( exception $e ) { die( $e->getMessage() ); } foreach ( $feeds->data as $item ) : extract( (array) $item ); $truncated = (strlen($description) > 100) ? substr($description, 0, 80) . '...' : $description; and it's working quite nicely... however I'm trying to replace the actual feeds them selves in this section: /********* Feeds *********/ $urls = array('http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml',); /********* Feeds *********/ with this: /********* Feeds *********/ $urls = array($params->get('url')); /********* Feeds *********/ But I keep getting this: String could not be parsed as XMLI know it's reading the links but it doesn't seem to be passing them correctly to be parsed for some reason... Suggestions? Thanks in advance! Quote Link to comment Share on other sites More sharing options...
requinix Posted December 29, 2015 Share Posted December 29, 2015 Well, first step is figuring out the exact value of $urls... print_r($urls); Quote Link to comment Share on other sites More sharing options...
cowboysdude Posted December 29, 2015 Author Share Posted December 29, 2015 (edited) Well, first step is figuring out the exact value of $urls... print_r($urls); This the output: Array ( [0] => http://www.dallascowboys.com/rss/video [1] => http://www.dallascowboys.com/rss/gallery [2] => http://www.dallascowboys.com/rss/audio [3] => http://espn.go.com/blog/feed?blog=nfceast [4] => https://sports.yahoo.com/nfl/teams/dal/rss.xml ) Edited December 29, 2015 by cowboysdude Quote Link to comment Share on other sites More sharing options...
cowboysdude Posted December 29, 2015 Author Share Posted December 29, 2015 When I use the print_r($url); it returns 'http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml',<div id="wrapper" style="margin-top:1px;"><ul id="ticker">String could not be parsed as XML Quote Link to comment Share on other sites More sharing options...
requinix Posted December 29, 2015 Share Posted December 29, 2015 Here's the thing: with /********* Feeds *********/ $urls = array($params->get('url')); /********* Feeds *********/$urls is guaranteed to be an array containing one single item. That contradicts the first output you gave. As for the second, there is no "$url" in the code you posted so I don't know where its value is coming from. Quote Link to comment Share on other sites More sharing options...
cowboysdude Posted December 29, 2015 Author Share Posted December 29, 2015 (edited) Here is the entire code... I see what you mean... JHtml::stylesheet('modules/mod_newsbanner/assets/css/styles.css'); JHtml::_('jquery.framework'); JHtml::script(JUri::base() . 'modules/mod_newsbanner/assets/js/tickerme.js'); $url = $params->get('url'); echo '<div id="wrapper" style="margin-top:1px;">'; echo '<ul id="ticker">'; class Feed_Amalgamator { public $urls = array(); public $data = array(); public function addFeeds( array $feeds ) { $this->urls = array_merge( $this->urls, array_values($feeds) ); } public function grabRss() { foreach ( $this->urls as $feed ) { $data = @new SimpleXMLElement( $feed, 0, true ); if ( !$data ) throw new Exception( 'Could not load: ' . $feed ); foreach ( $data->channel->item as $item ) { $this->data[] = $item; } } } public function amalgamate() { shuffle( $this->data ); $temp = array(); foreach ( $this->data as $item ) { if ( !in_array($item->link, $this->links($temp)) ) { $temp[] = $item; } } $this->data = $temp; shuffle( $this->data ); } private function links( array $items ) { $links = array(); foreach ( $items as $item ) { $links[] = $item->link; } return $links; } } /********* Feeds *********/ $urls = array($url); /********* Feeds *********/ try { $feeds = new Feed_Amalgamator; $feeds->addFeeds( $urls ); $feeds->grabRss(); $feeds->amalgamate(); } catch ( exception $e ) { die( $e->getMessage() ); } foreach ( $feeds->data as $item ) : extract( (array) $item ); $truncated = (strlen($description) > 100) ? substr($description, 0, 80) . '...' : $description; ?> <li><img src="modules/mod_newsbanner/assets/images/slogo.jpg" width="19" height="19"> <?php echo $truncated; ?> <a href="<?php echo $link; ?>" target="_blank"><font color=red>Read More</font></a></li> <?php endforeach; ?> </ul> </div> <script> jQuery(function(){ jQuery('#ticker').tickerme(); }); </script> Edited December 29, 2015 by cowboysdude Quote Link to comment Share on other sites More sharing options...
requinix Posted December 29, 2015 Share Posted December 29, 2015 Assuming you had $url = $params->get('url'); print_r($url); echo '<div id="wrapper" style="margin-top:1px;">'; echo '<ul id="ticker">';that means $url is actually the string 'http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml',which is no good. How is the "url" parameter being set? Can you make it an array of strings? Quote Link to comment Share on other sites More sharing options...
cowboysdude Posted December 30, 2015 Author Share Posted December 30, 2015 Well if you go back up to the top I have set $url to get the 'http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml', which comes from: /********* Feeds *********/ $urls = array($url); /********* Feeds *********/ it should be getting 'filled' from this: $url = $params->get('url'); which is a 'textarea' where users can put their urls like above and populate the array via the $url parameter.. It's not reading it for some strange reason... the print_r($url); was just to see if that $url was catching what was being put in the textarea in the module and it is.... problem is it's not translating later on down in the array() area.... Quote Link to comment Share on other sites More sharing options...
Solution requinix Posted December 30, 2015 Solution Share Posted December 30, 2015 which is a 'textarea' where users can put their urls like above and populate the array via the $url parameter..And there it is. See, the "url" param, and thus the $url variable, and thus the $urls array, contains a string of all the URLs. That's no good. Your code needs an array of individual URLs, not all of them bunched together. 1. You copied and pasted that 'http://www.dallascowboys.com/rss/video', 'http://www.dallascowboys.com/rss/gallery', 'http://www.dallascowboys.com/rss/audio', 'http://espn.go.com/blog/feed?blog=nfceast', 'https://sports.yahoo.com/nfl/teams/dal/rss.xml',into the textarea. You, as a user, need to fix that so it becomes http://www.dallascowboys.com/rss/video http://www.dallascowboys.com/rss/gallery http://www.dallascowboys.com/rss/audio http://espn.go.com/blog/feed?blog=nfceast https://sports.yahoo.com/nfl/teams/dal/rss.xmlOne URL for each line. No extra apostrophes or commas or anything. Make sure your form has instructions to do that. 2. Now you know each line is a URL. Supposedly. IMO the best way to get the individual URLs out of it is to try to locate a valid URL on each line, which gives you some freedom about leaving blank lines and such: $url = $params->get('url'); // beginning of line, maybe whitespace, a "http://" or "https://" url, maybe more whitespace, then the end of the line if (preg_match_all('/^\s*(https?://\S+)\s*$/im', $url, $matches, PREG_PATTERN_ORDER)) { $urls = $matches[1]; } else { // did not find any urls $urls = array(); }3. Now that you have $urls set you don't need /********* Feeds *********/ $urls = array($url); /********* Feeds *********/ Quote Link to comment Share on other sites More sharing options...
cowboysdude Posted December 30, 2015 Author Share Posted December 30, 2015 That all makes sense!! Huge Thank you!!! Problem is I tend to make it harder then it has to be... LOL Again, Thank you! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.