| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package FormValidator::LazyWay; |
|
2
|
|
|
|
|
|
|
|
|
3
|
26
|
|
|
26
|
|
1494013
|
use strict; |
|
|
26
|
|
|
|
|
78
|
|
|
|
26
|
|
|
|
|
2626
|
|
|
4
|
26
|
|
|
26
|
|
143
|
use warnings; |
|
|
26
|
|
|
|
|
47
|
|
|
|
26
|
|
|
|
|
1535
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
26
|
|
|
26
|
|
359
|
use base qw/Class::Accessor::Fast/; |
|
|
26
|
|
|
|
|
212
|
|
|
|
26
|
|
|
|
|
24099
|
|
|
7
|
26
|
|
|
26
|
|
175287
|
use FormValidator::LazyWay::Rule; |
|
|
26
|
|
|
|
|
91
|
|
|
|
26
|
|
|
|
|
247
|
|
|
8
|
26
|
|
|
26
|
|
20800
|
use FormValidator::LazyWay::Message; |
|
|
26
|
|
|
|
|
104
|
|
|
|
26
|
|
|
|
|
271
|
|
|
9
|
26
|
|
|
26
|
|
22597
|
use FormValidator::LazyWay::Fix; |
|
|
26
|
|
|
|
|
73
|
|
|
|
26
|
|
|
|
|
602
|
|
|
10
|
26
|
|
|
26
|
|
18519
|
use FormValidator::LazyWay::Filter; |
|
|
26
|
|
|
|
|
72
|
|
|
|
26
|
|
|
|
|
274
|
|
|
11
|
26
|
|
|
26
|
|
16791
|
use FormValidator::LazyWay::Utils; |
|
|
26
|
|
|
|
|
92
|
|
|
|
26
|
|
|
|
|
432
|
|
|
12
|
26
|
|
|
26
|
|
17948
|
use FormValidator::LazyWay::Result; |
|
|
26
|
|
|
|
|
88
|
|
|
|
26
|
|
|
|
|
1694
|
|
|
13
|
26
|
|
|
26
|
|
928
|
use UNIVERSAL::require; |
|
|
26
|
|
|
|
|
56
|
|
|
|
26
|
|
|
|
|
1489
|
|
|
14
|
26
|
|
|
26
|
|
1170
|
use Carp; |
|
|
26
|
|
|
|
|
62
|
|
|
|
26
|
|
|
|
|
1699
|
|
|
15
|
26
|
|
|
26
|
|
153
|
use Data::Dumper; |
|
|
26
|
|
|
|
|
1486
|
|
|
|
26
|
|
|
|
|
139173
|
|
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
our $VERSION = '0.20'; |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
__PACKAGE__->mk_accessors(qw/config unicode rule message fix filter result_class/); |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub new { |
|
22
|
41
|
|
|
41
|
1
|
471682
|
my $class = shift; |
|
23
|
|
|
|
|
|
|
|
|
24
|
41
|
|
|
|
|
102
|
my $args; |
|
25
|
41
|
100
|
|
|
|
216
|
if ( ref $_[0] eq 'HASH' ) { |
|
26
|
24
|
|
|
|
|
56
|
$args = shift; |
|
27
|
|
|
|
|
|
|
} |
|
28
|
|
|
|
|
|
|
else { |
|
29
|
17
|
|
|
|
|
73
|
my %args = @_; |
|
30
|
17
|
|
|
|
|
46
|
$args = \%args; |
|
31
|
|
|
|
|
|
|
} |
|
32
|
|
|
|
|
|
|
|
|
33
|
41
|
50
|
|
|
|
253
|
croak 'you must set config' unless $args->{config}; |
|
34
|
|
|
|
|
|
|
|
|
35
|
41
|
|
|
|
|
150
|
my $self = bless $args, $class; |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
|
|
38
|
41
|
100
|
|
|
|
389
|
if( $args->{result_class} ) { |
|
39
|
1
|
50
|
|
|
|
7
|
$args->{result_class}->require or die $@; |
|
40
|
1
|
|
|
|
|
220
|
$self->{result_class} = $args->{result_class}; |
|
41
|
|
|
|
|
|
|
} |
|
42
|
|
|
|
|
|
|
else { |
|
43
|
40
|
|
|
|
|
161
|
$self->{result_class} = 'FormValidator::LazyWay::Result'; |
|
44
|
|
|
|
|
|
|
} |
|
45
|
|
|
|
|
|
|
|
|
46
|
41
|
50
|
33
|
|
|
5613
|
if ( $self->unicode || $self->{config}->{unicode} ) { |
|
47
|
0
|
0
|
|
|
|
0
|
Data::Visitor::Encode->require or die 'unicode option require Data::Visitor::Encode. Please Install it.'; |
|
48
|
0
|
|
|
|
|
0
|
my $dev = Data::Visitor::Encode->new(); |
|
49
|
0
|
|
|
|
|
0
|
$self->config( $dev->decode('utf8', $self->config) ); |
|
50
|
|
|
|
|
|
|
} |
|
51
|
|
|
|
|
|
|
|
|
52
|
41
|
|
|
|
|
1134
|
my $rule = FormValidator::LazyWay::Rule->new( config => $self->config ); |
|
53
|
41
|
|
|
|
|
207
|
my $fix = FormValidator::LazyWay::Fix->new( config => $self->config ); |
|
54
|
41
|
|
|
|
|
184
|
my $filter = FormValidator::LazyWay::Filter->new( config => $self->config ); |
|
55
|
41
|
|
|
|
|
171
|
my $message = FormValidator::LazyWay::Message->new( |
|
56
|
|
|
|
|
|
|
config => $self->config, |
|
57
|
|
|
|
|
|
|
rule => $rule |
|
58
|
|
|
|
|
|
|
); |
|
59
|
|
|
|
|
|
|
|
|
60
|
41
|
|
|
|
|
121
|
$self->{rule} = $rule; |
|
61
|
41
|
|
|
|
|
115
|
$self->{fix} = $fix; |
|
62
|
41
|
|
|
|
|
105
|
$self->{filter} = $filter; |
|
63
|
41
|
|
|
|
|
95
|
$self->{message} = $message; |
|
64
|
|
|
|
|
|
|
|
|
65
|
41
|
|
|
|
|
339
|
return $self; |
|
66
|
|
|
|
|
|
|
} |
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
sub label { |
|
69
|
0
|
|
|
0
|
0
|
0
|
my $self = shift; |
|
70
|
0
|
|
|
|
|
0
|
my $lang = $self->message->lang; |
|
71
|
0
|
|
|
|
|
0
|
return $self->message->labels->{ $lang } ; |
|
72
|
|
|
|
|
|
|
} |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
sub check { |
|
75
|
40
|
|
|
40
|
0
|
102993
|
my $self = shift; |
|
76
|
40
|
|
|
|
|
86
|
my $input = shift; |
|
77
|
40
|
50
|
|
|
|
84
|
my %profile = %{ shift || {} }; |
|
|
40
|
|
|
|
|
454
|
|
|
78
|
40
|
|
|
|
|
475
|
my $storage = { |
|
79
|
|
|
|
|
|
|
error_message => {} , |
|
80
|
|
|
|
|
|
|
valid => FormValidator::LazyWay::Utils::get_input_as_hash($input), |
|
81
|
|
|
|
|
|
|
missing => [], |
|
82
|
|
|
|
|
|
|
unknown => [], |
|
83
|
|
|
|
|
|
|
invalid => {}, |
|
84
|
|
|
|
|
|
|
fixed => {}, |
|
85
|
|
|
|
|
|
|
}; |
|
86
|
|
|
|
|
|
|
|
|
87
|
40
|
|
|
|
|
234
|
FormValidator::LazyWay::Utils::check_profile_syntax( \%profile ); |
|
88
|
|
|
|
|
|
|
|
|
89
|
40
|
|
|
|
|
194
|
my @methods = ( |
|
90
|
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
# profileを扱いやすい型にコンバート |
|
92
|
|
|
|
|
|
|
'_conv_profile', |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
'_set_dependencies', |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
'_set_dependency_groups', |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
# langをプロフィールにセット |
|
99
|
|
|
|
|
|
|
'_set_lang', |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
# デフォルトセット |
|
102
|
|
|
|
|
|
|
'_set_default', |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
# 空のフィールドのキーを消去 |
|
105
|
|
|
|
|
|
|
'_remove_empty_fields', |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
# マージが設定された項目を storage にセット |
|
108
|
|
|
|
|
|
|
'_merge', |
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
# 未定義のフィールドをセット、そしてvalidから消去 |
|
111
|
|
|
|
|
|
|
'_set_unknown', |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
# filter ループ |
|
114
|
|
|
|
|
|
|
'_filter', |
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
# missingのフィールドをセット、そしてvalidから消去 |
|
117
|
|
|
|
|
|
|
'_check_required_fields', |
|
118
|
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
# invalidチェックループ |
|
120
|
|
|
|
|
|
|
'_validation_block', |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
# fiexed ループ |
|
123
|
|
|
|
|
|
|
'_fixed', |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
); |
|
126
|
|
|
|
|
|
|
|
|
127
|
40
|
|
|
|
|
90
|
for my $method (@methods) { |
|
128
|
480
|
|
|
|
|
2687
|
$self->$method( $storage, \%profile ); |
|
129
|
|
|
|
|
|
|
} |
|
130
|
|
|
|
|
|
|
|
|
131
|
40
|
100
|
|
|
|
77
|
$storage->{has_missing} = scalar @{$storage->{missing}} ? 1 : 0 ; |
|
|
40
|
|
|
|
|
185
|
|
|
132
|
40
|
100
|
|
|
|
68
|
$storage->{has_invalid} = scalar keys %{$storage->{invalid}} ? 1 : 0 ; |
|
|
40
|
|
|
|
|
226
|
|
|
133
|
40
|
100
|
100
|
|
|
310
|
$storage->{has_error} = ( $storage->{has_missing} || $storage->{has_invalid} ) ? 1 : 0 ; |
|
134
|
40
|
100
|
100
|
|
|
309
|
$storage->{success} = ( $storage->{has_missing} || $storage->{has_invalid} ) ? 0 : 1 ; |
|
135
|
|
|
|
|
|
|
|
|
136
|
40
|
|
|
|
|
173
|
return $self->result_class->new( $storage ); |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
sub _set_error_message_for_display { |
|
140
|
41
|
|
|
41
|
|
94
|
my $self = shift; |
|
141
|
41
|
|
|
|
|
63
|
my $storage = shift; |
|
142
|
41
|
|
|
|
|
68
|
my $error_messages = shift; |
|
143
|
41
|
|
|
|
|
74
|
my $lang = shift; |
|
144
|
41
|
|
|
|
|
81
|
my $result = {}; |
|
145
|
|
|
|
|
|
|
|
|
146
|
41
|
|
|
|
|
61
|
foreach my $field ( keys %{$error_messages} ) { |
|
|
41
|
|
|
|
|
158
|
|
|
147
|
|
|
|
|
|
|
|
|
148
|
14
|
|
|
|
|
31
|
local $" = ','; |
|
149
|
14
|
|
|
|
|
27
|
my $tmp = "@{$error_messages->{$field}}"; |
|
|
14
|
|
|
|
|
64
|
|
|
150
|
14
|
|
66
|
|
|
54
|
my $label = $self->message->labels->{ $lang }{ $field } || $field; |
|
151
|
14
|
|
|
|
|
204
|
my $mes = $self->message->base_message->{ $lang }{invalid} ; |
|
152
|
14
|
|
|
|
|
196
|
$mes =~ s/__rule__/$tmp/g; |
|
153
|
14
|
|
|
|
|
73
|
$mes =~ s/__field__/$label/g; |
|
154
|
|
|
|
|
|
|
|
|
155
|
14
|
|
|
|
|
64
|
$result->{$field} = $mes; |
|
156
|
|
|
|
|
|
|
} |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
# setting missing error message |
|
159
|
41
|
100
|
|
|
|
72
|
if ( scalar @{ $storage->{missing} } ) { |
|
|
41
|
|
|
|
|
179
|
|
|
160
|
10
|
|
|
|
|
21
|
for my $field ( @{ $storage->{missing} } ) { |
|
|
10
|
|
|
|
|
36
|
|
|
161
|
11
|
|
66
|
|
|
73
|
my $label = $self->message->labels->{ $lang }{ $field } || $field; |
|
162
|
11
|
|
|
|
|
148
|
my $mes = $self->message->base_message->{ $lang }{missing} ; |
|
163
|
11
|
|
|
|
|
152
|
$mes =~ s/__field__/$label/g; |
|
164
|
11
|
|
|
|
|
48
|
$result->{$field} = $mes; |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
41
|
|
|
|
|
206
|
$storage->{error_message} = $result; |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
} |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
sub _append_error_message { |
|
173
|
16
|
|
|
16
|
|
86
|
my $self = shift; |
|
174
|
16
|
|
|
|
|
32
|
my $lang = shift; |
|
175
|
16
|
|
|
|
|
200
|
my $level = shift; |
|
176
|
16
|
|
|
|
|
29
|
my $field = shift; |
|
177
|
16
|
|
|
|
|
26
|
my $storage = shift; |
|
178
|
16
|
|
|
|
|
551
|
my $label = shift; |
|
179
|
16
|
|
|
|
|
210
|
my $error_messages = shift; |
|
180
|
16
|
|
|
|
|
35
|
my $regex = shift; |
|
181
|
|
|
|
|
|
|
|
|
182
|
16
|
|
|
|
|
270
|
$storage->{invalid}{$field}{$label} = 1; |
|
183
|
|
|
|
|
|
|
|
|
184
|
16
|
100
|
|
|
|
71
|
unless ( exists $error_messages->{$field} ) { |
|
185
|
14
|
|
|
|
|
50
|
$error_messages->{$field} = []; |
|
186
|
|
|
|
|
|
|
} |
|
187
|
|
|
|
|
|
|
|
|
188
|
16
|
|
66
|
|
|
265
|
my $key = $regex || $field ; |
|
189
|
16
|
|
|
|
|
26
|
push @{ $error_messages->{$field} }, |
|
|
16
|
|
|
|
|
304
|
|
|
190
|
|
|
|
|
|
|
$self->message->get( |
|
191
|
|
|
|
|
|
|
{ lang => $lang, field => $key , label => $label, level => $level } |
|
192
|
|
|
|
|
|
|
); |
|
193
|
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
} |
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
sub _merge { |
|
197
|
40
|
|
|
40
|
|
64
|
my $self = shift; |
|
198
|
40
|
|
|
|
|
65
|
my $storage = shift; |
|
199
|
40
|
|
|
|
|
129
|
my $profile = shift; |
|
200
|
|
|
|
|
|
|
|
|
201
|
40
|
|
|
|
|
70
|
my @fields = keys %{ $storage->{valid} } ; |
|
|
40
|
|
|
|
|
162
|
|
|
202
|
|
|
|
|
|
|
|
|
203
|
40
|
100
|
|
|
|
179
|
return unless $self->config->{setting}->{merge}; |
|
204
|
|
|
|
|
|
|
|
|
205
|
1
|
|
|
|
|
8
|
for my $key ( keys %{$profile->{required}}, keys %{$profile->{optional}} ) { |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
4
|
|
|
206
|
1
|
|
|
|
|
3
|
my $field = $self->config->{setting}->{merge}->{$key}; |
|
207
|
1
|
50
|
33
|
|
|
19
|
if ( ref $field eq 'HASH' |
|
|
|
|
33
|
|
|
|
|
|
208
|
|
|
|
|
|
|
&& $field->{format} |
|
209
|
|
|
|
|
|
|
&& $field->{fields} ) { |
|
210
|
1
|
|
|
|
|
2
|
my @values = map { $storage->{valid}->{$_} } @{ $field->{fields} }; |
|
|
3
|
|
|
|
|
11
|
|
|
|
1
|
|
|
|
|
4
|
|
|
211
|
1
|
|
|
|
|
14
|
$storage->{valid}->{$key} = sprintf($field->{format}, @values); |
|
212
|
|
|
|
|
|
|
} |
|
213
|
|
|
|
|
|
|
} |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
sub _filter { |
|
217
|
40
|
|
|
40
|
|
61
|
my $self = shift; |
|
218
|
40
|
|
|
|
|
68
|
my $storage = shift; |
|
219
|
40
|
|
|
|
|
61
|
my $profile = shift; |
|
220
|
|
|
|
|
|
|
|
|
221
|
40
|
|
|
|
|
60
|
my @fields = keys %{ $storage->{valid} } ; |
|
|
40
|
|
|
|
|
147
|
|
|
222
|
|
|
|
|
|
|
|
|
223
|
40
|
|
|
|
|
92
|
for my $field (@fields) { |
|
224
|
65
|
|
50
|
|
|
382
|
my $level = $profile->{level}{$field} || 'strict'; |
|
225
|
65
|
|
|
|
|
238
|
($storage->{valid}{$field} ) = $self->filter->parse($storage->{valid}{$field}, $level, $field); |
|
226
|
|
|
|
|
|
|
} |
|
227
|
|
|
|
|
|
|
} |
|
228
|
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
sub _fixed { |
|
230
|
40
|
|
|
40
|
|
70
|
my $self = shift; |
|
231
|
40
|
|
|
|
|
70
|
my $storage = shift; |
|
232
|
40
|
|
|
|
|
73
|
my $profile = shift; |
|
233
|
|
|
|
|
|
|
|
|
234
|
40
|
|
|
|
|
75
|
my @fields = keys %{ $storage->{valid} } ; |
|
|
40
|
|
|
|
|
141
|
|
|
235
|
|
|
|
|
|
|
|
|
236
|
40
|
|
|
|
|
96
|
for my $field (@fields) { |
|
237
|
52
|
|
50
|
|
|
337
|
my $level = $profile->{level}{$field} || 'strict'; |
|
238
|
|
|
|
|
|
|
|
|
239
|
52
|
|
|
|
|
193
|
my ( $v , $modified ) = $self->fix->parse($storage->{valid}{$field}, $level, $field); |
|
240
|
52
|
100
|
100
|
|
|
236
|
if( $profile->{use_fixed_method} && $profile->{use_fixed_method}{$field} ) { |
|
241
|
1
|
|
|
|
|
3
|
my $fixed_field_name = $profile->{use_fixed_method}{$field}; |
|
242
|
1
|
|
|
|
|
6
|
$storage->{fixed}{$fixed_field_name} = $v; |
|
243
|
|
|
|
|
|
|
} |
|
244
|
|
|
|
|
|
|
else { |
|
245
|
51
|
|
|
|
|
236
|
$storage->{valid}{$field} = $v; |
|
246
|
|
|
|
|
|
|
} |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
} |
|
249
|
|
|
|
|
|
|
} |
|
250
|
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
sub _validation_block { |
|
252
|
40
|
|
|
40
|
|
71
|
my $self = shift; |
|
253
|
40
|
|
|
|
|
60
|
my $storage = shift; |
|
254
|
40
|
|
|
|
|
60
|
my $profile = shift; |
|
255
|
40
|
|
|
|
|
80
|
my $error_messages = {}; |
|
256
|
|
|
|
|
|
|
|
|
257
|
40
|
|
|
|
|
61
|
my @fields = keys %{ $profile->{required} } ; |
|
|
40
|
|
|
|
|
154
|
|
|
258
|
40
|
|
|
|
|
65
|
push @fields , keys %{ $profile->{optional} } ; |
|
|
40
|
|
|
|
|
128
|
|
|
259
|
|
|
|
|
|
|
|
|
260
|
40
|
|
|
|
|
102
|
for my $field (@fields) { |
|
261
|
77
|
|
|
|
|
110
|
my $is_invalid = 0; |
|
262
|
77
|
|
50
|
|
|
375
|
my $level = $profile->{level}{$field} || 'strict'; |
|
263
|
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
# missing , empty optional |
|
265
|
77
|
100
|
|
|
|
235
|
next unless exists $storage->{valid}{$field}; |
|
266
|
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
# bad logic... $level may change to regex_map |
|
268
|
65
|
|
|
|
|
229
|
my $validators = $self->_get_validator_methods( $field, \$level ); |
|
269
|
65
|
|
|
|
|
137
|
VALIDATE: |
|
270
|
65
|
|
|
|
|
90
|
for my $validator ( @{$validators} ) { |
|
271
|
|
|
|
|
|
|
|
|
272
|
82
|
|
|
|
|
330
|
my $stash = $profile->{stash}->{$field}; |
|
273
|
|
|
|
|
|
|
|
|
274
|
82
|
50
|
|
|
|
404
|
if ( ref $storage->{valid}{$field} eq 'ARRAY' ) { |
|
275
|
|
|
|
|
|
|
|
|
276
|
0
|
|
|
|
|
0
|
CHECK_ARRAYS: |
|
277
|
0
|
|
|
|
|
0
|
for my $value ( @{ $storage->{valid}{$field} } ) { |
|
278
|
0
|
0
|
|
|
|
0
|
if ( $validator->{method}->($value, $stash) ) { |
|
279
|
|
|
|
|
|
|
# OK |
|
280
|
0
|
|
|
|
|
0
|
next CHECK_ARRAYS; |
|
281
|
|
|
|
|
|
|
} |
|
282
|
|
|
|
|
|
|
else { |
|
283
|
0
|
|
|
|
|
0
|
$self->_append_error_message( $profile->{lang}, |
|
284
|
|
|
|
|
|
|
$level, $field, $storage, |
|
285
|
|
|
|
|
|
|
$validator->{label}, |
|
286
|
|
|
|
|
|
|
$error_messages , $validator->{_regex} ); |
|
287
|
0
|
|
|
|
|
0
|
$is_invalid++; |
|
288
|
0
|
|
|
|
|
0
|
last CHECK_ARRAYS; |
|
289
|
|
|
|
|
|
|
} |
|
290
|
|
|
|
|
|
|
} |
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
# 配列をやめる。 |
|
293
|
0
|
0
|
|
|
|
0
|
if ( !$profile->{want_array}{ $field } ) { |
|
294
|
0
|
|
|
|
|
0
|
$storage->{valid}{$field} = $storage->{valid}{$field}[0]; |
|
295
|
0
|
|
|
|
|
0
|
last VALIDATE; |
|
296
|
|
|
|
|
|
|
} |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
} |
|
299
|
|
|
|
|
|
|
else { |
|
300
|
82
|
|
|
|
|
167
|
my $value = $storage->{valid}{$field}; |
|
301
|
82
|
100
|
|
|
|
495
|
if ( $validator->{method}->( $value, $stash ) ) { |
|
302
|
|
|
|
|
|
|
# return alwasy array ref when want_array is seted. |
|
303
|
67
|
50
|
|
|
|
323
|
if ( $profile->{want_array}{$field} ) { |
|
304
|
0
|
|
|
|
|
0
|
$storage->{valid}{$field} = []; |
|
305
|
0
|
|
|
|
|
0
|
push @{ $storage->{valid}{$field} }, $value; |
|
|
0
|
|
|
|
|
0
|
|
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
} |
|
308
|
|
|
|
|
|
|
} |
|
309
|
|
|
|
|
|
|
else { |
|
310
|
15
|
|
|
|
|
261
|
$self->_append_error_message( $profile->{lang}, $level, $field, $storage, $validator->{label}, $error_messages , $validator->{_regex} ); |
|
311
|
15
|
|
|
|
|
232
|
$is_invalid++; |
|
312
|
|
|
|
|
|
|
} |
|
313
|
|
|
|
|
|
|
} |
|
314
|
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
} |
|
316
|
65
|
100
|
|
|
|
392
|
delete $storage->{valid}{$field} if $is_invalid; |
|
317
|
|
|
|
|
|
|
} |
|
318
|
|
|
|
|
|
|
|
|
319
|
40
|
|
|
|
|
214
|
$self->_set_error_message_for_display( $storage, $error_messages , $profile->{lang} ); |
|
320
|
|
|
|
|
|
|
} |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
sub _get_validator_methods { |
|
323
|
67
|
|
|
67
|
|
210
|
my $self = shift; |
|
324
|
67
|
|
|
|
|
93
|
my $field = shift; |
|
325
|
67
|
|
|
|
|
90
|
my $level = shift; |
|
326
|
|
|
|
|
|
|
|
|
327
|
67
|
|
|
|
|
207
|
my $validators = $self->rule->setting->{$$level}{$field}; |
|
328
|
|
|
|
|
|
|
|
|
329
|
67
|
100
|
|
|
|
675
|
if ( !defined $validators ) { |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
# 正規表現にfieldがマッチしたら適応 |
|
332
|
10
|
|
|
|
|
19
|
my @validators = (); |
|
333
|
10
|
|
|
|
|
15
|
foreach my $regexp ( keys %{ $self->rule->setting->{regex_map} } ) |
|
|
10
|
|
|
|
|
33
|
|
|
334
|
|
|
|
|
|
|
{ |
|
335
|
14
|
50
|
|
|
|
314
|
if ( $field =~ qr/$regexp/ ) { |
|
336
|
14
|
|
|
|
|
23
|
my @tmp = map { { %$_,_regex => $regexp } } @{$self->rule->setting->{regex_map}{$regexp}}; |
|
|
14
|
|
|
|
|
1806
|
|
|
|
14
|
|
|
|
|
45
|
|
|
337
|
14
|
|
|
|
|
24
|
push @validators,@tmp; |
|
338
|
14
|
|
|
|
|
54
|
$$level = 'regex_map'; |
|
339
|
|
|
|
|
|
|
} |
|
340
|
|
|
|
|
|
|
} |
|
341
|
10
|
50
|
|
|
|
34
|
if (scalar @validators) { $validators = \@validators } |
|
|
10
|
|
|
|
|
19
|
|
|
342
|
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
# 検証モジュールがセットされてないよ。 |
|
344
|
10
|
50
|
|
|
|
27
|
croak 'you should set ' . $$level . ':' . $field . ' validate method' |
|
345
|
|
|
|
|
|
|
unless $validators; |
|
346
|
|
|
|
|
|
|
} |
|
347
|
|
|
|
|
|
|
|
|
348
|
67
|
|
|
|
|
222
|
return $validators; |
|
349
|
|
|
|
|
|
|
} |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
sub _set_dependencies { |
|
352
|
40
|
|
|
40
|
|
87
|
my $self = shift; |
|
353
|
40
|
|
|
|
|
68
|
my $storage = shift; |
|
354
|
40
|
|
|
|
|
67
|
my $profile = shift; |
|
355
|
40
|
100
|
|
|
|
172
|
return 1 unless defined $profile->{dependencies}; |
|
356
|
|
|
|
|
|
|
|
|
357
|
8
|
|
|
|
|
14
|
foreach my $field ( keys %{$profile->{dependencies}} ) { |
|
|
8
|
|
|
|
|
28
|
|
|
358
|
8
|
|
|
|
|
19
|
my $deps = $profile->{dependencies}{$field}; |
|
359
|
8
|
50
|
|
|
|
26
|
if (defined $storage->{valid}{$field} ) { |
|
360
|
8
|
50
|
|
|
|
54
|
if (ref($deps) eq 'HASH') { |
|
|
|
0
|
|
|
|
|
|
|
361
|
8
|
|
|
|
|
26
|
for my $key (keys %$deps) { |
|
362
|
|
|
|
|
|
|
# Handle case of a key with a single value given as an arrayref |
|
363
|
|
|
|
|
|
|
# There is probably a better, more general solution to this problem. |
|
364
|
8
|
|
|
|
|
16
|
my $val_to_compare; |
|
365
|
8
|
50
|
33
|
|
|
41
|
if ((ref $storage->{valid}{$field} eq 'ARRAY') and (scalar @{ $storage->{valid}{$field} } == 1)) { |
|
|
0
|
|
|
|
|
0
|
|
|
366
|
0
|
|
|
|
|
0
|
$val_to_compare = $storage->{valid}{$field}->[0]; |
|
367
|
|
|
|
|
|
|
} |
|
368
|
|
|
|
|
|
|
else { |
|
369
|
8
|
|
|
|
|
29
|
$val_to_compare = $storage->{valid}{$field}; |
|
370
|
|
|
|
|
|
|
} |
|
371
|
|
|
|
|
|
|
|
|
372
|
8
|
100
|
|
|
|
40
|
if($val_to_compare eq $key){ |
|
373
|
6
|
|
|
|
|
105
|
for my $dep (FormValidator::LazyWay::Utils::arrayify($deps->{$key})){ |
|
374
|
10
|
|
|
|
|
149
|
$profile->{required}{$dep} = 1; |
|
375
|
|
|
|
|
|
|
} |
|
376
|
|
|
|
|
|
|
} |
|
377
|
|
|
|
|
|
|
} |
|
378
|
|
|
|
|
|
|
} |
|
379
|
|
|
|
|
|
|
elsif (ref $deps eq "CODE") { |
|
380
|
0
|
|
|
|
|
0
|
for my $val (FormValidator::LazyWay::Utils::arrayify( $storage->{valid}{$field} )) { |
|
381
|
0
|
|
|
|
|
0
|
my $returned_deps = $deps->($self, $val); |
|
382
|
|
|
|
|
|
|
|
|
383
|
0
|
|
|
|
|
0
|
for my $dep (FormValidator::LazyWay::Utils::arrayify($returned_deps)) { |
|
384
|
0
|
|
|
|
|
0
|
$profile->{required}{$dep} = 1; |
|
385
|
|
|
|
|
|
|
} |
|
386
|
|
|
|
|
|
|
} |
|
387
|
|
|
|
|
|
|
} |
|
388
|
|
|
|
|
|
|
else { |
|
389
|
0
|
|
|
|
|
0
|
for my $dep (FormValidator::LazyWay::Utils::arrayify($deps)){ |
|
390
|
0
|
|
|
|
|
0
|
$profile->{required}{$dep} = 1; |
|
391
|
|
|
|
|
|
|
} |
|
392
|
|
|
|
|
|
|
} |
|
393
|
|
|
|
|
|
|
} |
|
394
|
|
|
|
|
|
|
} |
|
395
|
|
|
|
|
|
|
} |
|
396
|
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
sub __set_dependencies { |
|
398
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
|
399
|
0
|
|
|
|
|
0
|
my $storage = shift; |
|
400
|
0
|
|
|
|
|
0
|
my $profile = shift; |
|
401
|
0
|
0
|
|
|
|
0
|
return 1 unless defined $profile->{dependencies}; |
|
402
|
|
|
|
|
|
|
|
|
403
|
0
|
|
|
|
|
0
|
foreach my $field ( keys %{ $profile->{dependencies} } ) { |
|
|
0
|
|
|
|
|
0
|
|
|
404
|
0
|
0
|
|
|
|
0
|
if ( $storage->{valid}{$field} ) { |
|
405
|
0
|
|
|
|
|
0
|
for my $dependency ( @{ $profile->{dependencies}{$field} } ) { |
|
|
0
|
|
|
|
|
0
|
|
|
406
|
0
|
|
|
|
|
0
|
$profile->{required}{$dependency} = 1; |
|
407
|
|
|
|
|
|
|
} |
|
408
|
|
|
|
|
|
|
} |
|
409
|
|
|
|
|
|
|
} |
|
410
|
|
|
|
|
|
|
|
|
411
|
0
|
|
|
|
|
0
|
return 1; |
|
412
|
|
|
|
|
|
|
} |
|
413
|
|
|
|
|
|
|
sub _set_dependency_groups { |
|
414
|
40
|
|
|
40
|
|
106
|
my $self = shift; |
|
415
|
40
|
|
|
|
|
65
|
my $storage = shift; |
|
416
|
40
|
|
|
|
|
73
|
my $profile = shift; |
|
417
|
40
|
50
|
|
|
|
167
|
return 1 unless defined $profile->{dependency_groups}; |
|
418
|
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
# check dependency groups |
|
421
|
|
|
|
|
|
|
# the presence of any member makes them all required |
|
422
|
0
|
|
|
|
|
0
|
for my $group (values %{ $profile->{dependency_groups} }) { |
|
|
0
|
|
|
|
|
0
|
|
|
423
|
0
|
|
|
|
|
0
|
my $require_all = 0; |
|
424
|
0
|
|
|
|
|
0
|
for my $field ( FormValidator::LazyWay::Utils::arrayify($group)) { |
|
425
|
0
|
0
|
|
|
|
0
|
$require_all = 1 if $storage->{valid}{$field}; |
|
426
|
|
|
|
|
|
|
} |
|
427
|
0
|
0
|
|
|
|
0
|
if ($require_all) { |
|
428
|
0
|
|
|
|
|
0
|
map { $profile->{required}{$_} = 1 } FormValidator::LazyWay::Utils::arrayify($group); |
|
|
0
|
|
|
|
|
0
|
|
|
429
|
|
|
|
|
|
|
} |
|
430
|
|
|
|
|
|
|
} |
|
431
|
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
} |
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
sub _check_required_fields { |
|
437
|
41
|
|
|
41
|
|
92
|
my $self = shift; |
|
438
|
41
|
|
|
|
|
63
|
my $storage = shift; |
|
439
|
41
|
|
|
|
|
69
|
my $profile = shift; |
|
440
|
|
|
|
|
|
|
|
|
441
|
41
|
|
|
|
|
71
|
for my $field ( keys %{ $profile->{required} } ) { |
|
|
41
|
|
|
|
|
155
|
|
|
442
|
75
|
100
|
|
|
|
257
|
push @{ $storage->{missing} }, $field |
|
|
11
|
|
|
|
|
28
|
|
|
443
|
|
|
|
|
|
|
unless exists $storage->{valid}{$field}; |
|
444
|
75
|
100
|
|
|
|
270
|
delete $storage->{valid}{$field} |
|
445
|
|
|
|
|
|
|
unless exists $storage->{valid}{$field}; |
|
446
|
|
|
|
|
|
|
} |
|
447
|
|
|
|
|
|
|
|
|
448
|
41
|
|
|
|
|
105
|
return 1; |
|
449
|
|
|
|
|
|
|
} |
|
450
|
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
sub _set_lang { |
|
452
|
40
|
|
|
40
|
|
79
|
my $self = shift; |
|
453
|
40
|
|
|
|
|
128
|
my $storage = shift; |
|
454
|
40
|
|
|
|
|
133
|
my $profile = shift; |
|
455
|
|
|
|
|
|
|
|
|
456
|
40
|
|
33
|
|
|
307
|
$profile->{lang} = $profile->{lang} || $self->message->lang; |
|
457
|
|
|
|
|
|
|
} |
|
458
|
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
sub _conv_profile { |
|
460
|
45
|
|
|
45
|
|
36220
|
my $self = shift; |
|
461
|
45
|
|
|
|
|
408
|
my $storage = shift; |
|
462
|
45
|
|
|
|
|
71
|
my $profile = shift; |
|
463
|
45
|
|
|
|
|
128
|
my %new_profile = (); |
|
464
|
45
|
|
|
|
|
234
|
%{ $new_profile{required} } = map { $_ => 1 } |
|
|
45
|
|
|
|
|
370
|
|
|
|
71
|
|
|
|
|
1411
|
|
|
465
|
|
|
|
|
|
|
FormValidator::LazyWay::Utils::arrayify( $profile->{required} ); |
|
466
|
45
|
|
|
|
|
293
|
%{ $new_profile{optional} } = map { $_ => 1 } |
|
|
45
|
|
|
|
|
164
|
|
|
|
12
|
|
|
|
|
138
|
|
|
467
|
|
|
|
|
|
|
FormValidator::LazyWay::Utils::arrayify( $profile->{optional} ); |
|
468
|
45
|
|
|
|
|
251
|
%{ $new_profile{want_array} } = map { $_ => 1 } |
|
|
45
|
|
|
|
|
143
|
|
|
|
2
|
|
|
|
|
30
|
|
|
469
|
|
|
|
|
|
|
FormValidator::LazyWay::Utils::arrayify( $profile->{want_array} ); |
|
470
|
|
|
|
|
|
|
|
|
471
|
45
|
|
|
|
|
176
|
$new_profile{stash} = $profile->{stash}; |
|
472
|
|
|
|
|
|
|
|
|
473
|
45
|
|
|
|
|
89
|
%{$profile} = ( %{$profile}, %new_profile ); |
|
|
45
|
|
|
|
|
240
|
|
|
|
45
|
|
|
|
|
221
|
|
|
474
|
|
|
|
|
|
|
|
|
475
|
45
|
|
|
|
|
192
|
return 1; |
|
476
|
|
|
|
|
|
|
} |
|
477
|
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
sub _set_unknown { |
|
479
|
42
|
|
|
42
|
|
88
|
my $self = shift; |
|
480
|
42
|
|
|
|
|
63
|
my $storage = shift; |
|
481
|
42
|
|
|
|
|
76
|
my $profile = shift; |
|
482
|
|
|
|
|
|
|
|
|
483
|
42
|
|
100
|
|
|
186
|
@{ $storage->{unknown} } = grep { |
|
|
78
|
|
|
|
|
486
|
|
|
484
|
42
|
|
|
|
|
127
|
not( exists $profile->{optional}{$_} |
|
485
|
|
|
|
|
|
|
or exists $profile->{required}{$_} ) |
|
486
|
42
|
|
|
|
|
80
|
} keys %{ $storage->{valid} }; |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
# and remove them from the list |
|
489
|
42
|
|
|
|
|
83
|
for my $field ( @{ $storage->{unknown} } ) { |
|
|
42
|
|
|
|
|
120
|
|
|
490
|
9
|
|
|
|
|
41
|
delete $storage->{valid}{$field}; |
|
491
|
|
|
|
|
|
|
} |
|
492
|
|
|
|
|
|
|
|
|
493
|
42
|
|
|
|
|
135
|
return 1; |
|
494
|
|
|
|
|
|
|
} |
|
495
|
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
sub _set_default { |
|
497
|
42
|
|
|
42
|
|
110
|
my $self = shift; |
|
498
|
42
|
|
|
|
|
72
|
my $storage = shift; |
|
499
|
42
|
|
|
|
|
70
|
my $profile = shift; |
|
500
|
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
# get from profile |
|
502
|
42
|
|
100
|
|
|
259
|
my $defaults = $profile->{defaults} || {}; |
|
503
|
42
|
|
|
|
|
79
|
foreach my $field ( %{ $defaults } ) { |
|
|
42
|
|
|
|
|
389
|
|
|
504
|
2
|
100
|
|
|
|
9
|
unless (defined $storage->{valid}{$field}) { $storage->{valid}{$field} = $defaults->{$field} } |
|
|
1
|
|
|
|
|
6
|
|
|
505
|
|
|
|
|
|
|
} |
|
506
|
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
# get from config file |
|
508
|
42
|
50
|
|
|
|
182
|
if ( defined $self->rule->defaults ) { |
|
509
|
42
|
|
|
|
|
503
|
foreach my $field ( keys %{ $self->rule->defaults } ) { |
|
|
42
|
|
|
|
|
191
|
|
|
510
|
2
|
|
66
|
|
|
37
|
$storage->{valid}{$field} ||= $self->rule->defaults->{$field}; |
|
511
|
|
|
|
|
|
|
} |
|
512
|
|
|
|
|
|
|
} |
|
513
|
|
|
|
|
|
|
|
|
514
|
|
|
|
|
|
|
|
|
515
|
42
|
|
|
|
|
399
|
return 1; |
|
516
|
|
|
|
|
|
|
} |
|
517
|
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
sub _remove_empty_fields { |
|
519
|
41
|
|
|
41
|
|
96
|
my $self = shift; |
|
520
|
41
|
|
|
|
|
68
|
my $storage = shift; |
|
521
|
41
|
|
|
|
|
192
|
$storage->{valid} = FormValidator::LazyWay::Utils::remove_empty_fields( |
|
522
|
|
|
|
|
|
|
$storage->{valid} ); |
|
523
|
|
|
|
|
|
|
|
|
524
|
41
|
|
|
|
|
92
|
return 1; |
|
525
|
|
|
|
|
|
|
} |
|
526
|
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
sub add_custom_invalid { |
|
528
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
529
|
0
|
|
|
|
|
|
my $form = shift; |
|
530
|
0
|
|
|
|
|
|
my $key = shift; |
|
531
|
0
|
|
0
|
|
|
|
my $message |
|
532
|
|
|
|
|
|
|
= $self->{messages}{config}{messages}{ $form->lang }{custom_invalid} |
|
533
|
|
|
|
|
|
|
{$key} || $key; |
|
534
|
0
|
|
|
|
|
|
$form->custom_invalid( $key, $message ); |
|
535
|
|
|
|
|
|
|
} |
|
536
|
|
|
|
|
|
|
|
|
537
|
|
|
|
|
|
|
1; |
|
538
|
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
__END__ |