49
|
1 package IMPL::Web::TDocument;
|
|
2 use strict;
|
|
3 use warnings;
|
|
4
|
|
5 use base qw(IMPL::DOM::Node IMPL::Object::Disposable);
|
|
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 = (
|
|
18 'IMPL::DOM::Node' => sub { nodeName => 'document' }
|
|
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
|
|
103 // create new document
|
|
104 my $doc = new IMPL::Web::TDocument;
|
|
105
|
|
106 // load template
|
|
107 $doc->loadFile('Templates/index.tt');
|
|
108
|
|
109 // render file
|
|
110 print $doc->Render();
|
|
111
|
|
112 =head1 DESCRIPTION
|
|
113
|
|
114 Документ, основанный на шаблоне Template::Toolkit. Позволяет загрузить шаблон,
|
|
115 и сформировать окончательный документ. Является наследником C<IMPL::DOM::Node>,
|
|
116 т.о. может быть использован для реализации DOM модели.
|
|
117
|
|
118 Внутри шаблона переменная C<document> ссылается на объект документа. По этой
|
|
119 причине образуется циклическая ссылка между объектами шаблона и документом, что
|
|
120 требует вызова метода C<Dispose> для освобождения документа.
|
|
121
|
|
122 =head1 METHODS
|
|
123
|
|
124 =level 4
|
|
125
|
|
126 =item C<new()>
|
|
127
|
|
128 Создает новый экземпляр документа
|
|
129
|
|
130 =item C<$doc->loadFile($fileName,$encoding)>
|
|
131
|
|
132 Загружает шаблон из файла C<$fileName>, используя кодировку C<$encoding>. Если
|
|
133 кодировка не указана, использует utf-8.
|
|
134
|
|
135 =item C<$doc->Render()>
|
|
136
|
|
137 Возвращает данные построенные на основе загруженного шаблона.
|
|
138
|
|
139 =item C<$doc->Dispose()>
|
|
140
|
|
141 Освобождает ресурсы и помечает объект как освобожденный.
|
|
142
|
|
143 =back
|
|
144
|
|
145 =cut
|