Difference between revisions of "Workshop - week 06"
Line 84: | Line 84: | ||
== Producing your own web feed == | == Producing your own web feed == | ||
− | Let's create a new "feed" action in out existing "Guestbook" controller. | + | Let's create a new "feed" action in out existing "Guestbook" controller. (see [[Workshop - week 04]] - Models and databases) |
We don't want any layouts for this action, as we are displaying pure XML, not an HTML page. One way of achieving this is to change the current layout to an empty file located in our layout folder (and called "blank.phtml" in this example). | We don't want any layouts for this action, as we are displaying pure XML, not an HTML page. One way of achieving this is to change the current layout to an empty file located in our layout folder (and called "blank.phtml" in this example). |
Revision as of 15:51, 28 January 2009
Main Page >> Web Frameworks >> Web Frameworks - Workbook >> Workshop - week 06
Consuming an existing web feed
First you need to create a new controller (new file!), with just one default "index" action.
In this action you simply create your feed object by calling the Zend_Feed::import function, which take as a parameter the URL of the web feed (the BBC news feed in this example).
You then copy the content of the feed to an array, and pass the array to the view.
<?php // application/controllers/FeedController.php class FeedController extends Zend_Controller_Action { protected $_model; public function indexAction() { // Read remote feed try { $rss = Zend_Feed::import('http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml'); } catch (Zend_Feed_Exception $e) { // feed import failed echo "Exception caught importing feed: {$e->getMessage()}\n"; exit; } // Initialize the channel data array $channel = array( 'title' => $rss->title(), 'link' => $rss->link(), 'description' => $rss->description(), 'items' => array() ); // Loop over each item and store relevant data foreach ($rss as $item) { $channel['items'][] = array( 'title' => $item->title(), 'link' => $item->link(), 'description' => $item->description() ); } // Pass to view $this->view->entries = $channel['items']; } }
You also need to create a view (new file!) for your new controller/action. The view simply loops through and displays the array provided by the controller:
<!-- application/views/scripts/feed/index.hhtml --> Feed Entries: <br /> <dl> <!-- Loop through the entries provided by the controller --> <? foreach ($this->entries as $entry): ?> <dt><?= $this->escape($entry['title']) ?></dt> <dd><?= $this->escape($entry['description']) ?></dd> <? endforeach ?> </dl>
You can then simply access your consumed feed at the following URL: http://mi-linux.wlv.ac.uk/~0123456/zend/public/feed/ (please replace 0123456 by your own student numbeer!)
What you should see on your screen:
Note: For simplicity and clarity we are importing the feed in the controller, but a feed is an XML file, and as such could (should?) be considered as a data source. In line with MVC principles it would therefore be better practice to move the feed import code to a "model" file.
Producing your own web feed
Let's create a new "feed" action in out existing "Guestbook" controller. (see Workshop - week 04 - Models and databases)
We don't want any layouts for this action, as we are displaying pure XML, not an HTML page. One way of achieving this is to change the current layout to an empty file located in our layout folder (and called "blank.phtml" in this example).
You then transfer your data from the model to an array, and convert the array to a feed using the Zend_Feed::importArray function.
Easy!
// application/controllers/GuestbookController.php public function feedAction() { // Change layout to blank.phtml (empty file) $this->_helper->layout->setLayout('blank'); // Set feed values $array['title'] = 'Guestbook feed'; $array['link'] = 'http://www.somewhere.com/'; $array['description'] = 'This is guestbook feed'; $array['charset'] = 'utf8'; // Loop through db records and add feed items to array $model = $this->_getModel(); foreach($model->fetchEntries() as $one_item) { $array['entries'][] = array( 'title' => $one_item['email'], 'link' => 'http://www.somewhere.com/123', 'description' => $one_item['comment'] ); } // Import rss feed from array $feed = Zend_Feed::importArray($array, 'rss'); // Send http headers and dump the feed $feed->send(); }
To test your new "feed" action simply visit the following URL: http://mi-linux.wlv.ac.uk/~0123456/zend/public/guestbook/feed (please replace 0123456 by your own student numbeer!)
What you should see on your screen (if you are using Firefox anyway... not sure what feeds look like in other browsers):