comparison Lib/IMPL/Web/View/TTDocument.pm @ 287:2d253e6e4a88

*TTView refactoring
author cin
date Tue, 19 Feb 2013 03:05:10 +0400
parents d357b5d85d25
children 3a9cfea098dd
comparison
equal deleted inserted replaced
286:d357b5d85d25 287:2d253e6e4a88
11 TTControl => 'IMPL::Web::View::TTControl', 11 TTControl => 'IMPL::Web::View::TTControl',
12 Loader => 'IMPL::Code::Loader' 12 Loader => 'IMPL::Code::Loader'
13 }, 13 },
14 base => [ 14 base => [
15 'IMPL::Web::View::TTControl' => sub { 15 'IMPL::Web::View::TTControl' => sub {
16 my ($template,$contextOpts) = @_; 16 my ($template,$ctx) = @_;
17 'document', 17 'document',
18 $template, # template 18 $template, # template
19 Template::Context->new($contextOpts) # context 19 $ctx || Template::Context->new() # context
20 } 20 }
21 ], 21 ],
22 props => [ 22 props => [
23 layout => PROP_RW, 23 layout => PROP_RW,
24 opts => PROP_RO,
25 loader => PROP_RW, 24 loader => PROP_RW,
26 controls => PROP_RO, 25 controls => PROP_RO,
27 creationArgs => PROP_RO, 26 creationArgs => PROP_RO,
28 27
29 # store the stash separately to make require() method to work correctly 28 # store the stash separately to make require() method to work correctly
35 BEGIN { 34 BEGIN {
36 35
37 } 36 }
38 37
39 sub CTOR { 38 sub CTOR {
40 my ($this,$template,$refOpts,$loader,$vars) = @_; 39 my ($this,$template,$ctx,$loader,$vars) = @_;
41 40
42 $this->controls({}); 41 $this->controls({});
43 $this->loader($loader) if $loader; 42 $this->loader($loader) if $loader;
44 43
45 $this->layout( $template->layout ) unless $this->layout; 44 $this->layout( $template->layout ) unless $this->layout;
46 45
47 $this->opts($refOpts);
48 $this->stash($this->context->stash); 46 $this->stash($this->context->stash);
49 $this->creationArgs($vars); 47 $this->creationArgs($vars);
50 48
51 my $self = $this; 49 my $self = $this;
52 weaken($self); 50 weaken($self);
80 } else { 78 } else {
81 79
82 my $path = $control; 80 my $path = $control;
83 81
84 if ( my $template = $this->loader->template($path) ) { 82 if ( my $template = $this->loader->template($path) ) {
85 my $opts = { %{$this->opts} };
86 83
87 # factory will create a clone of the stash 84 # factory will create a clone of the stash
88 # $opts->{STASH} = $this->stash->clone(); 85 # $opts->{STASH} = $this->stash->clone();
89 86
90 my $ctx = new Template::Context($opts); 87 my $ctx = Template::Context->new({%{$this->context}, STASH => $this->stash });#new Template::Context($opts);
91 88
92 $factory = new IMPL::Web::View::TTFactory( 89 $factory = new IMPL::Web::View::TTFactory(
93 $template->class || TTControl, 90 $template->class || TTControl,
94 $template, 91 $template,
95 $ctx, 92 $ctx,
96 $opts,
97 join( '/', splice( @{[split(/\//,$path)]}, 0, -1 ) ) 93 join( '/', splice( @{[split(/\//,$path)]}, 0, -1 ) )
98 ); 94 );
99 95
100 if ($template->class) { 96 if ($template->class) {
101 Loader->safe->Require($template->class); 97 Loader->safe->Require($template->class);
117 $args ||= {}; 113 $args ||= {};
118 114
119 my $newArgs = hashMerge($this->creationArgs, $args); 115 my $newArgs = hashMerge($this->creationArgs, $args);
120 116
121 if ($this->layout) { 117 if ($this->layout) {
122 my $tlayout = $this->loader->layout($this->layout); 118 my $text = eval {
123 if(my $init = $tlayout->blocks->{INIT}) { 119 #$this->context->localise();
124 $this->context->process( 120 my $tlayout = $this->loader->layout($this->layout);
125 $init, 121 if(my $init = $tlayout->blocks->{INIT}) {
126 hashMerge( 122 $this->context->process(
127 $newArgs, 123 $init,
128 { 124 hashMerge(
129 this => $this, 125 $newArgs,
130 template => $this->template 126 {
131 } 127 template => $this->template
132 ) 128 }
129 )
130 );
131 }
132 return $this->context->include(
133 $tlayout,
134 {
135 %{$newArgs},
136 content => $this->RenderContent($newArgs),
137 this => $this,
138 template => $this->template
139 }
133 ); 140 );
134 } 141 };
135 return $this->context->include( 142 my $e = $@;
136 $tlayout, 143
137 { 144 #$this->context->delocalise();
138 %{$newArgs}, 145
139 content => $this->RenderContent($newArgs), 146 if ($e) {
140 this => $this, 147 die $e;
141 template => $this->template 148 } else {
142 } 149 return $text;
143 ); 150 }
151
144 } else { 152 } else {
145 return $this->RenderContent($newArgs); 153 return $this->RenderContent($newArgs);
146 } 154 }
147 } 155 }
148 156