Подтвердить что ты не робот

Ларавельное лезвие, как добавить в раздел

Если вы посмотрите официальную документацию laravel http://laravel.com/docs/4.2/templates В нем говорится, что предоставление этого макета:

<!-- Stored in app/views/layouts/master.blade.php -->

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

В расширенном виде

@extends('layouts.master')

@section('sidebar')


    <p>This is appended to the master sidebar.</p>
@stop

@section('content')
    <p>This is my body content.</p>
@stop

Будет добавлен раздел sidebar. Но на самом деле, если вы попробуете, это не добавляет, он просто переопределяет содержимое из расширенного шаблона.

Я слышал о других функциях лезвия, таких как @append, @prepend, @parent... никто не работает.

Кроме того, этот пример в официальном документе, который не работает, я считаю, что документация на blade-серверу очень плохая. Здесь нет ничего о функции лезвия, например @parent.

4b9b3361

Ответ 1

Пример в документации на веб-сайте Larvel действительно кажется ошибочным, но я думаю, что это проблема разборки разметки на веб-сайте, те же документы в github показывают правильный код:

В любом случае @parent действительно работает. Пример в документах должен выглядеть так:

@extends('layouts.master')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@stop

@section('content')
    <p>This is my body content.</p>
@stop

Быстрый просмотр в Illuminate/View/Factory.php подтверждает, что делает @parent:

/**
 * Append content to a given section.
 *
 * @param  string  $section
 * @param  string  $content
 * @return void
 */
protected function extendSection($section, $content)
{
    if (isset($this->sections[$section]))
    {
        $content = str_replace('@parent', $content, $this->sections[$section]);
    }

    $this->sections[$section] = $content;
}

Ответ 2

Вы можете просто использовать @append...

@extends('layouts.master')

@section('sidebar')
    <p>This is appended to the master sidebar.</p>
@append

@section('content')
    <p>This is my body content.</p>
@stop

См. здесь.

Чтобы понять, как это работает...

Метод compileStatements() в BladeCompiler вызывает метод compileAppend(), как вы можете видеть здесь:

/**
 * Compile Blade Statements that start with "@"
 *
 * @param  string  $value
 * @return mixed
 */
protected function compileStatements($value)
{
    $callback = function($match)
    {
        if (method_exists($this, $method = 'compile'.ucfirst($match[1])))
        {
            $match[0] = $this->$method(array_get($match, 3));
        }

        return isset($match[3]) ? $match[0] : $match[0].$match[2];
    };

    return preg_replace_callback('/\[email protected](\w+)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x', $callback, $value);
}

В свою очередь, это вызывает вызов appendSection(), который выглядит следующим образом:

/**
 * Stop injecting content into a section and append it.
 *
 * @return string
 */
public function appendSection()
{
    $last = array_pop($this->sectionStack);

    if (isset($this->sections[$last]))
    {
        $this->sections[$last] .= ob_get_clean();
    }
    else
    {
        $this->sections[$last] = ob_get_clean();
    }

    return $last;
}

Ответ 3

как упоминалось ранее, я использовал @parent, и он отлично работает для меня. Может быть примером расширенного title поможет:

master.blade.php

@section('title')
My Blog 
@stop
<!doctype html>
<html>
<head>
    @include('includes.head')
</head>
<body>
<div class="container-fluid">
    <div id="main" class="row">
            @yield('content')
    </div>
</div>
</body>
</html>

включает /head.blade.php

<meta charset="utf-8">
<title>@yield('title')</title>

post.blade.php

@extends('master')

@section('title')
@parent
| {{$post->title }}
@stop
@section('content')
// Post Body here ..
@stop

Поэтому Title будет отображаться следующим образом:

Мой блог | Заголовок моего сообщения


Собственно, это будет выглядеть примерно так:

<title>
    My Blog
    | My Post Title
</title> 

чтобы вы могли использовать второй параметр секции для установки значений:

включает /head.blade.php

...
@section('title', 'My Blog')
...

post.blade.php

...
@section('title', '@parent | ' . $post->ar_name )
...

И это сделает:

<title>My Blog | My Post Title</title> 

Итак, вы избавитесь от строк внутри заголовка,

Надеюсь, что это поможет.

Примечание: Это используется для Laravel 5.2, не совсем уверен, но, как я помню, он работает и для Laravel 4.