Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
180:d1676be8afcc | 181:47dac58691ee |
---|---|
1 package IMPL::Web::View::TTFactory; | |
2 use strict; | |
3 | |
4 use Template::Context(); | |
5 | |
6 use IMPL::lang qw(:hash :declare :constants); | |
7 use IMPL::Exception(); | |
8 | |
9 | |
10 use parent qw(IMPL::Object::Factory); | |
11 | |
12 BEGIN { | |
13 public property template => PROP_ALL; | |
14 public property context => PROP_ALL; | |
15 public property opts => PROP_ALL; | |
16 public property nodeProperties => PROP_ALL; | |
17 public property instances => PROP_GET | PROP_OWNERSET; | |
18 } | |
19 | |
20 __PACKAGE__->PassThroughArgs; | |
21 | |
22 sub CTOR { | |
23 my ($this,$factory,$template,$context,$options,$nodeProps) = @_; | |
24 | |
25 die IMPL::ArgumentException("A template is required") unless $template; | |
26 | |
27 $options ||= {}; | |
28 | |
29 $this->template($template); | |
30 $this->context($context || new Template::Context($options)); | |
31 $this->opts($options); | |
32 $this->nodeProperties($nodeProps || {}); | |
33 $this->instances(0); | |
34 | |
35 # init factory context | |
36 $this->context->process($this->template); | |
37 } | |
38 | |
39 our %CTOR = ( | |
40 'IMPL::Object::Factory' => sub { | |
41 $_[0] | |
42 } | |
43 ); | |
44 | |
45 sub MergeParameters { | |
46 my ($this,$name,$refProps) = @_; | |
47 | |
48 my $opts = { $this->opts }; | |
49 $opts->{STASH} = $opts->{STASH}->clone() if $opts->{STASH}; | |
50 | |
51 my $ctx = new Template::Context($opts); | |
52 | |
53 return ($name, $this->template, $ctx, hashMerge($this->nodeProperties,$refProps)); | |
54 } | |
55 | |
56 sub CreateObject { | |
57 my $this = shift; | |
58 | |
59 my $count = $this->instances; | |
60 | |
61 unless($count) { | |
62 # нужно выполнить именно блок INIT шаблона при создании первого экземпляра | |
63 if (my $init = $this->template->blocks->{INIT}) { | |
64 $this->context->process($init); | |
65 } | |
66 } | |
67 | |
68 $count++; | |
69 $this->instances($count); | |
70 | |
71 return $this->SUPER::CreateObject(@_); | |
72 } | |
73 | |
74 sub save { | |
75 die new IMPL::NotImplementedException("This class doesn't support serialization"); | |
76 } | |
77 | |
78 sub restore { | |
79 die new IMPL::NotImplementedException("This class doesn't support serialization"); | |
80 } | |
81 | |
82 1; | |
83 | |
84 __END__ | |
85 | |
86 =pod | |
87 | |
88 =head1 NAME | |
89 | |
90 C<IMPL::Web::View::TTFactory> - фабрика элементов управления | |
91 | |
92 =head1 SYNOPSIS | |
93 | |
94 =begin code | |
95 | |
96 my $factory = new IMPL::Web::View::TTFactory( | |
97 typeof IMPL::Web::View::TTControl, | |
98 $doc, | |
99 $context, | |
100 { | |
101 TRIM => 1 | |
102 }, | |
103 { | |
104 myprop => 'my value' | |
105 }, | |
106 ); | |
107 | |
108 my $input1 = $factory->new('login', { class => "required" } ); | |
109 | |
110 my $propval = $input->nodeProperty('myprop'); # 'my value' | |
111 | |
112 =end code | |
113 | |
114 =begin text | |
115 | |
116 [% | |
117 this.appendChild( | |
118 my.org.input.new('login', class = this.errors('login') ? "invalid" : "" ) | |
119 ); | |
120 %] | |
121 | |
122 =end text | |
123 | |
124 =head1 DESCRIPTION | |
125 | |
126 C< Inherits L<IMPL::Object::Factory> > | |
127 | |
128 =head1 MEMBERS | |
129 | |
130 =over | |
131 | |
132 =item C<[get,set]template> | |
133 | |
134 Документ C<Template::Document> который описывает элемент управления. См. C<IMPL::Web::View::TTControl>. | |
135 | |
136 =item C<[get,set]context> | |
137 | |
138 Контекст фабрики элементов управления, в этом контексте выполняет шаблон элемента управления при загрузке. | |
139 Далее в этом контексте будет выполнен блок инициализации при создании первого элемента управления. | |
140 | |
141 =item C<[get,set]opts> | |
142 | |
143 Параметры контекста элемента управления (ссылка на хеш). Каждый элемент управления при создании получает свой контекст, | |
144 который создает с данными параметрами и хранилищем переменных, дочерним к контексту фабрики. | |
145 | |
146 =item C<[get,set]nodeProperties> | |
147 | |
148 Ссылка на хеш со значениями свойств по умолчанию для создаваемого элемента управления. | |
149 | |
150 =item C<[get]instances> | |
151 | |
152 Количество созданных элементов управления данной фабрикой | |
153 | |
154 =item C<[override]MergeParameters($name,$nodeProps)> | |
155 | |
156 Превращает значения переданные методу C<new> фабрики в параметры для создания элемента управления. | |
157 | |
158 =over | |
159 | |
160 =item C<$name> | |
161 | |
162 Имя создаваемого узла (C<nodeName>). | |
163 | |
164 =item C<$nodeProps> | |
165 | |
166 Ссылка на шех со значениями свойств узла. Данные значения будут совмещены со значениями из свойства C<nodeProperties> | |
167 | |
168 =back | |
169 | |
170 =item C<[override]CreateObject(@params)> | |
171 | |
172 Создает экземпляр элемента управления стандартным образом. Учитывает количество экземпляров и если это первый, | |
173 то производит дополнительную инициализацию контекста выполнив блок шаблона C<INIT>. | |
174 | |
175 =item C<new($name,$nodeProps)> | |
176 | |
177 Создает элемент управления с указанным именем и набором свойств. | |
178 | |
179 =back | |
180 | |
181 =cut |