2013-09-17 1 views
8

Я хотел бы иметь возможность повторять частичное количество раз в представлении с различным содержимым в каждом повторении.Как повторно использовать частичный фрагмент в шаблоне

Частичная простая панель с заголовком и некоторым контентом. Содержимое каждой панели может отличаться по сложности, поэтому я хотел бы иметь возможность использовать метод передачи данных @section('content').

Множество до меня выглядит следующим образом:

panel.blade.php - парциальное быть повторен.

<div class="panel"> 
    <header> 
     @yield('heading') 
    </header> 
    <div class="inner"> 
     @yield('inner') 
    </div> 
</div> 

view.blade.php - мнение, в котором парциальное повторяется

@extends('default') 

@section('content') 

    {{-- First Panel --}} 
    @section('heading') 
     Welcome, {{ $user->name }} 
    @stop 
    @section('inner') 
     <p>Welcome to the site.</p> 
    @stop 
    @include('panel') 

    {{-- Second Panel --}} 
    @section('heading') 
     Your Friends 
    @stop 
    @section('inner') 
     <ul> 
     @foreach($user->friends as $friend) 
      <li>{{ $friend->name }}</li> 
     @endforeach 
     </ul> 
    @stop 
    @include('panel') 

@stop 

Я бегу в том же номере, как это: http://forums.laravel.io/viewtopic.php?id=3497

Отображается первая панель как предполагалось, но второй - это просто повторение первого.

Как это исправить? Если это плохой способ сделать это, что было бы лучше?

ответ

10

Для Laravel 5.4, Components & Slots могут быть вам полезны. Следующее решение для Laravel 4.x и, вероятно, < = 5.3.


На мой взгляд, это глупый случай использования для синтаксиса @include. Количество возвращаемого вами HTML-данных незначительно, особенно потому, что единственной потенциально сложной частью является содержимое inner. Имейте в виду, чем больше анализа нужно сделать, тем больше накладных расходов на ваше приложение.

Кроме того, я не знаю, внутренние работы в @yield & @section функций, поэтому я не могу сказать, как «правильный» это работать ваш включает в себя этот путь. Включает в себя, как правило, используют ключ => значение пары передается в качестве параметра в заголовочном вызова:

@include('panel', ['heading' => 'Welcome', 'inner' => '<p>Some stuff here.</p>']) 

Не самое идеальное место, чтобы упаковать кучу HTML, но это «разработан» способ (насколько я знаю , как минимум).

Это говорит ...

Используйте @section ... @overwrite синтаксис, упомянутый в "Other Control Structures" части страницы шаблонов документов.

@extends('default') 

@section('content') 

    {{-- First Panel --}} 
    @section('heading') 
     Welcome, {{ $user->name }} 
    @overwrite 
    @section('inner') 
     <p>Welcome to the site.</p> 
    @overwrite 
    @include('panel') 

    {{-- Second Panel --}} 
    @section('heading') 
     Your Friends 
    @overwrite 
    @section('inner') 
     <ul> 
     @foreach($user->friends as $friend) 
      <li>{{ $friend->name }}</li> 
     @endforeach 
     </ul> 
    @overwrite 
    @include('panel') 

@stop 
+3

Здесь следует указать одно: Директива @include должна быть ниже директив раздела панели. Как и в приведенном выше примере. Если вы поместите «@include» над директивами «@section», это не сработает для нескольких «@includes». И снова, если вы используете «@stop», он будет работать только для одной панели. Для нескольких панелей; вы должны использовать «@overwrite». Вышеприведенный пример верен, я просто указываю на некоторые важные вещи. –

 Смежные вопросы

  • Нет связанных вопросов^_^