comparison Lib/IMPL/Web/View/TTDocument.pm @ 190:cd1ff7029a63

IMLP::Web::View refactored, added new method 'require' which is available inside templates. Changed document rendering.
author cin
date Wed, 04 Apr 2012 17:51:27 +0400
parents 08015e2803f1
children 78a18a2b6266
comparison
equal deleted inserted replaced
189:08015e2803f1 190:cd1ff7029a63
3 3
4 use IMPL::lang qw(:declare :constants); 4 use IMPL::lang qw(:declare :constants);
5 use IMPL::DOM::Property qw(_dom); 5 use IMPL::DOM::Property qw(_dom);
6 use IMPL::Web::View::TTFactory(); 6 use IMPL::Web::View::TTFactory();
7 use IMPL::Web::View::TTControl(); 7 use IMPL::Web::View::TTControl();
8
9 use Scalar::Util qw(weaken);
8 10
9 11
10 use parent qw( 12 use parent qw(
11 IMPL::DOM::Document 13 IMPL::DOM::Document
12 IMPL::Web::View::TTControl 14 IMPL::Web::View::TTControl
31 33
32 $this->layout( $template->layout ) unless $this->layout; 34 $this->layout( $template->layout ) unless $this->layout;
33 35
34 $this->opts($refOpts); 36 $this->opts($refOpts);
35 $this->stash($this->context->stash); 37 $this->stash($this->context->stash);
38
39 my $self = $this;
40 weaken($self);
41
42 $this->templateVars('require', sub {
43 my $doc = $self;
44 die new IMPL::Exception("A document is destroyed or invalid") unless $doc;
45 $doc->require(@_);
46 });
47
48 $this->templateVars('document', sub { $self } );
36 } 49 }
37 50
38 our %CTOR = ( 51 our %CTOR = (
39 'IMPL::Web::View::TTControl' => sub { 52 'IMPL::Web::View::TTControl' => sub {
40 'document', 53 'document',
96 } 109 }
97 110
98 sub Render { 111 sub Render {
99 my ($this,$args) = @_; 112 my ($this,$args) = @_;
100 113
101 my $output = $this->SUPER::Render( { document => $this } ); 114 my $output;
102 115
103 if ($this->layout) { 116 if ($this->layout) {
104 $output = $this->context->include($this->layout, { content => $output } ); 117 $output = $this->context->include(
118 $this->layout,
119 {
120 content => sub { $output ||= $this->RenderContent($args); }
121 }
122 );
123 } else {
124 return $this->RenderContent($args);
105 } 125 }
106 126
107 return $output; 127 return $output;
128 }
129
130 sub RenderContent {
131 my $this = shift;
132 return $this->SUPER::Render(@_);
108 } 133 }
109 134
110 135
111 1; 136 1;
112 137
151 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи 176 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
152 вспомогательного шаблона - обертки. Если у шаблона документа указан C<layout> в метаданных, то он будет 177 вспомогательного шаблона - обертки. Если у шаблона документа указан C<layout> в метаданных, то он будет
153 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если 178 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
154 обертка не задана, то результатом будет вывод самого скрипта шаблона. 179 обертка не задана, то результатом будет вывод самого скрипта шаблона.
155 180
156 Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее, 181
157 указанное при создании документа.
158 =head2 Порядок обработки документа 182 =head2 Порядок обработки документа
159 183
160 =over 184 =over
161 185
162 =item 1 Создается документ при помощи метода C<TTLoader::document()> 186 =item 1 Создается документ при помощи метода C<TTLoader::document()>
170 194
171 =head2 Загрузка элемента управления 195 =head2 Загрузка элемента управления
172 196
173 =over 197 =over
174 198
175 =item 1 C<document.require('my/org/input')> 199 =item 1 C<require('my/org/input')>
176 200
177 =item 1 Загружает шаблон C<my/org/input.tt> 201 =item 1 Загружает шаблон C<my/org/input.tt>
178 202
179 =item 1 Создает фабрику элементов управления с собственным контекстом, унаследованным от контекст документа. 203 =item 1 Создает фабрику элементов управления с собственным контекстом, унаследованным от контекст документа.
180 204