comparison Lib/IMPL/Web/Application/ControllerUnit.pm @ 112:0ed8e2541b1c

Form processing mechanism
author wizard
date Tue, 18 May 2010 17:59:31 +0400
parents 6c25ea91c985
children 7b14e0122b79
comparison
equal deleted inserted replaced
111:6c25ea91c985 112:0ed8e2541b1c
1 package IMPL::Web::Application::ControllerUnit; 1 package IMPL::Web::Application::ControllerUnit;
2 2 use strict;
3 use base qw(IMPL::Object); 3 use base qw(IMPL::Object);
4 4
5 use IMPL::Class::Property; 5 use IMPL::Class::Property;
6 use IMPL::DOM::Transform::PostToDOM;
7 use IMPL::DOM::Schema;
8
9 use constant {
10 CONTROLLER_METHODS => 'controller_methods',
11 STATE_CORRECT => 'correct',
12 STATE_NEW => 'new',
13 STATE_INVALID => 'invalid'
14 };
6 15
7 BEGIN { 16 BEGIN {
8 public property action => prop_get | owner_set; 17 public property action => prop_get | owner_set;
9 public property application => prop_get | owner_set; 18 public property application => prop_get | owner_set;
10 public property query => prop_get | owner_set; 19 public property query => prop_get | owner_set;
12 public property formSchema => prop_get | owner_set; 21 public property formSchema => prop_get | owner_set;
13 public property formErrors => prop_get | owner_set; 22 public property formErrors => prop_get | owner_set;
14 } 23 }
15 24
16 sub CTOR { 25 sub CTOR {
17 my ($this,$action) = @_; 26 my ($this,$action,$args) = @_;
18 27
19 $this->action($action); 28 $this->action($action);
20 $this->application($action->application); 29 $this->application($action->application);
21 $this->query($action->query); 30 $this->query($action->query);
31
32 $this->$_($args->{$_}) foreach qw(formData formSchema formErrors);
33 }
34
35 sub forms {
36 my ($self,%forms) = @_;
37
38 while ( my ($method,$info) = each %forms ) {
39 die new IMPL::Exception("A method doesn't exists in the controller",$self,$method) unless $self->can($method);
40 if ( not ref $info ) {
41 $self->class_data(CONTROLLER_METHODS)->{$method} = {
42 wrapper => 'FormWrapper',
43 schema => $info
44 };
45 } elsif (ref $info eq 'HASH') {
46 die new IMPL::Exception("A schema must be specified",$self,$method) unless $info->{schema};
47
48 $self->class_data(CONTROLLER_METHODS)->{$method} = {
49 wrapper => 'FormWrapper',
50 schema => $info->{schema}
51 };
52 } else {
53 die new IMPL::Exception("Unsupported method information",$self,$method);
54 }
55 }
56 }
57
58 sub transactions {
59
22 } 60 }
23 61
24 sub InvokeAction { 62 sub InvokeAction {
25 my ($self,$method,$action) = @_; 63 my ($self,$method,$action) = @_;
26 64
27 if ($self->can($method)) { 65 if (my $methodInfo = $self->class_data(CONTROLLER_METHODS)->{$method}) {
28 my $unit = $self->new($action); 66 if (my $wrapper = $methodInfo->{wrapper}) {
29 $unit->$method(); 67 return $self->$wrapper($method,$action,$methodInfo);
68 } else {
69 return $self->TransactionWrapper($method,$action,$methodInfo);
70 }
30 } else { 71 } else {
31 die new IMPL::InvalidOperationException("Invalid method call",$self,$method); 72 die new IMPL::InvalidOperationException("Invalid method call",$self,$method);
32 } 73 }
74 }
75
76 sub TransactionWrapper {
77 my ($self,$method,$action,$methodInfo) = @_;
78
79 my $unit = $self->new($action);
80 return $unit->$method();
81 }
82
83 sub FormWrapper {
84 my ($this,$method,$action,$methodInfo) = @_;
85
86 my $schema = $this->loadSchema($methodInfo->{schema});
87
88 my $process = $this->query->param('process') || 0;
89
90
91
92 my %result = (
93
94 );
33 } 95 }
34 96
35 1; 97 1;
36 98
37 __END__ 99 __END__
140 =item C<[get] formErrors> 202 =item C<[get] formErrors>
141 203
142 =item C<InvokeAction($method,$action)> 204 =item C<InvokeAction($method,$action)>
143 205
144 Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по 206 Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по
145 своимправилам. 207 своим правилам.
208
209 =item C<TransactionWrapper($method,$action,$methodInfo)>
210
211 Обертка для конструирования простых транзакций, может быть переопределен для конструирования контекста по
212 своим правилам.
213
214 =item C<FormWrapper($method,$action,$methodInfo)>
215
216 Обертка для конструирования форм, может быть переопределен для конструирования контекста по
217 своим правилам.
146 218
147 =back 219 =back
148 220
149 =head1 EXAMPLE 221 =head1 EXAMPLE
150 222