Дисциплины - Серверные технологии разработки

Разработка web-приложения с серверной маршрутизацией - Представления

По умолчанию, laravel работает с шаблонизатором blade. Шаблоны создаются в папке app/views и имеют расширение blade.php. Шаблоны подключаются в экшне через хелпер view(), входящим параметром в который передается имя шаблона без расширения blade.php.

Сперва создадим в папке view папку layouts для хранения базовых шаблонов. В папке layouts создадим файл defaults.blade.php

Базовый шаблон defaults.blade.php.

@include('layouts.header')

<div class="container">

 

<div class="masthead">

<h3 class="text-muted">Project name</h3>

<ul class="nav nav-justified">

<li class="active"><a href="#">Home</a></li>

--блок ссылок --

</ul>

</div>

@yield('content')

<!-- Site footer -->

<div class="footer">

<p>&copy; Company 2014</p>

</div>

</div><!-- /container -->

@include('layouts.footer')

В файлах layouts/header.blade.php и layouts/footer.blade.php находится обычный html-код для шапки и футера сайта. Эти 3 файла – это неизменная часть шаблона.

@yield(‘content’) – вывод переменной content. Саму переменную определим в меняющейся части шаблона.

Меняющуюся часть шаблона вынесем в отдельный файл index.blade.php.

Меняющаяся часть шаблона.

@extends('layouts.default')

@section('content')

<h1>Добро пожаловать на сайт</h1>

<div>Текст на страницу</div>

@stop

Если необходимо создать часть кода в шаблоне, которая в последствии будет либо заменена, либо добавлена, то можно воспользоваться дирректировой @show

Объявление переменной с диррективой @show в базовом шаблоне.

@section('styles')

<link href="{{ asset('/css/bootstrap.css') }}">

@show

Далее к данному стилю можно добавить другие стили в файлах подшаблона. В подшаблоне обращаемся к диррективе @parent переменной styles.

Объявление переменной с диррективой @show в базовом шаблоне.

@extends('public')

@section('styles')

    @parent

<linkhref="{{ asset('/js/fancybox/jquery.fancybox.css') }}">

@stop

Обратите внимание на @extends в начале кода. В шаблонизаторе blade из контроллера мы обращаемся к подшаблону, а подшаблон с помощью диррективы @extends сам себя вставляет в базовый шаблон public.

Подключение подшаблона index.blade.php осуществляется в экшне контроллера.

Подключение подшаблона index.blade.php.

return view('index');

Передача массива в шаблон:

Передача массива в шаблон.

$posts = array(1=>’One’, 2=>’Two’);

return view('index', $posts);

Имеется также ещё один способ передачи переменных в шаблон, через метод with():

 Передача переменной в шаблон с помощью метода with.

$posts = array(1=>’One’, 2=>’Two’);

return view(‘index’)->with(‘posts’, $posts)

Если вы не уверены в существовании передаваемой переменной, то нужно использовать with(), тогда не будет выводиться ошибка.

И ещё один способ передачи переменных:

Магический метод передачи данных в шаблон.

$view = view('greeting')->withName('Victoria');   

Для вывода переменных в шаблоне можно воспользоваться диррективой {{}}

Вывод переменных шаблона.

{{$name}} // простой вывод переменной
 {{isset($name)?$name:'Default'}} // вывод либо переменной либо значения по умолчанию.
{{ $name or 'Default' }}// еще один способ вывода значения по умолчанию

Для предотвращения XSS-атак дирректива {{}} экранирует html-тэги. Если всё же необходимо вывести html, то можно воспользоваться другой дирректовой:

 Дирректива {!! !!}.

Hello,{!!$name!!}.

Вывод всех элементов массива на экран

Вывод элементов массива на экран.

@if($posts->count())

@foreach($posts as $post)

     <div>{{$post }}</div>

@endforeach

@endif

Проверка шаблона на существование

Проверить существует ли шаблон по заданному пути, можно с помощью хелпера view() и метода exists(), входящим параметром в который передается путь к шаблону.

Проверка шаблона на существование.

if (view()->exists('templates.base')) {
            // шаблон существует
}else{
            // шаблон не существует
}

Передача данных во все шаблоны

Для передачи переменных во все шаблоны, можно воспользоваться либо хелпером view():

Передача данных во все шаблоны с помощью хелперов.

view()->share('data', [1, 2, 3]);

либо фасадом:

Передача данных во все шаблоны с помощью фасадов.

View::share('data', [1, 2, 3]);

Этот код можно положить в метод boot() сервис-провайдера общего сервис-провайдера приложения AppServiceProvider или своего собственного.

View composer

Композеры (view composers) - функции-замыкания или методы класса, которые вызываются, когда шаблон рендерится в строку. Если у вас есть данные, которые вы хотите привязать к шаблону при каждом его рендеринге, то композеры помогут вам выделить такую логику в отдельное место.

Регистрировать композеры можно внутри сервис-провайдера. Мы будем использовать фасад View для того, чтобы получить доступ к имплементации контракта Illuminate\Contracts\View\Factory:

 Определение композера.

<?php namespace App\Providers;
use View;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\SiteComposer;
class ComposerServiceProvider extends ServiceProvider {
    public function boot()
    {
        View::composer('*', 'App\Http\ViewComposers\SiteComposer');
    }
    public function register()
    {
        //
    }
}

Файл компосера необходимо зарегистрировать в config/app.php

Регистрация файла композера.

'App\Providers\ComposerServiceProvider',

Определение класса SiteComposer:

Класс SiteComposer.

<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class SiteComposer
{
  public function compose(View $view)
  {
    $view->with('menu_items',’TEST’);
  }
}

Метод compose должен получать в качестве аргумента инстанс Illuminate\Contracts\View\View. Для передачи переменных в шаблон используйте метод with().

Назначение композера для нескольких шаблонов

Вместо имени шаблона можно использовать массив имен.

Назначение композера для нескольких шаблонов.

View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer');

Композер для всех шаблонов

А вот так можно назначить композер для всех шаблонов:

Назначение композера для всех шаблонов.

View::composer('*', function()
{
    //
});

Регистрация нескольких шаблонов

Можно использовать метод composers, чтобы зарегистрировать несколько композеров одновременно:

Регистрация нескольких шаблонов одновременно.

View::composers([
    'App\Http\ViewComposers\AdminComposer' =>
['admin.index', 'admin.profile'],
    'App\Http\ViewComposers\UserComposer' => 'user',
'App\Http\ViewComposers\ProductComposer' => 'product'
]);

ViewCreator

Создатели шаблонов работают почти так же, как композеры, но вызываются сразу после создания объекта шаблона, а не во время его рендеринга в строку. Для регистрации используйте метод creator:

 Регистрация view creator.

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');   

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
80422 БГУИР
10421-10422 ИИТ БГУИР
10423 БГУИР
20421 БГУИР
30421 БГУИР
30423 БГУИР
Вопросы