407
|
1 package IMPL::Web::View::TTView;
|
|
2 use strict;
|
|
3
|
|
4 use JSON;
|
|
5 use IMPL::lang qw(hashMerge is);
|
|
6 use IMPL::Const qw(:prop);
|
|
7 use IMPL::declare {
|
|
8 require => {
|
|
9 Context => 'IMPL::Web::View::TTContext',
|
|
10 Loader => 'IMPL::Code::Loader',
|
|
11 Factory => 'IMPL::Web::View::ObjectFactory'
|
|
12 },
|
|
13 base => [
|
|
14 'IMPL::Object' => undef,
|
|
15 'IMPL::Object::Autofill' => '@_',
|
|
16 'IMPL::Object::Serializable' => undef
|
|
17 ],
|
|
18 props => [
|
|
19 options => PROP_RW,
|
|
20 viewBase => PROP_RW,
|
|
21 layoutBase => PROP_RW,
|
|
22 layout => PROP_RW,
|
|
23 tt_ext => PROP_RW,
|
|
24 includes => PROP_RW | PROP_LIST,
|
|
25 globals => PROP_RW
|
|
26 ]
|
|
27 };
|
|
28
|
|
29 sub CTOR {
|
|
30 my ($this) = @_;
|
|
31
|
|
32 $this->tt_ext('tt') unless defined $this->tt_ext;
|
|
33 }
|
|
34
|
|
35 sub display {
|
|
36 my ($this,$model,$template,$args) = @_;
|
|
37
|
|
38 my $context = Context->new($this->options);
|
|
39 eval {
|
|
40 $context->process('globals' . '.' . $this->tt_ext, $args);
|
|
41 };
|
|
42 my $layout = delete $args->{layout} || $this->layout;
|
|
43
|
|
44 return $context->invoke_environment(
|
|
45 sub {
|
|
46 my $ctx = shift;
|
|
47 if ($layout) {
|
|
48 return $ctx->invoke_environment(
|
|
49 sub {
|
|
50 return shift->render(
|
|
51 $layout,
|
|
52 hashMerge(
|
|
53 {
|
|
54 content => sub {
|
|
55 $ctx->invoke_environment(
|
|
56 sub {
|
|
57 return shift->display_model($model,$template);
|
|
58 },
|
|
59 {
|
|
60 base => $this->viewBase
|
|
61 }
|
|
62 )
|
|
63 },
|
|
64 model => $model
|
|
65 }
|
|
66 )
|
|
67 ); # render
|
|
68 },
|
|
69 {
|
|
70 base => $this->layoutBase,
|
|
71 }
|
|
72 );
|
|
73 } else {
|
|
74 return $ctx->invoke_environment(
|
|
75 sub {
|
|
76 return shift->display_model($model,$template);
|
|
77 },
|
|
78 {
|
|
79 base => $this->viewBase
|
|
80 }
|
|
81 );
|
|
82 }
|
|
83 },hashMerge(
|
|
84 $this->globals,
|
|
85 hashMerge(
|
|
86 $args,
|
|
87 {
|
|
88 includes => scalar($this->includes),
|
|
89 tt_ext => $this->tt_ext,
|
|
90 debug => sub {
|
|
91 warn @_;
|
|
92 },
|
|
93 is => sub {
|
|
94 my ($obj,$class) = @_;
|
|
95 if (is($class,Factory)) {
|
|
96 return is($obj,$class->factory);
|
|
97 } else {
|
|
98 return is($obj,$class);
|
|
99 }
|
|
100 },
|
|
101 import => sub {
|
|
102 return Factory->new(Loader->safe->Require(shift));
|
|
103 },
|
|
104 toJSON => sub {
|
|
105 return JSON->new()->utf8->pretty->encode(shift);
|
|
106 }
|
|
107 }
|
|
108 )
|
|
109 )
|
|
110 );
|
|
111 }
|
|
112
|
|
113 1; |