Альтернативный язык шаблонов
============================

Yii позволяет разработчику использовать свой любимый язык шаблонов (например,
Prado или Smarty) для описания представлений контроллера или виджета. Для этого
требуется написать и установить свой компонент [viewRenderer|CWebApplication::viewRenderer].
Обработчик представления перехватывает вызовы [CBaseController::renderFile],
компилирует файл представления с альтернативным синтаксисом и отдаёт результат
компиляции.

> Info|Информация: Не рекомендуется использовать альтернативный синтаксис шаблонов
для описания представлений компонентов, выкладываемых в открытый доступ. Это
приведёт к требованию использовать тот же синтаксис, что использован в представлении
компонента.

Далее мы покажем, как использовать [CPradoViewRenderer] — обработчик представлений,
позволяющий разработчику использовать синтаксис шаблонов, используемый в фреймворке
[Prado](http://www.pradosoft.com/). Если вы хотите реализовать свои обработчики
представлений, обязательно изучите [CPradoViewRenderer].

Использование `CPradoViewRenderer`
----------------------------------

Для использования [CPradoViewRenderer] необходимо настроить приложение
следующим образом:

~~~
[php]
return array(
	'components'=>array(
		…,
		'viewRenderer'=>array(
			'class'=>'CPradoViewRenderer',
		),
	),
);
~~~

По умолчанию [CPradoViewRenderer] будет компилировать исходные файлы представлений и
сохранять получаемые файлы PHP в директорию [runtime](/doc/guide/basics.convention#directory).
PHP-файлы изменяются только в том случае, если изменено исходное представление.
Поэтому, использование [CPradoViewRenderer] влечёт за собой очень незначительное
падение производительности.

> Tip|Подсказка: Несмотря на то, что [CPradoViewRenderer] добавляет новый синтаксис
для более быстрого и удобного описания представлений, вы можете использовать код
PHP также, как и в обычных представлениях.

Ниже будут описаны конструкции, поддерживаемые [CPradoViewRenderer].

### Сокращённые PHP-тэги

Сокращённые PHP-тэги — хороший способ сократить код, используемый в представлении.
Выражение `<%= expression %>` преобразуется в `<?php echo expression ?>`.
`<% statement %>` — в `<?php statement ?>`. К примеру:

~~~
[php]
<%= CHtml::textField($name,'value'); %>
<% foreach($models as $model): %>
~~~

преобразуется в

~~~
[php]
<?php echo CHtml::textField($name,'value'); ?>
<?php foreach($models as $model): ?>
~~~

### Компонентные тэги

Компонентные тэги используются для того, чтобы вставить в представление
[виджет](/doc/guide/basics.view#widget). Синтаксис следующий:

~~~
[php]
<com:WidgetClass property1=value1 property2=value2 …>
	// содержимое виджета
</com:WidgetClass>

// виджет без содержимого
<com:WidgetClass property1=value1 property2=value2 …/>
~~~

Здесь `WidgetClass` определяет имя класса виджета или
[псевдоним пути](/doc/guide/basics.namespace). Начальные значения свойств могут
быть как строками, заключенными в кавычки, так и выражениями PHP, заключёнными в
фигурные скобки. К примеру:

~~~
[php]
<com:CCaptcha captchaAction="captcha" showRefreshButton={false} />
~~~

преобразуется в

~~~
[php]
<?php $this->widget('CCaptcha', array(
	'captchaAction'=>'captcha',
	'showRefreshButton'=>false)); ?>
~~~

> Note|Примечание: Значение `showRefreshButton` задано как `{false}`
вместо `"false"` так как последнее означает строку, а не логическое значение.

### Кэширующие тэги

Кэширующие тэги — краткий способ использования
[кэширования фрагментов](/doc/guide/caching.fragment). Синтаксис следующий:

~~~
[php]
<cache:fragmentID property1=value1 property2=value2 …>
	// содержимое, которое необходимо кэшировать
</cache:fragmentID >
~~~

Здесь `fragmentID` — уникальный идентификатор кэшируемого объекта. Пары имя-значение
используются для настройки кэширования фрагментов. К примеру:

~~~
[php]
<cache:profile duration={3600}>
	// информация из профиля пользователя
</cache:profile >
~~~

будет преобразовано в

~~~
[php]
<?php if($this->beginCache('profile', array('duration'=>3600))): ?>
	// информация из профиля пользователя
<?php $this->endCache(); endif; ?>
~~~

### Захватывающие тэги

Как и кэширующие тэги, захватывающие тэги — компактный способ использования
[CBaseController::beginClip] и [CBaseController::endClip]. Синтаксис следующий:

~~~
[php]
<clip:clipID>
	// содержимое для захвата
</clip:clipID >
~~~

Здесь `clipID` — уникальный идентификатор захваченного содержимого.
Захватывающие тэги преобразуются следующим образом:

~~~
[php]
<?php $this->beginClip('clipID'); ?>
	// содержимое для захвата
<?php $this->endClip(); ?>
~~~

### Тэги комментариев

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

~~~
[php]
<!---
Этот комментарий будет вырезан… цензурой
--->
~~~

Одновременное использование шаблонов разного формата
----------------------------------------------------

Начиная с версии 1.1.2 возможно использовать одновременно как альтернативный, так и
обычный PHP синтаксис шаблонов. Для этого необходимо задать свойству обработчика
шаблонов [CViewRenderer::fileExtension] значение, отличное от `.php`.
К примеру, если оно будет выставлено в `.tpl`, то все шаблоны с расширением `.tpl` будут
обрабатываться выбранным обработчиком представлений. Шаблоны с расширением `.php`,
как и ранее, будут использовать стандартный синтаксис PHP.