silverstripe-blog/code/widgets/RSSWidget.php

89 lines
2.2 KiB
PHP
Raw Normal View History

2007-09-07 00:33:58 +02:00
<?php
class RSSWidget extends Widget {
static $db = array(
"RSSTitle" => "Text",
2007-09-07 00:33:58 +02:00
"RssUrl" => "Text",
"NumberToShow" => "Int"
2007-09-07 00:33:58 +02:00
);
2009-01-20 05:01:45 +01:00
static $has_one = array();
static $has_many = array();
static $many_many = array();
static $belongs_many_many = array();
2007-09-07 00:33:58 +02:00
static $defaults = array(
"NumberToShow" => 10,
"RSSTitle" => 'RSS Feed'
2007-09-07 00:33:58 +02:00
);
static $cmsTitle = "RSS Feed";
static $description = "Downloads another page's RSS feed and displays items in a list.";
2007-09-07 00:33:58 +02:00
/**
* If the RssUrl is relative, convert it to absolute with the
* current baseURL to avoid confusing simplepie.
* Passing relative URLs to simplepie will result
* in strange DNS lookups and request timeouts.
*
* @return string
*/
function getAbsoluteRssUrl() {
$urlParts = parse_url($this->RssUrl);
if(!isset($urlParts['host']) || !$urlParts['host']) {
return Director::absoluteBaseURL() . $this->RssUrl;
} else {
return $this->RssUrl;
}
}
2007-09-07 00:33:58 +02:00
function getCMSFields() {
return new FieldSet(
new TextField("RSSTitle", _t('RSSWidget.CT', "Custom title for the feed")),
new TextField("RssUrl", _t('RSSWidget.URL', "URL of the other page's RSS feed. Please make sure this URL points to an RSS feed.")),
new NumericField("NumberToShow", _t('RSSWidget.NTS', "Number of Items to show"))
2007-09-07 00:33:58 +02:00
);
}
function Title() {
return ($this->RSSTitle) ? $this->RSSTitle : 'RSS Feed';
}
2007-09-07 00:33:58 +02:00
function FeedItems() {
$output = new DataObjectSet();
// Protection against infinite loops when an RSS widget pointing to this page is added to this page
if(stristr($_SERVER['HTTP_USER_AGENT'], 'SimplePie')) {
return $output;
}
include_once(Director::getAbsFile(SAPPHIRE_DIR . '/thirdparty/simplepie/simplepie.inc'));
2008-12-13 00:14:47 +01:00
$t1 = microtime(true);
$feed = new SimplePie($this->AbsoluteRssUrl, TEMP_FOLDER);
$feed->init();
if($items = $feed->get_items(0, $this->NumberToShow)) {
foreach($items as $item) {
// Cast the Date
$date = new Date('Date');
$date->setValue($item->get_date());
// Cast the Title
$title = new Text('Title');
$title->setValue($item->get_title());
$output->push(new ArrayData(array(
'Title' => $title,
'Date' => $date,
'Link' => $item->get_link()
)));
}
return $output;
2007-09-07 00:33:58 +02:00
}
}
}
?>