comparison 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
comparison
equal deleted inserted replaced
112:0ed8e2541b1c 113:7b14e0122b79
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; 6 use IMPL::DOM::Transform::PostToDOM;
7 use IMPL::DOM::Schema; 7 use IMPL::DOM::Schema;
8 use Class::Inspector;
9 use File::Spec;
8 10
9 use constant { 11 use constant {
10 CONTROLLER_METHODS => 'controller_methods', 12 CONTROLLER_METHODS => 'controller_methods',
11 STATE_CORRECT => 'correct', 13 STATE_CORRECT => 'correct',
12 STATE_NEW => 'new', 14 STATE_NEW => 'new',
19 public property query => prop_get | owner_set; 21 public property query => prop_get | owner_set;
20 public property formData => prop_get | owner_set; 22 public property formData => prop_get | owner_set;
21 public property formSchema => prop_get | owner_set; 23 public property formSchema => prop_get | owner_set;
22 public property formErrors => prop_get | owner_set; 24 public property formErrors => prop_get | owner_set;
23 } 25 }
26
27 __PACKAGE__->class_data(CONTROLLER_METHODS,{});
24 28
25 sub CTOR { 29 sub CTOR {
26 my ($this,$action,$args) = @_; 30 my ($this,$action,$args) = @_;
27 31
28 $this->action($action); 32 $this->action($action);
54 } 58 }
55 } 59 }
56 } 60 }
57 61
58 sub transactions { 62 sub transactions {
59 63 my ($self,@names) = @_;
64
65 $self->class_data(CONTROLLER_METHODS)->{$_} = {} foreach @names;
60 } 66 }
61 67
62 sub InvokeAction { 68 sub InvokeAction {
63 my ($self,$method,$action) = @_; 69 my ($self,$method,$action) = @_;
64 70
79 my $unit = $self->new($action); 85 my $unit = $self->new($action);
80 return $unit->$method(); 86 return $unit->$method();
81 } 87 }
82 88
83 sub FormWrapper { 89 sub FormWrapper {
84 my ($this,$method,$action,$methodInfo) = @_; 90 my ($self,$method,$action,$methodInfo) = @_;
85 91
86 my $schema = $this->loadSchema($methodInfo->{schema}); 92 my $schema = $self->loadSchema($methodInfo->{schema});
87 93
88 my $process = $this->query->param('process') || 0; 94 my $process = $action->query->param('process') || 0;
89 95 my $form = $methodInfo->{form}
90 96 || $action->query->param('form')
91 97 || $schema->selectSingleNode('ComplexNode')->name
92 my %result = ( 98 or die new IMPL::Exception('No situable form name could be determined',$self,$method);
93 99
100 my %result;
101
102 my $transform = IMPL::DOM::Transform::PostToDOM->new(
103 undef,
104 $schema,
105 $form
94 ); 106 );
107
108 $result{formSchema} = $schema;
109 $result{formData} = $transform->Transform($self->query);
110
111 if ($process) {
112 $result{formErrors} = $transform->Errors->as_list;
113 if ($transform->Errors->Count) {
114 $result{state} = STATE_INVALID;
115 } else {
116 $result{state} = STATE_CORRECT;
117 my $unit = $self->new($action,\%result);
118 $result{result} = $unit->method();
119 }
120 } else {
121 $result{state} = STATE_NEW;
122 }
123
124 return \%result;
125 }
126
127 sub loadSchema {
128 my ($self,$name) = @_;
129
130 my ($vol,$dir,$file) = File::Spec->splitpath( Class::Inspector->resolved_filename(ref $self || $self) );
131
132 return IMPL::DOM::Schema->LoadSchema(File::Spec->catfile($vol,$dir,$name));
95 } 133 }
96 134
97 1; 135 1;
98 136
99 __END__ 137 __END__
104 142
105 C<IMPL::Web::Application::ControllerUnit> - базовый класс для обработчика транзакций в модели контроллера. 143 C<IMPL::Web::Application::ControllerUnit> - базовый класс для обработчика транзакций в модели контроллера.
106 144
107 =head1 DESCRIPTION 145 =head1 DESCRIPTION
108 146
109 Классы, наследуемые от данного класса используются для выполнения транзакций, которые приходят 147 Классы, наследуемые от данного класса называется пакетом транзакций. Часть методов в таком классе
110 через контроллер запросов. Как правило один класс представляет собой пакет транзакций, каждая 148 объявляются как транзакции при помощи методов C<transaction>, C<form>.
111 из которых является независимой от другой.
112 149
113 Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция. 150 Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция.
114 Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст 151 Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст
115 транзакции. 152 транзакции.
116 153