Invalid argument supplied for foreach()
Nu heb ik daar een rss feed reader opgezet (Simple RSS Feed Reader) maar hij gooit nu de site door elkaar en geeft een melding
Quote:
Notice: Undefined property: stdClass::$feedItems in /public/sites/www.kiesuwvoordeel.nl/modules/mod_jw_srfr/helper.php on line 42
Warning: Invalid argument supplied for foreach() in /public/sites/www.kiesuwvoordeel.nl/modules/mod_jw_srfr/helper.php on line 42
Warning: Invalid argument supplied for foreach() in /public/sites/www.kiesuwvoordeel.nl/modules/mod_jw_srfr/helper.php on line 42
Enig idee hoe ik dit kan oplossen ?
Misschien wat gebrekkige info maar hoor het graag alls jullie meer nodig hebben.
Website is www.kiesuwvoordeel.nlwww.kiesuwvoordeel.nl
Alvast bedankt voor een reactie
Henry
Wat relevante code is wel zo handig.
Dit staat er trouwens op regel 42: foreach($feed->feedItems as $key=>$item){
En waar komt $feed->feedItems vandaan?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?php
/**
* @version 3.3
* @package Simple RSS Feed Reader (module)
* @author JoomlaWorks - http://www.joomlaworks.net
* @copyright Copyright (c) 2006 - 2014 JoomlaWorks Ltd. All rights reserved.
* @license GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
*/
// no direct access
defined('_JEXEC') or die('Restricted access');
class SimpleRssFeedReaderHelper {
function getFeeds($feedsArray,$totalFeedItems,$perFeedItems,$feedTimeout,$dateFormat,$wordLimit,$cacheLocation,$cacheTime,$imageHandling,$riWidth){
/*
Legend for '$imageHandling':
0 - no images
1 - fetch first image only and hide others
2 - fetch and resize first image only and hide others
*/
// API
$mainframe = JFactory::getApplication();
$cacheTime = $cacheTime*60;
// Check if the cache folder exists
$cacheFolderPath = JPATH_SITE.DS.$cacheLocation;
if(file_exists($cacheFolderPath) && is_dir($cacheFolderPath)){
// all OK
} else {
mkdir($cacheFolderPath);
}
$feeds = self::multiRequest($feedsArray,$cacheTime);
$parsedFeeds = self::parseFeeds($feeds);
$feedItemsArray = array();
foreach($parsedFeeds as $feed){
foreach($feed->feedItems as $key=>$item){
// Create an object to store feed elements
$feedElements[$key] = new JObject;
$feedElements[$key]->itemTitle = $item->title;
$feedElements[$key]->itemLink = $item->link;
$feedElements[$key]->itemDate = strftime($dateFormat,strtotime($item->pubDate));
$feedElements[$key]->itemDateRSS = $item->pubDate;
$feedElements[$key]->itemDescription = $item->description;
$feedElements[$key]->feedImageSrc = '';
$feedElements[$key]->feedTitle = self::wordLimiter($feed->feedTitle,10);
$feedElements[$key]->feedURL = $feed->feedSubscribeUrl;
$feedElements[$key]->siteURL = $feed->feedLink;
// Give each feed an index based on date
$itemDateIndex = strftime('%Y%m%d%H%M',strtotime($item->pubDate)).'_'.$key;
// Pass all feed objects to an array
$feedItemsArray[$itemDateIndex] = $feedElements[$key];
}
}
// Reverse sort by key (=feed date)
krsort($feedItemsArray);
// Limit output
$outputArray = array();
$counter = 0;
foreach($feedItemsArray as $feedItem){
if($counter>=$totalFeedItems) continue;
// Clean up the feed title
$feedItem->itemTitle = trim(htmlentities($feedItem->itemTitle, ENT_QUOTES, 'utf-8'));
// URL Redirect
if(isset($feedItemLinkRedirect) && $feedItemLinkRedirect){
$feedItem->itemLink = $siteUrl.'/modules/mod_jw_srfr/redir.php?url='.urlencode($feedItem->itemLink);
}
// Determine if an image reference exists in the feed description
if($imageHandling==1 || $imageHandling==2){
$feedImage = self::getFirstImage($feedItem->itemDescription);
// If it does, copy, resize and store it locally
if(isset($feedImage) && $feedImage['ext']){
// first remove the img tag from the description
$feedItem->itemDescription = str_replace($feedImage['tag'],'',trim($feedItem->itemDescription));
// then resize and/or assign to variable
if($imageHandling==2){
$feedItem->feedImageSrc = 'http://ir0.mobify.com/'.$riWidth.'/'.$feedImage['src'];
} else {
$feedItem->feedImageSrc = $feedImage['src'];
}
} else {
$feedItem->feedImageSrc = '';
}
}
// Strip out images from the description
$feedItem->itemDescription = preg_replace("#<img.+?>#s","",$feedItem->itemDescription);
// Word limit
if($wordLimit){
$feedItem->itemDescription = self::wordLimiter($feedItem->itemDescription,$wordLimit);
}
$outputArray[] = $feedItem;
$counter++;
}
return $outputArray;
}
// Get array of feeds
function multiRequest($data,$cacheTime) {
// Set max_execution_time to 120
ini_set('max_execution_time',120);
$cacheTime = $cacheTime*60;
$result = array();
foreach ($data as $id => $url) {
$feed = self::getFile($url,$cacheTime,$subFolderName='feeds');
$result[$id] = JFile::read($feed);
}
return $result;
}
// Parse array of feeds
function parseFeeds($feeds){
$feedContents = array();
foreach($feeds as $key=>$feed){
libxml_use_internal_errors(true);
$feedContents[$key] = new stdClass;
$xml = simplexml_load_string($feed);
if(is_object($xml) && $items = $xml->xpath("/rss/channel/item")) {
$feedContents[$key]->feedSubscribeUrl = $feed;
$feedContents[$key]->feedTitle = $xml->channel->title;
$feedContents[$key]->feedLink = $xml->channel->link;
$feedContents[$key]->feedPubDate = $xml->channel->pubDate;
$feedContents[$key]->feedDescription = $xml->channel->description;
foreach($items as $item){
$feedContents[$key]->feedItems[] = $item;
}
} elseif(is_object($xml) && $items = $xml->xpath("/*[local-name()='feed' and namespace-uri()='http://www.w3.org/2005/Atom'] /*[local-name()='entry' and namespace-uri()='http://www.w3.org/2005/Atom']")) {
$feedContents[$key]->feedSubscribeUrl = $feed;
$feedContents[$key]->feedTitle = (string)$xml->title;
$feedContents[$key]->feedLink = (string)$xml->link->attributes()->href;
$feedContents[$key]->feedPubDate = (string)$xml->updated;
$feedContents[$key]->feedDescription = (string)$xml->subtitle;
foreach ($items as $item) {
$tmp = new stdClass();
$tmp->title = (string)$item->title;
$tmp->link = (string)$item->link->attributes()->href;
$tmp->pubDate = (string)$item->updated;
$tmp->description = (!empty($item->content)) ? $item->content:$item->summary;
$tmp->author = (string)$item->author->name;
$feedContents[$key]->feedItems[] = $tmp;
}
}
}
return $feedContents;
}
// Word Limiter
function wordLimiter($str,$limit=100,$end_char='[…]'){
if (trim($str) == '') return $str;
$str = strip_tags($str);
preg_match('/\s*(?:\S*\s*){'. (int) $limit .'}/', $str, $matches);
if (strlen($matches[0]) == strlen($str)) $end_char = '';
return rtrim($matches[0]).$end_char;
}
// Grab the first image in a string
function getFirstImage($string){
// find images
$regex = "#<img.+?>
/**
* @version 3.3
* @package Simple RSS Feed Reader (module)
* @author JoomlaWorks - http://www.joomlaworks.net
* @copyright Copyright (c) 2006 - 2014 JoomlaWorks Ltd. All rights reserved.
* @license GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
*/
// no direct access
defined('_JEXEC') or die('Restricted access');
class SimpleRssFeedReaderHelper {
function getFeeds($feedsArray,$totalFeedItems,$perFeedItems,$feedTimeout,$dateFormat,$wordLimit,$cacheLocation,$cacheTime,$imageHandling,$riWidth){
/*
Legend for '$imageHandling':
0 - no images
1 - fetch first image only and hide others
2 - fetch and resize first image only and hide others
*/
// API
$mainframe = JFactory::getApplication();
$cacheTime = $cacheTime*60;
// Check if the cache folder exists
$cacheFolderPath = JPATH_SITE.DS.$cacheLocation;
if(file_exists($cacheFolderPath) && is_dir($cacheFolderPath)){
// all OK
} else {
mkdir($cacheFolderPath);
}
$feeds = self::multiRequest($feedsArray,$cacheTime);
$parsedFeeds = self::parseFeeds($feeds);
$feedItemsArray = array();
foreach($parsedFeeds as $feed){
foreach($feed->feedItems as $key=>$item){
// Create an object to store feed elements
$feedElements[$key] = new JObject;
$feedElements[$key]->itemTitle = $item->title;
$feedElements[$key]->itemLink = $item->link;
$feedElements[$key]->itemDate = strftime($dateFormat,strtotime($item->pubDate));
$feedElements[$key]->itemDateRSS = $item->pubDate;
$feedElements[$key]->itemDescription = $item->description;
$feedElements[$key]->feedImageSrc = '';
$feedElements[$key]->feedTitle = self::wordLimiter($feed->feedTitle,10);
$feedElements[$key]->feedURL = $feed->feedSubscribeUrl;
$feedElements[$key]->siteURL = $feed->feedLink;
// Give each feed an index based on date
$itemDateIndex = strftime('%Y%m%d%H%M',strtotime($item->pubDate)).'_'.$key;
// Pass all feed objects to an array
$feedItemsArray[$itemDateIndex] = $feedElements[$key];
}
}
// Reverse sort by key (=feed date)
krsort($feedItemsArray);
// Limit output
$outputArray = array();
$counter = 0;
foreach($feedItemsArray as $feedItem){
if($counter>=$totalFeedItems) continue;
// Clean up the feed title
$feedItem->itemTitle = trim(htmlentities($feedItem->itemTitle, ENT_QUOTES, 'utf-8'));
// URL Redirect
if(isset($feedItemLinkRedirect) && $feedItemLinkRedirect){
$feedItem->itemLink = $siteUrl.'/modules/mod_jw_srfr/redir.php?url='.urlencode($feedItem->itemLink);
}
// Determine if an image reference exists in the feed description
if($imageHandling==1 || $imageHandling==2){
$feedImage = self::getFirstImage($feedItem->itemDescription);
// If it does, copy, resize and store it locally
if(isset($feedImage) && $feedImage['ext']){
// first remove the img tag from the description
$feedItem->itemDescription = str_replace($feedImage['tag'],'',trim($feedItem->itemDescription));
// then resize and/or assign to variable
if($imageHandling==2){
$feedItem->feedImageSrc = 'http://ir0.mobify.com/'.$riWidth.'/'.$feedImage['src'];
} else {
$feedItem->feedImageSrc = $feedImage['src'];
}
} else {
$feedItem->feedImageSrc = '';
}
}
// Strip out images from the description
$feedItem->itemDescription = preg_replace("#<img.+?>#s","",$feedItem->itemDescription);
// Word limit
if($wordLimit){
$feedItem->itemDescription = self::wordLimiter($feedItem->itemDescription,$wordLimit);
}
$outputArray[] = $feedItem;
$counter++;
}
return $outputArray;
}
// Get array of feeds
function multiRequest($data,$cacheTime) {
// Set max_execution_time to 120
ini_set('max_execution_time',120);
$cacheTime = $cacheTime*60;
$result = array();
foreach ($data as $id => $url) {
$feed = self::getFile($url,$cacheTime,$subFolderName='feeds');
$result[$id] = JFile::read($feed);
}
return $result;
}
// Parse array of feeds
function parseFeeds($feeds){
$feedContents = array();
foreach($feeds as $key=>$feed){
libxml_use_internal_errors(true);
$feedContents[$key] = new stdClass;
$xml = simplexml_load_string($feed);
if(is_object($xml) && $items = $xml->xpath("/rss/channel/item")) {
$feedContents[$key]->feedSubscribeUrl = $feed;
$feedContents[$key]->feedTitle = $xml->channel->title;
$feedContents[$key]->feedLink = $xml->channel->link;
$feedContents[$key]->feedPubDate = $xml->channel->pubDate;
$feedContents[$key]->feedDescription = $xml->channel->description;
foreach($items as $item){
$feedContents[$key]->feedItems[] = $item;
}
} elseif(is_object($xml) && $items = $xml->xpath("/*[local-name()='feed' and namespace-uri()='http://www.w3.org/2005/Atom'] /*[local-name()='entry' and namespace-uri()='http://www.w3.org/2005/Atom']")) {
$feedContents[$key]->feedSubscribeUrl = $feed;
$feedContents[$key]->feedTitle = (string)$xml->title;
$feedContents[$key]->feedLink = (string)$xml->link->attributes()->href;
$feedContents[$key]->feedPubDate = (string)$xml->updated;
$feedContents[$key]->feedDescription = (string)$xml->subtitle;
foreach ($items as $item) {
$tmp = new stdClass();
$tmp->title = (string)$item->title;
$tmp->link = (string)$item->link->attributes()->href;
$tmp->pubDate = (string)$item->updated;
$tmp->description = (!empty($item->content)) ? $item->content:$item->summary;
$tmp->author = (string)$item->author->name;
$feedContents[$key]->feedItems[] = $tmp;
}
}
}
return $feedContents;
}
// Word Limiter
function wordLimiter($str,$limit=100,$end_char='[…]'){
if (trim($str) == '') return $str;
$str = strip_tags($str);
preg_match('/\s*(?:\S*\s*){'. (int) $limit .'}/', $str, $matches);
if (strlen($matches[0]) == strlen($str)) $end_char = '';
return rtrim($matches[0]).$end_char;
}
// Grab the first image in a string
function getFirstImage($string){
// find images
$regex = "#<img.+?>
if (preg_match_all($regex, $string, $matches, PREG_PATTERN_ORDER) > 0){
$img = array();
// Entire <img> tag
$img['tag'] = $matches[0][0];
// Image src
if(preg_match("#src=\".+?\"#s",$img['tag'],$imgSrc)){
$img['src'] = str_replace('src="','',$imgSrc[0]);
$img['src'] = str_replace('"','',$img['src']);
} else {
$img['src'] = false;
}
// Is this a real content image?
if(preg_match("#\.(jpg|jpeg|png|gif|bmp)#s",strtolower($img['src']),$imgExt)){
$img['ext'] = true;
} else {
$img['ext'] = false;
}
return $img;
}
}
// Get remote file
function getFile($url, $cacheTime=3600, $subFolderName='', $extensionName='mod_jw_srfr'){
jimport('joomla.filesystem.file');
// Check cache folder
if($subFolderName){
$cacheFolderPath = JPATH_SITE.DS.'cache'.DS.$extensionName.DS.$subFolderName;
} else {
$cacheFolderPath = JPATH_SITE.DS.'cache'.DS.$extensionName;
}
if(file_exists($cacheFolderPath) && is_dir($cacheFolderPath)){
// all OK
} else {
mkdir($cacheFolderPath);
}
$url = trim($url);
if(substr($url,0,4)=="http"){
$turl = explode("?", $url);
$matchComponents = array("#(http|https)\:\/\/#s","#www\.#s");
$replaceComponents = array("","");
$turl = preg_replace($matchComponents,$replaceComponents,$turl[0]);
$turl = str_replace(array("/","-","."),array("_","_","_"),$turl);
$tmpFile = $cacheFolderPath.DS.urlencode($turl).'_'.md5($url).'.cache';
} else {
$tmpFile = $cacheFolderPath.DS.'cached_'.md5($url);
}
// Check if a cached copy exists otherwise create it
if(file_exists($tmpFile) && is_readable($tmpFile) && (filemtime($tmpFile)+$cacheTime) > time()){
$result = $tmpFile;
} else {
// Get file
if(substr($url,0,4)=="http"){
// remote file
if(ini_get('allow_url_fopen')){
// file_get_contents
$fgcOutput = JFile::read($url);
// cleanup the content received
$fgcOutput = preg_replace("#(\n|\r|\s\s+|<!--(.*?)-->)#s", "", $fgcOutput);
$fgcOutput = preg_replace("#(\t)#s", " ", $fgcOutput);
JFile::write($tmpFile,$fgcOutput);
} elseif(in_array('curl',get_loaded_extensions())) {
// cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$chOutput = curl_exec($ch);
curl_close($ch);
JFile::write($tmpFile,$chOutput);
} else {
// fsockopen
$readURL = parse_url($url);
$relativePath = (isset($readURL['query'])) ? $readURL['path']."?".$readURL['query'] : $readURL['path'];
$fp = fsockopen($readURL['host'], 80, $errno, $errstr, 5);
if (!$fp) {
JFile::write($tmpFile,'');
} else {
$out = "GET ".$relativePath." HTTP/1.1\r\n";
$out .= "Host: ".$readURL['host']."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$header = '';
$body = '';
do { $header .= fgets($fp,128); } while (strpos($header,"\r\n\r\n")=== false); // get the header data
while (!feof($fp)) $body .= fgets($fp,128); // get the actual content
fclose($fp);
JFile::write($tmpFile,$body);
}
}
$result = $tmpFile;
} else {
// local file
$result = $url;
}
}
return $result;
}
} // END CLASS
?>
- Aar -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Toevoeging op 14/06/2015 12:48:27:
Excuses, zal ik de volgende keer aandenken.
Gewijzigd op 13/06/2015 14:40:24 door - Ariën -