{{TOC}} == Шаблоны == .(tl_note) В этой статье, так же как и во всех прочих статьях документации термины //шаблон// ("template"), //вид// ("view") и //представление// ("presentation") - полные синонимы и используются взаимозаменяемо - первый наиболее понятен и употребителен в русском языке, второй и третий происходят от концепции ((ВП:MVC)). - //прим. пер.// **Шаблоны** содержат тот самый HTML-код, отправляемый клиенту. Разделение //представления// и //((ВП:бизнес-логик+а))и// позволяет сделать код понятнее и проще для поддержания. Шаблоны хранятся в папке **application/views** и имеют расширение **.php**. Класс %%View%% предоставляет удобный интерфейс для форматирования вывода и отправки его клиенту. Посмотрим на примеры. **Код шаблона:** %%(html) Файл находится в views/home/index.php. %% **Возвращение шаблона из ((docs/v3/routing маршрута)):** %% Route::get('/', function () { return View::make('home.index'); }); %% **Возвращение шаблона из ((docs/v3/controllers контроллера)):** %% public function action_index () { return View::make('home.index'); }); %% Иногда вам нужно больше контроля за тем, что в итоге получит браузер. Например, вам может понадобиться отправить **дополнительный заголовок**. Вот как это делается: %% Route::get('/', function () { $headers = array('foo' => 'bar'); return Response::make('Привет, мир!', 200, $headers); }); %% **Отправка ответа из шаблона:** %% return Response::view('home', 200, $headers); %% === Привязка данных === Обычно ((docs/v3/routing маршрут)) или ((docs/v3/controllers контроллер)) запрашивают данные из ((docs/v3/models модели)), которые затем отображаются с помощью шаблона. Таким образом, нам нужен механизм передачи данных в шаблон - для этого есть несколько способов, вы можете выбрать наиболее удобный для себя. **Привязка данных к шаблону:** %% Route::get('/', function () { return View::make('home')->with('name', 'Джеймс'); }); %% **Доступ к ним из шаблона:** %% Привет, . %% **Привязка данных в "цепочке":** %% View::make('home') ->with('name', 'Джеймс') ->with('votes', 25); %% **Передача массива с данными:** %% View::make('home', array('name' => 'James')); %% **Привязка через "((http://ru2.php.net/manual/ru/language.oop5.overloading.php#object.set магические свойства))":** %% $view->name = 'Джеймс'; $view->email = 'example@example.com'; %% **Привязка через интерфейс ((http://ru2.php.net/manual/ru/class.arrayaccess.php ArrayAccess)):** %% $view->name = 'Джеймс'; $view['email'] = 'example@example.com'; %% **Добавление общих ("разделяемых") данных для всех форматируемых шаблонов:** %% View::share('site_name', 'Моя страничка'); %% === Вложенные шаблоны === Иногда вам нужно будет вложить один шаблон в другой. Вложенные шаблоны иногда называют //частичными// ("partials") и они помогают вам поддерживать шаблоны компактными и модульными. **Вложение шаблона используя метод %%View->nest%%:** %% View::make('home')->nest('footer', 'partials.footer'); %% **Передача данных вложенному шаблону:** %% $view = View::make('home'); $view->nest('content', 'orders', array('orders' => $orders)); %% Чтобы вставить шаблон изнутри другого шаблона используется функция **render()**: %%
%% Часто один шаблон используется для отображения элемента списка. Например, можно создать шаблон для вывода инфморации об одном заказе, а в другом шаблоне пройти по списку заказов и вывести используя первый шаблон. Чтобы упростить код можно использовать функцию **render_each()**: %%
%% **Первый параметр** - имя шаблона для элемента, **второй** - массив элементов для форматирования, **третий** - имя переменной, которой присваивается очередной элемент списка перед передачей в //частичный шаблон//. === Именованные шаблоны === Шаблонам можно легко присваивать //имена// (!!(tl_note) так же, как и ((docs/v3/routing#именованные маршрутам)) - //прим. пер.//!!) для придания им выразительности и организованности. **Регистрация имени для шаблона:** %% View::name('layouts.default', 'layout'); %% **Получение шаблона по имени:** %% return View::of('layout'); %% **((#Привязка)) данных к именованному шаблону:** %% return View::of('layout', array('orders' => $orders)); %% === Составители === Каждый раз, когда создаётся шаблон он вызывает событие-//составитель// ("composer"). Это можно использовать для привязки общих данных к шаблону при каждом его создании. Один из частых случаев использования этого события - добавление панели боковой навигации со списком случайных статей в блоге. Вы можете ((#вложенные вложить)) ваш //частичный шаблон// в шаблон страницы ("layout view"), а затем зарегистрировать //составитель// для этого //частичного шаблона//, который будет получать данные из таблицы статей и передавать их в этот шаблон. Больше не нужно угадывать, какие данные должен загрузить именно этот ((docs/v3/controllers контроллер)). //Составители// обычно помещаются в **application/routes.php**. **Регистрация //составителя// для шаблона "home":** %% View::composer('home', function ($view) { $view->nest('footer', 'partials.footer'); }); %% Теперь каждый раз, когда создаётся шаблон %%(t)home%% его экземпляр будет передан в зарегистрированную //анонимную функцию// ([[http://ru2.php.net/manual/ru/functions.anonymous.php Closure]]), где вы можете подготовить его, как вам нужно. Шаблон может иметь **любое число //составителей//**, не обязательно только один. Вам есть, где развернуться! == Переадресация == Важно отметить, что и ((docs/v3/routing маршруты)), и ((docs/v3/controllers контроллеры)) требуют, чтобы //ответ// клиенту был возвращён с помощью **return** - вместо простого вызова %%Redirect::to();%% вам нужно //вернуть// объект как %%return Redirect::to();%%. В этом отличительная особенность Laravel от большинства других PHP-фреймворков и из-за этого она может быть упущена из вида. **Переадресация на другой ((ВП:URI)):** %% return Redirect::to('user/profile'); %% **Переадресация с определённым ((ВП:Список кодов состояния HTTP==HTTP-кодом)):** %% return Redirect::to('user/profile', 301); %% **Переадресация на защищённый URI (через HTTPS):** %% return Redirect::to_secure('user/profile'); %% **Переадресация на начальную страницу:** %% return Redirect::home(); %% **Переадресация на предыдущую страницу** (используя %%Request::referrer%%): %% return Redirect::back(); %% **Переадресация на ((docs/v3/routing#именованны+е))й ((docs/v3/routing маршрут)):** %% return Redirect::to_route('profile'); %% **Переадресация на ((docs/v3/controllers#действи+я))е ((docs/v3/controllers контроллера)):** %% return Redirect::to_action('home@index'); %% Вам может потребоваться переадресовать пользователя на ((docs/v3/routing#именованны+е))й ((docs/v3/routing маршрут)) и в то же время **заменить ((docs/v3/routing#wc шаблоны)) в его адресе** (!!(tl_note) %%(t)(:any)%%, %%(t)(:hnum)%% и т.д. - //прим. пер.//!!) на нужные значения. Это легко сделать: %% return Redirect::to_route('profile', array($username)); %% **Переадресация к ((docs/v3/controllers#действи+я))ю** с подстановкой значений:** %% return Redirect::to_action('user@profile', array($username)); %% === ...с одноразовыми переменными === Часто после того, как пользователь зарегистрировался или вошёл в систему, принято показывать приветственное сообщение - однако как сохранить его так, чтобы оно было доступно только для следующего запроса? Метод %%Redirect->with%% используется для переадресации с одновременным сохранением //одноразовых переменных// (!!(tl_note) "flash data" - значения, удаляемые после того, как клиент откроет страницу, следующую после той, на которой эти значения были сохранены - //прим. пер.//). %% return Redirect::to('profile')->with('status', 'Добро пожаловать!'); %% Вы можете прочитать это значение с помощью метода %%Session::get%%: %% $status = Session::get('status'); %% .(further_reading) Связанные темы: * ((docs/v3/session/usage)) === Скачивание файлов === **Отправка файла на скачивание клиенту:** %% return Response::download('file/path.jpg'); %% **Скачивание файла с присвоением имени:** %% return Response::download('file/path.jpg', 'photo.jpg'); %% == Ошибки == Для отсылки страницы об ошибке просто укажите её ((ВП:Список кодов состояния HTTP==HTTP-код)). Нужный шаблон будет автоматически загружен из папки **views/error**. **Отправка ошибки 404** ("Файл не найден"): %% return Response::error('404'); %% **Отправка ошибки 500** ("Внутренняя ошибка сервера"): %% return Response::error('500'); %%