Sam Pettersson
Sam Pettersson

Reputation: 3227

Using multiple layouts in one controller

I can use protected $layout = 'layouts.mylayout'; to define which layout Laravel should use when using $this->layout->content = View::make('myview'); but what should i do if i need to use multiple layouts in the same controller?

Upvotes: 0

Views: 129

Answers (2)

Andreyco
Andreyco

Reputation: 22872

What about this solution? You can override layout property in controllers method, assing content to it, etc... Response is returned automaticaly.

To note, be sure your controller extends BaseController which contains setupLayout method. If it does not extend, implement setupLayout inside of your controller.

<?php

class UsersController extends BaseController
{

    protected $layout = 'users.layout.main';

    public function getList()
    {
        $this->layout->content = View::make('users.list');
    }

    public function getDetail()
    {
        $this->layout = View::make('users.layout.detail');

        $this->layout->content = View::make('users.detail');
    }
}

Upvotes: 1

Antonio Carlos Ribeiro
Antonio Carlos Ribeiro

Reputation: 87799

Looks like you cannot do it using protected $layout. But you have many options.

One is to pass the layout name to your view:

class TestController extends BaseController {

    public function index()
    {

        return View::make('myview', ['layout' => 'layouts.mylayout']);

    }

    public function show()
    {

        return View::make('myview', ['layout' => 'layouts.mySecondLayout']);

    }

    public function create()
    {

            /// this one will use your default layout

        return View::make('myview');

    }

}

And @extends your layout in your myview.blade.php:

@extends( isset($layout) ? $layout : Config::get('app.layout')  )

@section('content')
    Here goes your content
@stop

And your layout should be something like

<html><body>

    THIS IS YOUR LAYOUT 1

    @yield('content')

</body></html>

Also, in your app/config/app.php you will have to configure your default layout:

return array(

    'layout' => 'layouts.master',

    ...

);

Upvotes: 0

Related Questions