====== Декорирование данных в WACT-шаблонах. ====== Под декорированием мы подразумеваем применение шаблона декоратор (Decorator или Wrapper) для данных, которые мы получили из какого-то источника данных. Напомним, что шаблон Decorator используется в тех случах, когда нужно к классу добавить поведение, незаметно для его клиентов и не изменяя самого класса. ===== Декораторы итераторов ===== Разбирем небольшой пример, где мы будем использовать декоратор итератора. Например, у нас есть объект навигации (Navigation), наследник lmbActiveRecord, содержащий поле с адресом страницы page_url. При выводе навигации на странице нам необходимо подсвечивать текущую страницу. Здесь можно применить декоратор (хотя есть и другие способы это реализовать). Создадим класс HighLightDatasetDecorator: lmb_require('limb/net/src/lmbUri.class.php'); lmb_require('limb/datasource/src/lmbPagedDatasetDecorator.class.php'); class HighLightDatasetDecorator extends lmbPagedDatasetDecorator { protected $path_field = 'url'; function setPathField($path_field) { $this->path_field = $path_field; } function current() { $record = parent :: current(); $this->_assignHighlight($record); return $record; } protected function _assignHighlight($record) { $path = $record->get($this->path_field); if(!$path) return; $compare = $this->_compareRequestUriWithRecordUri(new lmbUri($path)); if($compare === false || $compare < 0) return; $record->set('hightlight', 1); } protected function _compareRequestUriWithRecordUri($record_uri) { if($record_uri->getHost()) return -1; $uri = lmbToolkit :: instance()->getRequest()->getUri(); return $uri->comparePath($record_uri); } } ?> Этот класс можно параметрировать при помощи метода setPathField(). HighLightDatasetDecorator сравнивает url-ы (вернее пути) при помощи метода comparePath класса lmbUri() и при необходимости ставит в запись поле 'hightlight' со значением 1. Чуть ниже мы покажем, как это можно использовать в шаблоне. Базовые классы для декоторов итераторов можно найти в пакете DATASOURCE. ===== Применение тегов и ===== При помощи тегов **** можно применять декораторы прямо в шаблоне, например: {$page_title} {$page_title}
Атрибут тега **using** указывает на класс декоратора, который будет применен к списку объектов класса Navigation. Тег работает таким образом, что он вызывает метод setParamName($param_value) для всех агрументов тега, кроме using. В нашем случае, это приведет к вызову метода setPathField('page_url') и наш объект класса HighLightDatasetDecorator сможет использовать именно поле page_url из объектов Navigation для сравнения. Тег **** работает аналогично тегу , с тем отличием, что он применяется внутри тега.