181
+ − 1 package IMPL::Web::View::TTControl;
+ − 2 use strict;
+ − 3
+ − 4 use IMPL::DOM::Property qw(_dom);
+ − 5 use IMPL::lang qw(:declare :constants);
+ − 6
+ − 7 use Template::Context();
191
+ − 8 use Scalar::Util qw(weaken);
181
+ − 9
+ − 10 use parent qw(
194
+ − 11 IMPL::DOM::Node
181
+ − 12 );
+ − 13
187
+ − 14 {
194
+ − 15 my $nextId = 1;
+ − 16 sub _GetNextId {
+ − 17 return $nextId++;
+ − 18 }
187
+ − 19 }
181
+ − 20
+ − 21
+ − 22 BEGIN {
194
+ − 23 public _dom property id => PROP_ALL;
+ − 24
+ − 25 public property context => PROP_GET | PROP_OWNERSET;
+ − 26 public property template => PROP_ALL;
181
+ − 27 }
+ − 28
+ − 29
+ − 30 sub CTOR {
194
+ − 31 my ($this,$name,$template,$context,$refProps) = @_;
+ − 32
+ − 33 $name ||= "control";
+ − 34
+ − 35 $this->template( $template ) or die new IMPL::ArgumentException("A template is required");
+ − 36 $this->context( $context ) or die new IMPL::ArgumentException("A context is required");
+ − 37
+ − 38 $this->id($name . "-" . _GetNextId()) unless $this->id;
+ − 39
+ − 40 weaken($this); # prevent cyclic references produces by the code below
+ − 41
+ − 42 $context->stash->set('append', sub { $this->appendChild(@_); undef; } );
+ − 43 $context->stash->set('select', sub { $this->selectNodes(@_); } );
+ − 44
181
+ − 45 }
+ − 46
+ − 47 our %CTOR = (
194
+ − 48 'IMPL::DOM::Node' => sub {
+ − 49 nodeName => $_[0],
+ − 50 %{ $_[3] || {} }
+ − 51 }
181
+ − 52 );
+ − 53
191
+ − 54 sub InitInstance {
194
+ − 55 my ($this,$args) = @_;
+ − 56
+ − 57 $args ||= {};
+ − 58
+ − 59 if ( my $ctor = $this->template->blocks->{CTOR} ) {
+ − 60 $this->context->include($ctor, { %$args, this => $this } );
+ − 61 }
191
+ − 62 }
+ − 63
187
+ − 64 sub renderBlock {
194
+ − 65 $_[0]->template->blocks->{RENDER} || $_[0]->template;
187
+ − 66 }
+ − 67
+ − 68 sub Render {
194
+ − 69 my ($this,$args) = @_;
+ − 70
+ − 71 $args = {} unless ref $args eq 'HASH';
+ − 72
+ − 73 if(my $body = $this->renderBlock ) {
+ − 74 return $this->context->include( $body, { %$args, this => $this, template => $this->template, document => $this->document } );
+ − 75 } else {
+ − 76 return "";
+ − 77 }
185
+ − 78 }
+ − 79
+ − 80 sub AUTOLOAD {
194
+ − 81 our $AUTOLOAD;
+ − 82
+ − 83 my $method = ($AUTOLOAD =~ m/(\w+)$/)[0];
+ − 84
+ − 85 return if $method eq 'DESTROY';
+ − 86
+ − 87 my $this = shift;
+ − 88
+ − 89 $this->nodeProperty($method,@_);
181
+ − 90 }
+ − 91
+ − 92 1;
+ − 93
+ − 94 __END__
+ − 95
+ − 96 =pod
+ − 97
+ − 98 =head1 NAME
+ − 99
+ − 100 C<IMPL::Web::View::TTControl>
+ − 101
+ − 102 =head1 SYNPOSIS
+ − 103
+ − 104 =head1 DESCRIPTION
+ − 105
+ − 106 =head2 BLOCKS
+ − 107
+ − 108 При загрузке шаблона, создается фабрика, с собственным контекстом в которой выполняется шаблон элемента управления
+ − 109
+ − 110 =head3 INIT
+ − 111
+ − 112 Данный блок шаблона управления выполняется один раз при создании первого экземпляра элемента управления
+ − 113
+ − 114 =head3 CTOR
+ − 115
+ − 116 данный блок выполняется каждый раз при создании нового экземпляра элемента управления, при этом переменная C<this>
+ − 117 указывает на эземпляр элемента упарвления
+ − 118
+ − 119 =head3 RENDER
+ − 120
187
+ − 121 Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и есть результат отображения элемента управления.
+ − 122
+ − 123 =head2 TEMPLATE VARS
+ − 124
+ − 125 Каждый шаблон имеет собственное пространство имен, унаследованное от пространства имен фабрики элементов (которая в свою очередь наследует контекст документа).
+ − 126 В шаблоне могут определяться новые переменные, которые разделяются между блоками. Также доступны стандартные переменные
+ − 127
+ − 128 =over
+ − 129
+ − 130 =item * C<this> ссылка на объект элемента управления
+ − 131
+ − 132 =item * C<component> ссылка на текущий шаблон, устанавливается автоматически в методе C<Template::Context::process>.
+ − 133
+ − 134 =item * C<template> ссылка на шаблон элемента управления, для совместимости с C<TT>
+ − 135
+ − 136 =back
+ − 137
+ − 138 =head1 MEMBERS
+ − 139
+ − 140 =over
+ − 141
+ − 142 =item * C<[get]context>
+ − 143
+ − 144 Контекст элемента управления, хранит пременные шаблона. Наследуется от контекста фабрики элементов управления, который
+ − 145 наследуется от контекста документа.
+ − 146
+ − 147 =item * C<[get,set]template>
+ − 148
+ − 149 C<Template::Document> Шаблон элемента управления.
+ − 150
+ − 151 =item * C<AUTOLOAD>
+ − 152
+ − 153 Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>.
+ − 154
+ − 155 =back
181
+ − 156
+ − 157
+ − 158 C<lang ru>
+ − 159
+ − 160 =cut