Представлення
=============
Представлення — це 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()
	{
		// цей метод буде викликаний методом CController::beginWidget()
	}

	public function run()
	{
		// цей метод буде викликаний методом CController::endWidget()
	}
}
~~~

Як і у контролера, у віджета може бути власне представлення.
За замовчуванням, файли представлень віджета знаходяться у піддиректорії
`views` директорії, яка містить файл класу віджета. Ці представлення можна рендерити
за допомогою виклику [CWidget::render()], точно так, як і у випадку із контролером.
Єдина різниця полягає у тому, що для представлення віджета не використовуються макети.
Також, `$this` в представленні вказує на екземпляр віджета, а не на екземпляр контролера.

> Tip|Підказка: властивість [CWidgetFactory::widgets] може бути використана для налаштування 
замовчувань для окремих віджетів у всьому додатку. Детальніше про це можна прочитати у розділі 
[«Теми оформлення» (Глобальне налаштування віджетів)](/doc/guide/topics.theming#customizing-widgets-globally)

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

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

Yii надає стандартний набір системних представлень, розташованих у
`framework/views`. Їх можні змінити, створивши файли представлень з
тими ж назвами у директорії `protected/views/system`.
