Mercurial > pub > Impl
changeset 187:927653d01f4f
TTControl::AUTOLOAD now accesses nodeProperties
Added TTControl::renderBlock property to access RENDER block of the template
author | sergey |
---|---|
date | Tue, 03 Apr 2012 07:54:25 +0400 |
parents | 6c0fee769b0c |
children | 029c9610528c |
files | Lib/IMPL/Web/View/TTControl.pm Lib/IMPL/Web/View/TTDocument.pm |
diffstat | 2 files changed, 75 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Web/View/TTControl.pm Fri Mar 30 16:40:34 2012 +0400 +++ b/Lib/IMPL/Web/View/TTControl.pm Tue Apr 03 07:54:25 2012 +0400 @@ -10,7 +10,12 @@ IMPL::DOM::Node ); -my $nextId = 1; +{ + my $nextId = 1; + sub _GetNextId { + return $nextId++; + } +} BEGIN { @@ -24,6 +29,8 @@ sub CTOR { my ($this,$name,$template,$context,$refProps) = @_; + $name ||= "control"; + $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); $this->context( $context ) or die new IMPL::ArgumentException("A context is required"); @@ -31,6 +38,8 @@ $context->process($ctor, { this => $this } ); } + $this->id($name . "-" . _GetNextId()) unless $this->id; + } our %CTOR = ( @@ -40,11 +49,28 @@ } ); -sub Render { - my ($this) = @_; +sub templateVars { + my $this = shift; + my $name = shift; - if(my $body = $this->template->blocks->{RENDER} ) { - return $this->context->process( $body, { this => $this } ); + if (@_) { + return $this->context->stash->set($name, shift); + } else { + return $this->context->stash->get($name); + } +} + +sub renderBlock { + $_[0]->template->blocks->{RENDER}; +} + +sub Render { + my ($this,$args) = @_; + + $args = {} unless ref $args eq 'HASH'; + + if(my $body = $this->renderBlock ) { + return $this->context->include( $body, { %$args, this => $this, template => $this->template } ); } else { return ""; } @@ -57,10 +83,9 @@ return if $method eq 'DESTROY'; - my $res = $_[0]->template->$method(); + my $this = shift; - return defined($res) ? $res : $_[0]->context->stash->get($method); - + $this->nodeProperty(@_); } 1; @@ -92,7 +117,41 @@ =head3 RENDER - +Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и есть результат отображения элемента управления. + +=head2 TEMPLATE VARS + +Каждый шаблон имеет собственное пространство имен, унаследованное от пространства имен фабрики элементов (которая в свою очередь наследует контекст документа). +В шаблоне могут определяться новые переменные, которые разделяются между блоками. Также доступны стандартные переменные + +=over + +=item * C<this> ссылка на объект элемента управления + +=item * C<component> ссылка на текущий шаблон, устанавливается автоматически в методе C<Template::Context::process>. + +=item * C<template> ссылка на шаблон элемента управления, для совместимости с C<TT> + +=back + +=head1 MEMBERS + +=over + +=item * C<[get]context> + +Контекст элемента управления, хранит пременные шаблона. Наследуется от контекста фабрики элементов управления, который +наследуется от контекста документа. + +=item * C<[get,set]template> + +C<Template::Document> Шаблон элемента управления. + +=item * C<AUTOLOAD> + +Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>. + +=back C<lang ru>
--- a/Lib/IMPL/Web/View/TTDocument.pm Fri Mar 30 16:40:34 2012 +0400 +++ b/Lib/IMPL/Web/View/TTDocument.pm Tue Apr 03 07:54:25 2012 +0400 @@ -75,13 +75,17 @@ } } +sub renderBlock { + $_[0]->template; +} + sub Render { - my ($this,$param) = @_; + my ($this,$args) = @_; - my $output = $this->context->process($this->template, {this => $this, document => $this} ); + my $output = $this->IMPL::Web::TTControl::Render( { document => $this } ); if ($this->layout) { - $output = $this->context->include($this->layout,{ content => $output }); + $output = $this->context->include($this->layout, { content => $output } ); } return $output;