Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter/PHP - Calling a view from within a view

Basically for my webapp I'm trying to organise it a bit better. As it at the moment, every time I want to load a page, I have to do it from my controller like so:

        $this->load->view('subviews/template/headerview');
    $this->load->view('subviews/template/menuview');
    $this->load->view('The-View-I-Want-To-Load');
    $this->load->view('subviews/template/sidebar');
    $this->load->view('subviews/template/footerview'); 

As you can tell it's not really very efficient.

So I thought I'd create one 'master' view - It's called template.php. This is the contents of the template view:

<?php
    $view = $data['view'];

        $this->load->view('subviews/template/headerview');
        $this->load->view('subviews/template/menuview');
        $this->load->view($view);
        $this->load->view('subviews/template/sidebar');
        $this->load->view('subviews/template/footerview');
?>

And then I thought I'd be able to call it from a controller like this:

    $data['view'] = 'homecontent';
    $this->load->view('template',$data);

Unfortunately I simply cannot make this work. Does anyone have any ways around this or fixes I can put into place? I've tried putting ""s and ''s around $view in template.php but that makes no difference. The usual error is "Undefined variable: data" or "Cannot load view: $view.php" etc.

Thanks folks!

Jack

like image 701
Jack Avatar asked Apr 11 '10 16:04

Jack


2 Answers

I believe where you have:

$view = $data['view'];

$this->load->view('subviews/template/headerview');
$this->load->view('subviews/template/menuview');
$this->load->view($view);
$this->load->view('subviews/template/sidebar');
$this->load->view('subviews/template/footerview');

You need to just get rid of the line:

$view = $data['view'];

This is because when the array is passed from the controller, the variable on the view can be accessed simply by $view rather than $data['view'].

like image 119
dd0x Avatar answered Oct 18 '22 07:10

dd0x


Quite a few suggestions here http://codeigniter.com/forums/viewthread/88335/

I chose this method: Controller class:

public function __construct() 
{
    parent::__construct();

    $this->load->vars(array(
        'header' => 'partials/header',
        'footer' => 'partials/footer',
    ));
}

public function index()
{       
    $data['page_title'] = 'Page specific title';        
    $this->load->view('my-view', $data);
}

View:

<?php $this->load->view($header, compact('page_title')); ?>
... blah blah ...
<?php $this->load->view($footer); ?>

Having to load the view in the view and pass through any variables that might be used by your child view is far from ideal. Being able to use something like Action Filters in Laravel would probably be better.

like image 6
Stan Bondi Avatar answered Oct 18 '22 06:10

Stan Bondi