# HG changeset patch # User wizard # Date 1274132017 -14400 # Node ID 6c25ea91c985af9055354f02434d2dee74e8a7ea # Parent c13a215508cad5f614bd850b798872fde431b266 ControllerUnit concept diff -r c13a215508ca -r 6c25ea91c985 Lib/IMPL/Class/Meta.pm --- a/Lib/IMPL/Class/Meta.pm Mon May 17 17:42:27 2010 +0400 +++ b/Lib/IMPL/Class/Meta.pm Tue May 18 01:33:37 2010 +0400 @@ -200,7 +200,7 @@ sub say_version { my ($self) = @_; - print $self->class_data(info)->{version}; + print $self->class_data('info')->{version}; } package Bar; diff -r c13a215508ca -r 6c25ea91c985 Lib/IMPL/Web/Application/ControllerUnit.pm --- a/Lib/IMPL/Web/Application/ControllerUnit.pm Mon May 17 17:42:27 2010 +0400 +++ b/Lib/IMPL/Web/Application/ControllerUnit.pm Tue May 18 01:33:37 2010 +0400 @@ -8,6 +8,9 @@ public property action => prop_get | owner_set; public property application => prop_get | owner_set; public property query => prop_get | owner_set; + public property formData => prop_get | owner_set; + public property formSchema => prop_get | owner_set; + public property formErrors => prop_get | owner_set; } sub CTOR { @@ -27,4 +30,162 @@ } else { die new IMPL::InvalidOperationException("Invalid method call",$self,$method); } -} \ No newline at end of file +} + +1; + +__END__ + +=pod + +=head1 NAME + +C - базовый класс для обработчика транзакций в модели контроллера. + +=head1 DESCRIPTION + +Классы, наследуемые от данного класса используются для выполнения транзакций, которые приходят +через контроллер запросов. Как правило один класс представляет собой пакет транзакций, каждая +из которых является независимой от другой. + +Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция. +Для этого вызывается метод C, который создает/восстанавливает контекст +транзакции. + +Транзакции на данный момент делятся на простые и формы. + +=head2 Простые транзакции + +Простые транзакции получаю только запрос, без предварительной обработки, и возвращенный результат напрямую +передается пользователю. + +=head2 Формы + +При использовании форм запрос предварительно обрабатывается, для получения DOM документа с данными формы. +Для постороенния DOM документа используется схема. При этом становятся доступны дополнительные свойства +C, C, C. + +Результат выполнения транзакции не возвращается напрямую пользователю, а включается в общий ответ, который +выглядит следующим образом + +=begin code + +{ + state => '{ new | correct | invalid }', + result => $transactionResult, + formData => $formDOM, + formSchema => $formSchema, + formErrors => @errors +} + +=end code + +=over + +=item C + +Состояние верификации формы. + +=over + +=item C + +Первоначальное содержимое формы, оно может быть некорректным, но это нормально. +В данном состоянии транзакция обычно не выполняется. + +=item C + +Данные формы корректны, транзакция выполнена, и ее результат доступен через поле C + +=item C + +Содержимое формы не прошло верификацию, ошибки доступны через поле C. Транзакция +не выполнялась. + +=back + +=item C + +Результат выполнения транзакции, если конечно таковая выполнялась. + +=item C + +ДОМ документ с данными формами. Документ существует всегда, не зависимо от его корректности, +может быть использован для построения формы, уже заполненную параметрами. + +=item C + +Схема данных формы, может использоваться для построения динамических форм. + +=item C + +Ошибки верификации данных, если таковые были + +=back + +=head1 MEMBERS + +=over + +=item C<[get] application> + +=item C<[get] query> + +=item C<[get] response> + +=item C<[get] formData> + +=item C<[get] formSchema> + +=item C<[get] formErrors> + +=item C + +Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по +своимправилам. + +=back + +=head1 EXAMPLE + +=begin code + +package MyBooksUnit; +use strict; +use base qw(IMPL::Web::Application::ControllerUnit); + +__PACKAGE__->PassThroughArgs; + +__PACKAGE__->transactions(qw( + find + info +)); +__PACKAGE__->forms( + create => 'books.create.xml' +); + +sub find { + my ($this) = @_; + + return $this->application->dataSource->resultset('Books')->find({author => $this->query->param('author')}); +} + +sub info { + my ($this) = @_; + + return $this->application->dataSource->resultset('Books')->find({id => $this->query->param('id')}); +} + +sub create { + my ($this) = @_; + + my %book = map { + $_ => $this->formData->selectSingleNode($_)->nodeValue + } qw(author_id title year ISBN); + + return $this->application->datasource->resultset('Books')->create(\%book); +} + +=end code + +=cut \ No newline at end of file