annotate Lib/IMPL/Web/View/TTContext.pm @ 352:675cd1829255

working on TTView: added control classes support
author cin
date Thu, 10 Oct 2013 19:51:19 +0400
parents cfd7570c2af2
children feeb3bc4a818
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',
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
17 Loader => 'IMPL::Code::Loader'
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
18 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
19 base => [
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
20 'Template::Context' => '@_'
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
21 ]
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
22 };
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
23
347
cin
parents: 346
diff changeset
24 BEGIN {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
25 no strict 'refs';
347
cin
parents: 346
diff changeset
26 foreach my $prop (qw(
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
27 root
347
cin
parents: 346
diff changeset
28 base
cin
parents: 346
diff changeset
29 tt_ext
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
30 tt_cache
347
cin
parents: 346
diff changeset
31 parent
cin
parents: 346
diff changeset
32 prefix
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
33 cache
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
34 includes
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
35 modules
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
36 aliases
347
cin
parents: 346
diff changeset
37 )) {
cin
parents: 346
diff changeset
38 my $t = $prop;
cin
parents: 346
diff changeset
39
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
40 *{__PACKAGE__ . '::' . $prop} = sub {
347
cin
parents: 346
diff changeset
41 my $this = shift;
cin
parents: 346
diff changeset
42 return @_ ? $this->stash->set($t, @_) : $this->stash->get($t);
cin
parents: 346
diff changeset
43 }
cin
parents: 346
diff changeset
44 }
cin
parents: 346
diff changeset
45 }
cin
parents: 346
diff changeset
46
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
47 sub clone {
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
48 my $this = shift;
347
cin
parents: 346
diff changeset
49 my $params = shift;
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
50
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
51 $this->localise();
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
52
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
53 my $args = { %{$this} };
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
54
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
55 $this->delocalise();
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
56
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
57 my $class = ref($this);
343
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
58
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
59 delete $args->{CONFIG};
9bdccdf1f50b Added a templates context
cin
parents:
diff changeset
60
347
cin
parents: 346
diff changeset
61 my $clone = $class->new($args);
cin
parents: 346
diff changeset
62
cin
parents: 346
diff changeset
63 $clone->stash->update($params) if $params;
cin
parents: 346
diff changeset
64
cin
parents: 346
diff changeset
65 return $clone;
345
cin
parents: 343
diff changeset
66 }
cin
parents: 343
diff changeset
67
cin
parents: 343
diff changeset
68 sub find_template {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
69 my ($this,$name) = @_;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
70
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
71 my $cache = $this->tt_cache;
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
72
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
73 $this->tt_cache($cache = {}) unless $cache;
345
cin
parents: 343
diff changeset
74
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
75 if(my $tpl = $cache->{$name}) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
76 return $tpl;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
77 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
78
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
79 my @inc = ($this->base, @{$this->includes || []});
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
80
345
cin
parents: 343
diff changeset
81 my $ext = $this->tt_ext || "";
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
82
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
83 my $file;
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
84
345
cin
parents: 343
diff changeset
85 foreach my $dir (@inc) {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
86 $file = $dir ? "$dir/$name" : $name;
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 $base = join('/',splice([split(/\/+/,$file)],0,-1));
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
89
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
90 $file = $ext ? "$file.$ext" : $file;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
91
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
92 if (exists($this->modules->{$file})) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
93 my $info = $this->modules->{$file};
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
94 return $cache->{$name} = $info
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
95 if $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
96 } else {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
97 if( my $tt = eval { $this->template($file) } ) {
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
98 my $class;
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
99 if ($class = $tt->class) {
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
100 $class = $this->aliases->{$class} || $class;
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
101 Loader->safe->Require($class);
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
102 }
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
103 my $info = {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
104 base => $base,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
105 labels => $this->load_labels($file),
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
106 template => $tt,
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
107 initialized => 0,
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
108 class => $class
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
109 };
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
110 $this->modules->{$file} = $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
111 return $cache->{$name} = $info;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
112 } else {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
113 $this->modules->{$file} = undef;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
114 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
115 }
345
cin
parents: 343
diff changeset
116 }
cin
parents: 343
diff changeset
117
cin
parents: 343
diff changeset
118 $this->throw(Template::Constants::ERROR_FILE, "$name: not found");
cin
parents: 343
diff changeset
119 }
cin
parents: 343
diff changeset
120
347
cin
parents: 346
diff changeset
121 sub display {
cin
parents: 346
diff changeset
122 my $this = shift;
cin
parents: 346
diff changeset
123 my $model = shift;
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
124 my ($template, $args);
347
cin
parents: 346
diff changeset
125
cin
parents: 346
diff changeset
126 if (ref $_[0] eq 'HASH') {
cin
parents: 346
diff changeset
127 $args = shift;
cin
parents: 346
diff changeset
128 } else {
cin
parents: 346
diff changeset
129 $template = shift;
cin
parents: 346
diff changeset
130 $args = shift;
cin
parents: 346
diff changeset
131 }
cin
parents: 346
diff changeset
132
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
133 my $prefix = $this->prefix;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
134
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
135 if (not(($args and delete $args->{_no_resolve}) or ref $model)) {
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
136 $prefix = $prefix ? "${prefix}.${model}" : $model;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
137 $model = $this->resolve_model($model);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
138 } else {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
139 $prefix = "";
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
140 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
141
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
142 $template = $template ? $this->find_template($template) : $this->find_template_for($model);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
143
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
144 return $this->render(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
145 $template,
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
146 hashApply(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
147 {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
148 prefix => $prefix,
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
149 model => $model,
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
150 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
151 $args
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
152 )
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
153 );
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
154 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
155
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
156 sub display_model {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
157 my $this = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
158 my $model = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
159 my ($template, $args);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
160
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
161 if (ref $_[0] eq 'HASH') {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
162 $args = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
163 } else {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
164 $template = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
165 $args = shift;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
166 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
167
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
168 $args ||= {};
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
169
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
170 my $prefix = delete $args->{prefix} || $this->prefix;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
171
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
172 if (my $rel = delete $args->{rel}) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
173 $prefix = $prefix ? "${prefix}.${rel}" : $rel;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
174 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
175
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
176 $template = $template ? $this->find_template($template) : $this->find_template_for($model);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
177
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
178 return $this->render(
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
179 $template,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
180 hashApply(
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
181 {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
182 prefix => $prefix,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
183 model => $model,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
184 },
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
185 $args
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
186 )
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
187 );
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
188 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
189
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
190 sub invoke_environment {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
191 my ($this,$code,$env) = @_;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
192
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
193 $env ||= {};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
194
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
195 my $out = eval {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
196 $this->localise(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
197 hashApply(
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
198 {
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
199 aliases => $this->aliases || {},
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
200 root => $this->root || $this,
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
201 modules => $this->modules || {},
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
202 cache => TypeKeyedCollection->new(),
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
203 display => sub {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
204 $this->display(@_);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
205 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
206 render => sub {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
207 $this->render(@_);
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
208 },
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
209 display_model => sub {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
210 $this->display_model(@_);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
211 },
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
212 tt_cache => {}
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
213 },
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
214 $env
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
215 )
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
216 );
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
217
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
218 &$code($this);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
219 };
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
220
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
221 my $e = $@;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
222 $this->delocalise();
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
223
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
224 die $e if $e;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
225
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
226 return $out;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
227 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
228
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
229 sub render {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
230 my ($this,$template,$args) = @_;
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 $args ||= {};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
233
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
234 my $info = ref $template ? $template : $this->find_template($template);
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
235
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
236 if (ref($info) ne 'HASH') {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
237 carp "got an invalid template object: $info (" . ref($info) . ")";
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
238 $info = {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
239 template => $info,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
240 base => $this->base,
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
241 initialized => 1
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
242 };
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
243 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
244
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
245 return $this->invoke_environment(
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
246 sub {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
247 my $ctx = shift;
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
248
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
249 unless($info->{initialized}) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
250 if(my $init = $info->{template}->blocks->{INIT}) {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
251 $info->{initialized} = 1;
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
252 eval {
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
253 $ctx->visit($info->{template}->blocks);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
254 $ctx->include($init);
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
255 };
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
256 $ctx->leave();
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
257 }
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
258 }
352
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
259
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
260 if (my $class = $info->{class}) {
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
261 $class->new($this,$info->{template})->Render($args);
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
262 } else {
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
263 return $ctx->include($info->{template},$args);
675cd1829255 working on TTView: added control classes support
cin
parents: 351
diff changeset
264 }
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
265 },
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
266 hashMerge(
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
267 $info->{labels} || {},
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
268 {
351
cfd7570c2af2 working on TTView: created TTView class for rendering models
cin
parents: 349
diff changeset
269 base => $info->{base},
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
270 parent => $this
86b470004d47 added lables loading
cin
parents: 348
diff changeset
271 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
272 )
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
273 )
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
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
276 sub resolve_model {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
277 my ($this,$prefix) = @_;
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 die ArgException->new(prefix => "the prefix must be specified")
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
280 unless defined $prefix;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
281
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
282 #TODO handle DOM models
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
283
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
284 my @comp = map { $_, 0 } grep length($_), split(/\.|\[(\d+)\]/, $prefix);
347
cin
parents: 346
diff changeset
285
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
286 return $this->stash->get(['model',0,@comp]);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
287 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
288
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
289 sub find_template_for {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
290 my ($this,$model) = @_;
347
cin
parents: 346
diff changeset
291
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
292 my $type = typeof($model);
347
cin
parents: 346
diff changeset
293
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
294 return $this->find_template('templates/plain') unless $type;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
295
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
296 if (my $template = $this->cache->Get($type)) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
297 return $template;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
298 } else {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
299
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
300 no strict 'refs';
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
301
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
302 my @isa = $type;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
303
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
304 while (@isa) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
305 my $sclass = shift @isa;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
306
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
307 (my $name = $sclass) =~ s/:+/_/g;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
308
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
309 $template = $this->find_template("templates/$name");
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
310
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
311 if ($template) {
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
312 $this->cache->Set($sclass,$template);
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
313 return $template;
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
314 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
315
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
316 push @isa, @{"${sclass}::ISA"};
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
317 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
318
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
319 }
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
320
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
321 return;
347
cin
parents: 346
diff changeset
322 }
cin
parents: 346
diff changeset
323
349
86b470004d47 added lables loading
cin
parents: 348
diff changeset
324 sub get_real_file {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
325 my ($this,$fname) = @_;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
326
86b470004d47 added lables loading
cin
parents: 348
diff changeset
327 my @path = split(/\/+/,$fname);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
328
86b470004d47 added lables loading
cin
parents: 348
diff changeset
329 foreach my $provider (@{$this->load_templates || []}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
330 foreach my $dir (@{$provider->paths || []}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
331 my $realName = File::Spec->catfile($dir,@path);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
332 return $realName if -f $realName;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
333 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
334 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
335 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
336
86b470004d47 added lables loading
cin
parents: 348
diff changeset
337 sub load_labels {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
338 my ($this,$fname) = @_;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
339
86b470004d47 added lables loading
cin
parents: 348
diff changeset
340 $fname = $this->get_real_file($fname);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
341
86b470004d47 added lables loading
cin
parents: 348
diff changeset
342 my %vars;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
343
86b470004d47 added lables loading
cin
parents: 348
diff changeset
344 my $flabels = "$fname.labels";
86b470004d47 added lables loading
cin
parents: 348
diff changeset
345
86b470004d47 added lables loading
cin
parents: 348
diff changeset
346 if (-f $flabels) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
347
86b470004d47 added lables loading
cin
parents: 348
diff changeset
348 my %labels;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
349 $labels{default} = IMPL::Resources::Strings::ParseStringsMap($flabels);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
350
86b470004d47 added lables loading
cin
parents: 348
diff changeset
351 while(my($label,$text) = each %{$labels{default}}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
352 $vars{$label} = sub {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
353 my ($params) = @_;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
354 my $locale = Resources->currentLocale;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
355
86b470004d47 added lables loading
cin
parents: 348
diff changeset
356 unless ($labels{$locale}) {
86b470004d47 added lables loading
cin
parents: 348
diff changeset
357 $labels{$locale} = -f "$fname.$locale" ?
86b470004d47 added lables loading
cin
parents: 348
diff changeset
358 IMPL::Resources::Strings::ParseStringsMap("$fname.$locale") :
86b470004d47 added lables loading
cin
parents: 348
diff changeset
359 {};
86b470004d47 added lables loading
cin
parents: 348
diff changeset
360 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
361
86b470004d47 added lables loading
cin
parents: 348
diff changeset
362 return FormatMessage(($labels{$locale}{$label} || $text),$params);
86b470004d47 added lables loading
cin
parents: 348
diff changeset
363 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
364 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
365 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
366
86b470004d47 added lables loading
cin
parents: 348
diff changeset
367 return \%vars;
86b470004d47 added lables loading
cin
parents: 348
diff changeset
368 }
86b470004d47 added lables loading
cin
parents: 348
diff changeset
369
345
cin
parents: 343
diff changeset
370 1;
cin
parents: 343
diff changeset
371
cin
parents: 343
diff changeset
372 __END__
cin
parents: 343
diff changeset
373
cin
parents: 343
diff changeset
374 =pod
cin
parents: 343
diff changeset
375
cin
parents: 343
diff changeset
376 =head1 NAME
cin
parents: 343
diff changeset
377
cin
parents: 343
diff changeset
378 C<IMPL::Web::View::TTContext> - доработанная версия контекста
cin
parents: 343
diff changeset
379
cin
parents: 343
diff changeset
380 =head1 DESCRIPTION
cin
parents: 343
diff changeset
381
cin
parents: 343
diff changeset
382 Расширяет функции C<Template::Context>
cin
parents: 343
diff changeset
383
cin
parents: 343
diff changeset
384 =begin plantuml
cin
parents: 343
diff changeset
385
cin
parents: 343
diff changeset
386 @startuml
cin
parents: 343
diff changeset
387
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
388 object RootContext {
345
cin
parents: 343
diff changeset
389 document
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
390 globals
345
cin
parents: 343
diff changeset
391 }
cin
parents: 343
diff changeset
392
cin
parents: 343
diff changeset
393 object DocumentContext {
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
394 base
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
395 extends
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
396 }
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
397
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
398 object ControlContext {
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
399 base
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
400 extends
345
cin
parents: 343
diff changeset
401 }
cin
parents: 343
diff changeset
402
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
403 RootContext o-- DocumentContext
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
404 RootContext o-- ControlContext
345
cin
parents: 343
diff changeset
405
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
406 Document -- DocumentContext
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
407 Control - ControlContext
345
cin
parents: 343
diff changeset
408
348
f116cd9fe7d9 working on TTView: pre-alpha version
cin
parents: 347
diff changeset
409 Loader . RootContext: <<creates>>
346
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
410 Loader . Document: <<creates>>
f05634287ac7 working on the view concept
cin
parents: 345
diff changeset
411 Loader -up- Registry
345
cin
parents: 343
diff changeset
412
cin
parents: 343
diff changeset
413 @enduml
cin
parents: 343
diff changeset
414
cin
parents: 343
diff changeset
415 =end plantuml
cin
parents: 343
diff changeset
416
cin
parents: 343
diff changeset
417 =head1 MEMBERS
cin
parents: 343
diff changeset
418
cin
parents: 343
diff changeset
419 =head2 C<[get,set]base>
cin
parents: 343
diff changeset
420
cin
parents: 343
diff changeset
421 Префикс пути для поиска шаблонов
cin
parents: 343
diff changeset
422
cin
parents: 343
diff changeset
423 =head2 C<template($name)>
cin
parents: 343
diff changeset
424
cin
parents: 343
diff changeset
425 Сначала пытается загрузить шаблон используя префикс C<base>, затем без префикса.
cin
parents: 343
diff changeset
426
cin
parents: 343
diff changeset
427 =head2 C<clone()>
cin
parents: 343
diff changeset
428
cin
parents: 343
diff changeset
429 Создает копию контекста, при этом C<stash> локализуется, таким образом
cin
parents: 343
diff changeset
430 клонированный контекст имеет собственное пространство имен, вложенное в
cin
parents: 343
diff changeset
431 пространство родительского контекста.
cin
parents: 343
diff changeset
432
cin
parents: 343
diff changeset
433 =cut