Mercurial > pub > Impl
annotate Lib/IMPL/Web/View/TTFactory.pm @ 300:bf3af33b9003
sync
| author | cin |
|---|---|
| date | Fri, 22 Mar 2013 01:05:11 +0400 |
| parents | 78f767765706 |
| children | aeeb57a12046 |
| rev | line source |
|---|---|
| 181 | 1 package IMPL::Web::View::TTFactory; |
| 2 use strict; | |
| 3 | |
| 4 use Template::Context(); | |
| 5 | |
| 267 | 6 use IMPL::lang qw(:hash); |
| 181 | 7 use IMPL::Exception(); |
| 192 | 8 use Scalar::Util qw(weaken); |
| 181 | 9 |
| 10 | |
| 267 | 11 use IMPL::Const qw(:prop); |
| 12 use IMPL::declare { | |
| 298 | 13 require => { |
| 14 Loader => 'IMPL::Code::Loader' | |
| 15 }, | |
| 267 | 16 base => [ |
| 298 | 17 'IMPL::Object::Factory' => sub { |
| 300 | 18 shift; |
| 298 | 19 } |
| 267 | 20 ], |
| 21 props => [ | |
| 22 template => PROP_RW, | |
| 23 context => PROP_RW, | |
| 24 instances => PROP_RW, | |
| 300 | 25 baseLocation => PROP_RW, |
|
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
26 require => PROP_RO |
| 267 | 27 ] |
| 28 }; | |
| 181 | 29 |
| 30 sub CTOR { | |
| 300 | 31 my ($this,$class,$template,$context,$baseLocation,$require) = @_; |
| 194 | 32 |
| 33 die IMPL::ArgumentException("A template is required") unless $template; | |
| 34 | |
| 300 | 35 Loader->safe->Require($class) |
| 36 if $class and not ref $class; | |
| 298 | 37 |
| 287 | 38 $context ||= new Template::Context(); |
| 194 | 39 |
| 40 $this->template($template); | |
| 41 $this->context($context); | |
| 300 | 42 $this->baseLocation($baseLocation); |
| 194 | 43 $this->instances(0); |
|
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
44 $this->require($require); |
| 181 | 45 } |
| 46 | |
| 47 sub MergeParameters { | |
| 300 | 48 my ($this,$refProps) = @_; |
| 291 | 49 |
| 298 | 50 $refProps->{factory} = $this; |
| 51 | |
| 300 | 52 my $baseLocation = $this->baseLocation; |
| 287 | 53 |
| 300 | 54 my $ctx = $this->CloneContext(); |
| 287 | 55 |
|
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
56 my $require = $this->require; |
| 289 | 57 |
| 300 | 58 $ctx->stash->update({ |
| 267 | 59 require => sub { |
| 60 my ($module) = @_; | |
| 61 | |
| 300 | 62 $module =~ s/^\.\//$baseLocation\//; |
|
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
63 return $require->($module); |
| 267 | 64 } |
| 65 }); | |
| 66 | |
| 300 | 67 return ($this->template, $ctx, $refProps); |
| 181 | 68 } |
| 69 | |
| 70 sub CreateObject { | |
| 194 | 71 my $this = shift; |
| 72 | |
| 73 my $count = $this->instances; | |
| 74 | |
| 75 unless($count) { | |
| 76 # нужно выполнить именно блок INIT шаблона при создании первого экземпляра | |
| 77 if (my $init = $this->template->blocks->{INIT}) { | |
| 78 $this->context->process($init); | |
| 79 } | |
| 296 | 80 |
| 81 $this->context->visit($this->template->blocks); | |
| 194 | 82 } |
| 83 | |
| 84 my $instance = $this->SUPER::CreateObject(@_); | |
| 85 | |
| 86 $instance->InitInstance(); | |
| 87 | |
| 88 $count++; | |
| 89 $this->instances($count); | |
| 90 | |
| 91 return $instance; | |
| 181 | 92 } |
| 93 | |
| 300 | 94 sub CloneContext { |
| 95 my ($this) = @_; | |
| 96 | |
| 97 $this->context->localise(); | |
| 98 | |
| 99 my $args = { %{$this->context} }; | |
| 289 | 100 delete $args->{CONFIG}; |
| 101 | |
| 300 | 102 $this->context->delocalise(); |
| 103 | |
| 289 | 104 return Template::Context->new($args); |
| 105 } | |
| 106 | |
| 181 | 107 sub save { |
| 194 | 108 die new IMPL::NotImplementedException("This class doesn't support serialization"); |
| 181 | 109 } |
| 110 | |
| 111 sub restore { | |
| 194 | 112 die new IMPL::NotImplementedException("This class doesn't support serialization"); |
| 181 | 113 } |
| 114 | |
| 115 1; | |
| 116 | |
| 117 __END__ | |
| 118 | |
| 119 =pod | |
| 120 | |
| 121 =head1 NAME | |
| 122 | |
| 123 C<IMPL::Web::View::TTFactory> - фабрика элементов управления | |
| 124 | |
| 125 =head1 SYNOPSIS | |
| 126 | |
| 127 =begin code | |
| 128 | |
| 129 my $factory = new IMPL::Web::View::TTFactory( | |
| 280 | 130 'IMPL::Web::View::TTControl', |
| 194 | 131 $doc, |
| 132 $context, | |
| 133 { | |
| 134 TRIM => 1 | |
| 135 }, | |
| 136 { | |
| 137 myprop => 'my value' | |
| 138 }, | |
| 181 | 139 ); |
| 140 | |
| 141 my $input1 = $factory->new('login', { class => "required" } ); | |
| 142 | |
| 143 my $propval = $input->nodeProperty('myprop'); # 'my value' | |
| 144 | |
| 145 =end code | |
| 146 | |
| 147 =begin text | |
| 148 | |
| 149 [% | |
| 194 | 150 this.appendChild( |
| 151 my.org.input.new('login', class = this.errors('login') ? "invalid" : "" ) | |
| 152 ); | |
| 181 | 153 %] |
| 154 | |
| 155 =end text | |
| 156 | |
| 157 =head1 DESCRIPTION | |
| 158 | |
| 159 C< Inherits L<IMPL::Object::Factory> > | |
| 160 | |
| 161 =head1 MEMBERS | |
| 162 | |
| 163 =over | |
| 164 | |
| 165 =item C<[get,set]template> | |
| 166 | |
| 167 Документ C<Template::Document> который описывает элемент управления. См. C<IMPL::Web::View::TTControl>. | |
| 168 | |
| 169 =item C<[get,set]context> | |
| 170 | |
| 171 Контекст фабрики элементов управления, в этом контексте выполняет шаблон элемента управления при загрузке. | |
| 172 Далее в этом контексте будет выполнен блок инициализации при создании первого элемента управления. | |
| 173 | |
| 174 =item C<[get,set]opts> | |
| 175 | |
| 176 Параметры контекста элемента управления (ссылка на хеш). Каждый элемент управления при создании получает свой контекст, | |
| 177 который создает с данными параметрами и хранилищем переменных, дочерним к контексту фабрики. | |
| 178 | |
| 179 =item C<[get,set]nodeProperties> | |
| 180 | |
| 181 Ссылка на хеш со значениями свойств по умолчанию для создаваемого элемента управления. | |
| 182 | |
| 183 =item C<[get]instances> | |
| 184 | |
| 185 Количество созданных элементов управления данной фабрикой | |
| 186 | |
| 187 =item C<[override]MergeParameters($name,$nodeProps)> | |
| 188 | |
| 189 Превращает значения переданные методу C<new> фабрики в параметры для создания элемента управления. | |
| 190 | |
| 191 =over | |
| 192 | |
| 193 =item C<$name> | |
| 194 | |
| 195 Имя создаваемого узла (C<nodeName>). | |
| 196 | |
| 197 =item C<$nodeProps> | |
| 198 | |
| 199 Ссылка на шех со значениями свойств узла. Данные значения будут совмещены со значениями из свойства C<nodeProperties> | |
| 200 | |
| 201 =back | |
| 202 | |
| 203 =item C<[override]CreateObject(@params)> | |
| 204 | |
| 205 Создает экземпляр элемента управления стандартным образом. Учитывает количество экземпляров и если это первый, | |
| 206 то производит дополнительную инициализацию контекста выполнив блок шаблона C<INIT>. | |
| 207 | |
| 191 | 208 =item C<[inherited]new($name,$nodeProps)> |
| 181 | 209 |
| 210 Создает элемент управления с указанным именем и набором свойств. | |
| 211 | |
| 212 =back | |
| 213 | |
| 214 =cut |
