comparison Lib/IMPL/Web/View/TTDocument.pm @ 181:47dac58691ee

New templating system, small fixes
author sourcer
date Thu, 26 Jan 2012 01:15:57 +0400
parents
children ae8072f2f2a3
comparison
equal deleted inserted replaced
180:d1676be8afcc 181:47dac58691ee
1 package IMPL::Web::View::TTDocument;
2 use strict;
3
4 use IMPL::lang qw(:declare :constants);
5 use IMPL::DOM::Property qw(_dom);
6 use IMPL::Web::View::TTFactory();
7 use IMPL::Web::View::TTControl();
8
9
10 use parent qw(
11 IMPL::DOM::Document
12 IMPL::Web::View::TTControl
13 );
14
15 BEGIN {
16 public _dom property layout => PROP_ALL;
17 public property opts => PROP_GET | PROP_OWNERSET;
18 public property loader => PROP_GET | PROP_OWNERSET;
19 public property controls => PROP_GET | PROP_OWNERSET;
20 }
21
22 sub CTOR {
23 my ($this,$template,$refOpts,%args) = @_;
24
25 $this->controls({});
26 $this->loader($args{loader}) if $args{loader};
27
28 $this->layout( $template->layout ) unless $this->layout;
29
30 $this->opts($refOpts);
31 }
32
33 our %CTOR = (
34 'IMPL::Web::View::TTControl' => sub {
35 'document',
36 $_[0], # template
37 new Template::Context($_[1]) # context
38 },
39 'IMPL::DOM::Document' => sub {
40 nodeName => 'document'
41 }
42 );
43
44 sub require {
45 my ($this, $control) = @_;
46
47 if (! $this->controls->{$control}) {
48
49 (my $path = $control) =~ tr/\./\//;
50 if ( my $template = $this->loader->template($path) ) {
51 my $opts = ${$this->opts};
52 $opts->{STASH} = $this->context->stash->clone();
53
54 my $ctx = new Template::Context($opts);
55
56 my $factory = new IMPL::Web::View::TTFactory(
57 typeof IMPL::Web::View::TTControl,
58 $template,
59 $ctx,
60 $opts
61 );
62
63 my @parts = split(/\.+/,$control);
64
65 $this->context->stash->set([map { $_, 0 } @parts], $factory);
66
67 } else {
68 die new IMPL::KeyNotFoundException($control);
69 }
70
71 }
72 }
73
74 sub Render {
75 my ($this,$param) = @_;
76
77 my $output = $this->context->process($this->template, {this => $this} );
78
79 if ($this->layout) {
80 $output = $this->context->include($this->layout,{ content => $output });
81 }
82
83 return $output;
84 }
85
86
87 1;
88
89 __END__
90
91 =pod
92
93 =head1 NAME
94
95 C<IMPL::Web::View::TTDocument> - документ для построения HTML страницы на основе шаблонов TT.
96
97 =head1 SYNOPSIS
98
99 =begin code
100
101 use IMPL::Web::View::TTDocument();
102
103 my $doc = new IMPL::Wbe::View::TTDocument($template,$ttOptions);
104
105 return $doc->Render();
106
107 =end code
108
109 Однако, более предпочтительный способ использовать C<IMPL::Web::View::TTLoader>.
110
111 =head1 DESCRIPTION
112
113 Документ для представления данных. Документы представляют собой иерархически организованные данные,
114 элементами данного документа являются данные для отображения, такие как
115
116 =over
117
118 =item * Объекты из БД
119
120 =item * Навигационные цепочки
121
122 =item * Меню и т.п.
123
124 =back
125
126 Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ.
127 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
128 вспомогательного шаблона - обертки. Если у шаблона документа указан C<wrapper> в метаданных, то он будет
129 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
130 обертка не задана, то результатом будет вывод самого скрипта шаблона.
131
132 Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее,
133 указанное при создании документа.
134
135 =head2 Загрузка элемента управления
136
137 =over
138
139 =item 1 C<document.require(my.org.input)>
140
141 =item 1 Загружает шаблон C<my/org/input.tt>
142
143 =item 1 Создает фабрику элементов управления с собственным контекстом, вложенным в контекст документа.
144
145 =item 1 Выполняет шаблон в пространстве имен фабрики
146
147 =item 1 Регистритует фабрику в контексте документа по пути C<my.org.input>
148
149 =back
150
151 =head2 Создание элемента управления
152
153 =over
154
155 =item 1 C<< my.org.input.new('login') >>
156
157 =item 1 Если это первый элемент управления, то выполняетя статический конструктор в контексте фабрики
158
159 =item 1 Создается новый дочерний контекст к контексту фабрики
160
161 =item 1 Создается экземпляр элемента управления
162
163 =item 1 Выполняется блок конструктора в контексте элемента управления, параметр C<this> имеет значение
164 нового экземпляра элемента управления
165
166 =back
167
168 =head1 MEMBERS
169
170 =over
171
172 =item C<CTOR($template, %options)>
173
174 Создает экземпляр документа с указанным шаблоном и параметрами, параметры
175
176 =back
177
178 =cut