模板继承/扩展布局在laravel中不起作用

时间:2015-01-02 14:27:25

标签: laravel

我的问题是模板继承不适用于某些视图。

这是我的模板(layout.blade.php)

<html>
    <head>
  <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>PoetryCollective</title>
    <link href="{{ asset('bower/bootstrap/dist/css/bootstrap.min.css') }}" rel="stylesheet">
    <link href="{{ asset('css/style.css') }}" rel="stylesheet">

    <!-- Bootstrap -->
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
    </head>
    <body>

        </div>
        <div class="container">

        <div class="row">
            </div>
            <div class="col-md-2 line logotitle">
                        <img alt="logotitle" src="{{ asset('images/poetryfont.png') }}"></img>  

            </div>
            <div class="col-md-10 line">
                <ul class="nav nav-tabs mynav navbar-right">
                        <li role="presentation"><a href="#">Login</a></li>
                        <li role="presentation"><?php echo link_to('/users/signup', 'SignUp');?></li>
                </ul>
            </div>
            <div class="row">
                <div class="col-md-11">
                    <div class="logotitle">
                    </div>
                </div>
                <div class="col-md-1 rightlogo">
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                <div class="navigation">
                    <nav role="navigation" class="navbar navbar-default mainnav">
                        <ul class="nav navbar-nav">
                            <li  role="presentation" class="active"><a href="#">Write poems</a></li>
                            <li  role="presentation"><a href="#">Read Poems</a></li>
                        </ul>
                        <form class="navbar-form navbar-right" role="search">
                            <div class="form-group">
                              <input type="text" class="form-control" placeholder="Find a poem">
                            </div>
                            <button type="submit" class="btn btn-default">Submit</button>
                        </form>
                    </nav>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-md-8 content">
                        @yield('content')


                        <h1>Lorem Ipsum</h1>
                        <p>
                            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras maximus in velit nec mattis. Morbi auctor massa vitae lorem molestie aliquam. Vivamus bibendum mi at eros fermentum, et gravida risus euismod. Quisque eu nisl vel urna placerat imperdiet nec in tortor. Morbi interdum pulvinar odio, eu pharetra massa varius vitae. Pellentesque suscipit felis ante, at dapibus felis luctus quis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean feugiat luctus erat, id facilisis mi suscipit quis. Donec eu erat sed leo volutpat rutrum. Suspendisse aliquam pretium eleifend. Curabitur nec volutpat ex. In interdum tortor id enim efficitur, ut porttitor lacus consectetur. Mauris blandit mollis neque, eget tincidunt ex hendrerit non. Donec sed ligula eu enim feugiat sollicitudin. Sed facilisis at mauris in rutrum.

                        </p>

                        <h1>Lorem Ipsum</h1>

                        <p>


Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent purus justo, consectetur at blandit id, porttitor vitae nunc. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer efficitur nulla eros. Aliquam eleifend venenatis sapien, sit amet lacinia dolor rhoncus quis. Fusce aliquam ullamcorper nulla at iaculis. Pellentesque suscipit, mi ut rhoncus sodales, elit arcu suscipit ex, a tempor eros quam quis ipsum. Vestibulum interdum rutrum faucibus. Aliquam vel feugiat mi, id vulputate nulla. Aliquam dapibus dolor eu risus tempus posuere. Aliquam erat volutpat. Integer in malesuada leo, ac commodo diam.

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam bibendum lectus nec felis tempus, a fermentum enim condimentum. Etiam magna nulla, bibendum egestas dictum vitae, rhoncus at lorem. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vestibulum vel lectus pharetra lobortis. Pellentesque lorem odio, consectetur in ultricies sagittis, facilisis at ante. Phasellus at sagittis nunc. Mauris hendrerit velit libero, vitae finibus augue rhoncus eget. Ut tincidunt pharetra arcu, ac fermentum nisi faucibus in. Nulla molestie vestibulum ligula, eget ultricies ex dictum id. Quisque scelerisque dictum lorem. Ut euismod blandit sem, sit amet tempor nulla sollicitudin aliquam. Nulla egestas feugiat fringilla.

Etiam id molestie neque, non malesuada enim. Aenean blandit interdum ligula, nec gravida dui. Nam lectus nisi, pulvinar at dolor et, dignissim maximus odio. Quisque sed congue velit, pellentesque fermentum dui. Mauris sed varius sem, nec dapibus est. Nulla suscipit enim diam, quis gravida quam placerat vel. Integer a dui ornare, hendrerit urna sed, sollicitudin enim. Phasellus id ante a sapien dictum hendrerit fermentum nec lectus. Integer elementum orci volutpat viverra interdum.

Fusce eget orci ornare, varius libero in, sodales nisl. Aenean at scelerisque eros. Nunc ut viverra neque, ut posuere libero. Maecenas in massa venenatis, mattis mauris. 


                        </p>
            </div>

            <div class="col-md-4 sidebar">
                    <h3>Sidebar</h3>

            </div>

        </div>
        <div class="row">
            <div class="col-md-12 footer">
                <p class="credit">
                    Fontdesign in Logo by Sergiy S. Tkachenko</p>
            </div>
        </div>
    </div>


        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="{{ asset('bower/bootstrap/dist/js/bootstrap.min.js') }}"></script>
    <script src="{{ asset('js/production.min.js') }}"></script>
    </body>
</html>

奇怪的是,这个视图可以工作并加载/扩展布局模板:

@extends('layout')

@section('content')
{{ $poems }}
@stop

但是这个不起作用,不加载模板,只显示自己的内容:

@extends('layout')


@section('content')

<?php
echo "<p>Signing up</p>";

echo Form::open(array('url' => '/users/signup'));
echo Form::label('username', 'Username');
echo Form::text('username');
echo Form::label('email', 'E-Mail Address');
echo Form::text('email');
echo Form::label('Password');
echo Form::password('password');
// echo Form::password('password1', 'Password confirmation');
echo Form::close();

if(!empty ($errors))
{
    foreach ($erros->all() as $error)
    {
        echo '<div class="error">' . $error . '</div>';
    }
}
?>
@stop

我只是无法弄清楚为什么一个加载模板而另一个没有。 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

这似乎是您对模板系统如何工作做出一些未说明(可能未实现)假设的情况之一。我要指出你的问题让人感到困惑,并希望能指出你正确的方向。

Laravel中有两个模板系统。其中一个命名为blade,使用类似

的语法
@extends('layout')

@section('content')
    La de {{$da}}
@stop

第二个使用较少的系统是一个基本的PHP模板系统。即,通过类方法包含PHP文件,您可以访问完整的PHP系统。它使用看起来像这样的语法

<h1>This is a template</h1>
La de <?php echo $da; ?>     

Laravel根据模板的文件名决定使用哪个引擎。如果你说

View::make('example');

并命名您的模板app/view/example.blade.php,然后Laravel将使用刀片系统渲染您的模板。如果您将模板命名为app/view/example.php,Laravel将使用PHP系统渲染您的模板。

重要:只有刀片系统支持模板继承。即,PHP模板没有等同于@extends@section。您可以通过其他方式模拟这一点,但PHP模板中没有继承概念。

在您的问题中,您没有包含模板的名称,因此我们无法判断它们是由刀片还是由PHP呈现。

此外,在您的第二个模板中,您将混合使用刀片和PHP语法。您无法在刀片模板中使用<?php切换到PHP。

@section('content')

<?php
echo "<p>Signing up</p>";

这只是一个猜测,但我假设第二个模板有一个blade.php扩展名,这意味着Laravel使用刀片渲染它,这就是为什么你的PHP代码没有被渲染。您最好的办法是在刀片模板中转换PHP模板。即这个

<?php
echo "<p>Signing up</p>";

echo Form::open(array('url' => '/users/signup'));
echo Form::label('username', 'Username');

成为这个

<p>Signing up</p>
{{Form::open(array('url' => '/users/signup'))}}
{{Form::label('username', 'Username')}}

答案 1 :(得分:0)

我理解你的问题,但你的代码对我没有意义。

如果您使用刀片模板,则更适合使用以下内容:

@extends('layout')

@section('content')

<p>Signing up</p>

{{ Form::open(array('url' => '/users/signup')) }}
{{ Form::label('username', 'Username') }}
{{ Form::text('username') }}
{{ Form::label('email', 'E-Mail Address') }}
{{ Form::text('email') }}
{{ Form::label('Password') }}
{{ Form::password('password') }}
{{ Form::close() }}

@if(!empty ($errors))
    @foreach ($erros->all() as $error)
        <div class="error">' . $error . '</div>';
    @endforeach
@endif
@stop

更清洁

答案 2 :(得分:0)

如果其中一个正在工作而另一个不工作,则应检查以下内容:

1)文件的位置。例如,如果它位于'layouts'文件夹中,则需要在文件夹名称前加上:

    @extends('layouts.foo')

2)文件名的扩展名为 .blade.php ,例如 foo.blade.php (不是 foo.php

3)实际文件名,您可能错误地命名,检查文件的拼写和扩展名