Mercurial > pub > Impl
annotate Lib/IMPL/Web/View/TTDocument.pm @ 346:f05634287ac7
working on the view concept
author | cin |
---|---|
date | Mon, 30 Sep 2013 01:37:50 +0400 |
parents | 72799d1211c5 |
children |
rev | line source |
---|---|
181 | 1 package IMPL::Web::View::TTDocument; |
2 use strict; | |
3 | |
236 | 4 use Scalar::Util qw(weaken); |
5 use IMPL::Const qw(:prop); | |
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
6 use IMPL::lang qw(:hash is); |
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
7 use Carp qw(carp); |
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
8 use mro; |
309 | 9 use IMPL::Exception(); |
236 | 10 use IMPL::declare { |
11 require => { | |
305 | 12 TTRegistry => 'IMPL::Web::View::TTRegistry', |
236 | 13 TTFactory => 'IMPL::Web::View::TTFactory', |
14 TTControl => 'IMPL::Web::View::TTControl', | |
309 | 15 Loader => 'IMPL::Code::Loader', |
16 OpException => '-IMPL::InvalidOperationException' | |
236 | 17 }, |
18 base => [ | |
19 'IMPL::Web::View::TTControl' => sub { | |
309 | 20 my ($template,$ctx,$vars) = @_; |
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
21 $ctx ||= Template::Context->new(); |
309 | 22 return $template, $ctx, $vars; # context |
236 | 23 } |
24 ] | |
25 }; | |
181 | 26 |
27 sub CTOR { | |
311 | 28 my ($this,$template,$ctx) = @_; |
194 | 29 |
30 $this->layout( $template->layout ) unless $this->layout; | |
301 | 31 $this->title( $template->title ) unless $this->title; |
181 | 32 } |
33 | |
34 sub Render { | |
194 | 35 my ($this,$args) = @_; |
345 | 36 |
37 my $ctx = $this->context; | |
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
38 |
241
f48a1a9f4fa2
+Added ViewResult to allow implementation of the view environment.
sergey
parents:
238
diff
changeset
|
39 $args ||= {}; |
310
0a9d51cf6dfd
*TTView: refactoring, document supports custom classes, layouts are become controls
sergey
parents:
309
diff
changeset
|
40 $args->{document} = $this; |
345 | 41 $args->{render} = sub { |
42 my ($model,$factory) = @_; | |
43 | |
44 $factory = $ctx->require($factory) unless is($factory,TTFactory); | |
45 | |
46 return $factory->new({document => $this, model => $model})->Render(); | |
47 }; | |
290 | 48 |
288
3a9cfea098dd
*TTView refactoring: removed RequireControl method, etc.
sergey
parents:
287
diff
changeset
|
49 |
313
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
50 if ($this->layout) { |
345 | 51 my $layout = $this->registry->Require($this->layout)->new(); |
313
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
52 |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
53 my $next = $this->next::can(); |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
54 |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
55 return $layout->Render({ |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
56 content => sub { $this->$next($args) }, |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
57 template => $this->template, |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
58 document => $this |
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
59 }); |
194 | 60 } else { |
313
ec4ec1f056fe
TTView: page content now rendered lazy therefore a page layout must wrap the document content
cin
parents:
311
diff
changeset
|
61 return $this->next::method($args); |
194 | 62 } |
190
cd1ff7029a63
IMLP::Web::View refactored, added new method 'require' which is available inside templates. Changed document rendering.
cin
parents:
189
diff
changeset
|
63 } |
cd1ff7029a63
IMLP::Web::View refactored, added new method 'require' which is available inside templates. Changed document rendering.
cin
parents:
189
diff
changeset
|
64 |
303
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
65 sub GetTemplate { |
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
66 my ($this,$name) = @_; |
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
67 |
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
68 $this->template->blocks->{$name}; |
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
69 } |
a5eb64c6e6f7
TTDocument.GetTemplate corrected to work with document blocks
cin
parents:
301
diff
changeset
|
70 |
308 | 71 sub DTOR { |
72 my $this = shift; | |
73 | |
74 $this->registry->Dispose() if $this->registry; | |
75 } | |
76 | |
181 | 77 1; |
78 | |
79 __END__ | |
80 | |
81 =pod | |
82 | |
83 =head1 NAME | |
84 | |
85 C<IMPL::Web::View::TTDocument> - документ для построения HTML страницы на основе шаблонов TT. | |
86 | |
87 =head1 SYNOPSIS | |
88 | |
89 =begin code | |
90 | |
91 | |
92 =end code | |
93 | |
94 =head1 DESCRIPTION | |
95 | |
343 | 96 Позволяет строить представления при помощи Template Toolkit, при этом расширяет |
97 шаблоны до элементов управления, чтобы была возмлжность реализации функционала | |
98 средствами C<Perl>. | |
99 | |
100 Структура представления. | |
101 | |
102 =begin text | |
103 | |
104 + view | |
105 |- document.tt | |
106 |-+items | |
107 | |- title.tt | |
108 | |- item.tt | |
109 | | |
110 |-+layouts | |
111 |- | |
112 | |
113 =end text | |
114 | |
115 =begin text | |
116 | |
117 | |
118 | |
119 =end text | |
120 | |
344 | 121 =begin plantuml |
181 | 122 |
344 | 123 @startuml |
124 | |
345 | 125 object "doc: TTDocument" as doc |
126 object "docCtx: TTContext" as docctx | |
127 object "factory: TTFactory" as factory | |
128 object "registry: TTRegistry" as registry | |
129 object "control: TTControl" as ctl | |
130 object "ctlCtx: TTContext" as ctlctx | |
181 | 131 |
345 | 132 doc -up-> docctx |
133 registry --> "0..*" factory | |
134 factory .> doc: <<creates>> | |
135 factory .up.> ctl: <<creates>> | |
136 docctx -up-> registry | |
137 ctl -> ctlctx | |
138 ctlctx --> registry | |
139 ctlctx --> doc | |
344 | 140 |
141 @enduml | |
142 | |
143 =end plantuml | |
195
7a920771fd8e
IMPL::Web::View changed document layout handling, docs, examples
cin
parents:
194
diff
changeset
|
144 |
181 | 145 =cut |