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

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

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

24

Решение

Пример в документация с сайта 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;
}
42

Другие решения

Вы можете просто использовать @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('/\B@(\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;
}
18

как упоминалось ранее, я использовал @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>
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.

1
По вопросам рекламы [email protected]