# HG changeset patch # User cin # Date 1365997490 -14400 # Node ID 2ff513227cb42e32dad820ce7b61321ee11da9d8 # Parent a5eb64c6e6f72447332d7f5904e4935f79015ef3 *TTView: refactoring. Added control registry for the document. diff -r a5eb64c6e6f7 -r 2ff513227cb4 Lib/IMPL/Web/View/TTDocument.pm --- a/Lib/IMPL/Web/View/TTDocument.pm Mon Apr 08 02:18:47 2013 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Mon Apr 15 07:44:50 2013 +0400 @@ -162,199 +162,13 @@ =begin code -use IMPL::Web::View::TTDocument(); - -my $doc = new IMPL::Wbe::View::TTDocument($template,$ttOptions); - -return $doc->Render(); =end code -Однако, более предпочтительный способ использовать C. - =head1 DESCRIPTION -Документ для представления данных. Документы представляют собой иерархически организованные данные, -элементами данного документа являются данные для отображения, такие как - -=over - -=item * Объекты из БД - -=item * Навигационные цепочки - -=item * Меню и т.п. - -=back - -Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ. -Процесс форматирования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи -вспомогательного шаблона - обертки. Если у шаблона документа указан C в метаданных, то он будет -использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если -обертка не задана, то результатом будет вывод самого скрипта шаблона. - -Использование объектной модели документа позволяет решить задачи по созданию контейнеров, -у которых может быть сложное содежимое. Примером таких элементов могут быть формы, -внутри форм элементы управления также могут группироваться. - -=head2 Элементы управления (компоненты) - -Документ состоит из узлов, часть которых наследуется от C, такие узлы называются -элементами управления. Каждый элемент управления имеет собственный контекст, который наследуется от контекста -документа. - -=head2 Фабрика элементов управления - -Для создания элементов управления используются фабрики. Каждый элемен управления имеет свой шаблон для -форматиорвания содержимого, фабрика связывает шаблон и класс элемента управления, для чего при загрузке -шаблона используется свойство C из метаданных. Фабрика загружается в документ при том только один -раз, повторные загрузки фабрики возвращают уже загруженную. Для загрузки фабрики используется метод -C с указанием элемента управления. - -=head2 Порядок обработки документа - -Построение представления данных состоит из двух этапов - -=over - -=item 1 Создание объектной модели документа. На данном этапе создаются все элементы управления. - -=item 1 Преобразование объектной модели в конечнное представление. На данном этапе происходит -форматирование документа. - -=back - - -=head2 Загрузка элемента управления - -=over - -=item 1 C - -=item 1 Загружается шаблон C - -=item 1 Создается фабрика элементов управления с собственным контекстом, унаследованным от контекст документа. - -=item 1 При первом создании элемента управления фабрика инициализируется выполнением блока C. - -=back - -=head2 Создание элемента управления - -=over - -=item 1 C<< TInput.new('login') >> - -=item 1 Создается новый дочерний контекст к контексту фабрики - -=item 1 Создается экземпляр элемента управления - -=item 1 Выполняется блок конструктора C в контексте элемента управления, параметр C имеет значение -нового экземпляра элемента управления - -=back - -=head1 MEMBERS =over -=item C - -Создает экземпляр документа с указанным шаблоном и параметрами. - -=over - -=item C<$template> - -C шаблон документа. - -=item C<$contextOpts> - -C Параметры контекста C для документа. Эти параметры будут сохранены -в свойстве C, а также на их основе будет создан контекст текщего документа. Как правило -эти параметы задаются загрузчиком документа C, таким образом, что -C создаваемого контекста наследует переменные из контекста загрузчика. - -=item C<$loader> - -C загрузчик, который будет использоваться для загрузки элементов управления, -а также для получения обертки, заданной в свойстве документа C. - -=item C<$vars> - -C Необязательный параметр. переменные которые будут переданы в блок конструктора C. -Как правило они используются для передачи данных для построения документа - -=back - -=back - -=over - -=item C - -Получает или задает переменную для шаблона документа. Имя переменнной может быть составным, -например C<'my.var.name'>, см. C. - -=item C - -Загружает фабрику элемента управления, если она уже была загружена, возвращает на нее ссылку. -При загрузки фабрики для нее создается собственный контекст на основе параметров из свойства -C и ее пространство имен наследуется от пространства имен документа из свойства C. - -=item C - -Выполняет блок C документа для получения конечного представления, C<$vars> -содержит переменные для блока. - -=item C - -Выполняет шаблон документа для получения представления содержимого, в отличии от -метода C не использует обертку указанную в свойстве C, если обертка -не указана, то эти методы идентичны. - -=item C<[get,set]layout> - -Обертка, которая будет использована для построения представления документа. В обертке -будет доступна специальная переменная C, при обращении к которой будет B<выполнен> -метод C и возвращен результат его работы. Для получения шаблона обертки -используется загрузчик из свойства C. - -=item C<[get]opts> - -Параметры контекста, используются для создания контекстов фабрик элементов управления. - -=item C<[get]loader> - -Загрузчик, используется для загрузки шаблонов фабрик элементов управления и обертки. - -=item C<[get]controls> - -C Коллекция загруженных фабрик элементов управления, ключем является -квалифицированное имя элемента управления. - -=item C<[get]stash> - -C Пространство имен документа, оно используется как родительское -для пространств имен загружаемых фабрик элементов управления. - -=back - -=head1 TEMPLATES - -=begin text - -[%META layout='default'%] -[% BLOCK CTOR; - section('top','TOP'); - section('bottom','BOTTOM'); - section('client','CLIENT'); -END %] -[% BLOCK TOP; - TMenu = require('my/org/Menu'); - append(TMenu.new()); -END %] - -=end =cut \ No newline at end of file diff -r a5eb64c6e6f7 -r 2ff513227cb4 Lib/IMPL/Web/View/TTRegistry.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/TTRegistry.pm Mon Apr 15 07:44:50 2013 +0400 @@ -0,0 +1,42 @@ +package IMPL::Web::View::TTRegistry; +use strict; + +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + TTFactory => 'IMPL::Web::View::TTFactory' + }, + base => [ + 'IMPL::Object' => undef + ], + props => [ + loader => PROP_RW, + context => PROP_RW, + _cache => PROP_RW, + ] +}; + +sub Require { + my ($this,$name) = @_; + + if(my $factory = $this->_cache->{$name}) { + return $factory; + } else { + my $template = $this->loader->template($name) + or die AppException->new("Failed to load a template $name"); + + $factory = TTFactory->new( + $template, + $this->context, + $name, + $this + ); + + $this->_cache->{$name} = $factory; + return $factory; + } +} + +1; + +__END__