mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-12 11:06:54 +01:00
146 lines
9.0 KiB
Plaintext
146 lines
9.0 KiB
Plaintext
Представление
|
||
=============
|
||
Представление — это 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` в представлении указывает на экземпляр виджета, а не на экземпляр
|
||
контроллера.
|
||
|
||
Системные представления
|
||
------------------------
|
||
Системные представления относятся к представлениям, используемым Yii для
|
||
отображения ошибок и информации лога. Например, когда пользователь запрашивает
|
||
несуществующий контроллер или действие, Yii генерирует исключение, раскрывающее
|
||
суть ошибки. Такое исключение будет отображено с помощью системного представления.
|
||
|
||
Именование системных представлений подчиняется некоторым правилам.
|
||
Имена типа `errorXXX` относятся к представлениям, служащим для
|
||
отображения исключений [CHttpException] с кодом ошибки `XXX`.
|
||
Например, если исключение [CHttpException] сгенерировано с кодом ошибки 404,
|
||
будет использовано представление `error404`.
|
||
|
||
Yii предоставляет стандартный набор системных представлений, расположенных в
|
||
`framework/views`. Их можно изменить, создав файлы представлений с
|
||
теми же названиями в директории `protected/views/system`.
|
||
|
||
<div class="revision">$Id: basics.view.txt 3251 2011-06-01 00:24:06Z qiang.xue $</div> |