You are viewing revision #6 of this wiki article.
This is the latest version of this article.
You may want to see the changes made in this revision.
Web feed is a data format used for providing users with frequently updated content. In this article, we describe how to use Zend_Feed, an excellent component from Zend Framework to generate Web feed for an Yii application. This article can also serve as a general guide on how to use other components in Zend Framework.
To begin with, we download Zend Framework and extract it to the directory protected/vendors/Zend. Verify the file protected/vendors/Zend/Feed.php exists.
Then, in SiteController (or another controller if you like) create a feed action as follows,
Yii::import('application.vendors.*');
require_once('Zend/Feed.php');
public function actionFeed()
{
// retrieve the latest 20 posts
$posts=Post::model()->findAll(array(
'order'=>'createTime DESC',
'limit'=>20,
));
// convert to the format needed by Zend_Feed
$entries=array();
foreach($posts as $post)
{
$entries[]=array(
'title'=>$post->title,
'link'=>$this->createUrl('post/show',array('id'=>$post->id)),
'description'=>$post->content,
'lastUpdate'=>$post->createTime,
);
}
// generate and render RSS feed
$feed=Zend_Feed::importArray(array(
'title' => 'My Post Feed',
'link' => $this->createUrl(''),
'charset' => 'UTF-8',
'entries' => $entries,
), 'rss');
$feed->send();
}
To this end, the feed is done and we can access it via the following URL:
http://www.example.com/index.php?r=site/feed
Using the URL management feature of Yii, we can beautify the above URL to something like http://www.example.com/feed.xml.
We can insert this link to the head section of a page using the following code:
Yii::app()->clientScript->registerLinkTag(
'alternate',
'application/rss+xml',
$this->createUrl('site/feed'));
We can also use [CHtml::linkTag()] to directly insert the link tag at the current place in a page. The difference between these approaches is that the former code can be written anywhere while the latter can only appear in the head section of a view (or layout).
The Zend_Feed component has many other features. If you are interested, please refer to its documentation.
User Contributed Notes 6
How to load the files from Zend framework
For all of you who have trouble loading the Zend framework files here is my solution:
ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'path/to/zend/framework/'); // without the "Zend" directory and with trailing slash
require_once 'Zend/Loader/Autoloader.php';
Yii::registerAutoloader(array('Zend_Loader_Autoloader','autoload'));
What worked for me
I didnt really want to upload the whole Zend framework if I didnt need to so I worked out what is required.
3 folders - Feed, Http and Loader
4 files - Exception.php, Feed.php, Loader.php, Uri.php
At least thats what worked for me.
I had to use pretty much all the tweaks in the above comments to get it to work, so thanks all.
For completeness, my controller -
public function actionFeed() { Yii::import('application.vendors.*'); require_once 'Zend/Loader/Autoloader.php'; spl_autoload_unregister(array('YiiBase','autoload')); spl_autoload_register(array('Zend_Loader_Autoloader','autoload')); spl_autoload_register(array('YiiBase','autoload')); // retrieve the latest 20 posts $posts=Post::model()->findAll(array( 'order'=>'createTime DESC', 'limit'=>20, )); // convert to the format needed by Zend_Feed $entries=array(); foreach($posts as $post) { $entries[]=array( 'title'=>$post->title, 'link'=>CHtml::encode($this->createAbsoluteUrl('post/view',array('id'=>$post->id))), 'description'=>$post->content, 'lastUpdate'=>$post->createTime, ); } // generate and render RSS feed $feed=Zend_Feed::importArray(array( 'title' => 'dallak', 'link' => $this->createUrl(''), 'charset' => 'UTF-8', 'entries' => $entries, ), 'rss'); $feed->send(); }Autoload vs. require
Just to note that here:
Instead of
require_once('Zend/Feed.php');
require_once('Zend/Feed/Atom.php');
you may also use:
require_once 'Zend/Loader/Autoloader.php';
spl_autoload_unregister(array('YiiBase','autoload'));
spl_autoload_register(array('Zend_Loader_Autoloader','autoload'));
spl_autoload_register(array('YiiBase','autoload'));
taken from http://www.yiiframework.com/doc/cookbook/37/
PHP Error : DOMDocument::createElement(): unterminated entity reference ...
DOMDocument::createElement() that uses ZendFeed cannot pass the unsafe params like a character "&" that was in my url, created due to
$this->createUrl('post/show',array('id'=>$post->id)).So the Solution is in using a htmlentities() before unsafe parameters.
And the correct will be like this:
'link'=>htmlentities($this->createUrl('post/show',array('id'=>$post->id))),include error
I followed this guide and received the following error:
PHP Error Description include(Zend_Feed_Rss.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory Source File C:\Documents and Settings\Administrator\Desktop\Projects\Businessfeed\Site\yii\framework\YiiBase.php(310)SOLUTION
Add
require_once('Zend/Feed/Rss.php');on the line belowrequire_once('Zend/Feed.php');More Zend classes for
If you use the guid tag in the item, you need more Zend classes:
Leave a comment
If you have any questions, please ask in the forum instead.
Join the conversation to share a note.