0
|
1 package Form::Filter;
|
|
2 use strict;
|
|
3 use Common;
|
|
4 our @ISA = qw(Object);
|
|
5
|
|
6 use constant {
|
|
7 CTX_SINGLE => 1, #
|
|
8 CTX_SET => 2, #
|
|
9 CTX_EXISTENT => 4 #
|
|
10 };
|
|
11
|
|
12 BEGIN {
|
|
13 DeclareProperty Name => ACCESS_READ;
|
|
14 DeclareProperty Message => ACCESS_READ;
|
|
15 }
|
|
16
|
|
17 sub CTOR {
|
|
18 my ($this,$name,$message) = @_;
|
|
19 $this->{$Name} = $name or die new Exception('A filter name is required');
|
|
20 $this->{$Message} = $message;
|
|
21 }
|
|
22
|
|
23 sub FormatMessage {
|
|
24 my ($this,$object) = @_;
|
|
25
|
|
26 (my $message = $object->Attributes->{$this->{$Name}} || $this->{$Message} || ($Common::Debug ? "$this->{$Name}: %name%" : '')) =~ s{%(\w+(?:\.\w+)*)%}{
|
|
27 my $value = $object->Attributes->{$1} || ($Common::Debug ? $object->Name.'.'.$1 : '');
|
|
28 }ge;
|
|
29
|
|
30 return $message;
|
|
31 }
|
|
32
|
|
33 package Form::FilterResult;
|
|
34 use Common;
|
|
35 our @ISA = qw(Object);
|
|
36
|
|
37 use constant {
|
|
38 STATE_ERROR => 0, #
|
|
39 STATE_SUCCESS => 1, # ,
|
|
40 STATE_SUCCESS_STOP => 2, # ,
|
|
41 STATE_SUCCESS_STAY => 3 # ,
|
|
42 };
|
|
43
|
|
44 BEGIN {
|
|
45 DeclareProperty State => ACCESS_READ;
|
|
46 DeclareProperty Message => ACCESS_READ;
|
|
47 DeclareProperty Target => ACCESS_READ;
|
|
48 DeclareProperty Container => ACCESS_READ;
|
|
49 }
|
|
50
|
|
51 sub CTOR {
|
|
52 my $this = shift;
|
|
53 $this->SUPER::CTOR(@_);
|
|
54
|
|
55 UNIVERSAL::isa($this->{$Target},'Form::Item') or UNIVERSAL::isa($this->{$Container},'Form::Container') or die new Exception("Invalid Target or Container property") if $this->{$State} == STATE_ERROR;
|
|
56 }
|
|
57
|
|
58 sub Item {
|
|
59 my $this = shift;
|
|
60
|
|
61 return ref $this->{$Target} ?
|
|
62 ($this->{$Target}->isa('Form::Item') ? $this->{$Target} : $this->{$Container}->Item( $this->{$Target}->isMulti ? $this->{$Target}->Name . '0' : $this->{$Target}->Name ) )
|
|
63 :
|
|
64 ($this->{$Target});
|
|
65 }
|
|
66
|
|
67 1;
|