28

我正在尝试让我的默认模板与 Laravel 一起使用。我来自 Codeigniter 和 Phil Sturgeon 的模板系统,所以我试图以类似的方式来做。任何人都可以帮助我解决我错过的/做错的事情吗?谢谢!

//default.blade.php (located in layouts/default)
<html>
    <title>{{$title}}</title>
    <body>
    {{$content}}
    </body>
</html>
//end default.blade.php

//home.blade.php (index view including header and footer partials)
@layout('layouts.default')
@include('partials.header')
//code
@include('partials.footer')
//end home

//routes.php (mapping route to home controller)
Route::controller( 'home' );
//end

//home.php (controller)
<?php
class Home_Controller extends Base_Controller {
    public $layout = 'layouts.default';
    public function action_index()
    {   
        $this->layout->title = 'title';
        $this->layout->content = View::make( 'home' );
    }
}
//end
4

2 回答 2

86

您正在混合 Laravel 的两种不同布局方法。这样您就可以渲染布局视图,包含主视图并尝试再次包含在布局中。

我个人的偏好是控制器方法。

控制器布局

控制器和布局可以保持不变。

注意:作为快捷方式,您可以嵌套内容而不是 View::make,当您在布局中回显它时,它会自动呈现它。

在 home.blade.php 中删除 @layout 函数。

编辑(示例):

控制器/home.php

<?php
class Home_Controller extends Base_Controller {
  public $layout = 'layouts.default';
  public function action_index()
  {
    $this->layout->title = 'title';
    $this->layout->nest('content', 'home', array(
      'data' => $some_data
    ));
  }
}

视图/布局/default.blade.php

<html>
  <title>{{ $title }}</title>
  <body>
    {{ $content }}
  </body>
</html>

意见/home.blade.php

部分内容包含在内容中。

@include('partials.header')
{{ $data }}
@include('partials.footer')

刀片布局

如果你想要这种方法,你会遇到一些问题。首先,您在布局后包含新内容。不确定是否有意,但@layout函数本身基本上只是一个@include,限制在视图的开头。因此,如果您的布局是一个封闭的 html,那么之后的任何包含都将附加在您的 html 布局之后。

您的内容应在此处使用带有@section功能的部分,并在您的布局中使用@yield 。页眉和页脚可以使用@include包含在布局中,或者如果您想在内容视图中定义它,那么也可以将它们放在@section中,如下所示。如果您以这种方式定义它,如果一个部分不存在,则不会产生任何结果。

控制器/home.php

<?php
class Home_Controller extends Base_Controller {
  public function action_index()
  {
    return View::make('home')->with('title', 'title');
  }
}

视图/布局/default.blade.php

<html>
 <title>{{$title}}</title>
 <body>
  @yield('header')
  @yield('content')
  @yield('footer')
 </body>
</html>

意见/home.blade.php

@layout('layouts.default')
@section('header')
  header here or @include it
@endsection
@section('footer')
  footer
@endsection
@section('content')
  content
@endsection
于 2012-09-21T09:16:28.163 回答
0

上面给出的答案解释了如何在 Laravel 中完成模板化,但是为了获得额外的好处,比如管理组织到主题目录中的主题,能够在主题之间切换以及将部分和主题资源放在一起,这听起来几乎类似于Phil Sturgeon 模板库CI。您可能需要检查 Laravel 的主题包。链接在这里:

http://raftalks.github.io/Laravel_Theme_Bundle/

于 2012-09-27T22:16:05.587 回答