(0:00)
Теперь, когда вы узнали, как передавать переменные в вид, давайте пойдём дальше и поговорим чуть побольше о Blade. Если я верну боковую панель, надеюсь вы помните как в последнем уроке я говорил, что если постоянно копировать большие куски HTML в каждый вид, то всё очень быстро сломается. Вместо этого мы должны выделять такие куски в отдельные шаблоны. Итак, вот, что мы можем сделать. В моей директории /views, я создам новый мастер-файл или файл-шаблон, как вам удобно его называть.
(0:30)
Давайте просто остановимся на имени app.blade.php. ОК, так вот, здесь у нас будет весь наш обёртывающий HTML-код, так сказать. И потом я буду здесь использовать Blade — выведем раздел content:
@yield('content')
Обратите внимание насколько хорошо это читается. Вот наш HTML-код, и между этими двумя тегами я и хочу вывести («yield») моё содержимое. Или, выражаясь более точно, возможно у вас есть какой-то div-контейнер в формате Bootstrap.
(1:00)
ОК, теперь мы объявим все эти вещи один раз, и затем все ваши виды просто создадут небольшие разделы, которые будут автоматически вставлены вот здесь. Вот как. В нашем файле About, я могу сейчас удалить весь этот мусор, и вместо этого, я собираюсь расширить мою мастер-страницу app:
@extends('app')
Хорошо. Но теперь, как мне указать где находится мой раздел? Хорошо мы используем вот этот ключ: @section() и затем мы станем ссылаться на имя (мы назвали его content):
@section('content')
(1:30)
Итак, давайте посмотрим, сработает ли это. И знаете что, я избавлюсь от этой переменной, что мы удалили. Так что если мы переключимся обратно в Chrome, обновим, и готово. Но теперь мы не повторяем весь этот HTML. Так почему бы нам не добавить ту страницу contact о которой мы говорили ранее? ОК, вернёмся обратно в наш файл маршрутов. Когда пользователь делает GET-запрос на страницу contact, я хочу загрузить PHPPagesController@contact
:
Route::get('contact', 'PagesController@contact');
(2:00)
Не забывайте, вы всегда можете открывать эти файлы вручную, но вместо этого, очень постарайтесь использовать ваш редактор кода или IDE, чтобы очень быстро переключаться на эти имена. В этом случае я иду к PHPPagesController
, так что мне не нужно переходить сюда (Http/Controllers) и открывать все эти папки, я могу просто набрать PHPPagesController
и перейти, и почти что во всех современных IDE есть для этого специальные сочетания клавиш. Так что просто найдите их в своём редакторе. Как бы то ни было, мы собираемся быстро добавить контактную страницу:
return view ('pages.contact');
(2:30)
И теперь, если мы переключимся обратно, мы создали этот вид некоторое время назад, так что мы можем просто обновить его:
@extends('app')
И теперь создадим новый раздел (section) для области содержимого:
@section('content')
<h1>Contact Me!</h1>
@stop
Вот так. Хорошо, у нас есть новая страница, так что давайте пойдём и проверим её:
laravel5.dev/contact
и теперь она тоже работает. Но теперь, что делать, если мы хотим вставлять вещи в разных частях нашей главной страницы?
(3:00)
Например может быть в каком-то виде нужно вставить особый JavaScript или нечто подобное. Ну что же, тогда просто @yield на ещё один раздел:
@yield('footer')
Думайте об этом как о способе сказать: «Эй, если кто хочет добавить тут некоторый контент, просто создайте раздел и готово». Так, допустим, наша страница с контактами будет содержать специальный JavaScript. Тогда:
@section('footer')
@stop
И теперь мы просто выведем здесь предупреждение:
<script>alert ('Contact form scripts');</script>
(3:30)
Главное что здесь нужно понять — с этим подходом, предупреждение будет только отображаться на странице Contact, а не на странице About. Потому что здесь (about.blade.php), у нас не было раздела для подвала, так что он останется пустым. Итак, ещё один раз. Обновим. Видим предупреждение (alert), но если мы перейдём на laravel5.dev/about, то, конечно, его там нет. И действительно, для нашего текущего уровня знаний, это всё что нам нужно знать о мастер-страницах.
(4:00)
Но почему бы нам не пойти дальше и не поговорить ещё немного о вещах, связанных с Blade? Вы уже узнали о расширении мастер-страниц и разделов, и также, на последнем занятии, вы узнали о том, как выводить на экран данные. Но как насчет обычных вещей, например, что делать, если я хочу сделать быструю проверку с if? Ну, опять же, с обычным PHP вам пришлось бы открыть блок PHP, так? Вместо этого, мы просто будем использовать символ @ и затем if.
(4:30)
@if, наше условие, а затем закроем всё это с @endif. Так, допустим, нашей быстрой проверкой будет:
@if ($first == 'John') <h1>Hi John</h1>
Это, конечно, смешно, но мы выведем «Hi John» — просто чтобы показать вам, что у нас есть условие. В противном случае мы будем делать что-то другое:
@else <h1>Else</h1> @endif
Хорошо, давайте вернёмся и обновим. И вот как использовать простые условные операторы внутри ваших видов. И вы будете делать такого рода вещи довольно часто, особенно когда вы фильтруете через коллекции.
(5:00)
Так, например, есть похожий на @if, но противоположный ему @unless, и в мире PHP просто думайте что это if (!...) (если не). Это обратный оператор. Но у нас также есть вещи, такие как @foreach или для некоторых особых случаев @foreelse. Что означает, если у вас есть некоторый контент, для каждого из них, сделать это. В противном случае если у вас ничего нет, то сделайте это. И это может быть полезно, если вы хотите отфильтровать коллекцию, но вполне возможно, что в этой коллекции нет элементов.
(5:30)
И в тех случаях, вы хотите сообщить пользователю: «Извините, результатов нет». Вы можете использовать @foreelse для этого, или вы всегда можете сделать @if и затем вложенные @foreach внутри него. Так почему бы нам это не попробовать? Мы идём обратно в About, и сделаем заголовок:
<h3>People I Like:</h3>
И всё, что мы хотим сделать здесь, это принять массив от нашего контроллера, он придет из какого-то хранилища данных, и мы хотим пройти через все эти элементы и отобразить их здесь.
(6:00)
Мы собираемся создать здесь неупорядоченный список, и напишем:
@foreach ($people as $person)
В этих случаях мы будем просто выводить имя человека:
<li>{{ $person }}</li>
Наконец, мы всё завершили, так что мы сделаем @endforeach. Хорошо, но мы не совсем закончили, потому что мы должны передать PHP$people
в вид. Так что давайте сделаем это прямо здесь. Люди, которых я люблю... И мы перечислим Laravel сообщество. Как насчет, конечно, Тейлор Отуэлл и затем может быть старый добрый Дейл, и Эрик Барнс и давайте на них и остановимся, это не имеет значения:
$people = ['Taylor Otwell', 'Dayle Rees', 'Eric Barnes'];
(6:30)
Так что теперь я собираюсь передать эту переменную PHP$people
и давайте посмотрим, как это сработает:
return view('pages.about', compact('people'));
Мы вернёмся, обновим, и вот, теперь мы проходим через этот массив и отображаем результаты на странице. Однако помните, что это вероятно будет поступать из базы данных или типа того. Так что вполне возможно, что PHP$people
будет равен пустому массиву или пустой коллекции, как мы думаем об этом в Laravel:
$people = [];
(7:00)
В таких случаях, обратите внимание, мы не только ничего не увидим, но также, если мы проверим исходный код (кстати, на Mac я использую комбинацию клавиш Shift+Command+C чтобы открыть это), то у нас тут всё ещё есть неупорядоченный список. И на самом деле если у нас не было выдано никаких имён, то я не хочу тут никакого HTML, который не будет использоваться, верно? Вместо этого, давайте вернёмся сюда (about.blade.php), и почему бы нам не сделать:
@if (count ($people))
(7:30)
Если у нас есть люди, чтобы работать с ними, то пройдём через них. В противном случае не будем вообще ничего делать. И вот и всё. Так что если мы вернёмся и обновим, теперь мы ничего не видим, что означает, что мы не захламляем HTML в нашем приложении. ОК, но если мы вернёмся и сделаем так, как у нас было раньше — теперь у нас есть данные, поэтому мы через них пройдём. Хорошо, отличная работа, вы теперь немного узнали о Blade.
(8:00)
Здесь, конечно, ещё много всего можно изучить, но на данный момент, нам этого уже достаточно чтобы много чего сделать. Поэтому в следующем видео давайте перейдём к чему-нибудь ещё.
Комментарии (4)
Идея хорошая, однако не лучше ли просто записать такой же видос?
В смысле переведённые Laracasts? Для этого нужно разрешение автора, а он его не даёт. Но если вы начитаете и выложите на YT, то я дам ссылку.
Я имею в виду просто записать свои видео с тем же содержанием, что и у Джефри
Запишите.