Laravel по-русски

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

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

#1 09.09.2014 10:23:42

Ученик

Как работать с view templates?

Я начал изучать Laravel и не понимают природу представления шаблонов.

index.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<link rel="stylesheet" href="{{ URL::asset('/') }}css/bootstrap.min.css" />
	<link rel="stylesheet" href="{{ URL::asset('/') }}css/bootstrap-theme.min.css" />
	<script src="{{ URL::asset('/') }}js/bootstrap.min.js"></script>
	<script src="{{ URL::asset('/') }}js/jquery-2.1.1.min.js"></script>
</head>
<body>
	Start {{{ $n }}}
	<br>
	@foreach($p as $post)
		<p>{{ $post->po_id }}, {{ $post->po_user }}, {{ $post->po_post }} </p>
	@endforeach

	@section('sidebar')
		This is the master sidebar.
	@show
</body>
</html>

test.blade.php

@extends('index')


@section('sidebar')

test_1

@show

InController.php

<?php

class InController extends BaseController 
{
	public function getIndex()
	{
		$name = 'Hello <script> alert("ho"); </script>';

		$posts = Post::all();


		return View::make('index')
			->with('n', $name)
			->with('p', $posts);
	}


	public function getT1()
	{
		return View::make('test');
	}
}

route.php

<?php

Route::get('/', array(
	'as'	=> 'home',
	'uses'	=> 'InController@getIndex'
));


Route::get('/test', array(
	'as'	=> 't1',
	'uses'	=> 'InController@getT1'
));


Если вызов "http://127.0.0.1/laravel/public/test" тогда ошибка "Undefined variable: n (View: C:\..."

И это понятно.



Но как построить страницу (шаблон) где необходимо изменять лишь небольшую часть?

Header, footer, sidebars - там есть не только HTML, CSS и JS. Но также информация из DB (MySQL).

Изменения только в "content".


Пожалуйста, дайте направление, где копать.

#2 09.09.2014 10:53:51

Re: Как работать с view templates?

Пропущен @yield() , но это и не удивительно, эту особенность шаблонизации laravel упускают многие.

Я опишу свой способ организации шаблонов. У меня шаблоны разбиты на три части.
Html дан в bootstrap3.

1. Главный лейаут приложения, app/views/_layout/main.blade.php :

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<link rel="shortcut icon" href="favicon.ico">
	<title>@yield('title', "Дефолтный тайтл страницы")</title>
	<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">
	<link href="/app/css/style.css" rel="stylesheet">
</head>
<body>

<header>Мой хедер с меню и т.п.</header>

@yield("container")

<footer>Мой футер</footer>

</body>
</html>

2. Вспомогательные лейауты с сайдбарами - справа, слева и без. Вот файл app/views/_layout/leftsidebar.blade.php :

@extends('_layout.main')

@section('container')

<div class="container">
	<div class="row">
		<div class="col-md-3">
			@yield('sidebar')
		</div>
		<div class="col-md-9">
			@yield('content')
		</div>
	</div>
</div>

@stop

Остальное (справа и без сайдбара) пишется по аналогии. Здесь написано, что этот файл встраивается в _layout.main , секцией container на место, забронированное для неё (@yield("container")).
Папка лейаутов у меня начинается с подчеркивания затем, чтобы она была всегда вверху списка папок во views - легче искать.

3. И, собственно, шаблон, который вызывается из контроллера во View::make(). Например, app/views/home.blade.php :

@extends('_layout.leftsidebar')

@section('title')
	Тайтл конкретной страницы
@stop

@section('sidebar')
	@include("sidebar.sidebar_main")
@stop

@section('content')

Hello world.

@stop

Здесь я определяю тайтл страницы, сайдбар, который будет отображаться, и вид верстки - слева будет сайдбар или справа (тогда вместо leftsidebar я напишу rightsidebar).
В секции content я собственно рисую контент, который выводит данная вьюха.

Если сайдбар постоянно один, то чтобы не писать его секцию в каждой вьюхе, его можно захардкорить лейаутах 2го уровня , поставив вместо @yield("sidebar") - @include("sidebar.sidebar_main") , т.е. путь до вьюхи сайдбара.

Соответственно, когда вызывается View::make("home") , фреймворк берет home.blade.php , запоминает определенные там section, дальше обращается к вьюхе-"родителю", которая определяется в @extends(). Там он вставляет имеющиеся секции на место @yield() и запоминает определенные там секции. Затем берет @extends() и все повторяет, пока не дойдет до вьюхи, где @extends() уже не будет. После этого он сохраняет полученный html и отдает его на выход.

Общий принцип, надеюсь, понятен.

Изменено slider23 (09.09.2014 10:57:27)

Не в сети

#3 09.09.2014 11:57:40

Ученик

Re: Как работать с view templates?

Да. @yield я пропустил.

Принцип "лейаутов" для меня ясен.

Пока не ясно, как $n и $p поставляется значение.

Если открыть '/', то они заполняются и подаются.

Но если идти в '/ тест ", $n и $p не получает никакого значения.

Выделив этот раздел в отдельном файле это не решает проблему, потому что их значения не обрабатываются.

#4 09.09.2014 13:08:45

Re: Как работать с view templates?

  1. Но если идти в ’/ тест ", $n и $p не получает никакого значения.

Естественно — откуда им взяться, ведь при вызове шаблона они не передаются:

Route::get('/test', array(
	'as'	=> 't1',
	'uses'	=> 'InController@getT1'
));

Идём в InController, метод getT1:

	public function getT1()
	{
		return View::make('test');
	}

Как видно, шаблону не передаётся ни одной переменной (тогда как в том же getIndex они есть).

Не в сети

#5 09.09.2014 17:45:30

Ученик

Re: Как работать с view templates?

Естественно — откуда им взяться, ведь при вызове шаблона они не передаются:

Вот что я хочу понять. Откуда их взять.


Кажется, что я нашел решение.

View::composer(array('profile','dashboard'), function ($view) {
  $view->with('count', User::count());
});



View::composer('profile', 'ProfileComposer');



class ProfileComposer {

  public function compose($view)
  {
    $view->with('count', User::count());
  }

}

http://laravel.ru/docs/v4/responses#составители


Только остается вопрос о том, как он будет работать с большим количеством данных.

#6 09.09.2014 18:26:41

Re: Как работать с view templates?

  1. Вот что я хочу понять. Откуда их взять.

Точно от туда же, откуда берутся и переменные для index. Ты ведь сам написал этот код? Понимаешь, что делает View::make('index')->with('n', $name)?

  1. Кажется, что я нашел решение.

Составители — хороший вариант.

  1. Только остается вопрос о том, как он будет работать с большим количеством данных.

Количество данных и составители — это яблоки и розовое. Две разные вещи. Если данных столько, что на них не хватает памяти — её не хватит и при составителях, и без них.

Не в сети

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