Виды

Комментарии: 1   Просмотры: 7 391

Представления (или Виды)

Представления — это файлы, которые содержат отображаемую информацию приложения. Чаще всего это 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() и bind() заключается в том, что bind() передает переменную по ссылке. При вызове bind(), если переменная не определена, то она будет создана со значением NULL.

Также можно присвоить переменные непосредственно для объекта представления. Это аналогично вызову метода 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 комментарий

У меня такой вопрос. А как различить что отдавать в зависимости от типа запроса.
Например,
1. если это обычное отображение страницы то мы отрабатываем этот метод Controller_Website::before() в преКонтроллере и оборачиваем результат в шаблон страницы.
2. Если это Ajax запрос, но запрашивается HTML (например через jQuery.load(), то отдаем сразу результат представления без оборачивания в шаблон через метод Controller_Website::before()
3. А если например, вообще требуется JSON — то просто отдаем json_encode( все что было передано во View )

Каким образом такое сотворить с коханой???



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.