comparison Lib/IMPL/Web/View/TTContext.pm @ 345:72799d1211c5

sync
author cin
date Fri, 27 Sep 2013 16:28:27 +0400
parents 9bdccdf1f50b
children f05634287ac7
comparison
equal deleted inserted replaced
344:f1d67615a5b1 345:72799d1211c5
1 package IMPL::Web::View::TTContext; 1 package IMPL::Web::View::TTContext;
2 use strict; 2 use strict;
3 use Template::Base; 3 use Template::Base;
4 4
5 use IMPL::lang qw(is);
5 use IMPL::declare { 6 use IMPL::declare {
7 require => [
8 Document => '-Template::Document'
9 ],
6 base => { 10 base => {
7 'Template::Context' => '@_' 11 'Template::Context' => '@_'
8 } 12 }
9 }; 13 };
10 14
22 delete $args->{CONFIG}; 26 delete $args->{CONFIG};
23 27
24 return $class->new($args); 28 return $class->new($args);
25 } 29 }
26 30
31 sub base {
32 my $this = shift;
33
34 return @_ ? $this->stash->set('base', @_) : $this->stash->get('base');
35 }
36
37 sub tt_ext {
38 my $this = shift;
39
40 return @_ ? $this->stash->set('tt_ext', @_) : $this->stash->get('tt_ext');
41 }
42
43 sub find_template {
44 my ($this,$name,@inc) = @_;
45
46 push @inc, "";
47 my $ext = $this->tt_ext || "";
48
49 foreach my $dir (@inc) {
50 my $file = "$dir/$name$ext";
51 my $tt = eval { $this->template($file) };
52
53 return {
54 # if we load a block then we should use the current base directory
55 base => is($tt,Document) ? $dir : $this->base,
56 isDocument => is($tt,Document),
57 name => $name,
58 file => $file,
59 template => $tt
60 } if $tt;
61 }
62
63 $this->throw(Template::Constants::ERROR_FILE, "$name: not found");
64 }
65
66 sub require {
67 my ($this,$name) = @_;
68
69 return $this->stash->get([ 'require', [$name] ]);
70 }
71
27 1; 72 1;
73
74 __END__
75
76 =pod
77
78 =head1 NAME
79
80 C<IMPL::Web::View::TTContext> - доработанная версия контекста
81
82 =head1 DESCRIPTION
83
84 Расширяет функции C<Template::Context>
85
86 =begin plantuml
87
88 @startuml
89
90 object FooContext {
91 document
92 this
93 model
94 }
95
96 object BarContext {
97 document
98 this
99 model
100 }
101
102 object FooFactoryContext {
103 require = function(){}
104 include = function(){}
105 labels = {...}
106 base = "my/app/view"
107 extends = "my/app/view/bar"
108 }
109
110 object BarFactoryContext {
111 require = function(){}
112 include = function(){}
113 base = "my/app/view"
114 labels = {...}
115 extends = undefined
116 }
117
118 object RegistryContext {
119 registry
120 }
121
122 object DocumentFactoryContext {
123 require = function() {}
124 include = function() {}
125 labels = {...}
126 base = ""
127 extends = undefined
128 }
129
130 object DocumentContext {
131 this
132 }
133
134 FooFactoryContext --o BarFactoryContext
135 BarFactoryContext --o RegistryContext
136
137 FooContext -right-o FooFactoryContext
138 BarContext -right-o BarFactoryContext
139
140 DocumentFactoryContext -up-o RegistryContext
141 DocumentContext -left-o DocumentFactoryContext
142
143 Document --> DocumentContext
144
145 @enduml
146
147 =end plantuml
148
149 =head1 MEMBERS
150
151 =head2 C<[get,set]base>
152
153 Префикс пути для поиска шаблонов
154
155 =head2 C<template($name)>
156
157 Сначала пытается загрузить шаблон используя префикс C<base>, затем без префикса.
158
159 =head2 C<clone()>
160
161 Создает копию контекста, при этом C<stash> локализуется, таким образом
162 клонированный контекст имеет собственное пространство имен, вложенное в
163 пространство родительского контекста.
164
165 =cut