web-dev-qa-db-fra.com

laravel blade, comment ajouter à une section

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.

28
Amaynut

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;
}
47
Bogdan

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;
}
20
user1960364

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.

1
Mohannad Najjar