Представления (или Виды)
Представления — это файлы, которые содержат отображаемую информацию приложения. Чаще всего это HTML, CSS и JavaScript, но может быть и что-то другое, например, XML или JSON для вывода AJAX. Задача представления — это отделение отображения информации от логики приложения для возможности повторного использования и чистоты кода.
Представления могут содержать в себе код, используемый для отображения сохраненных в нем данных. Например, перебор элементов массива с информацией о продуктах и запись каждого результата в новую строку таблицы. Представления — это обычные PHP-файлы, в которых можно использовать обычный код. Тем не менее, необходимо стараться держать свои представления ‘немыми’ (т.е. не выполняющими никаких запросов для получения данных) насколько это возможно и получить все возможные данные в контроллерах, а затем передать их в представление.
Создание представлений
Файлы представлений хранятся в каталоге views. Также можно создавать подкаталоги в каталоге views, для лучшей организации файлов. Примеры правильного расположения представлений:
APPPATH/views/home.php APPPATH/views/pages/about.php APPPATH/views/products/details.php MODPATH/error/views/errors/404.php MODPATH/common/views/template.php
Загрузка представлений
Объекты представления, как правило, создаются внутри контроллера с помощью метода View::factory. Обычно представление затем присваивается свойству Request::$response.
public function action_about() { $this->request->response = View::factory('pages/about'); }
Когда представление назначается Response::body, как в примере выше, оно автоматически будет вызвано когда это необходимо. Для того чтобы получить результат представления, можно вызвать метод View::render или привести это представление к строковому типу. Когда представление получено, файл с этим представлением загрузится и HTML-код сгенерируется.
public function action_index() { $view = View::factory('pages/about'); // Render the view $about_page = $view->render(); // Or just type cast it to a string $about_page = (string) $view; $this->response->body($about_page); }
Переменные в представлениях
Как только представление загружено, переменные могут быть переданы с помощью методов View::set и View::bind.
public function action_roadtrip() { $view = View::factory('user/roadtrip') ->set('places', array('Rome', 'Paris', 'London', 'New York', 'Tokyo')); ->bind('user', $this->user); // view содержит переменные $places и $user $this->response->body($view); }
Также можно присвоить переменные непосредственно для объекта представления. Это аналогично вызову метода set().
public function action_roadtrip() { $view = View::factory('user/roadtrip'); $view->places = array('Rome', 'Paris', 'London', 'New York', 'Tokyo'); $view->user = $this->user; // The view will have $places and $user variables $this->response->body($view); }
Глобальные переменные
Приложение может иметь несколько представлений, которым нужен доступ к один и тем же переменным. Например, для отображения заголовка страницы в шапке шаблона и в теле содержимого страницы. Вы можете создавать переменные, которые будут доступны в любом представлении, используя методы View::set_global и View::bind_global.
// назначаем $page_title глобальной для всех представлений View::bind_global('page_title', $page_title);
Пусть приложение имеет три представления, которые генерируют главную страницу: template, template/sidebar и pages/home. Для начала необходимо написать абстрактный контроллер для создания шаблона:
abstract class Controller_Website extends Controller_Template { public $page_title; public function before() { parent::before(); // делаем $page_title доступной во всех представлениях View::bind_global('page_title', $this->page_title); // загружаем $sidebar внутрь шаблона $this->template->sidebar = View::factory('template/sidebar'); } }
Далее создаем контроллер Home, который расширяет Controller_Website
class Controller_Home extends Controller_Website { public function action_index() { $this->page_title = 'Home'; $this->template->content = View::factory('pages/home'); } }
Представления внутри представлений
Если необходимо включить одно представление в другое, то есть два варианта. Путем вызова View::factory можно включить его в текущее представление. Это означает, что необходимо передать все переменные в представление с помощью методов View::set или View::bind.
// тольпо переменная $user будет доступна в "views/user/login.php" <?php echo View::factory('user/login')->bind('user', $user) ?>
Другим вариантом является подключение представления на прямую, что делает все текущие переменные доступными в подключаемом представлении.
// любая переменная, определенная в этом представлении будет включена в "views/message.php" <?php include Kohana::find_file('views', 'user/login') ?>
Также можно назначить переменной вашего родительского представления, быть дочерним представлением в контроллере. Например:
// в вашем контроллере: public functin action_index() { $view = View::factory('common/template); $view->title = "Some title"; $view->body = View::factory('pages/foobar'); } // В views/common/template.php: <html> <head> <title><?php echo $title></title> </head> <body> <?php echo $body ?> </body> </html>
Конечно, можно загрузить весь объект Request в представление.
<?php echo Request::factory('user/login')->execute() ?>
Это пример так называемого HMVC (Иерарархические Модель-Контроллер-Вид), который делает возможным создание и чтение вызовов на другие URL-адреса внутри приложения.
Пожалуйста, зарегистрируйтесь для комментирования.
У меня такой вопрос. А как различить что отдавать в зависимости от типа запроса.
Например,
1. если это обычное отображение страницы то мы отрабатываем этот метод Controller_Website::before() в преКонтроллере и оборачиваем результат в шаблон страницы.
2. Если это Ajax запрос, но запрашивается HTML (например через jQuery.load(), то отдаем сразу результат представления без оборачивания в шаблон через метод Controller_Website::before()
3. А если например, вообще требуется JSON — то просто отдаем json_encode( все что было передано во View )
Каким образом такое сотворить с коханой???