| 
181
 | 
     1 package IMPL::Web::View::TTDocument;
 | 
| 
 | 
     2 use strict;
 | 
| 
 | 
     3 
 | 
| 
 | 
     4 use IMPL::lang qw(:declare :constants);
 | 
| 
 | 
     5 use IMPL::DOM::Property qw(_dom);
 | 
| 
 | 
     6 use IMPL::Web::View::TTFactory();
 | 
| 
 | 
     7 use IMPL::Web::View::TTControl();
 | 
| 
 | 
     8 
 | 
| 
 | 
     9 
 | 
| 
 | 
    10 use parent qw(
 | 
| 
 | 
    11 	IMPL::DOM::Document
 | 
| 
 | 
    12 	IMPL::Web::View::TTControl
 | 
| 
 | 
    13 );
 | 
| 
 | 
    14 
 | 
| 
 | 
    15 BEGIN {
 | 
| 
 | 
    16 	public _dom property layout => PROP_ALL;
 | 
| 
 | 
    17 	public property opts => PROP_GET | PROP_OWNERSET;
 | 
| 
 | 
    18 	public property loader => PROP_GET | PROP_OWNERSET;
 | 
| 
 | 
    19 	public property controls => PROP_GET | PROP_OWNERSET;
 | 
| 
 | 
    20 }
 | 
| 
 | 
    21 
 | 
| 
 | 
    22 sub CTOR {
 | 
| 
 | 
    23 	my ($this,$template,$refOpts,%args) = @_;
 | 
| 
 | 
    24 	
 | 
| 
 | 
    25 	$this->controls({});
 | 
| 
 | 
    26 	$this->loader($args{loader}) if $args{loader};
 | 
| 
 | 
    27 	
 | 
| 
 | 
    28 	$this->layout( $template->layout ) unless $this->layout;
 | 
| 
 | 
    29 	
 | 
| 
 | 
    30 	$this->opts($refOpts);
 | 
| 
 | 
    31 }
 | 
| 
 | 
    32 
 | 
| 
 | 
    33 our %CTOR = (
 | 
| 
 | 
    34 	'IMPL::Web::View::TTControl' => sub {
 | 
| 
 | 
    35 		'document',
 | 
| 
 | 
    36 		$_[0], # template
 | 
| 
 | 
    37 		new Template::Context($_[1])  # context
 | 
| 
 | 
    38 	},
 | 
| 
 | 
    39 	'IMPL::DOM::Document' => sub {
 | 
| 
 | 
    40 		nodeName => 'document'
 | 
| 
 | 
    41 	}
 | 
| 
 | 
    42 );
 | 
| 
 | 
    43 
 | 
| 
 | 
    44 sub require {
 | 
| 
 | 
    45 	my ($this, $control) = @_;
 | 
| 
 | 
    46 	
 | 
| 
186
 | 
    47 	if (my $factory = $this->controls->{$control}) {
 | 
| 
 | 
    48 		return $factory;
 | 
| 
 | 
    49 	} else {
 | 
| 
188
 | 
    50 =pod		
 | 
| 
186
 | 
    51 		my $path = $control;
 | 
| 
181
 | 
    52 		if ( my $template = $this->loader->template($path) ) {
 | 
| 
188
 | 
    53 			#my $opts = { %{$this->opts} };
 | 
| 
 | 
    54 			#$opts->{STASH} = $this->context->stash->clone();
 | 
| 
 | 
    55  
 | 
| 
 | 
    56 			my $ctx = new Template::Context();#$opts);
 | 
| 
181
 | 
    57 			
 | 
| 
186
 | 
    58 			$factory = new IMPL::Web::View::TTFactory(
 | 
| 
181
 | 
    59 				typeof IMPL::Web::View::TTControl,
 | 
| 
 | 
    60 				$template,
 | 
| 
 | 
    61 				$ctx,
 | 
| 
188
 | 
    62 				{} #$opts
 | 
| 
181
 | 
    63 			);
 | 
| 
 | 
    64 			
 | 
| 
186
 | 
    65 			my @parts = split(/\/+/,$control);
 | 
| 
181
 | 
    66 			
 | 
| 
186
 | 
    67 			$this->controls->{$control} = $factory;
 | 
| 
181
 | 
    68 			$this->context->stash->set([map { $_, 0 } @parts], $factory);
 | 
| 
186
 | 
    69 						
 | 
| 
 | 
    70 			return $factory;
 | 
| 
188
 | 
    71 
 | 
| 
181
 | 
    72 		} else {
 | 
| 
 | 
    73 			die new IMPL::KeyNotFoundException($control);
 | 
| 
 | 
    74 		}
 | 
| 
188
 | 
    75 =cut		
 | 
| 
181
 | 
    76 	}
 | 
| 
 | 
    77 }
 | 
| 
 | 
    78 
 | 
| 
187
 | 
    79 sub renderBlock {
 | 
| 
 | 
    80 	$_[0]->template;	
 | 
| 
 | 
    81 }
 | 
| 
 | 
    82 
 | 
| 
181
 | 
    83 sub Render {
 | 
| 
187
 | 
    84 	my ($this,$args) = @_;
 | 
| 
181
 | 
    85 	
 | 
| 
188
 | 
    86 	my $output = $this->SUPER::Render( { document => $this } );
 | 
| 
181
 | 
    87 	
 | 
| 
 | 
    88 	if ($this->layout) {
 | 
| 
187
 | 
    89 		$output = $this->context->include($this->layout, { content => $output } );
 | 
| 
181
 | 
    90 	}
 | 
| 
 | 
    91 	
 | 
| 
 | 
    92 	return $output;
 | 
| 
 | 
    93 }
 | 
| 
 | 
    94 
 | 
| 
 | 
    95 
 | 
| 
 | 
    96 1;
 | 
| 
 | 
    97 
 | 
| 
 | 
    98 __END__
 | 
| 
 | 
    99 
 | 
| 
 | 
   100 =pod
 | 
| 
 | 
   101 
 | 
| 
 | 
   102 =head1 NAME
 | 
| 
 | 
   103 
 | 
| 
 | 
   104 C<IMPL::Web::View::TTDocument> - документ для построения HTML страницы на основе шаблонов TT.
 | 
| 
 | 
   105 
 | 
| 
 | 
   106 =head1 SYNOPSIS
 | 
| 
 | 
   107 
 | 
| 
 | 
   108 =begin code
 | 
| 
 | 
   109 
 | 
| 
 | 
   110 use IMPL::Web::View::TTDocument();
 | 
| 
 | 
   111 
 | 
| 
 | 
   112 my $doc = new IMPL::Wbe::View::TTDocument($template,$ttOptions);
 | 
| 
 | 
   113 
 | 
| 
 | 
   114 return $doc->Render();
 | 
| 
 | 
   115 
 | 
| 
 | 
   116 =end code
 | 
| 
 | 
   117 
 | 
| 
 | 
   118 Однако, более предпочтительный способ использовать C<IMPL::Web::View::TTLoader>.
 | 
| 
 | 
   119 
 | 
| 
 | 
   120 =head1 DESCRIPTION
 | 
| 
 | 
   121 
 | 
| 
 | 
   122 Документ для представления данных. Документы представляют собой иерархически организованные данные,
 | 
| 
 | 
   123 элементами данного документа являются данные для отображения, такие как
 | 
| 
 | 
   124 
 | 
| 
 | 
   125 =over
 | 
| 
 | 
   126 
 | 
| 
 | 
   127 =item * Объекты из БД
 | 
| 
 | 
   128 
 | 
| 
 | 
   129 =item * Навигационные цепочки
 | 
| 
 | 
   130 
 | 
| 
 | 
   131 =item * Меню и т.п. 
 | 
| 
 | 
   132 
 | 
| 
 | 
   133 =back
 | 
| 
 | 
   134 
 | 
| 
 | 
   135 Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ.
 | 
| 
 | 
   136 Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
 | 
| 
 | 
   137 вспомогательного шаблона - обертки. Если у шаблона документа указан C<wrapper> в метаданных, то он будет
 | 
| 
 | 
   138 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
 | 
| 
 | 
   139 обертка не задана, то результатом будет вывод самого скрипта шаблона.
 | 
| 
 | 
   140 
 | 
| 
 | 
   141 Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее,
 | 
| 
 | 
   142 указанное при создании документа.
 | 
| 
185
 | 
   143 =head2 Порядок обработки документа
 | 
| 
 | 
   144 
 | 
| 
 | 
   145 =over
 | 
| 
 | 
   146 
 | 
| 
 | 
   147 =item 1 Создается документ при помощи метода C<TTLoader::document()>
 | 
| 
 | 
   148 
 | 
| 
 | 
   149 =item 1 При создании документа (в конструкторе), происходит выполнение блока C<CTOR>
 | 
| 
 | 
   150 
 | 
| 
 | 
   151 =item 1 При вызове метода C<TTDocument::Render()> устанавливаются переменные C<this>, C<document>
 | 
| 
 | 
   152 и шаблон обрабатывается при помощи метода C<process()> контекста документа.
 | 
| 
 | 
   153 
 | 
| 
 | 
   154 =back
 | 
| 
181
 | 
   155 
 | 
| 
 | 
   156 =head2 Загрузка элемента управления
 | 
| 
 | 
   157 
 | 
| 
 | 
   158 =over
 | 
| 
 | 
   159 
 | 
| 
185
 | 
   160 =item 1 C<document.require('my/org/input')>
 | 
| 
181
 | 
   161 
 | 
| 
 | 
   162 =item 1 Загружает шаблон C<my/org/input.tt>
 | 
| 
 | 
   163 
 | 
| 
 | 
   164 =item 1 Создает фабрику элементов управления с собственным контекстом, вложенным в контекст документа.
 | 
| 
 | 
   165 
 | 
| 
 | 
   166 =item 1 Выполняет шаблон в пространстве имен фабрики 
 | 
| 
 | 
   167 
 | 
| 
 | 
   168 =item 1 Регистритует фабрику в контексте документа по пути C<my.org.input>
 | 
| 
 | 
   169 
 | 
| 
 | 
   170 =back
 | 
| 
 | 
   171 
 | 
| 
 | 
   172 =head2 Создание элемента управления
 | 
| 
 | 
   173 
 | 
| 
 | 
   174 =over
 | 
| 
 | 
   175 
 | 
| 
 | 
   176 =item 1 C<< my.org.input.new('login') >>
 | 
| 
 | 
   177 
 | 
| 
 | 
   178 =item 1 Если это первый элемент управления, то выполняетя статический конструктор в контексте фабрики
 | 
| 
 | 
   179 
 | 
| 
 | 
   180 =item 1 Создается новый дочерний контекст к контексту фабрики
 | 
| 
 | 
   181 
 | 
| 
 | 
   182 =item 1 Создается экземпляр элемента управления
 | 
| 
 | 
   183 
 | 
| 
 | 
   184 =item 1 Выполняется блок конструктора в контексте элемента управления, параметр C<this> имеет значение
 | 
| 
 | 
   185 нового экземпляра элемента управления  
 | 
| 
 | 
   186 
 | 
| 
 | 
   187 =back
 | 
| 
 | 
   188 
 | 
| 
 | 
   189 =head1 MEMBERS
 | 
| 
 | 
   190 
 | 
| 
 | 
   191 =over
 | 
| 
 | 
   192 
 | 
| 
 | 
   193 =item C<CTOR($template, %options)>
 | 
| 
 | 
   194 
 | 
| 
 | 
   195 Создает экземпляр документа с указанным шаблоном и параметрами, параметры 
 | 
| 
 | 
   196 
 | 
| 
 | 
   197 =back
 | 
| 
 | 
   198 
 | 
| 
 | 
   199 =cut |