index for entre diferencias content ciclo array php laravel laravel-4 template-engine blade

php - for - Hoja de laravel, cómo anexar a una sección.



laravel foreach index (3)

Si busca la documentación oficial de laravel http://laravel.com/docs/4.2/templates , se dice que al dar este diseño:

<!-- 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>

Extendido por esta vista

@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

Se adjuntará a la sidebar la sección. Pero en realidad, si lo intentas es que no se agrega, simplemente reemplaza el contenido de la plantilla extendida.

Escuché sobre otras funciones de blade como @append, @prepend, @parent ... nadie parece funcionar.

Además, este ejemplo en el documento oficial que no funciona, me parece que la documentación de la hoja es muy pobre. No hay nada sobre la función blade como @parent por ejemplo.


El ejemplo en la http://laravel.com/docs/4.2/templates parece tener fallas, pero creo que es un problema de análisis de rebajas en el sitio web, los mismos documentos en github muestran el código correcto:

En cualquier caso, @parent sí funciona. El ejemplo en los documentos debería verse así:

@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 vistazo rápido en Illuminate/View/Factory.php confirma lo que @parent hace:

/** * 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; }


Simplemente puedes usar @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

Ver aqui

Para entender cómo funciona esto ...

El método compileStatements() en el BladeCompiler llama al método compileAppend() , como puede ver aquí:

/** * 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); }

A su vez, eso inserta una llamada a appendSection() que se ve así:

/** * 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; }


como se mencionó anteriormente, usé @parent y funciona bien para mí. Puede ser un ejemplo para un title extendido que ayude:

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>

incluye / 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

Por lo tanto, el título será renderizado para ser así:

Mi blog | Título de mi post

En realidad, esto hará que algo como:

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

para que pueda usar el segundo parámetro de la sección para establecer los valores:

incluye / head.blade.php

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

post.blade.php

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

Y esto hará que:

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

Así te librarás de las líneas dentro del título,

Espero que eso ayude.

Nota: Esto se usa para Laravel 5.2, no estoy seguro, pero como recuerdo, también funciona para Laravel 4.