Представление
=============
Представление — это PHP-скрипт, состоящий преимущественно из элементов
пользовательского интерфейса. Он может включать выражения PHP, однако рекомендуется,
чтобы эти выражения не изменяли данные и оставались относительно простыми.
Следуя концепции разделения логики и представления, большая часть кода логики
должна быть помещена в контроллер или модель, а не в скрипт представления.

У представления есть имя, которое используется, чтобы идентифицировать файл
скрипта представления в процессе рендеринга. Имя представления должно совпадать
с названием файла представления. К примеру, для представления `edit`
соответствующий файл скрипта должен называться `edit.php`. Чтобы отобразить
представление, необходимо вызвать метод [CController::render()], указав имя
представления. При этом метод попытается найти соответствующий файл в директории
`protected/views/ControllerID`.

Внутри скрипта представления экземпляр контроллера доступен через `$this`.
Таким образом, мы можем обратиться к свойству контроллера из кода представления:
`$this->propertyName`.

Кроме того, мы можем использовать следующий способ для передачи данных представлению:

~~~
[php]
$this->render('edit', array(
	'var1'=>$value1,
	'var2'=>$value2,
));
~~~

В приведённом коде метод [render()|CController::render] преобразует второй параметр —
массив — в переменные. Как результат, внутри представления будут доступны
локальные переменные `$var1` и `$var2`.

Макет
----------
Макет (layout) — это специальное представление для декорирования других представлений.
Макет обычно содержит части пользовательского интерфейса, общие для нескольких представлений.
Например, макет может содержать верхнюю и нижнюю части страницы, заключая между ними
содержание другого представления:

~~~
[php]
…здесь верхняя часть…
<?php echo $content; ?>
…здесь нижняя…
~~~

Здесь `$content` хранит результат рендеринга представления.

Макет применяется неявно при вызове метода [render()|CController::render].
По умолчанию в качестве макета используется представление
`protected/views/layouts/main.php`. Его можно изменить путём установки значений
[CWebApplication::layout] или [CController::layout]. Для рендеринга представления
без применения макета необходимо вызвать [renderPartial()|CController::renderPartial].


Виджет
------

Виджет (widget) — это экземпляр класса [CWidget] или унаследованного от него.
Это компонент, применяемый, в основном, с целью оформления. Виджеты обычно
встраиваются в представления для формирования некоторой сложной, но в то же время
самостоятельной части пользовательского интерфейса. К примеру, виджет календаря
может быть использован для рендеринга сложного интерфейса календаря.
Виджеты позволяют повторно использовать код пользовательского интерфейса.

Для подключения виджета необходимо выполнить в коде:

~~~
[php]
<?php $this->beginWidget('path.to.WidgetClass'); ?>
…некое содержимое, которое может быть использовано виджетом…
<?php $this->endWidget(); ?>
~~~

или

~~~
[php]
<?php $this->widget('path.to.WidgetClass'); ?>
~~~

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

Изменить поведение виджета можно путём установки начальных значений его свойств при вызове
[CBaseController::beginWidget] или [CBaseController::widget].
Например, при использовании виджета [CMaskedTextField] можно указать используемую маску,
передав массив начальных значений свойств как показано ниже, где ключи массива
являются именами свойств, а значения — начальными значениями соответствующих
им свойств виджета:

~~~
[php]
<?php
$this->widget('CMaskedTextField',array(
	'mask'=>'99/99/9999'
));
?>
~~~

Чтобы создать новый виджет, необходимо расширить класс [CWidget] и переопределить
его методы [init()|CWidget::init] и [run()|CWidget::run]:

~~~
[php]
class MyWidget extends CWidget
{
	public function init()
	{
		// этот метод будет вызван внутри CBaseController::beginWidget()
	}

	public function run()
	{
		// этот метод будет вызван внутри CBaseController::endWidget()
	}
}
~~~

Как и у контроллера, у виджета может быть собственное представление.
По умолчанию файлы представлений виджета находятся в поддиректории
`views` директории, содержащей файл класса виджета. Эти представления можно рендерить
при помощи вызова [CWidget::render()] точно так же, как и в случае с контроллером.
Единственное отличие состоит в том, что для представления виджета не используются макеты.
Также следует отметить, что `$this` в представлении указывает на экземпляр виджета, а не на экземпляр
контроллера.

> Tip|Подсказка: свойство [CWidgetFactory::widgets] может быть использовано для
> настройки умолчаний для отдельных виджетов во всём приложении. Подробнее об
> этом можно прочитать в разделе
> «[Темы оформления, глобальная настройка виджетов](/doc/guide/topics.theming)».

Системные представления
------------------------
Системные представления относятся к представлениям, используемым Yii для
отображения ошибок и информации лога. Например, когда пользователь запрашивает
несуществующий контроллер или действие, Yii генерирует исключение, раскрывающее
суть ошибки. Такое исключение будет отображено с помощью системного представления.

Именование системных представлений подчиняется некоторым правилам.
Имена типа `errorXXX` относятся к представлениям, служащим для
отображения исключений [CHttpException] с кодом ошибки `XXX`.
Например, если исключение [CHttpException] сгенерировано с кодом ошибки 404,
будет использовано представление `error404`.

Yii предоставляет стандартный набор системных представлений, расположенных в
`framework/views`. Их можно изменить, создав файлы представлений с
теми же названиями в директории `protected/views/system`.