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)>, который создает/восстанавливает контекст