Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/TTDocument.pm @ 345:72799d1211c5
sync
| author | cin |
|---|---|
| date | Fri, 27 Sep 2013 16:28:27 +0400 |
| parents | f1d67615a5b1 |
| children |
comparison
equal
deleted
inserted
replaced
| 344:f1d67615a5b1 | 345:72799d1211c5 |
|---|---|
| 19 'IMPL::Web::View::TTControl' => sub { | 19 'IMPL::Web::View::TTControl' => sub { |
| 20 my ($template,$ctx,$vars) = @_; | 20 my ($template,$ctx,$vars) = @_; |
| 21 $ctx ||= Template::Context->new(); | 21 $ctx ||= Template::Context->new(); |
| 22 return $template, $ctx, $vars; # context | 22 return $template, $ctx, $vars; # context |
| 23 } | 23 } |
| 24 ], | |
| 25 props => [ | |
| 26 layout => PROP_RW, | |
| 27 layoutBase => PROP_RW, | |
| 28 registry => PROP_RW, | |
| 29 baseLocation => PROP_RW | |
| 30 ] | 24 ] |
| 31 }; | 25 }; |
| 32 | 26 |
| 33 sub CTOR { | 27 sub CTOR { |
| 34 my ($this,$template,$ctx) = @_; | 28 my ($this,$template,$ctx) = @_; |
| 35 | 29 |
| 36 $this->layout( $template->layout ) unless $this->layout; | 30 $this->layout( $template->layout ) unless $this->layout; |
| 37 $this->title( $template->title ) unless $this->title; | 31 $this->title( $template->title ) unless $this->title; |
| 38 my $doc = $this; | |
| 39 weaken($doc); | |
| 40 $this->registry->context->stash->update({ | |
| 41 document => sub { $doc } | |
| 42 }); | |
| 43 } | 32 } |
| 44 | 33 |
| 45 sub Render { | 34 sub Render { |
| 46 my ($this,$args) = @_; | 35 my ($this,$args) = @_; |
| 36 | |
| 37 my $ctx = $this->context; | |
| 47 | 38 |
| 48 $args ||= {}; | 39 $args ||= {}; |
| 49 $args->{document} = $this; | 40 $args->{document} = $this; |
| 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 }; | |
| 50 | 48 |
| 51 | 49 |
| 52 if ($this->layout) { | 50 if ($this->layout) { |
| 53 my $layout = $this->registry->Require(join('/',$this->layoutBase, $this->layout))->new(); | 51 my $layout = $this->registry->Require($this->layout)->new(); |
| 54 | 52 |
| 55 my $next = $this->next::can(); | 53 my $next = $this->next::can(); |
| 56 | 54 |
| 57 return $layout->Render({ | 55 return $layout->Render({ |
| 58 content => sub { $this->$next($args) }, | 56 content => sub { $this->$next($args) }, |
| 122 | 120 |
| 123 =begin plantuml | 121 =begin plantuml |
| 124 | 122 |
| 125 @startuml | 123 @startuml |
| 126 | 124 |
| 127 namespace IMPL::Web::View { | 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 | |
| 128 | 131 |
| 129 TTDocument "0 .. *" .. TTLoader | 132 doc -up-> docctx |
| 130 TTDocument --|> TTControl | 133 registry --> "0..*" factory |
| 131 | 134 factory .> doc: <<creates>> |
| 132 TTControl .. TTContext | 135 factory .up.> ctl: <<creates>> |
| 133 | 136 docctx -up-> registry |
| 134 TTFactory -- TTControl | 137 ctl -> ctlctx |
| 135 TTFactory .. TTContext | 138 ctlctx --> registry |
| 136 | 139 ctlctx --> doc |
| 137 class TTRegistry | |
| 138 | |
| 139 } | |
| 140 | 140 |
| 141 @enduml | 141 @enduml |
| 142 | 142 |
| 143 =end plantuml | 143 =end plantuml |
| 144 | 144 |
