changeset 304:2ff513227cb4

*TTView: refactoring. Added control registry for the document.
author cin
date Mon, 15 Apr 2013 07:44:50 +0400
parents a5eb64c6e6f7
children b5d5793f348e
files Lib/IMPL/Web/View/TTDocument.pm Lib/IMPL/Web/View/TTRegistry.pm
diffstat 2 files changed, 42 insertions(+), 186 deletions(-) [+]
line wrap: on
line diff
--- 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<IMPL::Web::View::TTLoader>.
-
 =head1 DESCRIPTION
 
-Документ для представления данных. Документы представляют собой иерархически организованные данные,
-элементами данного документа являются данные для отображения, такие как
-
-=over
-
-=item * Объекты из БД
-
-=item * Навигационные цепочки
-
-=item * Меню и т.п. 
-
-=back
-
-Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ.
-Процесс форматирования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
-вспомогательного шаблона - обертки. Если у шаблона документа указан C<layout> в метаданных, то он будет
-использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
-обертка не задана, то результатом будет вывод самого скрипта шаблона.
-
-Использование объектной модели документа позволяет решить задачи по созданию контейнеров,
-у которых может быть сложное содежимое. Примером таких элементов могут быть формы,
-внутри форм элементы управления также могут группироваться.
-
-=head2 Элементы управления (компоненты)
-
-Документ состоит из узлов, часть которых наследуется от C<IMPL::Web::View::TTControl>, такие узлы называются
-элементами управления. Каждый элемент управления имеет собственный контекст, который наследуется от контекста
-документа.
-
-=head2 Фабрика элементов управления
-
-Для создания элементов управления используются фабрики. Каждый элемен управления имеет свой шаблон для
-форматиорвания содержимого, фабрика связывает шаблон и класс элемента управления, для чего при загрузке
-шаблона используется свойство C<type> из метаданных. Фабрика загружается в документ при том только один
-раз, повторные загрузки фабрики возвращают уже загруженную. Для загрузки фабрики используется метод
-C<require()> с указанием элемента управления. 
-
-=head2 Порядок обработки документа
-
-Построение представления данных состоит из двух этапов
-
-=over
-
-=item 1 Создание объектной модели документа. На данном этапе создаются все элементы управления. 
-
-=item 1 Преобразование объектной модели в конечнное представление. На данном этапе происходит
-форматирование документа.
-
-=back
-
-
-=head2 Загрузка элемента управления
-
-=over
-
-=item 1 C<TInput = require('my/org/input')>
-
-=item 1 Загружается шаблон C<my/org/input.tt>
-
-=item 1 Создается фабрика элементов управления с собственным контекстом, унаследованным от контекст документа.
-
-=item 1 При первом создании элемента управления фабрика инициализируется выполнением блока C<INIT>.
-
-=back
-
-=head2 Создание элемента управления
-
-=over
-
-=item 1 C<< TInput.new('login') >>
-
-=item 1 Создается новый дочерний контекст к контексту фабрики
-
-=item 1 Создается экземпляр элемента управления
-
-=item 1 Выполняется блок конструктора C<CTOR> в контексте элемента управления, параметр C<this> имеет значение
-нового экземпляра элемента управления  
-
-=back
-
-=head1 MEMBERS
 
 =over
 
-=item C<CTOR($template, $contextOpts, $loader[, $vars])>
-
-Создает экземпляр документа с указанным шаблоном и параметрами.
-
-=over
-
-=item C<$template>
-
-C<Template::Document> шаблон документа.
-
-=item C<$contextOpts>
-
-C<HASH> Параметры контекста C<Template::Context> для документа. Эти параметры будут сохранены
-в свойстве C<opts>, а также на их основе будет создан контекст текщего документа. Как правило
-эти параметы задаются загрузчиком документа C<IMPL::Web::View::TTLoader>, таким образом, что
-C<Template::Stash> создаваемого контекста наследует переменные из контекста загрузчика.
-
-=item C<$loader>
-
-C<IMPL::Web::View::TTLoader> загрузчик, который будет использоваться для загрузки элементов управления,
-а также для получения обертки, заданной в свойстве документа C<layout>.
-
-=item C<$vars>
-
-C<HASH> Необязательный параметр. переменные которые будут переданы в блок конструктора C<INIT>.
-Как правило они используются для передачи данных для построения документа 
-
-=back 
-
-=back
-
-=over
-
-=item C<templateVars($name[,$newValue])>
-
-Получает или задает переменную для шаблона документа. Имя переменнной может быть составным,
-например C<'my.var.name'>, см. C<Template::Stash::set()>.
-
-=item C<RequireControl($controlName)>
-
-Загружает фабрику элемента управления, если она уже была загружена, возвращает на нее ссылку.
-При загрузки фабрики для нее создается собственный контекст на основе параметров из свойства
-C<opts> и ее пространство имен наследуется от пространства имен документа из свойства C<stash>.
-
-=item C<Render($vars)>
-
-Выполняет блок C<renderBlock> документа для получения конечного представления, C<$vars>
-содержит переменные для блока.
-
-=item C<RenderContent($vars)>
-
-Выполняет шаблон документа для получения представления содержимого, в отличии от
-метода C<Render> не использует обертку указанную в свойстве C<layout>, если обертка
-не указана, то эти методы идентичны.
-
-=item C<[get,set]layout>
-
-Обертка, которая будет использована для построения представления документа. В обертке
-будет доступна специальная переменная C<content>, при обращении к которой будет B<выполнен>
-метод C<RenderContent()> и возвращен результат его работы. Для получения шаблона обертки
-используется загрузчик из свойства C<loader>.
-
-=item C<[get]opts>
-
-Параметры контекста, используются для создания контекстов фабрик элементов управления.
-
-=item C<[get]loader>
-
-Загрузчик, используется для загрузки шаблонов фабрик элементов управления и обертки.
-
-=item C<[get]controls>
-
-C<HASH> Коллекция загруженных фабрик элементов управления, ключем является
-квалифицированное имя элемента управления.
-
-=item C<[get]stash>
-
-C<Template::Stash> Пространство имен документа, оно используется как родительское
-для пространств имен загружаемых фабрик элементов управления. 
-
-=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
--- /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__