Mercurial > pub > Impl
diff Lib/IMPL/Web/View/TTFactory.pm @ 181:47dac58691ee
New templating system, small fixes
author | sourcer |
---|---|
date | Thu, 26 Jan 2012 01:15:57 +0400 |
parents | |
children | 6c0fee769b0c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/TTFactory.pm Thu Jan 26 01:15:57 2012 +0400 @@ -0,0 +1,181 @@ +package IMPL::Web::View::TTFactory; +use strict; + +use Template::Context(); + +use IMPL::lang qw(:hash :declare :constants); +use IMPL::Exception(); + + +use parent qw(IMPL::Object::Factory); + +BEGIN { + public property template => PROP_ALL; + public property context => PROP_ALL; + public property opts => PROP_ALL; + public property nodeProperties => PROP_ALL; + public property instances => PROP_GET | PROP_OWNERSET; +} + +__PACKAGE__->PassThroughArgs; + +sub CTOR { + my ($this,$factory,$template,$context,$options,$nodeProps) = @_; + + die IMPL::ArgumentException("A template is required") unless $template; + + $options ||= {}; + + $this->template($template); + $this->context($context || new Template::Context($options)); + $this->opts($options); + $this->nodeProperties($nodeProps || {}); + $this->instances(0); + + # init factory context + $this->context->process($this->template); +} + +our %CTOR = ( + 'IMPL::Object::Factory' => sub { + $_[0] + } +); + +sub MergeParameters { + my ($this,$name,$refProps) = @_; + + my $opts = { $this->opts }; + $opts->{STASH} = $opts->{STASH}->clone() if $opts->{STASH}; + + my $ctx = new Template::Context($opts); + + return ($name, $this->template, $ctx, hashMerge($this->nodeProperties,$refProps)); +} + +sub CreateObject { + my $this = shift; + + my $count = $this->instances; + + unless($count) { + # нужно выполнить именно блок INIT шаблона при создании первого экземпляра + if (my $init = $this->template->blocks->{INIT}) { + $this->context->process($init); + } + } + + $count++; + $this->instances($count); + + return $this->SUPER::CreateObject(@_); +} + +sub save { + die new IMPL::NotImplementedException("This class doesn't support serialization"); +} + +sub restore { + die new IMPL::NotImplementedException("This class doesn't support serialization"); +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Web::View::TTFactory> - фабрика элементов управления + +=head1 SYNOPSIS + +=begin code + +my $factory = new IMPL::Web::View::TTFactory( + typeof IMPL::Web::View::TTControl, + $doc, + $context, + { + TRIM => 1 + }, + { + myprop => 'my value' + }, +); + +my $input1 = $factory->new('login', { class => "required" } ); + +my $propval = $input->nodeProperty('myprop'); # 'my value' + +=end code + +=begin text + +[% + this.appendChild( + my.org.input.new('login', class = this.errors('login') ? "invalid" : "" ) + ); +%] + +=end text + +=head1 DESCRIPTION + +C< Inherits L<IMPL::Object::Factory> > + +=head1 MEMBERS + +=over + +=item C<[get,set]template> + +Документ C<Template::Document> который описывает элемент управления. См. C<IMPL::Web::View::TTControl>. + +=item C<[get,set]context> + +Контекст фабрики элементов управления, в этом контексте выполняет шаблон элемента управления при загрузке. +Далее в этом контексте будет выполнен блок инициализации при создании первого элемента управления. + +=item C<[get,set]opts> + +Параметры контекста элемента управления (ссылка на хеш). Каждый элемент управления при создании получает свой контекст, +который создает с данными параметрами и хранилищем переменных, дочерним к контексту фабрики. + +=item C<[get,set]nodeProperties> + +Ссылка на хеш со значениями свойств по умолчанию для создаваемого элемента управления. + +=item C<[get]instances> + +Количество созданных элементов управления данной фабрикой + +=item C<[override]MergeParameters($name,$nodeProps)> + +Превращает значения переданные методу C<new> фабрики в параметры для создания элемента управления. + +=over + +=item C<$name> + +Имя создаваемого узла (C<nodeName>). + +=item C<$nodeProps> + +Ссылка на шех со значениями свойств узла. Данные значения будут совмещены со значениями из свойства C<nodeProperties> + +=back + +=item C<[override]CreateObject(@params)> + +Создает экземпляр элемента управления стандартным образом. Учитывает количество экземпляров и если это первый, +то производит дополнительную инициализацию контекста выполнив блок шаблона C<INIT>. + +=item C<new($name,$nodeProps)> + +Создает элемент управления с указанным именем и набором свойств. + +=back + +=cut \ No newline at end of file