# Использование представлений Представления - файлы, содержащие отображаемую информацию Вашего приложения. Чаще всего это HTML, CSS и Javascript, но может быть чем угодно, например XML или JSON для AJAX-вызовов. Цель представлений - хранить эту информацию отдельно от логики приложения для облегчения повторного использования и более чистого кода. Несмотря на это, представления сами по себе могут содержать код, используемый для отображения сохраненных в них данных. Например, циклический перебор элементов массива данных о продукте и отображение каждого в отдельном табличном ряду. Представления есть PHP-файлы, так что Вы можете свободно использовать там любой код, как обычно. # Создание файлов представлений Файлы представлений располагаются в директории `views` [файловой системы](about.filesystem). Вы также можете создавать поддиректории в ней для упорядочивания файлов. Все приведенные ниже примеры файлов являются допустимыми: 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] обычно создается в контроллере ([Controller]) с помощью метода [View::factory]. Чаще всего представление записывается в свойство [Request::$response] или в другое представление. public function action_about() { $this->request->response = View::factory('pages/about'); } Когда представление сохранено в [Request::$response], как в примере выше, оно будет автоматически отображено при необходимости. Для получения сгенерированного вывода представления используйте метод [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->request->response = $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); // The view will have $places and $user variables $this->request->response = $view; } [!!] Единственная разница между `set()` и `bind()` в том, что `bind()` присоединяет переменную по ссылке. Если Вы вызываете `bind()` переменной до того, как она определена, переменная будет создана со значением `NULL`. ### Глобальные переменные Приложение может иметь несколько представлений, которым нужен доступ к одним и тем же переменным. Например, чтобы отобразить заголовок страницы и в шапке представления, и в теле содержимого страницы. Вы можете создать переменные, которые будут доступны в любом представлении, используя [View::set_global] и [View::bind_global]. // Assign $page_title to all views 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(); // Make $page_title available to all views View::bind_global('page_title', $this->page_title); // Load $sidebar into the template as a view $this->template->sidebar = View::factory('template/sidebar'); } } Далее, главный контроллер будет расширять `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]: // Only the $user variable will be available in "views/user/login.php" bind('user', $user) ?> Другой способ - подключение представлений напрямую, что делает все текущие переменные доступными в подключаемом представлении: // Any variable defined in this view will be included in "views/message.php" Естественно, Вы также можете загрузить объект [Request] в представление: execute() ?> Это пример [HMVC](about.mvc), который делает возможным создавать и считывать вызовы других URL Вашего приложения. # Переход с версии 2.x В отличие от версии Kohana 2.x, представления не создаются в контексте текущего контроллера, так что Вы не сможете использовать `$this` в качестве контроллера, в который загружено данное представление. Контроллер должен быть передан туда явно: $view->bind('controller', $this);