Скрипты видов
После того, как ваш контроллер определил переменные и вызвал
метод render() , Zend_View включает
требуемый скрипт вида и выполняет его в области
видимости экземпляра Zend_View. Поэтому в вашем скрипте
вида ссылки на $this в действительности будут ссылаться на
сам экземляр Zend_View.
Переменные, устанавливаемые в контроллере для скрипта вида, являются
свойствами экземпляра Zend_View. Например, если контроллер
установил переменную 'something', то в скрипте вида вы можете ссылаться
на нее следующим образом: $this->something. Это дает
возможность отслеживать, какие переменные были установлены
извне для скрипта, и какие были установлены в самом скрипте.
Ниже приведен пример скрипта вида из введения:
span style="color: #ff0000;">'author''title'
Экранирование вывода
Одной из наиважнейших задач, которую должен решать скрипт вида,
является обеспечение того, что вывод должным образом
экранирован; помимо прочего, это помогает
предотвратить XSS-атаки.
За исключением тех случаев, когда используются функции,
методы или помощники, которые сами производят экранирование,
вы должны всегда экранировать переменные, когда выводите их.
Zend_View снабжен методом escape() ,
который выполняет экранирование.
// плохая практика
// хорошая практика
По умолчанию метод escape() использует функцию PHP
htmlspecialchars() для экранирования. Но, в зависимости
от вашего окружения, может потребоваться выполнять экранирование
по-иному. Используйте метод setEscape() на уровне
контроллера, чтобы указать Zend_View, какую
экранирующую функцию обратного вызова использовать.
// создание экземпляра Zend_View
// приказываем ему использовать htmlentities
// в качестве экранирующей функции обратного вызова
$view->setEscape('htmlentities');
// либо приказываем ему использовать статический метод класса
'SomeClass', 'methodName'));
// или даже метод экземпляра
'methodName'));
// и затем воспроизводим вид
Функции или методы обратного вызова должны принимать значение,
которое требуется экранировать, как первый параметр,
все остальные параметры должны быть необязательными.
Использование других шаблонизаторов
Хотя PHP сам по себе представляет собой мощный шаблонизатор,
многие разработчики считают его избыточным или сложным для
верстальщиков и предпочитают использовать другие
шаблонизаторы. Zend_View предоставляет два пути для
этого: первый - через скрипты вида, второй - посредством реализации
интерфейса Zend_View_Interface.
Шаблонизаторы c использованием скриптов видов
Скрипт вида может использоваться для инстанцирования и
манипулирования отдельным объектом шаблона (это могут быть
шаблоны в стиле PHPLIB).
span style="color: #ff0000;">'template.inc'"booklist" => "booklist.tpl",
"eachbook" => "eachbook.tpl"'author', $this->escape($val['author''title', $this->escape($val['title']);
$tpl->parse("books", "eachbook""output", "booklist""nobooks", "nobooks.tpl")
$tpl->pparse("output", "nobooks");
}
Это может соответствовать следующему файлу шаблона:
<!-- booklist.tpl -->
<table>
<tr>
<th>Author</th>
<th>Title</th>
</tr>
{books}
</table>
<!-- eachbook.tpl -->
<tr>
<td>{author}</td>
<td>{title}</td>
</tr>
<!-- nobooks.tpl -->
<p>Нет книг для отображения.</p>
Шаблонизаторы с использованием Zend_View_Interface
Некоторые считают более удобным использовать совместимый с
Zend_View шаблонизатор.
Zend_View_Interface
предоставляет минимально необходимый для
совместимости интерфейс:
/**
* Возвращает объект используемого шаблонизатора
*//**
* Устанавливает путь к шаблонам или скриптам вида
*//**
* Устанавливает базовый путь ко всем необходимым скрипту вида ресурсам
*/'Zend_View');
/**
* Устанавливает дополнительный базовый путь к необходимым скрипту вида ресурсам
*/'Zend_View');
/**
* Возвращает текущие пути к скриптам
*//**
* Переопределение методов для присвоения значений переменным шаблонов как
* свойствам объекта
*//**
* "Ручная" установка значения переменной шаблона или одновременное присвоение
* значений нескольким переменным
*//**
* Удаление всех переменных шаблона
*//**
* Вывод шаблона с именем $name
*/
Используя этот интерфейс, относительно легко сделать "обертку"
для шаблонизаторов сторонних разработчиков. В примере показан
вариант "обертки" для Smarty:
span style="color: #808080; font-style: italic;">/**
* Объект Smarty
* @var Smarty
*//**
* Конструктор
*
* @param string $tmplPath
* @param array $extraParams
* @return void
*//**
* Возвращение объекта шаблонизатора
*
* @return Smarty
*//**
* Установка пути к шаблонам
*
* @param string $path Директория, устанавливаемая как путь к шаблонам
* @return void
*/'Invalid path provided');
}
/**
* Извлечение текущего пути к шаблонам
*
* @return string
*//**
* Метод-"псевдоним" для setScriptPath
*
* @param string $path
* @param string $prefix Не используется
* @return void
*/'Zend_View'/**
* Метод-"псевдоним" для setScriptPath
*
* @param string $path
* @param string $prefix Не используется
* @return void
*/'Zend_View'/**
* Присвоение значения переменной шаблона
*
* @param string $key Имя переменной
* @param mixed $val Значение переменной
* @return void
*//**
* Получение значения переменной
*
* @param string $key Имя переменной
* @return mixed Значение переменной
*//**
* Позволяет проверять переменные через empty() и isset()
*
* @param string $key
* @return boolean
*//**
* Позволяет удалять свойства объекта через unset()
*
* @param string $key
* @return void
*//**
* Присвоение переменных шаблону
*
* Позволяет установить значение к определенному ключу или передать массив
* пар ключ => значение
*
* @see __set()
* @param string|array $spec Ключ или массив пар ключ => значение
* @param mixed $value (необязательный) Если присваивается значение одной
* переменной, то через него передается значение переменной
* @return void
*//**
* Удаление всех переменных
*
* @return void
*//**
* Обрабатывает шаблон и возвращает вывод
*
* @param string $name Шаблон для обработки
* @return string Вывод
*/
В этом примере вы можете инстанцировать класс
Zend_View_Smarty вместо Zend_View и
использовать его так же, как используется
Zend_View.
//Пример 1. В initView() инициализатора
'/path/to/templates''ViewRenderer'':controller/:action.:suffix')
->setViewScriptPathNoControllerSpec(':action.:suffix')
->setViewSuffix('tpl');
//Пример 2. Использование в контроллере действии остается тем же
'Zend PHP 5 Certification Study Guide';
$this->view->author = 'Davey Shafik and Ben Ramsey'
}
}
//Пример 3. Инициализация вида в контроллере действий
'/path/to/templates''viewRenderer'':controller/:action.:suffix')
->setViewScriptPathNoControllerSpec(':action.:suffix')
->setViewSuffix('tpl');
}
}
|
|