Mercurial > pub > Impl
annotate Lib/IMPL/Web/View/TTDocument.pm @ 348:f116cd9fe7d9
working on TTView: pre-alpha version
| author | cin |
|---|---|
| date | Thu, 03 Oct 2013 19:48:57 +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 |
