Build an RSS 2.0 Feed with CodeIgniter

Build an RSS 2.0 Feed with CodeIgniter

Nov 18th, 2009 in PHP by Drazen Mokic

In this tutorial, we will build a RSS 2.0 Feed with the PHP framework CodeIgniter. After this tutorial, you will be able to build a feed for any custom website in no time at all.

PG

Author: Drazen Mokic

Hi, I'm Drazen. I am a web designer and developer from Vienna, Austria. I love Front- and Backend development, including CSS, PHP, MySQL, jQuery and I fight for web standard based markup and applications.

Tutorial Details

  • Program: CodeIgniter PHP Framework
  • Version: 1.7.1
  • Difficulty: Easy
  • Estimated Completion Time: 30 minutes

Step 1: What we Need

Finished Product

First, we'll take a look at the tools needed to get started. Besides an installation of CodeIgniter, we need a running MySQL database with some content from which we can build our feed.

For this purpose, here are some dummy entries you can import. Create a database called tut_feeds. Then, copy the following code, and import it into your MySQL database.

    CREATE TABLE IF NOT EXISTS `posts` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(120) NOT NULL,
      `text` text NOT NULL,
      `date` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM;
    
    INSERT INTO `posts` (`id`, `title`, `text`, `date`) VALUES
    (1, 'Some great article', 'It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', '2009-08-10'),
    (2, 'Another great article', 'It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', '2009-08-10'),
    (3, 'News from myfeed', 'It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', '2009-08-10');

This is how it should appear in phpmyadmin. After you have pasted the code in, press the Ok button on the right side.

If everything works correctly, you should see have something like this:

Step 2: Setting up CodeIgniter

Before we start writing code, we need to configure CodeIgniter.

Browse to your CI folder, and then into system/application/config. We will need to edit the following files:

  • autoload.php
  • config.php
  • database.php
  • routes.php

Edit the autoload.php like so:

	$autoload['libraries'] = array('database');

This will tell CI to load the database automatically; so we don't need to load it every time.

Edit the config.php like so:

	$config['base_url'] = "http://localhost/YOUR DIRECTORY";

You need to replace tutorials/ci_feeds with your directory and CI folder.

Edit the database.php like so:

	$db['default']['hostname'] = "localhost"; // your host
    $db['default']['username'] = "root";
    $db['default']['password'] = "";
    $db['default']['database'] = "tut_feeds"; 

With these settings, we tell CI which database to use. Here you also have to replace hostname, username and password with your personal database info.

Edit the routes.php like this:

	$route['default_controller'] = "Feed"; 

The default controller is the "index" controller for your application. Every time you open localhost/YOUR DIRECTORY, this default controller will be loaded first. We'll create the feed in the next step.

Step 3: Creating the Feed Controller

In this controller, all the magic happens. Browse to system/application/controllers and create a new file called feed.php. Next, create the Feed controller and have it extend the parent CI Controller.

	class Feed extends Controller {
      
      function Feed()
      {
		parent::Controller();
      }
}

If you are already confused please have a look at Jeffrey's Easy Development with CodeIgniter tutorial. After you've learned the basics, return to continue this tutorial! :)

Before the next step, we'll make use of CI's great helpers. Load the xml and text helper.

class Feed extends Controller {
      
      function Feed()
      {
        parent::Controller();
        
        $this->load->helper('xml');
		$this->load->helper('text');
      }
}

Step 4: Creating the Model

Next, will create a model to receive data from the database. If you don't know what models are, have a look at the CI userguide. Browse to system/application/models and create a file called posts_model.php.

class Posts_model extends Model {
	
	// get all postings
	function getPosts($limit = NULL)
	{
		return $this->db->get('posts', $limit);
	}
}

We are using active records to receive data from the database. The first parameter declares the table we want to use and with the second we can set a limit - so we can tell CI how many records we want to retrieve.

Perhaps you've noticed that $limit is set to NULL by default. This makes it possible to set a limit, but you don't have to. If you don't set a second parameter, this function will simply return all records.

Step 5: Back to the Feed Controller

Now that we've created our model, we can continue with our feed controller. We'll load the posts_model that we just created.

class Feed extends Controller {
      
      function Feed()
      {
        parent::Controller();
        
        $this->load->helper('xml');
		$this->load->helper('text');
        $this->load->model('posts_model', 'posts');
      }
}

With the second parameter, we assign our model to a different object name - so we have less to type :P. Now we create the index method which is the method called by default. Let's set up some information for the feed view later too.

	function index()
	{
		$data['feed_name'] = 'MyWebsite.com'; // your website
		$data['encoding'] = 'utf-8'; // the encoding
        $data['feed_url'] = 'http://www.MyWebsite.com/feed'; // the url to your feed
        $data['page_description'] = 'What my site is about comes here'; // some description
        $data['page_language'] = 'en-en'; // the language
        $data['creator_email'] = 'mail@me.com'; // your email
        $data['posts'] = $this->posts->getPosts(10);  
        header("Content-Type: application/rss+xml"); // important!
	}

While the majority of the information above is easy to understand, we will have a look at two of them. header("Content-Type: application/rss+xml"); is a very important part. This tells the browser to parse it as an RSS Feed. Otherwise the browser will try to parse it as plain text or html.

With $data['posts'] = $this->posts->getPosts(10); we are using our model and are storing all records in the $posts array. I set the limit to 10; so it will return, at most, 10 records. You can set this value higher or lower if you want. If we leave it blank, like $data['posts'] = $this->posts->getPosts();, it would return all records.

Finally, we need to load the view which we will create in the next step.

	function index()
	{
		$data['feed_name'] = 'MyWebsite.com'; 
		$data['encoding'] = 'utf-8'; // the encoding
        $data['feed_url'] = 'http://www.MyWebsite.com/feed'; 
        $data['page_description'] = 'What my site is about comes here'; 
        $data['page_language'] = 'en-en'; 
        $data['creator_email'] = 'mail@me.com';
        $data['posts'] = $this->posts->getPosts(10);  
        header("Content-Type: application/rss+xml"); 
        
        $this->load->view('rss', $data);
	}

Our $data array is passed as the second parameter to the view file, so we can access it in the view. Your feed controller should now look like this:

class Feed extends Controller {
	
	function Feed()
	{
		parent::Controller();
		
		$this->load->helper('xml');
		$this->load->helper('text');
        $this->load->model('posts_model', 'posts');
	}
	
	function index()
	{
		$data['feed_name'] = 'MyWebsite.com';
		$data['encoding'] = 'utf-8';
        $data['feed_url'] = 'http://www.MyWebsite.com/feed';
        $data['page_description'] = 'What my site is about comes here';
        $data['page_language'] = 'en-en';
        $data['creator_email'] = 'mail@me.com';
        $data['posts'] = $this->posts->getPosts(10);    
        header("Content-Type: application/rss+xml");
		
		$this->load->view('rss', $data);
	}
	
}

Step 6: Creating the View

Finally we have to create the view file - our output. Browse to system/application/views and crate a file called rss.php.

First we set the xml version and the encoding within the head.

	<?php  echo '<?xml version="1.0" encoding="' . $encoding . '"?>' . "\n"; ?>

Followed by some rss meta information.

    
    
        

Now we will access the array $data from the previous step. We can access this data via the array keys, like so:

    <?php echo $feed_name; ?>

    
    
    
    

    Copyright 
    

Now we need to loop, with foreach, to get all records.

    result() as $post): ?>
    
       

          <?php echo xml_convert($post->title); ?>
          id) ?>
          id) ?>

          	text, 200); ?> ]]>
			date; ?>
        

        
    
	
    	
	<  

For link and guide, you have to set a link to your controller where the posts are fetched. For example: my/posts/$post->id.

I hope you noticed CDATA. This is used for text-output (content). Remember how we learned in the head that this is xml; so it has to be xml valid. If we don't set CDATA we'll potentially end up with invalid markup.

Step 7: Overview

Now your files should look like this:

system/application/controllers/feed.php

class Feed extends Controller {
	
	function Feed()
	{
		parent::Controller();
		
		$this->load->helper('xml');
		$this->load->helper('text');
        $this->load->model('posts_model', 'posts');
	}
	
	function index()
	{
		$data['feed_name'] = 'MyWebsite.com';
		$data['encoding'] = 'utf-8';
        $data['feed_url'] = 'http://www.MyWebsite.com/feed';
        $data['page_description'] = 'What my site is about comes here';
        $data['page_language'] = 'en-en';
        $data['creator_email'] = 'mail@me.com';
        $data['posts'] = $this->posts->getPosts(10);    
        header("Content-Type: application/rss+xml");
		
		$this->load->view('rss', $data);
	}
	
}

system/application/models/posts_model.php

class Posts_model extends Model {
	
	// get all postings
	function getPosts($limit = NULL)
	{
		return $this->db->get('posts', $limit);
	}
}

system/application/views/rss.php

	' . "\n"; ?>
    
    
        
        
        <?php echo $feed_name; ?>
    
        
        
        
        
    
        Copyright 
        
    
        result() as $post): ?>
        
            
    
              <?php echo xml_convert($post->title); ?>
              id) ?>
              id) ?>
    
                text, 200); ?> ]]>
                date; ?>
            
    
            
        
        
        
      

And our feed looks like this, just with other content :)

Conclusion

I hope you've learned how easy it is to build an RSS 2.0 Feed with the power of CodeIgniter. For more tutorials and screencasts on CodeIgniter, check out Jeffrey`s CodeIgniter from Scratch series.


Related Posts

Check out some more great tutorials and articles that you might like

Enjoy this Post?

Your vote will help us grow this site and provide even more awesomeness

Plus Members

Source Files, Bonus Tutorials and
More for $9 a month for all TUTS+
sites in one subscription.

Join Now

User Comments

( ADD YOURS )
  1. PG

    Sergio November 18th

    Awesome, need to try this out.

    ( Reply )
  2. PG

    Crysfel November 18th

    there is a problem with the view, i think you should change the “” to “>” and “<” in your post.

    Thanks for the tut :D

    ( Reply )
  3. PG

    Muhammad Adnan November 18th

    seems I should try CI framework.

    ( Reply )
  4. PG

    BhenChod November 18th

    Would be better to show how we can create a twitterfeed of our own. eg. post to twitter from RSS, and works with all feeds.

    ( Reply )
  5. PG

    designfollow November 18th

    great info

    thank you

    ( Reply )
  6. PG

    David Rojas November 18th

    Now that’s a useful tutorial. Thanks. But please fix the view, I think the wp plugin for showing code has screwed it up.

    ( Reply )
    1. PG

      Drazen Mokic November 19th

      I cant do anything now, Jeffrey can fix this :)

      ( Reply )
  7. PG

    Jonas November 18th

    CodeIgniter is great – my preferred PHP framework. Zend Framework really makes something as simple as MVC complicated and time-consuming, whereas it’s easy with CodeIgniter. For those who are interested in getting further into CodeIgniter, check out http://codeigniter.com/tutorials/ .

    ( Reply )
  8. PG

    esranull November 18th

    really useful post but I cant

    ( Reply )
  9. PG

    Zoran November 18th

    Derek Allard, one of the guys from CI already has done this long time ago and there are other tutorials like this one, but anyhow, thank you very much for your effort, i am an experienced CI user and i am always happy to see tutorial about it.

    ( Reply )
  10. PG

    Milan November 18th

    That is really simple I tought that there will be more work.

    Great tut Drazene. Thanks.

    ( Reply )
  11. PG

    Imran Khan November 19th

    CI KICK ASS FOR PHP , nice tutorial

    ( Reply )
  12. PG

    Anton Lindqvist November 19th

    Great tutorial!
    But wouldn’t it be more efficient to use CI:s own Output class to set the Content-Type header? See example below.

    $this->output->set_header(‘Content-Type: application/rss+xml’);

    ( Reply )
    1. PG

      Drazen Mokic November 19th

      Yeah it maybe would be more efficient, you are right. CI has so much helpfull classes, helpers and libraries that i sometimes forget that there is this special one :D

      thanks

      ( Reply )
  13. PG

    Matt B November 19th

    Fantastic tutorial! I will be sure to reference this one in the future.

    Jeff, PLEASE fix that formatting problem!

    ( Reply )
  14. PG

    Brian Temecula November 19th

    While this tutorial is very basic, I like the continued dedication to CodeIgniter. Thanks for your work.

    ( Reply )
  15. PG

    Chalda November 19th

    Why you include xml helper if you don’t use the function xml_convert() ?

    ( Reply )
  16. PG

    Commenter November 19th

    I see one problem with this tutorial
    “After this tutorial, you will be able to build a feed for any custom website in no time at all. ”

    CI is not needed for XML, though a tutorial like this is great if someone already has a website built in CI, if not then this is far from a practical solution.

    ( Reply )
    1. PG

      R. B. Gottier November 19th

      Isn’t it obvious? If you don’t use CI, then you are missing out! I just released an E-Commerce application to the CI Wiki. That wouldn’t be a practical application for somebody to use if they weren’t a CI user, but it should be obvious that CI is awesome. The benefits of this framework are many, and after reading many articles about CI, a developer should have at least checked out CI by now.

      ( Reply )
      1. PG

        Commenter November 19th

        I just remembered this tutorial is aimed more at new people rather than experienced developers. But, put it this way, if they were taught to build an RSS feed in raw PHP, then they can very easily do so in CI without a tutorial.

      2. PG

        Commenter November 19th

        Or better yet, teach some basic OOP and make a BASIC XML creator library with an RSS feed helper (all in same class), and that can then very easily be imported into CI, or any other framework for that matter, and thats much more pratical imo.

      3. PG

        Robert P November 20th

        Of all the frameworks I have trialled over the years, CodeIgniter has the worst MVC implementation. It’s more a collection of poorly coded libraries loaded through a pointless interface.

        “The benefits of this framework are many”

        The benefits of any framework are many, but CI falls short at what it tries to imitate: a full-stack framework.

        Using CakePHP as an example (and not purposefully advocating it) you can build a more flexible RSS generator in about the same amount of time without needing to code the XML manually, as in this tutorial.

        Ultimately, use whichever framework gets the job done for you, but don’t try and claim CI is anything other than an inferior framework.

  17. PG

    Steven Dobbelaere November 21st

    I had to make some xml structure adjustments to get it to work, but it works now. I did this in no time, that’s why I love codeigniter.

    ( Reply )
  18. PG

    Rick November 26th

    Have you tried building an RSS feed in PHP without CodeIgniter? Because I think it’s probably much faster to write and to run without a web framework.

    ( Reply )
  19. PG

    webmasterdubai November 30th

    im big fan of CI, and this is really good tutorial fond to create feeds with CI in really simple way.

    ( Reply )
  20. PG

    new2web December 4th

    I am new to CI, I get afatal error saying Fatal error: Call to undefined function site_url() when I execute the code. Please let me know how to solve this problem?

    ( Reply )
    1. PG

      Drazen Mokic December 12th

      You need to load the ‘url’ helper before using the site_url() function.

      ( Reply )
  21. PG

    Jack Starr December 7th

    This is what i wanted….

    ( Reply )
  22. PG

    tips photoshop December 10th

    very nice,thanks :)

    ( Reply )
  23. PG

    troll January 18th

    please fix the code!!!
    thanks!

    ( Reply )
  24. PG

    troll January 18th

    hi, this is a rip off of this:
    http://derekallard.com/blog/post/building-an-rss-feed-in-code-igniter/

    what a shame!

    ( Reply )
  1. Arrow
    Gravatar

    Your Name
    January 18th