Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/Metadata/FormMeta.pm @ 371:d5c8b955bf8d
refactoring
author | cin |
---|---|
date | Fri, 13 Dec 2013 16:49:47 +0400 |
parents | 010ceafd0c5a |
children | 2f16f13b000c |
comparison
equal
deleted
inserted
replaced
370:cbf4febf0930 | 371:d5c8b955bf8d |
---|---|
1 package IMPL::Web::View::Metadata::FormMeta; | 1 package IMPL::Web::View::Metadata::FormMeta; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use IMPL::lang; | |
4 use IMPL::Const qw(:prop); | 5 use IMPL::Const qw(:prop); |
5 use IMPL::declare { | 6 use IMPL::declare { |
6 require => { | 7 require => { |
7 Exception => 'IMPL::Exception', | 8 Exception => 'IMPL::Exception', |
8 ArgException => '-IMPL::InvalidArgumentException', | 9 ArgException => '-IMPL::InvalidArgumentException', |
9 OpException => '-IMPL::InvalidOperationException', | 10 OpException => '-IMPL::InvalidOperationException', |
10 SchemaNavigator => 'IMPL::DOM::Navigator::SchemaNavigator' | 11 SchemaNavigator => 'IMPL::DOM::Navigator::SchemaNavigator', |
12 DOMNode => '-IMPL::DOM::Node' | |
11 }, | 13 }, |
12 base => [ | 14 base => [ |
13 'IMPL::Web::View::Metadata::BaseMeta' => '@_' | 15 'IMPL::Web::View::Metadata::BaseMeta' => '@_' |
14 ], | 16 ], |
15 props => [ | 17 props => [ |
34 | 36 |
35 $this->$_() || die ArgException->new($_ => "The $_ is required") | 37 $this->$_() || die ArgException->new($_ => "The $_ is required") |
36 foreach qw(schema); | 38 foreach qw(schema); |
37 } | 39 } |
38 | 40 |
41 sub GetSchemaProperty { | |
42 my ($this,$name) = @_; | |
43 | |
44 return $this->decl ? $this->decl->nodeProperty($name) || $this->schema->nodeProperty($name) : $this->schema->nodeProperty($name); | |
45 } | |
46 | |
47 sub template { | |
48 shift->GetSchemaProperty('template'); | |
49 } | |
50 | |
51 sub label { | |
52 shift->GetSchemaProperty('display'); | |
53 } | |
54 | |
55 sub inputType { | |
56 shift->GetSchemaProperty('inputType'); | |
57 } | |
58 | |
59 sub inputValue { | |
60 my ($this) = @_; | |
61 | |
62 if($this->isMultiple) { | |
63 return [ | |
64 map { | |
65 $_ ? $_->nodeValue || $_->nodeProperty('rawValue') : undef | |
66 } | |
67 @{$this->model || []} | |
68 ] | |
69 } else { | |
70 return $this->model ? $this->model->nodeValue || $this->model->nodeProperty('rawValue') : undef; | |
71 } | |
72 } | |
73 | |
39 sub isMultiple { | 74 sub isMultiple { |
40 my ($this) = @_; | 75 my ($this) = @_; |
41 $this->decl && $this->decl->isMultiple; | 76 $this->decl && $this->decl->isMultiple; |
42 } | 77 } |
43 | 78 |
49 sub GetOwnErrors { | 84 sub GetOwnErrors { |
50 my ($this) = @_; | 85 my ($this) = @_; |
51 | 86 |
52 my $nodes = $this->nodes; | 87 my $nodes = $this->nodes; |
53 | 88 |
54 return [ | 89 my $errors = [ |
55 grep _IsOwnError($nodes,$this->decl,$_), @{$this->errors || []} | 90 grep _IsOwnError($nodes,$this->decl,$_), @{$this->errors || []} |
56 ]; | 91 ]; |
92 | |
93 return $errors; | |
57 } | 94 } |
58 | 95 |
59 sub _IsOwnError { | 96 sub _IsOwnError { |
60 my ($nodes,$source,$err) = @_; | 97 my ($nodes,$source,$err) = @_; |
61 | 98 |
62 return 1 if ($err->node && grep($err->node == $_, @$nodes)) || (not(@$nodes) && $err->schema == $source ); | 99 return 1 if ($err->node && grep($err->node == $_, @$nodes)) || (not(@$nodes) && $err->schema == $source ); |
63 | 100 |
64 return 0; | 101 return 0; |
65 } | 102 } |
66 | 103 |
67 sub _IsErrorRelates { | 104 sub _IsErrorRelates { |
100 | 137 |
101 my %args = ( | 138 my %args = ( |
102 name => $decl->name, | 139 name => $decl->name, |
103 decl => $decl, | 140 decl => $decl, |
104 schema => $schema, | 141 schema => $schema, |
105 nodes => \@nodes, | 142 nodes => [@nodes], |
106 errors => [grep _IsErrorRelates(\@nodes,$decl,$_), @{$this->errors || []}] | 143 errors => [grep _IsErrorRelates(\@nodes,$decl,$_), @{$this->errors || []}] |
107 ); | 144 ); |
108 | 145 |
109 my ($model,$type); | 146 my ($model,$type); |
110 | 147 |
111 if ($decl->isMultiple) { | 148 if ($decl->isMultiple) { |
112 $model = \@nodes; | 149 $model = [@nodes]; |
113 $type = 'ARRAY'; | 150 $type = 'ARRAY'; |
114 $args{holdingType} = $schema->type; | 151 $args{holdingType} = $schema->type; |
115 } else { | 152 } else { |
116 $model = shift @nodes; | 153 $model = shift @nodes; |
117 $type = $schema->type; | 154 $type = $schema->type; |
164 nodes => \@nodes | 201 nodes => \@nodes |
165 } | 202 } |
166 ); | 203 ); |
167 } | 204 } |
168 | 205 |
206 sub GetMetadataForModel { | |
207 my ($self,$model,$args) = @_; | |
208 | |
209 $args ||= {}; | |
210 | |
211 my $modelType = delete $args->{modelType}; | |
212 | |
213 if($model) { | |
214 die ArgException->new(model => "A node is required") | |
215 unless is($model,DOMNode); | |
216 | |
217 $args->{decl} ||= $model->schemaSource; | |
218 $args->{schema} ||= $model->schema; | |
219 } | |
220 | |
221 return $self->new( | |
222 $model, | |
223 $modelType, | |
224 $args | |
225 ); | |
226 } | |
227 | |
169 1; | 228 1; |
170 | 229 |
171 __END__ | 230 __END__ |
172 | 231 |
173 =pod | 232 =pod |
241 | 300 |
242 sub display_for { | 301 sub display_for { |
243 my ($index,$tmpl) = @_; | 302 my ($index,$tmpl) = @_; |
244 | 303 |
245 if ($index =~ /^\d+$/) { | 304 if ($index =~ /^\d+$/) { |
246 return render($tmpl, meta => { $meta->GetItem($index) }); | 305 return render($tmpl, metadata => { $meta->GetItem($index) }); |
247 } else { | 306 } else { |
248 return render($tmpl, meta => { $meta->GetProperty($index) }); | 307 return render($tmpl, metadata => { $meta->GetProperty($index) }); |
249 } | 308 } |
250 } | 309 } |
251 | 310 |
252 =end code | 311 =end code |
253 | 312 |