tags:

views:

57

answers:

4

Let's say that I have a website that has 100 different pages. Each page uses a common header and footer. Inside the header is some dynamic content that comes from a database.

I'd like to avoid having to have code in every single controller and action that passes this common code into the view.

function index()
{
    // It sucks to have to include this on every controller action.
    data['title'] = "This is the index page";
    data['currentUserName'] = "John Smith";

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

function comments()
{
    // It sucks to have to include this on every controller action.
    data['title'] = "Comment list";
    data['currentUserName'] = "John Smith";

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

I realize that I could refactor the code so that the common parts are in a single function and the function is called by the action. Doing so would reduce SOME of the pain, but it still doesn't feel right since I'd still have to make a call to that function every time.

What's the correct way to handle this?

A: 

I had a similar situation. I created an 'includes' folder, and in there put a file that had the repetitive code from my controllers. Then in the controllers just include('/path/to/includeFile.php');

Don't know if it's the "correct" way, but it works well for me.

stormdrain
NO. This is bad. Doesn't follow MVC and is generally bad practice.
Tom Schlick
A: 

I ran across this after a search of their site. http://codeigniter.com/wiki/Header_and_footer_and_menu_on_every_page/ I'll review this page and its links, then post my thoughts.

Darthg8r
+1  A: 

One way I have been doing this is to extend the default controller class. You can read up on extending classes with MY_Controller in the user guide. Inside this extended class you can include something that you ALWAYS want to do, like render the page header template before the main content, or authorise a users access etc.

class MY_Controller extends Controller {

    function __construct()
    {
        parent::Controller();
        //code to always do goes here
        echo 'Always print this comment';
        $this->load->view('partials/template_start');
    }
} 

Then you can have your normal controller class extend THIS class by using

class MyControllerNameHere extends MY_Controller {
    function __construct()
    {
        //setup here
    }
    function index()
    {
        echo 'Only print this bit when this method is called';
        $this->load->view('partials/MYPAGENAMEHERE');
    }
}

There are other ways of doing this, I use a mixture of the above and William's Concepts Codeigniter Template library. Do a bit of searching - there are a few solutions for you.

Andy Copley
+1  A: 

I've also used the template library referenced above - http://www.williamsconcepts.com/ci/codeigniter/libraries/template/

This is another template library that came out recently - http://philsturgeon.co.uk/code/codeigniter-template

I haven't looked into the differences between the two much but I know that the people who created them are both strong contributors to the Codeigniter community.

someoneinomaha