Si vous regardez laravel documentation officielle http://laravel.com/docs/4.2/templates Il est dit que donner cette disposition:
<!-- 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>
Prolongé par cette vue
@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
Ajoutera à la section sidebar
. Mais en fait, si vous essayez, il ne s'ajoute pas, il remplace simplement le contenu du modèle étendu.
J'ai entendu parler de la fonction des autres lames comme @append, @prepend, @parent
... personne ne semble fonctionner.
A côté, cet exemple dans la doc officielle qui ne fonctionne pas, je trouve que la documentation du blade est très pauvre. Il n'y a rien sur la fonction de la lame comme @parent
par exemple.
L'exemple dans le documentation du site Web de Larvel semble en effet être défectueux, mais je pense que c'est un problème d'analyse de démarque sur le site Web, le mêmes documents sur github affiche le code correct :
Dans tout les cas @parent
fonctionne bien. L'exemple dans les documents devrait ressembler à ceci:
@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
Un coup d'œil dans le Illuminate/View/Factory.php
confirme ce que @parent
Est-ce que:
/**
* 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;
}
Vous pouvez simplement utiliser @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
Voir ici .
Pour comprendre comment cela fonctionne ...
La méthode compileStatements()
dans BladeCompiler appelle la méthode compileAppend()
, comme vous pouvez le voir ici:
/**
* 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);
}
À son tour, cela insère un appel à appendSection()
qui ressemble à ceci:
/**
* 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;
}
comme mentionné précédemment, j'ai utilisé @parent
et ça marche bien pour moi. Peut être un exemple de title
étendu aidera:
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>
inclut/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
Par conséquent, le titre sera rendu comme suit:
Mon blog | Mon titre de message
En fait, cela rendra quelque chose comme:
<title>
My Blog
| My Post Title
</title>
vous pouvez donc utiliser le deuxième paramètre de section pour définir les valeurs:
inclut/head.blade.php
...
@section('title', 'My Blog')
...
post.blade.php
...
@section('title', '@parent | ' . $post->ar_name )
...
Et cela rendra:
<title>My Blog | My Post Title</title>
Vous vous débarrasserez donc des lignes à l'intérieur du titre,
J'espère que ça aide.
Remarque: Ceci est utilisé pour Laravel 5.2, pas tout à fait sûr, mais si je me souviens bien, cela fonctionne pour Laravel 4 aussi.