Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 20.05.2016 23:17:43

Savin-Igor

Один лайаут для всех страниц и директивы @endsection и @stop

Я создал лайаут в котором  описываю только хедер и футер общий для всех страниц приложения. В боди пишу директиву @yield('content') . Файлы которые наследуют лайаут находятся в разных папках. Структура файла 'content.blade.php' -
@extends('layout')
@section('content')
@include('menu')
<p> Какой-то контент </p>
@endsection
В контролере создаю представление подобным образом - return view('home.content', [ 'dir' => 'home']);
Пока создал два роута -
Route::get('/', 'HomeController@home');
Route::get('/portfolio', 'PortfolioController@portfolio');

Делая запрос главной  страницы страница выводится нормально. При запросе /portfolio возникают следующие ошибки -
ErrorException in Factory.php line 578:
Cannot end a section without first starting one.

InvalidArgumentException in Factory.php line 578:
Cannot end a section without first starting one.

Загуглил проблему везде нашел только один совет убрать  директивы @endsection и @stop. Я  это работает, но создает вместо одной проблемы другую - код в броузер приходит совершенно не валидный. Сперва содержание контент потом уже хедер и футер. Я понимаю это из за того что Блэйд читает файлы от дочерних к родителю и без директив @endsection и @stop он не знает что вставить на место директивы @yield.

Кто-нибудь знает что делать в подомном случае, для того чтоб html код оставался валидным и использовать один лайаут для всех представлений???

#2 21.05.2016 07:47:26

Re: Один лайаут для всех страниц и директивы @endsection и @stop

Если ошибка в представлении portfolio, то его код и нужно показать.

Не в сети

#3 22.05.2016 00:07:33

Re: Один лайаут для всех страниц и директивы @endsection и @stop

/layouts/layout.blade.php

<!DOCTYPE html>
<html lang="{{App::getLocale()}}">
	@include('layouts.head')
	<body>
		@include('чего-тебе-надо')
		@yeld('content')
	</body>
</html>

/home.blade.php

@extends('layouts.layout')
@section('content')
твой контент для /home страницы
@endsection

/portfolio.blade.php

@extends('layouts.layout')
@section('content')
твой контент для /portfolio страницы
@endsection

HomeController.php

....
public function homePage()
{
	return view('home');
}
....

   
PortfolioController.php

....
public function portfolioPage()
{
	return view('portfolio');
}
....

   
route.php

Route::get('/', 'HomeController@homePage');
Route::get('/portfolio', 'PortfolioController@portfolioPage');

Помогло?

Не в сети

#4 22.05.2016 00:11:24

Re: Один лайаут для всех страниц и директивы @endsection и @stop

ещё из страницы можно управлять титулом страницы

portfolio.blade.php

@section('title','твой титул')
@section('content')
....

его закрывать не обязательно, но тот что content - стоит закрывать

/layouts/head.blade.php

<title>@yield('title', 'default title')</title>

Не в сети

#5 22.05.2016 00:13:48

Re: Один лайаут для всех страниц и директивы @endsection и @stop

если титул определяешь условиями внутри 'content'-секции, то закрывать надо всё и везде

Не в сети

#6 22.05.2016 10:07:28

Savin-Igor

Re: Один лайаут для всех страниц и директивы @endsection и @stop

Большое спасибо всем.  Помогло. smile

Подвал раздела