Mercurial > pub > Impl
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 |