diff Lib/IMPL/Web/View/TTDocument.pm @ 181:47dac58691ee

New templating system, small fixes
author sourcer
date Thu, 26 Jan 2012 01:15:57 +0400
parents
children ae8072f2f2a3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/View/TTDocument.pm	Thu Jan 26 01:15:57 2012 +0400
@@ -0,0 +1,178 @@
+package IMPL::Web::View::TTDocument;
+use strict;
+
+use IMPL::lang qw(:declare :constants);
+use IMPL::DOM::Property qw(_dom);
+use IMPL::Web::View::TTFactory();
+use IMPL::Web::View::TTControl();
+
+
+use parent qw(
+	IMPL::DOM::Document
+	IMPL::Web::View::TTControl
+);
+
+BEGIN {
+	public _dom property layout => PROP_ALL;
+	public property opts => PROP_GET | PROP_OWNERSET;
+	public property loader => PROP_GET | PROP_OWNERSET;
+	public property controls => PROP_GET | PROP_OWNERSET;
+}
+
+sub CTOR {
+	my ($this,$template,$refOpts,%args) = @_;
+	
+	$this->controls({});
+	$this->loader($args{loader}) if $args{loader};
+	
+	$this->layout( $template->layout ) unless $this->layout;
+	
+	$this->opts($refOpts);
+}
+
+our %CTOR = (
+	'IMPL::Web::View::TTControl' => sub {
+		'document',
+		$_[0], # template
+		new Template::Context($_[1])  # context
+	},
+	'IMPL::DOM::Document' => sub {
+		nodeName => 'document'
+	}
+);
+
+sub require {
+	my ($this, $control) = @_;
+	
+	if (! $this->controls->{$control}) {
+		
+		(my $path = $control) =~ tr/\./\//;
+		if ( my $template = $this->loader->template($path) ) {
+			my $opts = ${$this->opts};
+			$opts->{STASH} = $this->context->stash->clone();
+			
+			my $ctx = new Template::Context($opts);
+			
+			my $factory = new IMPL::Web::View::TTFactory(
+				typeof IMPL::Web::View::TTControl,
+				$template,
+				$ctx,
+				$opts
+			);
+			
+			my @parts = split(/\.+/,$control);
+			
+			$this->context->stash->set([map { $_, 0 } @parts], $factory);
+			
+		} else {
+			die new IMPL::KeyNotFoundException($control);
+		}
+		
+	}
+}
+
+sub Render {
+	my ($this,$param) = @_;
+	
+	my $output = $this->context->process($this->template, {this => $this} );
+	
+	if ($this->layout) {
+		$output = $this->context->include($this->layout,{ content => $output });
+	}
+	
+	return $output;
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::Web::View::TTDocument> - документ для построения HTML страницы на основе шаблонов TT.
+
+=head1 SYNOPSIS
+
+=begin code
+
+use IMPL::Web::View::TTDocument();
+
+my $doc = new IMPL::Wbe::View::TTDocument($template,$ttOptions);
+
+return $doc->Render();
+
+=end code
+
+Однако, более предпочтительный способ использовать C<IMPL::Web::View::TTLoader>.
+
+=head1 DESCRIPTION
+
+Документ для представления данных. Документы представляют собой иерархически организованные данные,
+элементами данного документа являются данные для отображения, такие как
+
+=over
+
+=item * Объекты из БД
+
+=item * Навигационные цепочки
+
+=item * Меню и т.п. 
+
+=back
+
+Скприт шаблона формирует структуру документа, затем сформированная структура форматируется в готовый документ.
+Процесс преобразования объектной модели в готовый документ может быть выполнена как вручную, так и при помощи
+вспомогательного шаблона - обертки. Если у шаблона документа указан C<wrapper> в метаданных, то он будет
+использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
+обертка не задана, то результатом будет вывод самого скрипта шаблона.
+
+Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее,
+указанное при создании документа.
+
+=head2 Загрузка элемента управления
+
+=over
+
+=item 1 C<document.require(my.org.input)>
+
+=item 1 Загружает шаблон C<my/org/input.tt>
+
+=item 1 Создает фабрику элементов управления с собственным контекстом, вложенным в контекст документа.
+
+=item 1 Выполняет шаблон в пространстве имен фабрики 
+
+=item 1 Регистритует фабрику в контексте документа по пути C<my.org.input>
+
+=back
+
+=head2 Создание элемента управления
+
+=over
+
+=item 1 C<< my.org.input.new('login') >>
+
+=item 1 Если это первый элемент управления, то выполняетя статический конструктор в контексте фабрики
+
+=item 1 Создается новый дочерний контекст к контексту фабрики
+
+=item 1 Создается экземпляр элемента управления
+
+=item 1 Выполняется блок конструктора в контексте элемента управления, параметр C<this> имеет значение
+нового экземпляра элемента управления  
+
+=back
+
+=head1 MEMBERS
+
+=over
+
+=item C<CTOR($template, %options)>
+
+Создает экземпляр документа с указанным шаблоном и параметрами, параметры 
+
+=back
+
+=cut
\ No newline at end of file