Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/TTLoader.pm @ 181:47dac58691ee
New templating system, small fixes
author | sourcer |
---|---|
date | Thu, 26 Jan 2012 01:15:57 +0400 |
parents | |
children | adc7669172c4 |
comparison
equal
deleted
inserted
replaced
180:d1676be8afcc | 181:47dac58691ee |
---|---|
1 package IMPL::Web::View::TTLoader; | |
2 use strict; | |
3 | |
4 use IMPL::lang qw(:declare :constants); | |
5 | |
6 use Template::Provider(); | |
7 use Template::Context(); | |
8 use Template::Constants qw(:status); | |
9 | |
10 use IMPL::Web::View::TTDocument(); | |
11 | |
12 use parent qw( | |
13 IMPL::Object | |
14 ); | |
15 | |
16 BEGIN { | |
17 public property options => PROP_ALL; | |
18 public property provider => PROP_GET | PROP_OWNERSET; | |
19 public property context => PROP_GET | PROP_OWNERSET; | |
20 public property ext => PROP_ALL; | |
21 | |
22 public property isInitialized => PROP_GET | PROP_OWNERSET; | |
23 public property initializer => PROP_GET | PROP_OWNERSET; | |
24 } | |
25 | |
26 sub CTOR { | |
27 my ($this,$refOpts,%args) = @_; | |
28 | |
29 $this->ext(delete $args{etx}); | |
30 $this->initializer(delete $args{initializer}); | |
31 | |
32 $this->options($refOpts); | |
33 | |
34 $refOpts->{LOAD_TEMPLATES} = $this->provider(new Template::Provider($refOpts)); | |
35 | |
36 $this->context(new Template::Context($refOpts)); | |
37 } | |
38 | |
39 sub document { | |
40 my ($this,$name) = @_; | |
41 | |
42 my $tt = $this->template($name); | |
43 | |
44 $this->_init(); | |
45 | |
46 my $opts = { $this->options }; | |
47 | |
48 $opts->{STASH} = $this->context->stash->clone(); | |
49 $opts->{LOAD_TEMPLATES} = $this->provider; | |
50 | |
51 return new IMPL::Web::View::TTDocument( $tt, $opts, loader => $this ); | |
52 } | |
53 | |
54 sub template { | |
55 my ($this,$name) = @_; | |
56 | |
57 $name =~ s/^\s+|\s+$//g; | |
58 | |
59 die new IMPL::ArgumentException("A valid template name is required") unless length $name; | |
60 | |
61 $name = $this->_appendExt($name); | |
62 | |
63 my ($tt,$error) = $this->provider->fetch($name); | |
64 | |
65 if ($error == STATUS_DECLINED) { | |
66 die new IMPL::KeyNotFoundException($name); | |
67 } elsif ($error == STATUS_ERROR) { | |
68 die new IMPL::Exception("Failed to load a template", $name, $tt); | |
69 } | |
70 | |
71 return $tt; | |
72 } | |
73 | |
74 sub _appendExt { | |
75 my ($this,$name) = @_; | |
76 | |
77 | |
78 if (length $this->ext and substr( $name, -length($this->ext) ) eq $this->ext) { | |
79 return $name; | |
80 } else { | |
81 return $name . $this->ext; | |
82 } | |
83 } | |
84 | |
85 sub _init { | |
86 my ($this) = @_; | |
87 | |
88 if (!$this->isInitialized) { | |
89 $this->isInitialized(1); | |
90 | |
91 if ($this->initializer) { | |
92 eval { | |
93 $this->context->process($this->initializer); | |
94 } | |
95 } | |
96 } | |
97 } | |
98 | |
99 1; | |
100 | |
101 __END__ | |
102 | |
103 =pod | |
104 | |
105 =head1 NAME | |
106 | |
107 C<IMPL::Web::View::TTLoader> - предоставляет глобальный контекст для загрузки шаблонов | |
108 | |
109 =head1 SYNOPSIS | |
110 | |
111 =begin code | |
112 | |
113 use IMPL::Web::View::TTLoader(); | |
114 | |
115 my $loader = new IMPL::Web::View::TTLoader( | |
116 { | |
117 INCLUDE_PATH => [ | |
118 '/my/app/tt', | |
119 '/my/app/tt/lib' | |
120 ] | |
121 }, | |
122 ext => '.tt', | |
123 initializer => 'shared/global' | |
124 | |
125 ); | |
126 | |
127 my $doc = $loader->document('index'); | |
128 | |
129 my $html = $doc->Render(); | |
130 | |
131 =end code | |
132 | |
133 =head1 DESCRIPTION | |
134 | |
135 =cut | |
136 |