Merge pull request #686 from wilr/3.0-rssfeed

FIX: use standard template rendering process for RSS feeds
This commit is contained in:
Ingo Schommer 2012-08-16 14:45:44 -07:00
commit 6d41cd8d09
2 changed files with 23 additions and 28 deletions

View File

@ -144,6 +144,7 @@ class RSSFeed extends ViewableData {
*/
function Entries() {
$output = new ArrayList();
if(isset($this->entries)) {
foreach($this->entries as $entry) {
$output->push(new RSSFeed_Entry($entry, $this->titleField, $this->descriptionField, $this->authorField));
@ -183,7 +184,10 @@ class RSSFeed extends ViewableData {
/**
* Output the feed to the browser
*/
function outputToBrowser() {
public function outputToBrowser() {
$prevState = SSViewer::get_source_file_comments();
SSViewer::set_source_file_comments(false);
if(is_int($this->lastModified)) {
HTTP::register_modification_timestamp($this->lastModified);
header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $this->lastModified) . ' GMT');
@ -192,26 +196,14 @@ class RSSFeed extends ViewableData {
HTTP::register_etag($this->etag);
}
$body = $this->feedContent();
HTTP::add_cache_headers();
header("Content-type: text/xml");
echo $body;
}
/**
* Return the content of the RSS feed.
*
* Also temporarily disabled source file comments, and restores
* to previous state once content has been rendered.
*
* @return string
*/
function feedContent() {
$prevState = SSViewer::get_source_file_comments();
SSViewer::set_source_file_comments(false);
$content = str_replace(' ', ' ', $this->renderWith($this->getTemplate()));
if(!headers_sent()) {
HTTP::add_cache_headers();
header("Content-type: text/xml");
}
SSViewer::set_source_file_comments($prevState);
return $content;
return $this->renderWith($this->getTemplate());
}
/**

View File

@ -14,7 +14,7 @@ class RSSFeedTest extends SapphireTest {
$list->push(new RSSFeedTest_ItemC());
$rssFeed = new RSSFeed($list, "http://www.example.com", "Test RSS Feed", "Test RSS Feed Description");
$content = $rssFeed->feedContent();
$content = $rssFeed->outputToBrowser();
//Debug::message($content);
$this->assertContains('<link>http://www.example.org/item-a/</link>', $content);
@ -32,7 +32,7 @@ class RSSFeedTest extends SapphireTest {
// Feed #2 - put Content() into <title> and AltContent() into <description>
$rssFeed = new RSSFeed($list, "http://www.example.com", "Test RSS Feed", "Test RSS Feed Description", "Content", "AltContent");
$content = $rssFeed->feedContent();
$content = $rssFeed->outputToBrowser();
$this->assertContains('<title>ItemA Content</title>', $content);
$this->assertContains('<title>ItemB Content</title>', $content);
@ -47,13 +47,11 @@ class RSSFeedTest extends SapphireTest {
$rssFeed = new RSSFeed(new ArrayList(), "", "", "");
$rssFeed->setTemplate('RSSFeedTest');
$content = $rssFeed->feedContent();
$content = $rssFeed->outputToBrowser();
$this->assertContains('<title>Test Custom Template</title>', $content);
$rssFeed->setTemplate('RSSFeed');
$content = $rssFeed->feedContent();
$content = $rssFeed->outputToBrowser();
$this->assertNotContains('<title>Test Custom Template</title>', $content);
}
@ -69,7 +67,6 @@ class RSSFeedTest extends SapphireTest {
Director::setBaseURL(null);
$_SERVER['HTTP_HOST'] = self::$original_host;
}
}
class RSSFeedTest_ItemA extends ViewableData {
@ -83,9 +80,11 @@ class RSSFeedTest_ItemA extends ViewableData {
function getTitle() {
return "ItemA";
}
function getContent() {
return "ItemA Content";
}
function getAltContent() {
return "ItemA AltContent";
}
@ -101,12 +100,15 @@ class RSSFeedTest_ItemB extends ViewableData {
function Title() {
return "ItemB";
}
function AbsoluteLink() {
return "http://www.example.com/item-b.html";
}
function Content() {
return "ItemB Content";
}
function AltContent() {
return "ItemB AltContent";
}
@ -114,7 +116,7 @@ class RSSFeedTest_ItemB extends ViewableData {
class RSSFeedTest_ItemC extends ViewableData {
// ItemC tests fields - Title has casting, Content doesn't.
static $casting = array(
public static $casting = array(
'Title' => 'Varchar',
'AltContent' => 'Text',
);
@ -126,6 +128,7 @@ class RSSFeedTest_ItemC extends ViewableData {
function Link() {
return "item-c.html";
}
function AbsoluteLink() {
return "http://www.example.com/item-c.html";
}