Шаблон наследования с использованием Blade

У меня проблема с наследованием с использованием шаблона лезвия. Итак, у меня есть мой основной шаблон: /layouts/main.blade.php

@section('oneNews')
<div class="row">
  <div class="large-12 columns pad_0">
      <div class="container">
          <div id="da-slider" class="da-slider">
            @foreach($aTopNews as $topNews)
              <div class="da-slide">
                  <h2>{{ $topNews['title'] }}</h2>
                  <p>{{ $topNews['content'] }}.</p>
                  <a href="/news/view/{{ $topNews['id'] }}" class="da-link">Read</a>
                  <div class="da-img">{{ HTML::image($topNews['image']) }}</div>
              </div>
              @endforeach
              <nav class="da-arrows">
                  <span class="da-arrows-prev"></span>
                  <span class="da-arrows-next"></span>
              </nav>
          </div>
      </div>
  </div>
</div>

Теперь я хочу наследовать этот шаблон в другом шаблоне

 @extends('layouts.main')

 @section('oneNews')
  <div class="row">
    <div class="large-12 columns pad_0 marg-top-20">
        Registru on-line
    </div>
  </div>
 @stop

Контроллер:

public function getIndex()
{
    return View::make('layouts.main')
        ->with('aNews',     \News::where('type', '=', '0')->get())
        ->with('aTopNews',  \News::where('type', '=', '1')->get())
        ->with('aNotice',   \News::where('type', '=', '2')->get());
}

Но я получаю ошибку: "Неопределенная переменная: aTopNews", помогите мне, пожалуйста

1 ответ

Прежде всего, с наследованием шаблона вы не возвращаете представление макета, вы возвращаете представление контента, а движок Blade Laravel позаботится о получении и рендеринге правильного макета: вот цель @extends в начале файла. Итак, в вашем контроллере вы должны иметь:

return View::make('content'); // assuming content.blade.php contains the code in your example

Одной из особенностей наследования шаблонов является то, что он не передает переменные из дочернего представления (содержимого) в представление макета. Так делаю View::make('content')->with('aTopNews', $aTopNews) только сделаю aTopNews доступны для content вид, а не layouts.main вид, который он расширяет. Чтобы сделать его доступным в макете, вы можете использовать View::share() что делает переменную доступной для всех представлений:

View::share('aTopNews',  \News::where('type', '=', '1')->get());

Кроме того, чтобы наследование разделов работало, в файле макета необходимо завершить @section('oneNews') с @show,

Документация Laravel очень хорошо объясняет, как работает Blade Template Inheritance.

Другие вопросы по тегам