Web Frameworks - Workbook - Week 06

From mi-linux
Revision as of 15:47, 19 January 2010 by In9352 (talk | contribs)
Jump to navigationJump to search

Main Page >> Web Frameworks >> Workbook >> Workshop - week 06

Consuming an existing web feed

First let's create a new "feed" action in our existing "guestbook" controller:

% zf.sh create action feed guestbook

Next, let's add some code in our new action.

Reading an RSS feed is as simple as instantiating a Zend_Feed_Rss object with the URL of the feed. We then pass the feed data to the view.

// application/controllers/GuestbookController.php

    public function feedAction()
    {
      // Read remote feed
      try
      {
          $rss = new Zend_Feed_Rss('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;
      }

      // Pass feed data to view
      $this->view->entries = $rss;
    }

Next, we need to edit our view and add some code to loop through and display feed data passed by the controller:


<!-- application/views/scripts/guestbook/feed.phtml -->

<!-- Display feed title -->
<h1><?=$this->entries->title()?></h1>
<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>

Finally, let's add a link to our new page!

What you should see on your screen:

Feed 2.gif

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

Note: You don't want any layouts for this action, as you are displaying pure XML, not an HTML page. One way of achieving this is to change the current layout to very simple layout located in your layout folder (and called "blank.phtml" in this example).

(application/layouts/scripts/blank.phtml)

<?= $this->layout()->content ?>

Let's create a new "feed" action in your existing "Guestbook" controller. (see Workshop - week 04 - Models and databases)

The first thing you need to do is to specify that you want to use you "blank" layout for this action.

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';
      // You need to change this line to read $array['charset'] = 'utf-8'; (Note the change to the 'utf8' part)
      
      // 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();
    }

And of course we need a new view for our new action. It is rather simple, as all it only has to display the feed:

(application/views/scripts/guestbook/feed.phtml)

<?
  echo $this->feedxml;

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 with your own student number!)

Added By Sanjeev Summan 0718721

The above url should be ( or at least was for me!) http://mi-linux.wlv.ac.uk/~0123456/QuickStart/public/guestbook/feed

What you should see on your screen (if you are using Firefox 3 anyway... not sure what feeds look like in other browsers):

Feed.gif

More on web feeds with Zend

Ready to move on?

When you're happy you understand what you've done here, take a look at the Week 7 Workshop