Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/TTContext.pm @ 354:9330835535b9
fixed view double rendering
author | cin |
---|---|
date | Wed, 16 Oct 2013 17:28:40 +0400 |
parents | feeb3bc4a818 |
children | 8dfb9df07d02 |
comparison
equal
deleted
inserted
replaced
353:feeb3bc4a818 | 354:9330835535b9 |
---|---|
32 prefix | 32 prefix |
33 cache | 33 cache |
34 includes | 34 includes |
35 modules | 35 modules |
36 aliases | 36 aliases |
37 resolver | |
37 )) { | 38 )) { |
38 my $t = $prop; | 39 my $t = $prop; |
39 | 40 |
40 *{__PACKAGE__ . '::' . $prop} = sub { | 41 *{__PACKAGE__ . '::' . $prop} = sub { |
41 my $this = shift; | 42 my $this = shift; |
135 $args = shift; | 136 $args = shift; |
136 } | 137 } |
137 | 138 |
138 my $prefix = $this->prefix; | 139 my $prefix = $this->prefix; |
139 | 140 |
141 my $info; | |
142 | |
140 if (not(($args and delete $args->{_no_resolve}) or ref $model)) { | 143 if (not(($args and delete $args->{_no_resolve}) or ref $model)) { |
141 $prefix = $prefix ? "${prefix}.${model}" : $model; | 144 $info = $this->resolve_model($model,$args); |
142 $model = $this->resolve_model($model); | |
143 } else { | 145 } else { |
144 $prefix = ""; | 146 $info = { |
145 } | 147 model => $model, |
146 | 148 prefix => "" |
147 $template = $template ? $this->find_template($template) : $this->find_template_for($model); | 149 }; |
150 } | |
151 | |
152 $template = $template ? $this->find_template($template) : $this->find_template_for($info->{model}); | |
148 | 153 |
149 return $this->render( | 154 return $this->render( |
150 $template, | 155 $template, |
151 hashApply( | 156 hashApply( |
152 { | 157 $info, |
153 prefix => $prefix, | |
154 model => $model, | |
155 }, | |
156 $args | 158 $args |
157 ) | 159 ) |
158 ); | 160 ); |
159 } | 161 } |
160 | 162 |
195 sub invoke_environment { | 197 sub invoke_environment { |
196 my ($this,$code,$env) = @_; | 198 my ($this,$code,$env) = @_; |
197 | 199 |
198 $env ||= {}; | 200 $env ||= {}; |
199 | 201 |
202 my $ctx = ($this->root || $this)->clone(); | |
203 | |
200 my $out = eval { | 204 my $out = eval { |
201 $this->localise( | 205 $ctx->localise( |
202 hashApply( | 206 hashApply( |
203 { | 207 { |
204 aliases => $this->aliases || {}, | 208 aliases => $this->aliases || {}, |
205 root => $this->root || $this, | 209 root => $this->root || $ctx, |
206 modules => $this->modules || {}, | 210 modules => $this->modules || {}, |
207 cache => TypeKeyedCollection->new(), | 211 cache => TypeKeyedCollection->new(), |
208 display => sub { | 212 display => sub { |
209 $this->display(@_); | 213 $ctx->display(@_); |
210 }, | 214 }, |
211 render => sub { | 215 render => sub { |
212 $this->render(@_); | 216 $ctx->render(@_); |
213 }, | 217 }, |
214 display_model => sub { | 218 display_model => sub { |
215 $this->display_model(@_); | 219 $ctx->display_model(@_); |
216 }, | 220 }, |
217 tt_cache => {} | 221 tt_cache => {} |
218 }, | 222 }, |
219 $env | 223 $env |
220 ) | 224 ) |
221 ); | 225 ); |
222 | 226 |
223 &$code($this); | 227 &$code($ctx); |
224 }; | 228 }; |
225 | 229 |
226 my $e = $@; | 230 my $e = $@; |
227 $this->delocalise(); | 231 $ctx->delocalise(); |
228 | 232 |
229 die $e if $e; | 233 die $e if $e; |
230 | 234 |
231 return $out; | 235 return $out; |
232 } | 236 } |
277 ) | 281 ) |
278 ) | 282 ) |
279 } | 283 } |
280 | 284 |
281 sub resolve_model { | 285 sub resolve_model { |
282 my ($this,$prefix) = @_; | 286 my ($this,$prefix,$args) = @_; |
283 | 287 |
284 die ArgException->new(prefix => "the prefix must be specified") | 288 die ArgException->new(prefix => "the prefix must be specified") |
285 unless defined $prefix; | 289 unless defined $prefix; |
286 | 290 |
287 #TODO handle DOM models | 291 #TODO handle DOM models |
288 | 292 |
293 if (my $resolver = $this->resolver) { | |
294 return $this->$resolver($prefix,$args); | |
295 } | |
296 | |
289 my @comp = map { $_, 0 } grep length($_), split(/\.|\[(\d+)\]/, $prefix); | 297 my @comp = map { $_, 0 } grep length($_), split(/\.|\[(\d+)\]/, $prefix); |
290 | 298 |
291 return $this->stash->get(['model',0,@comp]); | 299 return { |
300 model => $this->stash->get(['model',0,@comp]), | |
301 prefix => $this->prefix ? $this->prefix . ".$prefix" : $prefix | |
302 }; | |
292 } | 303 } |
293 | 304 |
294 sub find_template_for { | 305 sub find_template_for { |
295 my ($this,$model) = @_; | 306 my ($this,$model) = @_; |
296 | 307 |