# HG changeset patch # User cin # Date 1357773902 -14400 # Node ID 6b6d4b2275a1b4ae89c77b88b33ded28290ada28 # Parent c9c2ec29793f9066374518477ac628d6fa81970f improved documentation diff -r c9c2ec29793f -r 6b6d4b2275a1 Lib/IMPL/DOM/Schema/ValidationError.pm --- a/Lib/IMPL/DOM/Schema/ValidationError.pm Wed Jan 09 17:55:43 2013 +0400 +++ b/Lib/IMPL/DOM/Schema/ValidationError.pm Thu Jan 10 03:25:02 2013 +0400 @@ -69,26 +69,26 @@ =over -=item C<[get] Node> +=item C<[get] node> Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо узлы, которые не могут присутствоать в данном месте по схеме. Данное свойство может быть C. -=item C<[get] Parent> +=item C<[get] parent> -Родительский узел в котором произошла ошибка. Используется в случаях, когда C +Родительский узел в котором произошла ошибка. Используется в случаях, когда C не указан, например, если по схеме должен существовать дочерний узел с определенным именем, а в реальном документе его нет. Также это свойство может использоваться при формировании сообщения. -=item C<[get] Schema> +=item C<[get] schema> Схема для C или узла который должен присутсвовать если C не задан. -=item C<[get] Source> +=item C<[get] source> Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут использовать ссылки, то данное свойство нужно для получения схемы узла, а не @@ -98,7 +98,7 @@ типа, например, C, а свойство C будет указывать именно на C. -=item C<[get] Message> +=item C<[get] message> Возвращает форматированное сообщение об ошибке. @@ -120,7 +120,7 @@ my $node = $doc->selectSingleNode('user','name'); # Получаем все ошибки относящиеся к данному узлу -my @nodeErrors = grep { ($_->Node || $_->Parent) == $node } @errors; +my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; =end code diff -r c9c2ec29793f -r 6b6d4b2275a1 Lib/IMPL/Web/View/TTControl.pm --- a/Lib/IMPL/Web/View/TTControl.pm Wed Jan 09 17:55:43 2013 +0400 +++ b/Lib/IMPL/Web/View/TTControl.pm Thu Jan 10 03:25:02 2013 +0400 @@ -142,39 +142,113 @@ =head1 SYNPOSIS +=begin text + +[% + META version = 1; + BLOCK INIT; + # this is a document scope + dojo.require.push( 'dijit/form/Input' ); + END; + BLOCK CTOR; + # local to this block + TPreview = require('My/Org/TextPreview'); + + # init control props + this.dojoClass = this.dojoClass || 'dijit.form.Input'; + this.visualClass = this.visualClass || 'classic'; + this.childNodes = []; + + # init content + FOREACH text IN this.data; + this.childNodes.push( TPreview.new('preview', nodeValue = text ) ); + END; + + END; +%] + +
+ [% FOREACH node IN this.childNodes %] + [% node.Render() %] +
+ [% END %] +
+ +=end text + =head1 DESCRIPTION +Представляет собой фрагмент документа, который имеет шаблон для отображения, +набор свойств и т.п. + =head2 BLOCKS +=head3 META + +Атрибуты C C, C будут перенесены в свойства элемента +управления. + =head3 INIT -Данный блок шаблона управления выполняется один раз при создании первого экземпляра элемента управления, -может использоваться для формирования заголовочной части документа, скрипта подключающего ajax модули -при необходимости и т.п. +Данный блок шаблона управления выполняется один раз при создании первого +экземпляра элемента управления, в пространстве имен документа. Может +использоваться для формирования заголовочной части документа, скрипта +подключающего C<js> модули и т.п. + +Выполнение данного блока производится фабрикой элементов управления. =head3 CTOR -данный блок выполняется каждый раз при создании нового экземпляра элемента управления, при этом переменная C<this> -указывает на эземпляр элемента упарвления. Данный блок можно использовать для инициализации свойств элемента +данный блок выполняется каждый раз при создании нового экземпляра элемента +управления, при этом переменная C<this> указывает на эземпляр элемента +упарвления. Данный блок можно использовать для инициализации свойств элемента управления. =head3 RENDER -Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и есть результат отображения элемента управления. -Если в шаблоне нет блока C<RENDER>, то сам шаблон считается таковым. +Данный блок выполняется при вызове метода C<Render()>, вывод данного блока и +есть результат отображения элемента управления. Если в шаблоне нет блока +C<RENDER>, то сам шаблон считается таковым. =head2 TEMPLATE VARS -Каждый шаблон имеет собственное пространство имен, унаследованное от пространства имен фабрики элементов (которая в свою очередь наследует контекст документа). -В шаблоне могут определяться новые переменные, которые разделяются между блоками. Также доступны стандартные переменные +Каждый шаблон имеет собственное пространство имен, вложенное в пространство имен +фабрики элементов (которая разделяет пространство имен документа). В шаблоне +могут определяться новые переменные, однако они останутся локальными для блоков. + +Чтобы передать данные между блоками следует использовать ссылку на элемент +управления C<this>. + +=begin text + +[% + BLOCK CTOR; + this.extraCssClass = 'active'; + text = "this text will gone"; + END; +%] + +<div class="$this.extraCssClass">some text $text</div> + +=end text + +В примере выше переменная C<$text> установленная в конструкторе шаблона, при +отображении элемента управления будет неопределена. =over -=item * C<this> ссылка на объект элемента управления +=item * C<this> + +ссылка на объект элемента управления + +=item * C<component> -=item * C<component> ссылка на текущий шаблон, устанавливается автоматически в методе C<Template::Context::process>. +ссылка на текущий шаблон, устанавливается автоматически в методе +C<Template::Context::process>. -=item * C<template> ссылка на шаблон элемента управления, для совместимости с C<TT> +=item * C<template> + +ссылка на шаблон элемента управления, для совместимости с C<TT> =back @@ -184,8 +258,9 @@ =item * C<[get]context> -Контекст элемента управления, хранит пременные шаблона. Наследуется от контекста фабрики элементов управления, который -наследуется от контекста документа. +Контекст элемента управления, хранит пременные шаблона. Передается в +конструкторе. Фабрика элементов управления создает новый контекст пространство +имен которого вложено в пространство имен документа. =item * C<[get,set]template> @@ -193,11 +268,10 @@ =item * C<AUTOLOAD> -Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим свойствам через метод C<AUTOLOAD>. +Для удобства работы с шаблоном, элементы управления предоставляю доступ к своим +свойствам через метод C<AUTOLOAD>. Имена свойств должны начинаться со строчной +буквы. =back - -C<lang ru> - =cut \ No newline at end of file diff -r c9c2ec29793f -r 6b6d4b2275a1 Lib/IMPL/Web/View/TTLoader.pm --- a/Lib/IMPL/Web/View/TTLoader.pm Wed Jan 09 17:55:43 2013 +0400 +++ b/Lib/IMPL/Web/View/TTLoader.pm Thu Jan 10 03:25:02 2013 +0400 @@ -1,31 +1,33 @@ package IMPL::Web::View::TTLoader; use strict; -use IMPL::lang qw(:declare); - -use Template::Provider(); -use Template::Context(); use Template::Constants qw(:status); -use IMPL::Web::View::TTDocument(); - -use parent qw( - IMPL::Object - IMPL::Object::Serializable -); - -BEGIN { - public property options => PROP_ALL; - public property provider => PROP_GET | PROP_OWNERSET; - public property context => PROP_GET | PROP_OWNERSET; - public property ext => PROP_ALL; - public property layoutBase => PROP_GET | PROP_OWNERSET; - - public property isInitialized => PROP_GET | PROP_OWNERSET; - public property initializer => PROP_GET | PROP_OWNERSET; - - private property _globals => PROP_ALL; -} +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + Provider => 'Template::Provider', + Context => 'Template::Context', + TTDocument => 'IMPL::Web::View::TTDocument', + Exception => 'IMPL::Exception', + ArgumentException => '-IMPL::InvalidArgumentException', + KeyNotFoundException => '-IMPL::KeyNotFoundException' + }, + base => [ + 'IMPL::Object' => undef, + 'IMPL::Object::Serializable' => undef + ], + props => [ + options => PROP_RO, + provider => PROP_RO, + context => PROP_RO, + ext => PROP_RO, + layoutBase => PROP_RO, + isInitialized => PROP_RO, + initializer => PROP_RO, + _globals => PROP_RW + ] +}; sub save { my ($this,$context) = @_; @@ -61,9 +63,9 @@ $this->layoutBase($args{layoutBase}) if $args{layoutBase}; # to aviod cyclic references we need to do a copy of $refOpts - $refOpts->{LOAD_TEMPLATES} = $this->provider(new Template::Provider( { %$refOpts } )); + $refOpts->{LOAD_TEMPLATES} = $this->provider(Provider->new( { %$refOpts } )); - $this->context(new Template::Context($refOpts)); + $this->context(Context->new($refOpts)); } sub document { @@ -78,7 +80,7 @@ $opts->{STASH} = $this->context->stash->clone(); $opts->{LOAD_TEMPLATES} = $this->provider; - return new IMPL::Web::View::TTDocument( $tt, $opts, $this, $vars ); + return TTDocument->new( $tt, $opts, $this, $vars ); } sub template { @@ -86,16 +88,16 @@ $name =~ s/^\s+|\s+$//g; - die new IMPL::InvalidArgumentException("A valid template name is required") unless length $name; + die ArgumentException->new("A valid template name is required") unless length $name; $name = $this->_appendExt($name); my ($tt,$error) = $this->provider->fetch($name); if (defined $error and $error == STATUS_DECLINED) { - die new IMPL::KeyNotFoundException($name); + die KeyNotFoundException->($name); } elsif (defined $error and $error == STATUS_ERROR) { - die new IMPL::Exception("Failed to load a template", $name, $tt); + die Exception->new("Failed to load a template", $name, $tt); } return $tt; @@ -136,7 +138,7 @@ $this->context->process($initializer,$this->_globals); }; if (my $e = $@) { - die new IMPL::Exception("Failed to process an initializer", $this->initializer, $e); + die Exception->new("Failed to process an initializer", $this->initializer, $e); } $this->isInitialized(1); @@ -179,9 +181,60 @@ =head1 DESCRIPTION +Провайдер для загрузки шаблонов и документов. Имеет собственное пространство +имен, контекст выполнения шаблонов. Контект загрузчика инициализируется +шаблоном, в котором определяются глобальные переменные, которые будут доступны +в документах, однако их изменения будут локализованы. + +Инициализация контекста провайдера происходит при первой загрузке любого +документа. + =head1 MEMBERS +=head2 C<CTOR($options,%args)> + +=over + +=item * C<$options> + +Параметры контекста загрузчика, контексты документов и элементов управления +также унаследуют эти свойства. Напрямую передаются в конструктор +C<Template::Context>. + +=item * C<%args> + +Именованные параметы загрузчика. + +=over + +=item * C<ext> + +Расширение, которое будет добавляться к именам шаблонов и документов (если оно +не будет указано явно). + +=item * C<initializer> + +Имя шаблона, который будет использован для инициализации контекста. + +=item * C<globals> + +Глобальные переменнын, которые будут переданы в контекст. + +=item * C<layoutBase> + +Путь к шаблонам для оформления документов. Каждый документ может задавать свой +C<layout> указанный в его C<META> блоке или конструкторе. +См. C<IMPL::View::TTDocument>. + +=back + +=back + =head2 C<document($docName)> +Загружает документ с именем C<$docName>. При необходимости к нему будет +добавлено расширение, указанное в свойстве C<ext>. Это единственно полезный +метод провайдера. + =cut diff -r c9c2ec29793f -r 6b6d4b2275a1 Lib/IMPL/Web/ViewResult.pm --- a/Lib/IMPL/Web/ViewResult.pm Wed Jan 09 17:55:43 2013 +0400 +++ b/Lib/IMPL/Web/ViewResult.pm Thu Jan 10 03:25:02 2013 +0400 @@ -49,7 +49,8 @@ =head1 DESCRIPTION -Сожержит в себе информацию для представления модели. +Сожержит в себе информацию для представления модели. Также включает поля для +заголовков ответа C<cookies>, C<headers>, C<status>. =head1 MEMBERS