diff Lib/IMPL/Web/View/TTDocument.pm @ 190:cd1ff7029a63

IMLP::Web::View refactored, added new method 'require' which is available inside templates. Changed document rendering.
author cin
date Wed, 04 Apr 2012 17:51:27 +0400
parents 08015e2803f1
children 78a18a2b6266
line wrap: on
line diff
--- a/Lib/IMPL/Web/View/TTDocument.pm	Wed Apr 04 02:49:45 2012 +0400
+++ b/Lib/IMPL/Web/View/TTDocument.pm	Wed Apr 04 17:51:27 2012 +0400
@@ -6,6 +6,8 @@
 use IMPL::Web::View::TTFactory();
 use IMPL::Web::View::TTControl();
 
+use Scalar::Util qw(weaken);
+
 
 use parent qw(
 	IMPL::DOM::Document
@@ -33,6 +35,17 @@
 	
 	$this->opts($refOpts);
 	$this->stash($this->context->stash);
+	
+	my $self = $this;
+	weaken($self);
+	
+	$this->templateVars('require', sub {
+		my $doc = $self;
+		die new IMPL::Exception("A document is destroyed or invalid") unless $doc;
+		$doc->require(@_);
+	});
+	
+	$this->templateVars('document', sub { $self } );
 }
 
 our %CTOR = (
@@ -98,15 +111,27 @@
 sub Render {
 	my ($this,$args) = @_;
 	
-	my $output = $this->SUPER::Render( { document => $this } );
+	my $output;
 	
 	if ($this->layout) {
-		$output = $this->context->include($this->layout, { content => $output } );
+		$output = $this->context->include(
+			$this->layout,
+			{
+				content => sub { $output ||= $this->RenderContent($args); }
+			}
+		);
+	} else {
+		return $this->RenderContent($args);
 	}
 	
 	return $output;
 }
 
+sub RenderContent {
+	my $this = shift;
+	return $this->SUPER::Render(@_);
+}
+
 
 1;
 
@@ -153,8 +178,7 @@
 использован как шаблон для форматирования объектной модели, вывод самого шаблона будет проигнорирован. Если
 обертка не задана, то результатом будет вывод самого скрипта шаблона.
 
-Каждый документ имеет свое собственное пространство имен, которое может быть вложенным в некоторое внешнее,
-указанное при создании документа.
+
 =head2 Порядок обработки документа
 
 =over
@@ -172,7 +196,7 @@
 
 =over
 
-=item 1 C<document.require('my/org/input')>
+=item 1 C<require('my/org/input')>
 
 =item 1 Загружает шаблон C<my/org/input.tt>