Mercurial > pub > Impl
diff Lib/IMPL/Web/Application/ControllerUnit.pm @ 113:7b14e0122b79
Updated PostToDOM transformation
added selectSingleNode method to IMPL::DOM::Node
Implemented FormWrapper in the Web::Application::ControllerUnit
author | wizard |
---|---|
date | Fri, 21 May 2010 02:38:11 +0400 |
parents | 0ed8e2541b1c |
children | c8dfbbdd8005 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/ControllerUnit.pm Tue May 18 17:59:31 2010 +0400 +++ b/Lib/IMPL/Web/Application/ControllerUnit.pm Fri May 21 02:38:11 2010 +0400 @@ -5,6 +5,8 @@ use IMPL::Class::Property; use IMPL::DOM::Transform::PostToDOM; use IMPL::DOM::Schema; +use Class::Inspector; +use File::Spec; use constant { CONTROLLER_METHODS => 'controller_methods', @@ -22,6 +24,8 @@ public property formErrors => prop_get | owner_set; } +__PACKAGE__->class_data(CONTROLLER_METHODS,{}); + sub CTOR { my ($this,$action,$args) = @_; @@ -56,7 +60,9 @@ } sub transactions { + my ($self,@names) = @_; + $self->class_data(CONTROLLER_METHODS)->{$_} = {} foreach @names; } sub InvokeAction { @@ -81,17 +87,49 @@ } sub FormWrapper { - my ($this,$method,$action,$methodInfo) = @_; + my ($self,$method,$action,$methodInfo) = @_; + + my $schema = $self->loadSchema($methodInfo->{schema}); + + my $process = $action->query->param('process') || 0; + my $form = $methodInfo->{form} + || $action->query->param('form') + || $schema->selectSingleNode('ComplexNode')->name + or die new IMPL::Exception('No situable form name could be determined',$self,$method); - my $schema = $this->loadSchema($methodInfo->{schema}); + my %result; - my $process = $this->query->param('process') || 0; + my $transform = IMPL::DOM::Transform::PostToDOM->new( + undef, + $schema, + $form + ); + + $result{formSchema} = $schema; + $result{formData} = $transform->Transform($self->query); - + if ($process) { + $result{formErrors} = $transform->Errors->as_list; + if ($transform->Errors->Count) { + $result{state} = STATE_INVALID; + } else { + $result{state} = STATE_CORRECT; + my $unit = $self->new($action,\%result); + $result{result} = $unit->method(); + } + } else { + $result{state} = STATE_NEW; + } - my %result = ( - - ); + return \%result; +} + +sub loadSchema { + my ($self,$name) = @_; + + my ($vol,$dir,$file) = File::Spec->splitpath( Class::Inspector->resolved_filename(ref $self || $self) ); + + return IMPL::DOM::Schema->LoadSchema(File::Spec->catfile($vol,$dir,$name)); } 1; @@ -106,9 +144,8 @@ =head1 DESCRIPTION -Классы, наследуемые от данного класса используются для выполнения транзакций, которые приходят -через контроллер запросов. Как правило один класс представляет собой пакет транзакций, каждая -из которых является независимой от другой. +Классы, наследуемые от данного класса называется пакетом транзакций. Часть методов в таком классе +объявляются как транзакции при помощи методов C<transaction>, C<form>. Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция. Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст