{{Laracast Laravel 5 Fundamentals, 5, Passing Data to Views, 09.01.2015, 18.06.2016, https://laracasts.com/series/laravel-5-fundamentals/episodes/5}} %%(hvlraw) %% (0:00) Теперь, когда вы узнали, как передавать переменные в вид, давайте пойдём дальше и поговорим чуть побольше о Blade. Если я верну боковую панель, надеюсь вы помните как в последнем уроке я говорил, что если постоянно копировать большие куски HTML в каждый вид, то всё очень быстро сломается. Вместо этого мы должны выделять такие куски в отдельные шаблоны. Итак, вот, что мы можем сделать. В моей директории %%(t)/views%%, я создам новый мастер-файл или файл-шаблон, как вам удобно его называть. (0:30) Давайте просто остановимся на имени %%(t)app.blade.php%%. ОК, так вот, здесь у нас будет весь наш обёртывающий HTML-код, так сказать. И потом я буду здесь использовать Blade — выведем раздел %%(t)content%%: %% @yield('content') %% Обратите внимание насколько хорошо это читается. Вот наш HTML-код, и между этими двумя тегами я и хочу вывести ("yield") моё содержимое. Или, выражаясь более точно, возможно у вас есть какой-то %%(t)div%%-контейнер в формате Bootstrap. (1:00) ОК, теперь мы объявим все эти вещи один раз, и затем все ваши виды просто создадут небольшие разделы, которые будут автоматически вставлены вот здесь. Вот как. В нашем файле About, я могу сейчас удалить весь этот мусор, и вместо этого, я собираюсь расширить мою мастер-страницу %%(t)app%%: %% @extends('app') %% Хорошо. Но теперь, как мне указать где находится мой раздел? Хорошо мы используем вот этот ключ: %%(t)@section()%% и затем мы станем ссылаться на имя (мы назвали его %%(t)content%%): %% @section('content') %% (1:30) Итак, давайте посмотрим, сработает ли это. И знаете что, я избавлюсь от этой переменной, что мы удалили. Так что если мы переключимся обратно в Chrome, обновим, и готово. Но теперь мы не повторяем весь этот HTML. Так почему бы нам не добавить ту страницу %%(t)contact%% о которой мы говорили ранее? ОК, вернёмся обратно в наш файл маршрутов. Когда пользователь делает GET-запрос на страницу %%(t)contact%%, я хочу загрузить %%PagesController@contact%%: %% Route::get('contact', 'PagesController@contact'); %% (2:00) Не забывайте, вы всегда можете открывать эти файлы вручную, но вместо этого, очень постарайтесь использовать ваш редактор кода или IDE, чтобы очень быстро переключаться на эти имена. В этом случае я иду к %%PagesController%%, так что мне не нужно переходить сюда (%%(t)Http/Controllers%%) и открывать все эти папки, я могу просто набрать %%PagesController%% и перейти, и почти что во всех современных IDE есть для этого специальные сочетания клавиш. Так что просто найдите их в своём редакторе. Как бы то ни было, мы собираемся быстро добавить контактную страницу: %% return view ('pages.contact'); %% (2:30) И теперь, если мы переключимся обратно, мы создали этот вид некоторое время назад, так что мы можем просто обновить его: %% @extends('app') %% И теперь создадим новый раздел (%%(t)section%%) для области содержимого: %% @section('content')

Contact Me!

@stop %% Вот так. Хорошо, у нас есть новая страница, так что давайте пойдём и проверим её: %%(t) laravel5.dev/contact %% и теперь она тоже работает. Но теперь, что делать, если мы хотим вставлять вещи в разных частях нашей главной страницы? (3:00) Например может быть в каком-то виде нужно вставить особый JavaScript или нечто подобное. Ну что же, тогда просто %%(t)@yield%% на ещё один раздел: %% @yield('footer') %% Думайте об этом как о способе сказать: "Эй, если кто хочет добавить тут некоторый контент, просто создайте раздел и готово". Так, допустим, наша страница с контактами будет содержать специальный JavaScript. Тогда: %% @section('footer') @stop %% И теперь мы просто выведем здесь предупреждение: %%(h) %% (3:30) Главное что здесь нужно понять - с этим подходом, предупреждение будет только отображаться на странице Contact, а не на странице About. Потому что здесь (%%(t)about.blade.php%%), у нас не было раздела для подвала, так что он останется пустым. Итак, ещё один раз. Обновим. Видим предупреждение (%%(t)alert%%), но если мы перейдём на %%(t)laravel5.dev/about%%, то, конечно, его там нет. И действительно, для нашего текущего уровня знаний, это всё что нам нужно знать о мастер-страницах. (4:00) Но почему бы нам не пойти дальше и не поговорить ещё немного о вещах, связанных с Blade? Вы уже узнали о расширении мастер-страниц и разделов, и также, на последнем занятии, вы узнали о том, как выводить на экран данные. Но как насчет обычных вещей, например, что делать, если я хочу сделать быструю проверку с %%(t)if%%? Ну, опять же, с обычным PHP вам пришлось бы открыть блок PHP, так? Вместо этого, мы просто будем использовать символ %%(t)@%% и затем %%(t)if%%. (4:30) %%(t)@if%%, наше условие, а затем закроем всё это с %%(t)@endif%%. Так, допустим, нашей быстрой проверкой будет: %%(h) @if ($first == 'John')

Hi John

%% Это, конечно, смешно, но мы выведем "Hi John" - просто чтобы показать вам, что у нас есть условие. В противном случае мы будем делать что-то другое: %%(h) @else

Else

@endif %% Хорошо, давайте вернёмся и обновим. И вот как использовать простые условные операторы внутри ваших видов. И вы будете делать такого рода вещи довольно часто, особенно когда вы фильтруете через коллекции. (5:00) Так, например, есть похожий на %%(t)@if%%, но противоположный ему %%(t)@unless%%, и в мире PHP просто думайте что это %%(t)if (!...)%% (если не). Это обратный оператор. Но у нас также есть вещи, такие как %%(t)@foreach%% или для некоторых особых случаев %%(t)@foreelse%%. Что означает, если у вас есть некоторый контент, для каждого из них, сделать это. В противном случае если у вас ничего нет, то сделайте это. И это может быть полезно, если вы хотите отфильтровать коллекцию, но вполне возможно, что в этой коллекции нет элементов. (5:30) И в тех случаях, вы хотите сообщить пользователю: "Извините, результатов нет". Вы можете использовать %%(t)@foreelse%% для этого, или вы всегда можете сделать %%(t)@if%% и затем вложенные %%(t)@foreach%% внутри него. Так почему бы нам это не попробовать? Мы идём обратно в About, и сделаем заголовок: %%(h)

People I Like:

%% И всё, что мы хотим сделать здесь, это принять массив от нашего контроллера, он придет из какого-то хранилища данных, и мы хотим пройти через все эти элементы и отобразить их здесь. (6:00) Мы собираемся создать здесь неупорядоченный список, и напишем: %% @foreach ($people as $person) %% В этих случаях мы будем просто выводить имя человека: %%(h)
  • {{ $person }}
  • %% Наконец, мы всё завершили, так что мы сделаем %%(t)@endforeach%%. Хорошо, но мы не совсем закончили, потому что мы должны передать %%$people%% в вид. Так что давайте сделаем это прямо здесь. Люди, которых я люблю... И мы перечислим Laravel сообщество. Как насчет, конечно, Тейлор Отуэлл и затем может быть старый добрый Дейл, и Эрик Барнс и давайте на них и остановимся, это не имеет значения: %% $people = ['Taylor Otwell', 'Dayle Rees', 'Eric Barnes']; %% (6:30) Так что теперь я собираюсь передать эту переменную %%$people%% и давайте посмотрим, как это сработает: %% return view('pages.about', compact('people')); %% Мы вернёмся, обновим, и вот, теперь мы проходим через этот массив и отображаем результаты на странице. Однако помните, что это вероятно будет поступать из базы данных или типа того. Так что вполне возможно, что %%$people%% будет равен пустому массиву или пустой коллекции, как мы думаем об этом в Laravel: %% $people = []; %% (7:00) В таких случаях, обратите внимание, мы не только ничего не увидим, но также, если мы проверим исходный код (кстати, на Mac я использую комбинацию клавиш Shift+Command+C чтобы открыть это), то у нас тут всё ещё есть неупорядоченный список. И на самом деле если у нас не было выдано никаких имён, то я не хочу тут никакого HTML, который не будет использоваться, верно? Вместо этого, давайте вернёмся сюда (%%(t)about.blade.php%%), и почему бы нам не сделать: %%(t) @if (count ($people)) %% (7:30) Если у нас есть люди, чтобы работать с ними, то пройдём через них. В противном случае не будем вообще ничего делать. И вот и всё. Так что если мы вернёмся и обновим, теперь мы ничего не видим, что означает, что мы не захламляем HTML в нашем приложении. ОК, но если мы вернёмся и сделаем так, как у нас было раньше - теперь у нас есть данные, поэтому мы через них пройдём. Хорошо, отличная работа, вы теперь немного узнали о Blade. (8:00) Здесь, конечно, ещё много всего можно изучить, но на данный момент, нам этого уже достаточно чтобы много чего сделать. Поэтому в следующем видео давайте перейдём к чему-нибудь ещё.