49
|
1 package IMPL::Web::TDocument;
|
|
2 use strict;
|
|
3 use warnings;
|
|
4
|
75
|
5 use base qw(IMPL::DOM::Document IMPL::Object::Disposable);
|
49
|
6 use Template::Context;
|
|
7 use Template::Provider;
|
|
8 use IMPL::Class::Property;
|
|
9 use File::Spec;
|
|
10
|
|
11 BEGIN {
|
|
12 private property _Provider => prop_all;
|
|
13 private property _Context => prop_all;
|
|
14 public property Template => prop_get | owner_set;
|
|
15 }
|
|
16
|
|
17 our %CTOR = (
|
75
|
18 'IMPL::DOM::Document' => sub { nodeName => 'document' }
|
49
|
19 );
|
|
20
|
|
21 sub Provider {
|
|
22 my ($this,%args) = @_;
|
|
23
|
|
24 if (my $provider = $this->_Provider) {
|
|
25 return $provider;
|
|
26 } else {
|
|
27 return $this->_Provider(new Template::Provider(
|
|
28 \%args
|
|
29 ));
|
|
30 }
|
|
31 }
|
|
32
|
|
33 sub Context {
|
|
34 my ($this) = @_;
|
|
35
|
|
36 if (my $ctx = $this->_Context) {
|
|
37 return $ctx;
|
|
38 } else {
|
|
39 return $this->_Context (
|
|
40 new Template::Context(
|
|
41 VARIABLES => {
|
|
42 document => $this
|
|
43 },
|
|
44 TRIM => 1,
|
|
45 RECURSION => 1,
|
|
46 LOAD_TEMPLATES => [$this->Provider]
|
|
47 )
|
|
48 )
|
|
49 }
|
|
50 }
|
|
51
|
|
52 sub loadFile {
|
|
53 my ($this,$filePath,$encoding) = @_;
|
|
54
|
|
55 die new IMPL::InvalidArgumentException("A filePath parameter is required") unless $filePath;
|
|
56
|
|
57 $encoding ||= 'utf8';
|
|
58
|
|
59 $this->_Context(undef);
|
|
60 $this->_Provider(undef);
|
|
61
|
|
62 my ($vol,$dir,$fileName) = File::Spec->splitpath($filePath);
|
|
63
|
|
64 my $inc = File::Spec->catpath($vol,$dir,'');
|
|
65
|
|
66 $this->Provider(
|
|
67 ENCODING => $encoding,
|
|
68 INTERPOLATE => 1,
|
|
69 PRE_CHOMP => 1,
|
|
70 POST_CHOMP => 1,
|
|
71 INCLUDE_PATH => $inc
|
|
72 );
|
|
73
|
|
74 $this->Template($this->Context->template($fileName));
|
|
75 }
|
|
76
|
|
77 sub Title {
|
|
78 $_[0]->Template->Title;
|
|
79 }
|
|
80
|
|
81 sub Render {
|
|
82 my ($this) = @_;
|
|
83
|
|
84 return $this->Template->process($this->Context);
|
|
85 }
|
|
86
|
|
87 sub Dispose {
|
|
88 my ($this) = @_;
|
|
89
|
|
90 $this->Template(undef);
|
|
91 $this->_Context(undef);
|
|
92 $this->_Provider(undef);
|
|
93
|
|
94 $this->SUPER::Dispose();
|
|
95 }
|
|
96
|
|
97 1;
|
|
98 __END__
|
|
99 =pod
|
|
100
|
|
101 =head1 SYNOPSIS
|
|
102
|
75
|
103 =begin code
|
|
104
|
49
|
105 // create new document
|
|
106 my $doc = new IMPL::Web::TDocument;
|
|
107
|
|
108 // load template
|
|
109 $doc->loadFile('Templates/index.tt');
|
|
110
|
|
111 // render file
|
|
112 print $doc->Render();
|
|
113
|
75
|
114 =end code
|
|
115
|
49
|
116 =head1 DESCRIPTION
|
|
117
|
|
118 Документ, основанный на шаблоне Template::Toolkit. Позволяет загрузить шаблон,
|
|
119 и сформировать окончательный документ. Является наследником C<IMPL::DOM::Node>,
|
|
120 т.о. может быть использован для реализации DOM модели.
|
|
121
|
|
122 Внутри шаблона переменная C<document> ссылается на объект документа. По этой
|
|
123 причине образуется циклическая ссылка между объектами шаблона и документом, что
|
|
124 требует вызова метода C<Dispose> для освобождения документа.
|
|
125
|
|
126 =head1 METHODS
|
|
127
|
|
128 =level 4
|
|
129
|
|
130 =item C<new()>
|
|
131
|
|
132 Создает новый экземпляр документа
|
|
133
|
|
134 =item C<$doc->loadFile($fileName,$encoding)>
|
|
135
|
|
136 Загружает шаблон из файла C<$fileName>, используя кодировку C<$encoding>. Если
|
|
137 кодировка не указана, использует utf-8.
|
|
138
|
|
139 =item C<$doc->Render()>
|
|
140
|
|
141 Возвращает данные построенные на основе загруженного шаблона.
|
|
142
|
|
143 =item C<$doc->Dispose()>
|
|
144
|
|
145 Освобождает ресурсы и помечает объект как освобожденный.
|
|
146
|
|
147 =back
|
|
148
|
76
|
149 =head1 DOM
|
|
150
|
|
151 =begin text
|
|
152
|
|
153 [% table = document.tables.Add('env') %]
|
|
154
|
|
155 [% FOEACH item in document.result %]
|
|
156 [% table.rows.Add( item.get('name','value') ) %]
|
|
157 [% END %]
|
|
158
|
|
159 [% form = document.forms.Add('login') %]
|
|
160
|
|
161 [% form.loadValues( {user => 'guest', password => ''} ) %]
|
|
162
|
|
163 [% form.template = BLOCK %]
|
|
164 [% %]
|
|
165 [% END %]
|
|
166 [% END %]
|
|
167
|
|
168
|
|
169 =end text
|
|
170
|
|
171
|
49
|
172 =cut
|