annotate Lib/IMPL/Web/View/TTContext.pm @ 397:73f81f4e9570

sync
author cin
date Mon, 05 May 2014 18:17:03 +0400
parents 2c14f66efa08
children 38cb0b80e88e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
1 package IMPL::Web::View::TTContext;
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
2 use strict;
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
3 use Template::Base;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
4 use Carp qw(carp);
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
5 use File::Spec();
86b470004d47 added lables loading
cin
parents: 348
diff changeset
6 use IMPL::Resources::Format qw(FormatMessage);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
7 use IMPL::Resources::Strings();
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
8
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
9 use IMPL::Exception();
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
10 use IMPL::lang qw(is typeof hashApply hashMerge);
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
11 use IMPL::declare {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
12 require => {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
13 Document => '-Template::Document',
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
14 TypeKeyedCollection => 'IMPL::TypeKeyedCollection',
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
15 ArgException => '-IMPL::InvalidArgumentException',
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
16 Resources => 'IMPL::Resources',
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
17 Loader => 'IMPL::Code::Loader',
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
18 MetadataBase => '-IMPL::Web::View::Metadata::BaseMeta',
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
19 Metadata => 'IMPL::Web::View::Metadata::ObjectMeta',
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
20 StringMap => 'IMPL::Resources::StringLocaleMap'
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
21 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
22 base => [
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
23 'Template::Context' => '@_'
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
24 ]
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
25 };
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
26
347
cin
parents: 346
diff changeset
27 BEGIN {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
28 no strict 'refs';
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
29 # modules is a global (for the whole document) templates cache
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
30 # tt_cache is a local (for the current context only) templtes cache
347
cin
parents: 346
diff changeset
31 foreach my $prop (qw(
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
32 root
347
cin
parents: 346
diff changeset
33 base
cin
parents: 346
diff changeset
34 tt_ext
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
35 tt_cache
347
cin
parents: 346
diff changeset
36 parent
cin
parents: 346
diff changeset
37 prefix
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
38 cache
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
39 includes
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
40 modules
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
41 aliases
356
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
42 id
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
43 metadata
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
44 model
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
45 templateInfo
347
cin
parents: 346
diff changeset
46 )) {
cin
parents: 346
diff changeset
47 my $t = $prop;
cin
parents: 346
diff changeset
48
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
49 *{__PACKAGE__ . '::' . $prop} = sub {
347
cin
parents: 346
diff changeset
50 my $this = shift;
cin
parents: 346
diff changeset
51 return @_ ? $this->stash->set($t, @_) : $this->stash->get($t);
cin
parents: 346
diff changeset
52 }
cin
parents: 346
diff changeset
53 }
cin
parents: 346
diff changeset
54 }
cin
parents: 346
diff changeset
55
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
56 sub clone {
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
57 my $this = shift;
347
cin
parents: 346
diff changeset
58 my $params = shift;
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
59
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
60 $this->localise();
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
61
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
62 my $args = { %{$this} };
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
63
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
64 $this->delocalise();
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
65
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
66 my $class = ref($this);
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
67
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
68 delete $args->{CONFIG};
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
69
347
cin
parents: 346
diff changeset
70 my $clone = $class->new($args);
cin
parents: 346
diff changeset
71
cin
parents: 346
diff changeset
72 $clone->stash->update($params) if $params;
cin
parents: 346
diff changeset
73
cin
parents: 346
diff changeset
74 return $clone;
345
cin
parents: 343
diff changeset
75 }
cin
parents: 343
diff changeset
76
356
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
77 sub get_next_id {
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
78 my ($this) = @_;
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
79
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
80 my $id = $this->stash->get('document.nextId') || 0;
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
81 $this->stash->set('document.nextId', $id + 1);
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
82 return "w-$id";
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
83 }
97131d500f16 TTView: added identifiers support
cin
parents: 355
diff changeset
84
345
cin
parents: 343
diff changeset
85 sub find_template {
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
86 my ($this,$name, $nothrow) = @_;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
87
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
88 my $cache = $this->tt_cache;
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
89
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
90 $this->tt_cache($cache = {}) unless $cache;
345
cin
parents: 343
diff changeset
91
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
92 if(my $tpl = $cache->{$name}) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
93 return $tpl;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
94 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
95
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
96 my @inc = ($this->base, @{$this->includes || []});
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
97 #my @inc = @{$this->includes || []};
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
98
345
cin
parents: 343
diff changeset
99 my $ext = $this->tt_ext || "";
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
100
394
2c14f66efa08 minor changes
cin
parents: 381
diff changeset
101 #warn "find: $name";
2c14f66efa08 minor changes
cin
parents: 381
diff changeset
102
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
103 my $file;
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
104
345
cin
parents: 343
diff changeset
105 foreach my $dir (@inc) {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
106 $file = $dir ? "$dir/$name" : $name;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
107
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
108 my @parts = split(/\/+/,$file);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
109
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
110 my $templateName = pop @parts;
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
111
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
112 my $base = join('/',@parts);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
113
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
114 $file = $ext ? "$file.$ext" : $file;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
115
394
2c14f66efa08 minor changes
cin
parents: 381
diff changeset
116 #warn " file: $file";
2c14f66efa08 minor changes
cin
parents: 381
diff changeset
117
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
118 if (exists($this->modules->{$file})) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
119 my $info = $this->modules->{$file};
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
120 return $cache->{$name} = $info
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
121 if $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
122 } else {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
123 if( my $tt = eval { $this->template($file) } ) {
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
124 my $class;
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
125 if ($class = $tt->class) {
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
126 $class = $this->aliases->{$class} || $class;
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
127 Loader->safe->Require($class);
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
128 }
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
129 my $info = {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
130 base => $base,
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
131 name => $templateName,
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
132 template => $tt,
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
133 initialized => 0,
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
134 class => $class,
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
135 file => $file
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
136 };
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
137 $this->modules->{$file} = $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
138 return $cache->{$name} = $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
139 } else {
353
feeb3bc4a818 corrected error handling while loading templates
cin
parents: 352
diff changeset
140 my $err = $@;
feeb3bc4a818 corrected error handling while loading templates
cin
parents: 352
diff changeset
141
feeb3bc4a818 corrected error handling while loading templates
cin
parents: 352
diff changeset
142 for(my $t = $err; is($t,'Template::Exception'); $t = $t->info ) {
feeb3bc4a818 corrected error handling while loading templates
cin
parents: 352
diff changeset
143 die $err unless $t->type eq Template::Constants::ERROR_FILE;
feeb3bc4a818 corrected error handling while loading templates
cin
parents: 352
diff changeset
144 }
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
145 $this->modules->{$file} = undef;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
146 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
147 }
345
cin
parents: 343
diff changeset
148 }
cin
parents: 343
diff changeset
149
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
150 $this->throw(Template::Constants::ERROR_FILE, "$name: not found")
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
151 unless $nothrow;
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
152 return;
345
cin
parents: 343
diff changeset
153 }
cin
parents: 343
diff changeset
154
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
155 sub display_for {
347
cin
parents: 346
diff changeset
156 my $this = shift;
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
157 my $path = shift;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
158 my ($template, $args);
347
cin
parents: 346
diff changeset
159
cin
parents: 346
diff changeset
160 if (ref $_[0] eq 'HASH') {
cin
parents: 346
diff changeset
161 $args = shift;
cin
parents: 346
diff changeset
162 } else {
cin
parents: 346
diff changeset
163 $template = shift;
cin
parents: 346
diff changeset
164 $args = shift;
cin
parents: 346
diff changeset
165 }
cin
parents: 346
diff changeset
166
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
167 my $prefix = $this->prefix;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
168
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
169 my $info;
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
170 my $meta = $this->resolve_model($path,$args)
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
171 or return "[not found '$path']";
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
172
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
173 $info->{prefix} = join('.', grep($_, $prefix, $path));
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
174 $info->{model} = $meta->model;
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
175 $info->{metadata} = $meta;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
176
355
8dfb9df07d02 added support for the custom resolvers for the TTView
sergey
parents: 354
diff changeset
177 $template ||= $info->{template};
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
178 $template = $template ? $this->find_template($template) : $this->find_template_for($info->{metadata});
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
179
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
180 return $this->render(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
181 $template,
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
182 hashApply(
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
183 $info,
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
184 $args
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
185 )
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
186 );
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
187 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
188
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
189 sub display_model {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
190 my $this = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
191 my $model = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
192 my ($template, $args);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
193
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
194 if (ref $_[0] eq 'HASH') {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
195 $args = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
196 } else {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
197 $template = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
198 $args = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
199 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
200
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
201 #copy
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
202 $args = { %{$args || {}} };
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
203
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
204 $args->{prefix} = join('.',grep($_,$this->prefix,$args->{path}))
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
205 unless defined $args->{prefix};
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
206
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
207 if (is($model,MetadataBase)) {
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
208 $args->{model} = $model->model;
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
209 $args->{metadata} = $model;
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
210 } else {
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
211 $args->{model} = $model;
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
212 $args->{metadata} = Metadata->GetMetadataForModel($model);
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
213 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
214
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
215 $template = $template ? $this->find_template($template) : $this->find_template_for($args->{metadata});
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
216
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
217 return $this->render(
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
218 $template,
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
219 $args
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
220 );
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
221 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
222
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
223 # обеспечивает необходимый уровень изоляции между контекстами
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
224 # $code - код, который нужно выполнить в новом контексте
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
225 # $env - хеш с переменными, которые будут переданы в новый контекст
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
226 # в процессе будет создан клон корневого контекста, со всеми его свойствами
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
227 # затем новый контекст будет локализован и в него будут добавлены новые переменные из $env
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
228 # созданный контекст будет передан параметром в $code
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
229 sub invoke_environment {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
230 my ($this,$code,$env) = @_;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
231
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
232 $env ||= {};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
233
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
234 my $ctx = ($this->root || $this)->clone();
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
235
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
236 my @includes = @{$this->includes || []};
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
237
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
238 if ($this->base) {
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
239 unshift @includes, $this->base;
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
240 }
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
241
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
242 my $out = eval {
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
243 $ctx->localise(
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
244 hashApply(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
245 {
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
246 includes => \@includes,
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
247 aliases => $this->aliases || {},
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
248 root => $this->root || $ctx,
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
249 modules => $this->modules || {},
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
250 cache => TypeKeyedCollection->new(),
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
251 display_for => sub {
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
252 $ctx->display_for(@_);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
253 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
254 render => sub {
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
255 $ctx->render(@_);
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
256 },
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
257 display_model => sub {
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
258 $ctx->display_model(@_);
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
259 },
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
260 tt_cache => {},
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
261 labels => sub {
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
262 $ctx->load_labels(@_);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
263 }
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
264 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
265 $env
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
266 )
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
267 );
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
268
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
269 &$code($ctx);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
270 };
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
271
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
272 my $e = $@;
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
273 $ctx->delocalise();
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
274
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
275 die $e if $e;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
276
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
277 return $out;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
278 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
279
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
280 # использует указанный шаблон для создания фрагмента документа
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
281 # шаблон может быть как именем, так и хешем, содержащим информацию
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
282 # о шаблоне.
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
283 # отдельно следует отметить, что данный метод создает новый контекст
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
284 # для выполнения шаблона в котором задает переменные base, parent, id
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
285 # а также создает переменные для строковых констант из labels
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
286 # хеш с переменными $args будет передан самому шаблону в момент выполнения
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
287 # если у шаблона указан класс элемента управления, то при выполнении шаблона
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
288 # будет создан экземпляр этого класса и процесс выполнения шаблона будет
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
289 # делегирован методу Render этого экземпляра.
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
290 sub render {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
291 my ($this,$template,$args) = @_;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
292
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
293 $args ||= {};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
294
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
295 my $info = ref $template ? $template : $this->find_template($template);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
296
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
297 if (ref($info) ne 'HASH') {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
298 carp "got an invalid template object: $info (" . ref($info) . ")";
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
299 $info = {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
300 template => $info,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
301 base => $this->base,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
302 initialized => 1
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
303 };
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
304 }
394
2c14f66efa08 minor changes
cin
parents: 381
diff changeset
305
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
306 return $this->invoke_environment(
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
307 sub {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
308 my $ctx = shift;
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
309
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
310 unless($info->{initialized}) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
311 if(my $init = $info->{template}->blocks->{INIT}) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
312 $info->{initialized} = 1;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
313 eval {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
314 $ctx->visit($info->{template}->blocks);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
315 $ctx->include($init);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
316 };
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
317 $ctx->leave();
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
318 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
319 }
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
320
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
321 if (my $class = $info->{class}) {
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
322 $class->new($ctx,$info->{template},$args)->Render({});
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
323 } else {
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
324 return $ctx->include($info->{template},$args);
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
325 }
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
326 },
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
327 {
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
328 base => $info->{base},
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
329 parent => $this,
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
330 id => $this->get_next_id,
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
331 templateInfo => $info
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
332 }
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
333 )
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
334 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
335
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
336 sub resolve_model {
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
337 my ($this,$prefix) = @_;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
338
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
339 die ArgException->new(prefix => "the prefix must be specified")
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
340 unless defined $prefix;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
341
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
342 my $meta = $this->metadata;
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
343 unless($meta) {
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
344 $meta = Metadata->GetMetadataForModel($this->model);
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
345 $this->metadata($meta);
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
346 }
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
347
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
348 foreach my $part (grep length($_), split(/\.|\[(\d+)\]/, $prefix)) {
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
349 last unless $meta;
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
350 if ($part =~ /^\d+$/) {
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
351 $meta = $meta->GetItem($part);
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
352 } else {
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
353 $meta = $meta->GetProperty($part);
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
354 }
354
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
355 }
9330835535b9 fixed view double rendering
cin
parents: 353
diff changeset
356
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
357 return $meta;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
358 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
359
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
360 sub find_template_for {
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
361 my ($this,$meta, $nothrow) = @_;
347
cin
parents: 346
diff changeset
362
371
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
363 die ArgException->new(meta => 'An invalid metadata is supplied')
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
364 unless is($meta,MetadataBase);
d5c8b955bf8d refactoring
cin
parents: 370
diff changeset
365
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
366 return $this->find_template($meta->template)
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
367 if ($meta->template);
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
368
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
369 my $type = $meta->modelType;
347
cin
parents: 346
diff changeset
370
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
371 return $this->find_template('templates/plain') unless $type;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
372
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
373 if (my $template = $this->cache->Get($type)) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
374 return $template;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
375 } else {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
376
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
377 no strict 'refs';
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
378
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
379 my @isa = $type;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
380
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
381 while (@isa) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
382 my $sclass = shift @isa;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
383
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
384 (my $name = $sclass) =~ s/:+/_/g;
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
385 my ($shortName) = ($sclass =~ m/(\w+)$/);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
386
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
387 $template = $this->find_template("templates/$name",1) || $this->find_template("templates/$shortName",1);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
388
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
389 if ($template) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
390 $this->cache->Set($sclass,$template);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
391 return $template;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
392 }
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
393
381
ced5937ff21a Custom getters/setters support method names in theirs definitions
cin
parents: 380
diff changeset
394 #todo $meta->GetISA to implement custom hierachy
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
395 push @isa, @{"${sclass}::ISA"};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
396 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
397
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
398 }
370
cbf4febf0930 ObjectMeta, Tests, migrating to the new metadata model.
sergey
parents: 359
diff changeset
399 $this->throw(Template::Constants::ERROR_FILE, "can't find a template for the model $type")
359
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
400 unless $nothrow;
833e663796c4 TTView: added view variable to pass rendering context between controls
sergey
parents: 356
diff changeset
401
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
402 return;
347
cin
parents: 346
diff changeset
403 }
cin
parents: 346
diff changeset
404
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
405 sub get_real_file {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
406 my ($this,$fname) = @_;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
407
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
408 return unless length $fname;
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
409
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
410 my @path = split(/\/+/,$fname);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
411
86b470004d47 added lables loading
cin
parents: 348
diff changeset
412 foreach my $provider (@{$this->load_templates || []}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
413 foreach my $dir (@{$provider->paths || []}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
414 my $realName = File::Spec->catfile($dir,@path);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
415 return $realName if -f $realName;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
416 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
417 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
418 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
419
86b470004d47 added lables loading
cin
parents: 348
diff changeset
420 sub load_labels {
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
421 my ($this,$data) = @_;
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
422
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
423 die ArgException->new("A hash reference is required")
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
424 unless ref($data) eq 'HASH';
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
425
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
426 my $stringMap = StringMap->new($data);
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
427
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
428 $this->stash->update({
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
429 map {
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
430 my $id = $_;
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
431 $id,
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
432 sub {
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
433 $stringMap->GetString($id,@_);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
434 };
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
435 } keys %$data
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
436 });
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
437
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
438 my $ti = $this->templateInfo || {};
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
439
380
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
440 if (my $fullName = $this->get_real_file($ti->{file})) {
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
441 my ($vol,$dir,$fname) = File::Spec->splitpath($fullName);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
442
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
443 my $name = $this->templateInfo->{name};
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
444
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
445 my $localePath = File::Spec->catpath($vol, File::Spec->catdir($dir,'locale'),'');
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
446
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
447 $stringMap->name($name);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
448 $stringMap->paths($localePath);
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
449 }
1eca08048ba9 TTContext migrated to the unified localization mechanism IMPL::Resources::StringLocaleMap
cin
parents: 371
diff changeset
450 return;
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
451 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
452
345
cin
parents: 343
diff changeset
453 1;
cin
parents: 343
diff changeset
454
cin
parents: 343
diff changeset
455 __END__
cin
parents: 343
diff changeset
456
cin
parents: 343
diff changeset
457 =pod
cin
parents: 343
diff changeset
458
cin
parents: 343
diff changeset
459 =head1 NAME
cin
parents: 343
diff changeset
460
cin
parents: 343
diff changeset
461 C<IMPL::Web::View::TTContext> - доработанная версия контекста
cin
parents: 343
diff changeset
462
cin
parents: 343
diff changeset
463 =head1 DESCRIPTION
cin
parents: 343
diff changeset
464
cin
parents: 343
diff changeset
465 Расширяет функции C<Template::Context>
cin
parents: 343
diff changeset
466
cin
parents: 343
diff changeset
467 =begin plantuml
cin
parents: 343
diff changeset
468
cin
parents: 343
diff changeset
469 @startuml
cin
parents: 343
diff changeset
470
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
471 object RootContext {
345
cin
parents: 343
diff changeset
472 document
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
473 globals
345
cin
parents: 343
diff changeset
474 }
cin
parents: 343
diff changeset
475
cin
parents: 343
diff changeset
476 object DocumentContext {
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
477 base
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
478 extends
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
479 }
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
480
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
481 object ControlContext {
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
482 base
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
483 extends
345
cin
parents: 343
diff changeset
484 }
cin
parents: 343
diff changeset
485
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
486 RootContext o-- DocumentContext
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
487 RootContext o-- ControlContext
345
cin
parents: 343
diff changeset
488
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
489 Document -- DocumentContext
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
490 Control - ControlContext
345
cin
parents: 343
diff changeset
491
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
492 Loader . RootContext: <<creates>>
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
493 Loader . Document: <<creates>>
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
494 Loader -up- Registry
345
cin
parents: 343
diff changeset
495
cin
parents: 343
diff changeset
496 @enduml
cin
parents: 343
diff changeset
497
cin
parents: 343
diff changeset
498 =end plantuml
cin
parents: 343
diff changeset
499
cin
parents: 343
diff changeset
500 =head1 MEMBERS
cin
parents: 343
diff changeset
501
cin
parents: 343
diff changeset
502 =head2 C<[get,set]base>
cin
parents: 343
diff changeset
503
cin
parents: 343
diff changeset
504 Префикс пути для поиска шаблонов
cin
parents: 343
diff changeset
505
cin
parents: 343
diff changeset
506 =head2 C<template($name)>
cin
parents: 343
diff changeset
507
cin
parents: 343
diff changeset
508 Сначала пытается загрузить шаблон используя префикс C<base>, затем без префикса.
cin
parents: 343
diff changeset
509
cin
parents: 343
diff changeset
510 =head2 C<clone()>
cin
parents: 343
diff changeset
511
cin
parents: 343
diff changeset
512 Создает копию контекста, при этом C<stash> локализуется, таким образом
cin
parents: 343
diff changeset
513 клонированный контекст имеет собственное пространство имен, вложенное в
cin
parents: 343
diff changeset
514 пространство родительского контекста.
cin
parents: 343
diff changeset
515
cin
parents: 343
diff changeset
516 =cut