annotate Lib/IMPL/Web/TT/Document.pm @ 134:44977efed303

Significant performance optimizations Fixed recursion problems due converting objects to JSON Added cache support for the templates Added discovery feature for the web methods
author wizard
date Mon, 21 Jun 2010 02:39:53 +0400
parents 0dce0470a3d8
children 5b849974bed8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
1 package IMPL::Web::TT::Document;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
2 use strict;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
3 use warnings;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
4
75
wizard
parents: 49
diff changeset
5 use base qw(IMPL::DOM::Document IMPL::Object::Disposable);
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
6 use Template::Context;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
7 use Template::Provider;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
8 use IMPL::Class::Property;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
9 use File::Spec;
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
10 use Scalar::Util qw(blessed);
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
11 use IMPL::Web::TT::Collection;
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
12 use IMPL::Web::TT::Control;
109
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
13 use Carp;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
14
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
15 BEGIN {
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
16 private property _provider => prop_all;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
17 private property _context => prop_all;
134
44977efed303 Significant performance optimizations
wizard
parents: 127
diff changeset
18 public property cache => prop_all;
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
19 public property template => prop_get | owner_set;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
20 public property presenter => prop_all, { validate => \&_validatePresenter };
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
21 private property _controlClassMap => prop_all;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
22 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
23
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
24 our %CTOR = (
75
wizard
parents: 49
diff changeset
25 'IMPL::DOM::Document' => sub { nodeName => 'document' }
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
26 );
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
27
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
28 sub CTOR {
134
44977efed303 Significant performance optimizations
wizard
parents: 127
diff changeset
29 my ($this,%args) = @_;
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
30
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
31 $this->_controlClassMap({});
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
32 $this->registerControlClass( Control => 'IMPL::Web::TT::Control' );
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
33 $this->appendChild( $this->Create(body => 'IMPL::Web::TT::Collection') );
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
34 $this->appendChild( $this->Create(head => 'IMPL::Web::TT::Collection') );
134
44977efed303 Significant performance optimizations
wizard
parents: 127
diff changeset
35 $this->cache($args{cache}) if $args{cache};
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
36 }
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
37
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
38 sub CreateControl {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
39 my ($this,$name,$class,$args) = @_;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
40
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
41 $args = {} unless ref $args eq 'HASH';
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
42
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
43 if (my $info = $this->_controlClassMap->{$class}) {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
44 my %nodeArgs = (%{$info->{args}},%$args);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
45 $nodeArgs{controlClass} = $class;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
46
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
47 return $this->Create($name,$info->{type},\%nodeArgs);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
48 } else {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
49 die new IMPL::Exception('A control is\'t registered', $class, $name);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
50 }
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
51 }
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
52
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
53 sub provider {
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
54 my ($this,%args) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
55
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
56 if (my $provider = $this->_provider) {
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
57 return $provider;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
58 } else {
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
59 return $this->_provider(new Template::Provider(
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
60 \%args
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
61 ));
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
62 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
63 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
64
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
65 sub context {
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
66 my ($this) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
67
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
68 if (my $ctx = $this->_context) {
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
69 return $ctx;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
70 } else {
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
71 return $this->_context (
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
72 new Template::Context(
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
73 VARIABLES => {
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
74 document => $this,
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
75 this => $this,
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
76 render => sub {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
77 $this->_process(@_);
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
78 }
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
79 },
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
80 TRIM => 1,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
81 RECURSION => 1,
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
82 LOAD_TEMPLATES => [$this->provider]
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
83 )
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
84 )
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
85 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
86 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
87
127
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
88 sub resolveVar {
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
89 my ($this,$var) = @_;
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
90
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
91 return $this->context->stash->get($var);
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
92 }
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 121
diff changeset
93
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
94 sub registerControlClass {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
95 my ($this, $controlClass, $type, $args) = @_;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
96
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
97 $type ||= 'IMPL::Web::TT::Control';
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
98
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
99 die new IMPL::InvalidArgumentException("A controlClass must be a single word",$controlClass) unless $controlClass =~ /^\w+$/;
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
100
117
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
101 eval "require $type; 1;" or die new IMPL::Exception("Failed to load a module",$type,"$@") unless eval { $type->can('new') };
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
102
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
103 die new IMPL::InvalidArgumentException("A type must be subclass of IMPL::DOM::Node",$type) unless $type->isa('IMPL::DOM::Node');
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
104
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
105 $this->_controlClassMap->{$controlClass} = {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
106 controlClass => $controlClass,
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
107 type => $type,
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
108 args => ref $args eq 'HASH' ? $args : {}
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
109 };
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
110 }
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
111
117
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
112 sub require {
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
113 my ($this,$template) = @_;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
114
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
115 my $doc = $this->context->template($template);
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
116
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
117 die new IMPL::InvalidOperationException("A specified template isn't a document",$template) unless eval{ $doc -> isa('Template::Document') };
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
118
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
119 my $controlClass = $doc->class;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
120 my $type = $doc->nativeType;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
121 my $controlTemplate;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
122 my $out = "";
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
123
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
124 die new IMPL::InvalidOperationException("A specified template isn't a control",$template) unless $controlClass;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
125
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
126 if (not $this->isControlClass($controlClass)) {
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
127 if ($doc->template) {
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
128 $controlTemplate = $doc->blocks()->{$doc->template} || $this->context->template($doc->template);
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
129 $out = $this->context->process($doc);
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
130 } else {
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
131 $controlTemplate = $doc;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
132 }
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
133 $this->registerControlClass($controlClass,$type,{ template => $controlTemplate } );
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
134 }
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
135
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
136 return $out;
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
137 }
0475eb382085 Controls support (RC1)
wizard
parents: 109
diff changeset
138
109
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
139 sub isControlClass {
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
140 my ($this,$name) = @_;
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
141 return $this->_controlClassMap->{$name} ? 1 : 0;
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
142 }
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
143
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
144 sub _getControls {
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
145 my ($this) = @_;
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
146
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
147 my ($node) = $this->selectNodes('controls');
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
148 return $node;
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
149 }
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
150
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
151 sub _validatePresenter {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
152 my ($this,$value) = @_;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
153
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
154 die new IMPL::InvalidArgumentException("A view object is required") unless blessed($value) and $value->isa('Template::View');
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
155 }
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
156
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
157 sub LoadFile {
121
92c850d0bdb9 Minor changes
wizard
parents: 117
diff changeset
158 my ($this,$filePath,$encoding,@includes) = @_;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
159
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
160 die new IMPL::InvalidArgumentException("A filePath parameter is required") unless $filePath;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
161
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
162 $encoding ||= 'utf8';
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
163
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
164 $this->_context(undef);
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
165 $this->_provider(undef);
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
166
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
167 my ($vol,$dir,$fileName) = File::Spec->splitpath($filePath);
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
168
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
169 my $inc = File::Spec->catpath($vol,$dir,'');
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
170
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
171 $this->provider(
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
172 ENCODING => $encoding,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
173 INTERPOLATE => 1,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
174 PRE_CHOMP => 1,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
175 POST_CHOMP => 1,
134
44977efed303 Significant performance optimizations
wizard
parents: 127
diff changeset
176 COMPILE_EXT => $this->cache ? '.ttc' : undef,
44977efed303 Significant performance optimizations
wizard
parents: 127
diff changeset
177 COMPILE_DIR => $this->cache,
121
92c850d0bdb9 Minor changes
wizard
parents: 117
diff changeset
178 INCLUDE_PATH => [$inc,@includes]
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
179 );
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
180
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
181 $this->template($this->context->template($fileName));
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
182 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
183
97
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
184 sub AddVar {
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
185 my ($this,$name,$value) = @_;
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
186
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
187 $this->context->stash->set($name,$value);
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
188 }
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 77
diff changeset
189
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
190 sub title {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
191 $_[0]->template->title;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
192 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
193
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
194 sub Render {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
195 my ($this) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
196
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
197 return $this->template->process($this->context);
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
198 }
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
199
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
200 # Формирует представление для произвольных объектов
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
201 sub _process {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
202 my ($this,@items) = @_;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
203
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
204 my @result;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
205
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
206 foreach my $item (@items) {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
207 if (blessed($item) and $item->isa('IMPL::Web::TT::Control')) {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
208 push @result, $item->Render();
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
209 } elsif(blessed($item)) {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
210 if ($this->presenter) {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
211 push @result, $this->presenter->print($item);
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
212 } else {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
213 push @result, $this->toString;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
214 }
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
215 } else {
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
216 push @result, $item;
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
217 }
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
218 }
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
219
107
0e72ad99eef7 Updated Web::TT
wizard
parents: 97
diff changeset
220 return join '',@result;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
221 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
222
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
223 our $AUTOLOAD;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
224 sub AUTOLOAD {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
225 my $this = shift;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
226 my ($method) = ($AUTOLOAD =~ /(\w+)$/);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
227
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
228 if($method =~ /^create(\w+)/) {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
229 my ($name,$args) = @_;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
230 return $this->CreateControl($name,$1,$args);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
231 }
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
232
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
233 my @result = $this->selectNodes($method);
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
234
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
235 return $result[0] if @result;
109
ddf0f037d460 IMPL::DOM::Node updated to support TT, (added childNodesRef and selectNodesRef for using from TT)
wizard
parents: 108
diff changeset
236 carp "Looks like you have a mistake, document doesn't have a such property or child: $method";
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
237 return;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
238 }
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
239
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
240 sub as_list {
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
241 $_[0]->childNodes;
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
242 }
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
243
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
244 sub Dispose {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
245 my ($this) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
246
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
247 $this->template(undef);
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
248 $this->_context(undef);
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
249 $this->_provider(undef);
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
250
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
251 $this->supercall::Dispose();
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
252 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
253
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
254 1;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
255 __END__
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
256 =pod
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
257
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
258 =head1 NAME
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
259
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
260 C<IMPL::Web::TT::Document> - Документ, позволяющий строить представление по шаблону
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
261
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
262 =head1 SYNOPSIS
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
263
75
wizard
parents: 49
diff changeset
264 =begin code
wizard
parents: 49
diff changeset
265
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
266 // create new document
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
267 my $doc = new IMPL::Web::TT::Document;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
268
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
269 // load template
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
270 $doc->loadFile('Templates/index.tt');
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
271
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
272 // render file
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
273 print $doc->Render();
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
274
75
wizard
parents: 49
diff changeset
275 =end code
wizard
parents: 49
diff changeset
276
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
277 =head1 DESCRIPTION
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
278
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
279 C<use base qw(IMPL::DOM::Document)>
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
280
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
281 Документ, основанный на шаблоне Template::Toolkit. Позволяет загрузить шаблон,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
282 и сформировать окончательный документ. Является наследником C<IMPL::DOM::Node>,
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
283 т.о. может быть использован для реализации DOM модели.
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
284
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
285 Внутри шаблона переменная C<document> ссылается на объект документа. По этой
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
286 причине образуется циклическая ссылка между объектами шаблона и документом, что
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
287 требует вызова метода C<Dispose> для освобождения документа.
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
288
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
289 =head1 METHODS
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
290
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
291 =over
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
292
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
293 =item C<CTOR()>
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
294
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
295 Создает новый экземпляр документа, свойство C<nodeName> устанавливается в 'C<document>'
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
296
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
297 =item C<$doc->LoadFile($fileName,$encoding)>
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
298
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
299 Загружает шаблон из файла C<$fileName>, используя кодировку C<$encoding>. Если
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
300 кодировка не указана, использует utf-8.
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
301
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
302 =item C<$doc->Render()>
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
303
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
304 Возвращает данные построенные на основе загруженного шаблона.
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
305
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
306 =item C<$doc->Dispose()>
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
307
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
308 Освобождает ресурсы и помечает объект как освобожденный.
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
309
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
310 =back
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
311
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
312 =head1 DOM
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
313
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
314 Документ представляет собой DOM документ, состоящий из узлов, которые представляют собой данные
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
315 для отображения. Для форматированого вывода используется C<template>.
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
316
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
317 В качестве элементов документа могут присутсвовать специальные объекты C<IMPL::Web::TT::Control>,
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
318 которые внутри содержат шаблон для форматирования собственного содержимого.
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
319
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
320
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
321
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
322 Документ предоставляет ряд фнукций для работы с элементами управления.
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
323
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
324 =head1 TEMPLATE
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
325
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
326 =begin code html
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
327
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
328 [% CALL document.registerClass( 'Table', 'My::TableClass', template => 'tables/pretty.tt' ) %]
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
329 [% CALL document.registerClass( 'Form' )%]
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
330
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
331 [% table = document.сreateTable('env') %]
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
332
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
333 [% FOEACH item in document.result %]
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
334 [% table.rows.Add( item.get('name','value') ) %]
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
335 [% END %]
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
336
108
c6fb6964de4c Removed absolute modules
wizard
parents: 107
diff changeset
337 [% form = document.createForm('login') %]
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
338 [% form.template = 'LOGIN_FORM'%]
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
339
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
340 [% FOREACH item IN document.childNodes %]
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
341 [%render(item)%]
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
342 [% END %]
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
343
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
344 [% BLOCK LOGIN_FORM %]
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
345 <form method="POST" action='/login.pl'>
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
346 user: [% render(this.item('name')) %] password: [% render(this.item('password')) %] <input type="submit"/>
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
347 </form>
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
348 [% END %]
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
349
77
9d24db321029 Refactoring Web::TT
wizard
parents: 76
diff changeset
350 =end code html
76
b1652a158b2b Web::DOM
wizard
parents: 75
diff changeset
351
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 7
diff changeset
352 =cut