Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/View/TTDocument.pm Wed Apr 04 02:49:45 2012 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Wed Apr 04 17:51:27 2012 +0400 @@ -6,6 +6,8 @@ use IMPL::Web::View::TTFactory(); use IMPL::Web::View::TTControl(); +use Scalar::Util qw(weaken); + use parent qw( IMPL::DOM::Document @@ -33,6 +35,17 @@ $this->opts($refOpts); $this->stash($this->context->stash); + + my $self = $this; + weaken($self); + + $this->templateVars('require', sub { + my $doc = $self; + die new IMPL::Exception("A document is destroyed or invalid") unless $doc; + $doc->require(@_); + }); + + $this->templateVars('document', sub { $self } ); } our %CTOR = ( @@ -98,15 +111,27 @@ sub Render { my ($this,$args) = @_; - my $output = $this->SUPER::Render( { document => $this } ); + my $output; if ($this->layout) { - $output = $this->context->include($this->layout, { content => $output } ); + $output = $this->context->include( + $this->layout, + { + content => sub { $output ||= $this->RenderContent($args); } + } + ); + } else { + return $this->RenderContent($args); } return $output; } +sub RenderContent { + my $this = shift; + return $this->SUPER::Render(@_); +} + 1; @@ -153,8 +178,7 @@ использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если обертка не задана, то результатом будет вывод самого скрипта шаблона. -Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее, -указанное при создании документа. + =head2 Порядок обработки документа =over @@ -172,7 +196,7 @@ =over -=item 1 C<document.require('my/org/input')> +=item 1 C<require('my/org/input')> =item 1 Загружает шаблон C<my/org/input.tt>