monkeypaw201 Posted July 4, 2010 Report Share Posted July 4, 2010 I did this as a favor for someone, but I figured I'd share it with everyone.. you know, spread the wealth. This code simply reads the RSS feed that SMF outputs (of the latest posts) and returns it as a list (with the option to make it linkable). The implementation technique can vary, you could include the file, or just copy and paste it into your page (~100 lines). <?php /** SMF Forum RSS Feed to Latest Posts List Built for phpVMS www.phpvms.net Built by Lorenzo Aiello www.la92.com **/ /********* CONFIGURATION *********/ // Full URL to your SMF installation, WITH trailing slash $board_url = 'http://forum.yourwebsite.com/'; // Want the list to be linkable? TRUE = Yes, FALSE = No $linkable = TRUE; /******* END CONFIGURATION *******/ /** == STOP == DO NOT EDIT BELOW THIS **/ function xml2ary(&$string) { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parse_into_struct($parser, $string, $vals, $index); xml_parser_free($parser); $mnary=array(); $ary=&$mnary; foreach ($vals as $r) { $t=$r['tag']; if ($r['type']=='open') { if (isset($ary[$t])) { if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_c']=array(); $cv['_c']['_p']=&$ary; $ary=&$cv['_c']; } elseif ($r['type']=='complete') { if (isset($ary[$t])) { // same as open if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_v']=(isset($r['value']) ? $r['value'] : ''); } elseif ($r['type']=='close') { $ary=&$ary['_p']; } } _del_p($mnary); return $mnary; } // _Internal: Remove recursion in result array function _del_p(&$ary) { foreach ($ary as $k=>$v) { if ($k==='_p') unset($ary[$k]); elseif (is_array($ary[$k])) _del_p($ary[$k]); } } $feed = file_get_contents($board_url.'index.php?type=rss;action=.xml'); $feed = xml2ary($feed); $feed = $feed['rss']['_c']['channel']['_c']; foreach($feed['item'] as $item) { if($linkable) { echo '<li><a href="'.$item['_c']['link']['_v'].'" target="_blank">'.$item['_c']['title']['_v'].'</a></li>'; }else{ echo '<li>'.$item['_c']['title']['_v'].'</li>'; } } ?> 1 Quote Link to comment Share on other sites More sharing options...
monkeypaw201 Posted July 4, 2010 Author Report Share Posted July 4, 2010 As a brief update.. A bug I found is that you will need at least two posts in your forum for this to work propery. Also, if you get errors like this: Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/XXXXX/public_html/lib/skins/XXXXX/frontpage_main.tpl on line XXXX It means that your web hosting provider is a little paranoid with their PHP security, so you can use this code instead, which uses a different method of retrieving the information. <?php /** SMF Forum RSS Feed to Latest Posts List Built for phpVMS www.phpvms.net Built by Lorenzo Aiello www.la92.com **/ /********* CONFIGURATION *********/ // Full URL to your SMF installation, WITH trailing slash $board_url = 'http://forum.yourwebsite.com/'; // Want the list to be linkable? TRUE = Yes, FALSE = No $linkable = TRUE; /******* END CONFIGURATION *******/ /** == STOP == DO NOT EDIT BELOW THIS **/ function xml2ary(&$string) { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parse_into_struct($parser, $string, $vals, $index); xml_parser_free($parser); $mnary=array(); $ary=&$mnary; foreach ($vals as $r) { $t=$r['tag']; if ($r['type']=='open') { if (isset($ary[$t])) { if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_c']=array(); $cv['_c']['_p']=&$ary; $ary=&$cv['_c']; } elseif ($r['type']=='complete') { if (isset($ary[$t])) { // same as open if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array()); $cv=&$ary[$t][count($ary[$t])-1]; } else $cv=&$ary[$t]; if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;} $cv['_v']=(isset($r['value']) ? $r['value'] : ''); } elseif ($r['type']=='close') { $ary=&$ary['_p']; } } _del_p($mnary); return $mnary; } // _Internal: Remove recursion in result array function _del_p(&$ary) { foreach ($ary as $k=>$v) { if ($k==='_p') unset($ary[$k]); elseif (is_array($ary[$k])) _del_p($ary[$k]); } } $curl_handle=curl_init(); curl_setopt($curl_handle,CURLOPT_URL,$board_url.'index.php?type=rss;action=.xml'); curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); $feed = curl_exec($curl_handle); curl_close($curl_handle); $feed = xml2ary($feed); $feed = $feed['rss']['_c']['channel']['_c']; foreach($feed['item'] as $item) { if($linkable) { echo '<li><a href="'.$item['_c']['link']['_v'].'" target="_blank">'.$item['_c']['title']['_v'].'</a></li>'; }else{ echo '<li>'.$item['_c']['title']['_v'].'</li>'; } } ?> Quote Link to comment Share on other sites More sharing options...
Strider Posted July 29, 2010 Report Share Posted July 29, 2010 I used that code, but I got Warning: Invalid argument supplied for foreach() in /home/globalai/public_html/lib/skins/cargo2/frontpage_main.tpl on line 259 Quote Link to comment Share on other sites More sharing options...
dimitris Posted July 30, 2010 Report Share Posted July 30, 2010 i use the 1st code but Warning: file_get_contents() [function.file-get-contents]: Couldn't resolve host name in /home/greeceai/public_html/fss/lib/skins/crystalogre/frontpage_main.tpl on line 112 Warning: file_get_contents(http://forum.yourwebsite.com/index.php?type=rss;action=.xml) [function.file-get-contents]: failed to open stream: operation failed in /home/greeceai/public_html/fss/lib/skins/crystalogre/frontpage_main.tpl on line 112 Warning: Invalid argument supplied for foreach() in /home/greeceai/public_html/fss/lib/skins/crystalogre/frontpage_main.tpl on line 117 the 2nd code Warning: Invalid argument supplied for foreach() in /home/greeceai/public_html/fss/lib/skins/crystalogre/frontpage_main.tpl on line 123 the line 123 is : foreach($feed['item'] as $item) Quote Link to comment Share on other sites More sharing options...
Administrators simpilot Posted July 31, 2010 Administrators Report Share Posted July 31, 2010 With smf isn't it easier to just use the built in features of ssi.php that is already installed with the board? Here is the one from the westjetvirtual board, http://www.westjetvirtual.net/forum/ssi_examples.php if you have smf installed you should be able to get to it by - path to your forum/ssi_examples.php Quote Link to comment Share on other sites More sharing options...
dimitris Posted July 31, 2010 Report Share Posted July 31, 2010 With smf isn't it easier to just use the built in features of ssi.php that is already installed with the board? Here is the one from the westjetvirtual board, http://www.westjetvirtual.net/forum/ssi_examples.php if you have smf installed you should be able to get to it by - path to your forum/ssi_examples.php as always thank you ! working fine ! Quote Link to comment Share on other sites More sharing options...
Strider Posted July 31, 2010 Report Share Posted July 31, 2010 I tried that, but it didn't work, it gave me a fatal error, and the skin didn't work. 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.