comparison Lib/IMPL/Web/View/TTDocument.pm @ 189:08015e2803f1

IMPL::Vew::Web - fixed memory leaks, more tests
author cin
date Wed, 04 Apr 2012 02:49:45 +0400
parents 029c9610528c
children cd1ff7029a63
comparison
equal deleted inserted replaced
188:029c9610528c 189:08015e2803f1
15 BEGIN { 15 BEGIN {
16 public _dom property layout => PROP_ALL; 16 public _dom property layout => PROP_ALL;
17 public property opts => PROP_GET | PROP_OWNERSET; 17 public property opts => PROP_GET | PROP_OWNERSET;
18 public property loader => PROP_GET | PROP_OWNERSET; 18 public property loader => PROP_GET | PROP_OWNERSET;
19 public property controls => PROP_GET | PROP_OWNERSET; 19 public property controls => PROP_GET | PROP_OWNERSET;
20
21 # store the stash separately to make require() method to work correctly
22 # even when a stash of the context is modified during the processing
23 public property stash => PROP_GET | PROP_OWNERSET;
20 } 24 }
21 25
22 sub CTOR { 26 sub CTOR {
23 my ($this,$template,$refOpts,%args) = @_; 27 my ($this,$template,$refOpts,%args) = @_;
24 28
26 $this->loader($args{loader}) if $args{loader}; 30 $this->loader($args{loader}) if $args{loader};
27 31
28 $this->layout( $template->layout ) unless $this->layout; 32 $this->layout( $template->layout ) unless $this->layout;
29 33
30 $this->opts($refOpts); 34 $this->opts($refOpts);
35 $this->stash($this->context->stash);
31 } 36 }
32 37
33 our %CTOR = ( 38 our %CTOR = (
34 'IMPL::Web::View::TTControl' => sub { 39 'IMPL::Web::View::TTControl' => sub {
35 'document', 40 'document',
39 'IMPL::DOM::Document' => sub { 44 'IMPL::DOM::Document' => sub {
40 nodeName => 'document' 45 nodeName => 'document'
41 } 46 }
42 ); 47 );
43 48
49 sub templateVars {
50 my $this = shift;
51 my $name = shift;
52
53 if (@_) {
54 return $this->stash->set($name, shift);
55 } else {
56 return $this->stash->get($name);
57 }
58 }
59
44 sub require { 60 sub require {
45 my ($this, $control) = @_; 61 my ($this, $control) = @_;
46 62
47 if (my $factory = $this->controls->{$control}) { 63 if (my $factory = $this->controls->{$control}) {
48 return $factory; 64 return $factory;
49 } else { 65 } else {
50 =pod 66
51 my $path = $control; 67 my $path = $control;
52 if ( my $template = $this->loader->template($path) ) { 68 if ( my $template = $this->loader->template($path) ) {
53 #my $opts = { %{$this->opts} }; 69
54 #$opts->{STASH} = $this->context->stash->clone(); 70 my $opts = { %{$this->opts} };
71 $opts->{STASH} = $this->stash->clone();
55 72
56 my $ctx = new Template::Context();#$opts); 73 my $ctx = new Template::Context($opts);
57 74
58 $factory = new IMPL::Web::View::TTFactory( 75 $factory = new IMPL::Web::View::TTFactory(
59 typeof IMPL::Web::View::TTControl, 76 typeof IMPL::Web::View::TTControl,
60 $template, 77 $template,
61 $ctx, 78 $ctx,
62 {} #$opts 79 $opts
63 ); 80 );
64 81
65 my @parts = split(/\/+/,$control); 82 my @parts = split(/\/+/,$control);
66 83
67 $this->controls->{$control} = $factory; 84 $this->controls->{$control} = $factory;
68 $this->context->stash->set([map { $_, 0 } @parts], $factory);
69 85
70 return $factory; 86 return $factory;
71 87
72 } else { 88 } else {
73 die new IMPL::KeyNotFoundException($control); 89 die new IMPL::KeyNotFoundException($control);
74 } 90 }
75 =cut
76 } 91 }
77 } 92 }
78 93
79 sub renderBlock { 94 sub renderBlock {
80 $_[0]->template; 95 $_[0]->template;
132 147
133 =back 148 =back
134 149
135 Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ. 150 Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ.
136 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи 151 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
137 вспомогательного шаблона - обертки. Если у шаблона документа указан C<wrapper> в метаданных, то он будет 152 вспомогательного шаблона - обертки. Если у шаблона документа указан C<layout> в метаданных, то он будет
138 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если 153 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
139 обертка не задана, то результатом будет вывод самого скрипта шаблона. 154 обертка не задана, то результатом будет вывод самого скрипта шаблона.
140 155
141 Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее, 156 Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее,
142 указанное при создании документа. 157 указанное при создании документа.
159 174
160 =item 1 C<document.require('my/org/input')> 175 =item 1 C<document.require('my/org/input')>
161 176
162 =item 1 Загружает шаблон C<my/org/input.tt> 177 =item 1 Загружает шаблон C<my/org/input.tt>
163 178
164 =item 1 Создает фабрику элементов управления с собственным контекстом, вложенным в контекст документа. 179 =item 1 Создает фабрику элементов управления с собственным контекстом, унаследованным от контекст документа.
165 180
166 =item 1 Выполняет шаблон в пространстве имен фабрики 181 =item 1 Выполняет шаблон в пространстве имен фабрики
167
168 =item 1 Регистритует фабрику в контексте документа по пути C<my.org.input>
169 182
170 =back 183 =back
171 184
172 =head2 Создание элемента управления 185 =head2 Создание элемента управления
173 186