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