CI How-to: Load global data in a view across all controllers

One the first issues I encountered with CodeIgniter was that I wanted to be able to use the same dynamic data in my header view across all controllers. And, I didn't want to repeat myself in each controller to load the model data that needed to be persistent site wide. For example, see the twitter feed in the header? I didn't want to have to do something like this in each method of every controller.

// *** inside the blog controller

function index() {
    $data['twitter'] = $this->twitter->get_twitter_status();

    return $this->load->view('entry_list', $data);
}

function entry() {
    $data['twitter'] = $this->twitter->get_twitter_status();

    return $this->load->view('entry_detail', $data);
}

// *** inside the about controller

function index() {
    $data['twitter'] = $this->twitter->get_twitter_status();

    return $this->load->view('about', $data);
}

// *** etc...

There is too much repetition here, so let's streamline the process. Start by creating a file in ./system/application/libraries/MY_Controller.php. When you prefix it with "MY_", CI will automatically load the file because it thinks you want to extend the base class. We do. Win.

class MY_Controller extends Controller {
    var $global_data = array();

    function MY_Controller() {
        parent::Controller();

        $this->load->model('Twitter_model', 'twitter');
        $this->global_data['twitter'] = $this->twitter->get_twitter_status();

        // other common stuff; for example you may want a global cart, login/logout, etc.
    }

    // create a simple wrapper for the CI load->view() method
    // but first, merge the global and local data into one array
    function display_view($view, $local_data = array()) {
        $data = array_merge($this->global_data, $local_data);

        return $this->load->view($view, $data);
    }
}

Now in your controllers, extend MY_Controller instead of Controller. And in your controller methods, instead of calling $this->load->view(), call the wrapper function.

class Blog extends MY_Controller {
    function Blog() {
        parent::MY_Controller();
    }

    function index() {
        $data['will_it_blend'] = "Yes, it will blend.";

        // ... do stuff ...

        $this->display_view("entry_list", $data);
    }
}

The "entry_list" view in this example will have both the global $twitter and the local $will_it_blend data variables set. While trolling the CodeIgniter forums, I also came across Template Library for CodeIgniter which looks to be even more über. But I think it might be overkill for what I'm after today.

What others are saying...

tomexsans
Hello, i know this version of the CI you use is not the latest, will this trick run on the latest version of CI like version 2?

Add your thoughts...

Name:

Website/URL:
(optional)

Comments:

Image Verification: