Best method of including views within views in CodeIgniter
I'm starting a large codeigniter project and would like to try to create some reusable 'mini' views for snippets of content like loops of data which may be displayed on different pages/controllers.
Is it better to call the views from within the main controller's view? If so, how? Or should I call the 'mini view' from the controller and thus pass the view's code to the main view?
Verified Answer (113 Votes) ✓
Views within other views are called Nested views. There are two ways of including nested views in CodeIgniter:
1. Load a nested view inside the controller
Load the view in advance and pass to the other view. First put this in the controller:
<?php // the "TRUE" argument tells it to return the content, rather than display it immediately $data['menu'] = $this->load->view('menu', NULL, TRUE); $this->load->view ('home', $data); ?>
<?=$menu?> in your view at the point you want the menu to appear.
2. Load a view "from within" a view
First put this in the controller:
<?php $this->load->view('home'); ?>
Then put this in the
<?php $this->view('menu'); ?> <p>Other home content...</p>
About best method, I prefer the 1st method over 2nd one, because by using 1st method I don't have to mix up code, it is not like include php. Although indirectly both are same, the 1st method is clearer & cleaner than 2nd one!
Answer #2 (17 Votes)
Honestly I prefer to do this by having template views then loading that with the necessary data from the controller, it means a lot less repeated code and follows the DRY concept better than loading views from views. Especially for things like headers, footers and menus.
So my template view would look something like this:
$this->load->view('header',$title); $this->load->view('sidebar',$sidebar_content); $this->load->view('main_content',$main_content); $this->load->view('footer');
Then in my controller I pass the data required to the template like this:
$data['title'] = 'Home Page'; $data['sidebar_content']='pages/standard_sidebar'; $data['main_content'] ='pages/my_home_page'; $this->load->view('template',$data);
There are a number of benefits to doing it this way. First is I can have multiple templates, for example I have, in my case, two main ones, one for full page views without a sidebar and one for pages with a sidebar, I also call an if statement to decide which header to include, the regular one or the one with the admin menu in it.
Yes I could include the header, sidebar and footer in every main view page, but that ends up in a ton of duplicate code. And what happens if for example I want all my pages to have something new, some other small snippet? Using templates I add the snippet to the appropriate template and it's done. Going the other route I find every page and add the snippet view there, it's the equivalent to having CSS in the page in my opinion, wasteful and not ultimately maintainable.
Answer #3 (8 Votes)
I use this method into my view to insert the include view where I want
or in the controller you can load more than a view like this:
$this->load->view('header_view'); $this->load->view('list_view'); $this->load->view('footer_view');
No one method is better than the other, it depends if you have to pass some data (in this case use method2) or if you want to include a view in a specific part of your main view (in this case is better to use method1)
Passing data to your include view by your main view
into your controller:
$data['title'] = "Title"; $this->load->view('main_view',$data);
in your view
$data2['title'] = $title; $this->load->view('include/include_view',$data2);
If you want to pass entire data to your include view you can do in this way: in your controller:
$data['nestedView']['title'] = 'title';
in your view