Представление ============= Представление — это 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] …здесь верхняя часть… …здесь нижняя… ~~~ Здесь `$content` хранит результат рендеринга представления. Макет применяется неявно при вызове метода [render()|CController::render]. По умолчанию в качестве макета используется представление `protected/views/layouts/main.php`. Его можно изменить путём установки значений [CWebApplication::layout] или [CController::layout]. Для рендеринга представления без применения макета необходимо вызвать [renderPartial()|CController::renderPartial]. Виджет ------ Виджет (widget) — это экземпляр класса [CWidget] или унаследованного от него. Это компонент, применяемый, в основном, с целью оформления. Виджеты обычно встраиваются в представления для формирования некоторой сложной, но в то же время самостоятельной части пользовательского интерфейса. К примеру, виджет календаря может быть использован для рендеринга сложного интерфейса календаря. Виджеты позволяют повторно использовать код пользовательского интерфейса. Для подключения виджета необходимо выполнить в коде: ~~~ [php] beginWidget('path.to.WidgetClass'); ?> …некое содержимое, которое может быть использовано виджетом… endWidget(); ?> ~~~ или ~~~ [php] widget('path.to.WidgetClass'); ?> ~~~ Последний вариант используется, когда виджет не имеет внутреннего содержимого. Изменить поведение виджета можно путём установки начальных значений его свойств при вызове [CBaseController::beginWidget] или [CBaseController::widget]. Например, при использовании виджета [CMaskedTextField] можно указать используемую маску, передав массив начальных значений свойств как показано ниже, где ключи массива являются именами свойств, а значения — начальными значениями соответствующих им свойств виджета: ~~~ [php] 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`.