Шаблон наследования с использованием 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.