Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/View/TTDocument.pm Tue Apr 03 20:08:42 2012 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Wed Apr 04 02:49:45 2012 +0400 @@ -17,6 +17,10 @@ public property opts => PROP_GET | PROP_OWNERSET; public property loader => PROP_GET | PROP_OWNERSET; public property controls => PROP_GET | PROP_OWNERSET; + + # store the stash separately to make require() method to work correctly + # even when a stash of the context is modified during the processing + public property stash => PROP_GET | PROP_OWNERSET; } sub CTOR { @@ -28,6 +32,7 @@ $this->layout( $template->layout ) unless $this->layout; $this->opts($refOpts); + $this->stash($this->context->stash); } our %CTOR = ( @@ -41,38 +46,48 @@ } ); +sub templateVars { + my $this = shift; + my $name = shift; + + if (@_) { + return $this->stash->set($name, shift); + } else { + return $this->stash->get($name); + } +} + sub require { my ($this, $control) = @_; if (my $factory = $this->controls->{$control}) { return $factory; } else { -=pod + my $path = $control; if ( my $template = $this->loader->template($path) ) { - #my $opts = { %{$this->opts} }; - #$opts->{STASH} = $this->context->stash->clone(); + + my $opts = { %{$this->opts} }; + $opts->{STASH} = $this->stash->clone(); - my $ctx = new Template::Context();#$opts); + my $ctx = new Template::Context($opts); $factory = new IMPL::Web::View::TTFactory( typeof IMPL::Web::View::TTControl, $template, $ctx, - {} #$opts + $opts ); my @parts = split(/\/+/,$control); $this->controls->{$control} = $factory; - $this->context->stash->set([map { $_, 0 } @parts], $factory); return $factory; } else { die new IMPL::KeyNotFoundException($control); } -=cut } } @@ -134,7 +149,7 @@ Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ. Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи -вспомогательного шаблона - обертки. Если у шаблона документа указан C<wrapper> в метаданных, то он будет +вспомогательного шаблона - обертки. Если у шаблона документа указан C<layout> в метаданных, то он будет использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если обертка не задана, то результатом будет вывод самого скрипта шаблона. @@ -161,11 +176,9 @@ =item 1 Загружает шаблон C<my/org/input.tt> -=item 1 Создает фабрику элементов управления с собственным контекстом, вложенным в контекст документа. +=item 1 Создает фабрику элементов управления с собственным контекстом, унаследованным от контекст документа. -=item 1 Выполняет шаблон в пространстве имен фабрики - -=item 1 Регистритует фабрику в контексте документа по пути C<my.org.input> +=item 1 Выполняет шаблон в пространстве имен фабрики =back