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 |
