# HG changeset patch # User cin # Date 1333714958 -14400 # Node ID a9faf883cdced2709e2d78d8d38dd06fc436bab4 # Parent 78a18a2b62668a2d7de83db833b35c4faedb004e IMPL::Web::View refactoring diff -r 78a18a2b6266 -r a9faf883cdce Lib/IMPL/Web/View/TTControl.pm --- a/Lib/IMPL/Web/View/TTControl.pm Thu Apr 05 17:51:51 2012 +0400 +++ b/Lib/IMPL/Web/View/TTControl.pm Fri Apr 06 16:22:38 2012 +0400 @@ -40,7 +40,7 @@ weaken($this); # prevent cyclic references produces by the code below $context->stash->set('append', sub { $this->appendChild(@_); undef; } ); - $context->stash->set('select', sub { $this->selectNodes(@_) } ); + $context->stash->set('select', sub { $this->selectNodes(@_); } ); } diff -r 78a18a2b6266 -r a9faf883cdce Lib/IMPL/Web/View/TTDocument.pm --- a/Lib/IMPL/Web/View/TTDocument.pm Thu Apr 05 17:51:51 2012 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Fri Apr 06 16:22:38 2012 +0400 @@ -72,7 +72,10 @@ } sub require { - my ($this, $control) = @_; + my ($this, $control, $nodeProps) = @_; + + $nodeProps ||= {}; + $nodeProps->{document} = $this; if (my $factory = $this->controls->{$control}) { return $factory; @@ -90,7 +93,8 @@ typeof IMPL::Web::View::TTControl, $template, $ctx, - $opts + $opts, + { document => $this } ); my @parts = split(/\/+/,$control); @@ -174,11 +178,15 @@ =back Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ. -Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи +Процесс форматирования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи вспомогательного шаблона - обертки. Если у шаблона документа указан C в метаданных, то он будет использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если обертка не задана, то результатом будет вывод самого скрипта шаблона. +Использование объектной модели документа позволяет решить задачи по созданию элементов управления +контейнеров, у которых может быть сложное содежимое. Примером таких элементов могут быть формы, +внутри форм элементы управления могут группироваться. + =head2 Порядок обработки документа diff -r 78a18a2b6266 -r a9faf883cdce Lib/IMPL/Web/View/TTFactory.pm --- a/Lib/IMPL/Web/View/TTFactory.pm Thu Apr 05 17:51:51 2012 +0400 +++ b/Lib/IMPL/Web/View/TTFactory.pm Fri Apr 06 16:22:38 2012 +0400 @@ -5,6 +5,7 @@ use IMPL::lang qw(:hash :declare :constants); use IMPL::Exception(); +use Scalar::Util qw(weaken); use parent qw(IMPL::Object::Factory); @@ -25,12 +26,18 @@ die IMPL::ArgumentException("A template is required") unless $template; $options ||= {}; + $context ||= new Template::Context($options); $this->template($template); - $this->context($context || new Template::Context($options)); - $this->opts($options || {}); + $this->context($context); + $this->opts($options); $this->nodeProperties($nodeProps || {}); $this->instances(0); + + my $doc = delete $nodeProps->{document}; + weaken($doc); + + $context->stash->set('require', sub { $doc->require(@_); } ); } our %CTOR = (