Ларавельное лезвие, как добавить в раздел
Если вы посмотрите официальную документацию 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
.
Ответы
Ответ 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.