Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/TTControl.pm @ 187:927653d01f4f
TTControl::AUTOLOAD now accesses nodeProperties
Added TTControl::renderBlock property to access RENDER block of the template
author | sergey |
---|---|
date | Tue, 03 Apr 2012 07:54:25 +0400 |
parents | 6c0fee769b0c |
children | 029c9610528c |
comparison
equal
deleted
inserted
replaced
186:6c0fee769b0c | 187:927653d01f4f |
---|---|
8 | 8 |
9 use parent qw( | 9 use parent qw( |
10 IMPL::DOM::Node | 10 IMPL::DOM::Node |
11 ); | 11 ); |
12 | 12 |
13 my $nextId = 1; | 13 { |
14 my $nextId = 1; | |
15 sub _GetNextId { | |
16 return $nextId++; | |
17 } | |
18 } | |
14 | 19 |
15 | 20 |
16 BEGIN { | 21 BEGIN { |
17 public _dom property id => PROP_ALL; | 22 public _dom property id => PROP_ALL; |
18 | 23 |
22 | 27 |
23 | 28 |
24 sub CTOR { | 29 sub CTOR { |
25 my ($this,$name,$template,$context,$refProps) = @_; | 30 my ($this,$name,$template,$context,$refProps) = @_; |
26 | 31 |
32 $name ||= "control"; | |
33 | |
27 $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); | 34 $this->template( $template ) or die new IMPL::ArgumentException("A template is required"); |
28 $this->context( $context ) or die new IMPL::ArgumentException("A context is required"); | 35 $this->context( $context ) or die new IMPL::ArgumentException("A context is required"); |
29 | 36 |
30 if ( my $ctor = $template->blocks->{CTOR} ) { | 37 if ( my $ctor = $template->blocks->{CTOR} ) { |
31 $context->process($ctor, { this => $this } ); | 38 $context->process($ctor, { this => $this } ); |
32 } | 39 } |
40 | |
41 $this->id($name . "-" . _GetNextId()) unless $this->id; | |
33 | 42 |
34 } | 43 } |
35 | 44 |
36 our %CTOR = ( | 45 our %CTOR = ( |
37 'IMPL::DOM::Node' => sub { | 46 'IMPL::DOM::Node' => sub { |
38 nodeName => $_[0], | 47 nodeName => $_[0], |
39 %{ $_[3] || {} } | 48 %{ $_[3] || {} } |
40 } | 49 } |
41 ); | 50 ); |
42 | 51 |
52 sub templateVars { | |
53 my $this = shift; | |
54 my $name = shift; | |
55 | |
56 if (@_) { | |
57 return $this->context->stash->set($name, shift); | |
58 } else { | |
59 return $this->context->stash->get($name); | |
60 } | |
61 } | |
62 | |
63 sub renderBlock { | |
64 $_[0]->template->blocks->{RENDER}; | |
65 } | |
66 | |
43 sub Render { | 67 sub Render { |
44 my ($this) = @_; | 68 my ($this,$args) = @_; |
45 | 69 |
46 if(my $body = $this->template->blocks->{RENDER} ) { | 70 $args = {} unless ref $args eq 'HASH'; |
47 return $this->context->process( $body, { this => $this } ); | 71 |
72 if(my $body = $this->renderBlock ) { | |
73 return $this->context->include( $body, { %$args, this => $this, template => $this->template } ); | |
48 } else { | 74 } else { |
49 return ""; | 75 return ""; |
50 } | 76 } |
51 } | 77 } |
52 | 78 |
55 | 81 |
56 my $method = ($AUTOLOAD =~ m/(\w+)$/)[0]; | 82 my $method = ($AUTOLOAD =~ m/(\w+)$/)[0]; |
57 | 83 |
58 return if $method eq 'DESTROY'; | 84 return if $method eq 'DESTROY'; |
59 | 85 |
60 my $res = $_[0]->template->$method(); | 86 my $this = shift; |
61 | 87 |
62 return defined($res) ? $res : $_[0]->context->stash->get($method); | 88 $this->nodeProperty(@_); |
63 | |
64 } | 89 } |
65 | 90 |
66 1; | 91 1; |
67 | 92 |
68 __END__ | 93 __END__ |
90 данный блок выполняется каждый раз при создании нового экземпляра элемента управления, при этом переменная C<this> | 115 данный блок выполняется каждый раз при создании нового экземпляра элемента управления, при этом переменная C<this> |
91 указывает на эземпляр элемента упарвления | 116 указывает на эземпляр элемента упарвления |
92 | 117 |
93 =head3 RENDER | 118 =head3 RENDER |
94 | 119 |
95 | 120 Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и есть результат отображения элемента управления. |
121 | |
122 =head2 TEMPLATE VARS | |
123 | |
124 Каждый шаблон имеет собственное пространство имен, унаследованное от пространства имен фабрики элементов (которая в свою очередь наследует контекст документа). | |
125 В шаблоне могут определяться новые переменные, которые разделяются между блоками. Также доступны стандартные переменные | |
126 | |
127 =over | |
128 | |
129 =item * C<this> ссылка на объект элемента управления | |
130 | |
131 =item * C<component> ссылка на текущий шаблон, устанавливается автоматически в методе C<Template::Context::process>. | |
132 | |
133 =item * C<template> ссылка на шаблон элемента управления, для совместимости с C<TT> | |
134 | |
135 =back | |
136 | |
137 =head1 MEMBERS | |
138 | |
139 =over | |
140 | |
141 =item * C<[get]context> | |
142 | |
143 Контекст элемента управления, хранит пременные шаблона. Наследуется от контекста фабрики элементов управления, который | |
144 наследуется от контекста документа. | |
145 | |
146 =item * C<[get,set]template> | |
147 | |
148 C<Template::Document> Шаблон элемента управления. | |
149 | |
150 =item * C<AUTOLOAD> | |
151 | |
152 Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>. | |
153 | |
154 =back | |
96 | 155 |
97 | 156 |
98 C<lang ru> | 157 C<lang ru> |
99 | 158 |
100 =cut | 159 =cut |