Mercurial > pub > Impl
comparison Lib/Form.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package Form; | |
| 2 use strict; | |
| 3 use Common; | |
| 4 use base qw(Form::Container); | |
| 5 use Form::ItemId; | |
| 6 use Form::ValueItem; | |
| 7 | |
| 8 BEGIN { | |
| 9 DeclareProperty AutoCreate => ACCESS_ALL; | |
| 10 DeclareProperty isValidated => ACCESS_READ; | |
| 11 DeclareProperty isValid => ACCESS_READ; | |
| 12 DeclareProperty ValidationErrors => ACCESS_READ; | |
| 13 DeclareProperty MapFieldClasses => ACCESS_READ; | |
| 14 DeclareProperty LoadedFiledClasses => ACCESS_NONE; | |
| 15 DeclareProperty Bindings => ACCESS_READ; | |
| 16 } | |
| 17 | |
| 18 sub CTOR { | |
| 19 my ($this,$schema,$bind) = @_; | |
| 20 | |
| 21 $this->SUPER::CTOR( | |
| 22 Schema => $schema->Body, | |
| 23 Id => Form::ItemId->new('Form',undef,Form::ItemId::Root->new()), | |
| 24 Form => $this | |
| 25 ); | |
| 26 $this->{$MapFieldClasses} = { | |
| 27 SelectBox => 'Form::ValueItem::List', | |
| 28 RadioSelect => 'Form::ValueItem::List', | |
| 29 MultiCheckBox => 'Form::ValueItem::List' | |
| 30 }; | |
| 31 $this->{$LoadedFiledClasses} = { 'Form::ValueItem' => 1 }; | |
| 32 $this->{$Bindings} = $bind || {}; | |
| 33 $this->{$isValid} = 0; | |
| 34 $this->{$isValidated} = 0; | |
| 35 } | |
| 36 | |
| 37 sub NavigatePath { | |
| 38 my ($this,$path) = @_; | |
| 39 | |
| 40 shift @$path if $path->[0]->Name eq 'Form'; # eat root node in Form/Item | |
| 41 | |
| 42 return $this->SUPER::NavigatePath($path); | |
| 43 } | |
| 44 | |
| 45 sub Item { | |
| 46 my ($this,$strId) = @_; | |
| 47 | |
| 48 return $this->Navigate($this->MakeItemId($strId,undef)); | |
| 49 } | |
| 50 | |
| 51 sub MakeItemId { | |
| 52 my ($this,$Name,$BaseObject) = @_; | |
| 53 | |
| 54 my $ItemId; | |
| 55 if ($BaseObject and $BaseObject->isa('Form::Item')) { | |
| 56 $ItemId = $BaseObject->Id; | |
| 57 } else { | |
| 58 $ItemId = new Form::ItemId::Root; | |
| 59 } | |
| 60 | |
| 61 foreach my $item (split /\//,$Name) { | |
| 62 if ($item =~ /^(\w+?)(\d+)?$/) { | |
| 63 $ItemId = Form::ItemId->new($1,$2,$ItemId); | |
| 64 } else { | |
| 65 die new Exception('The invalid identifier',$Name); | |
| 66 } | |
| 67 } | |
| 68 return $ItemId; | |
| 69 } | |
| 70 | |
| 71 sub CreateInstance { | |
| 72 my ($this,$schema,$ItemId,$parent) = @_; | |
| 73 | |
| 74 my $obj; | |
| 75 if ($schema->isa('Schema::Form::Container')) { | |
| 76 $obj = new Form::Container( | |
| 77 Id => Form::ItemId->new($ItemId->Name,$ItemId->InstanceID,($parent ? $parent->Id : undef)), | |
| 78 Form => $this, | |
| 79 Parent => $parent, | |
| 80 Schema => $schema, | |
| 81 Attributes => {%{$schema->Attributes}} | |
| 82 ); | |
| 83 } elsif ($schema->isa('Schema::Form::Field')) { | |
| 84 my $class = $this->{$MapFieldClasses}{$schema->Format->Name} || 'Form::ValueItem'; | |
| 85 if (not $this->{$LoadedFiledClasses}{$class}) { | |
| 86 eval "require $class;" or die new Exception('Failed to load a module',$class,$@); | |
| 87 $this->{$LoadedFiledClasses}{$class} = 1; | |
| 88 } | |
| 89 $obj = $class->new( | |
| 90 Id => Form::ItemId->new($ItemId->Name,$ItemId->InstanceID,($parent ? $parent->Id : undef)), | |
| 91 Form => $this, | |
| 92 Parent => $parent, | |
| 93 Type => $schema->Format->Name, | |
| 94 Schema => $schema, | |
| 95 Attributes => {%{$schema->Attributes}} | |
| 96 ); | |
| 97 } else { | |
| 98 die new Exception('Unexpected schema type', ref $schema); | |
| 99 } | |
| 100 | |
| 101 return $obj; | |
| 102 } | |
| 103 | |
| 104 sub Validate { | |
| 105 my ($this) = @_; | |
| 106 | |
| 107 my @errors = $this->SUPER::Validate; | |
| 108 $this->{$isValidated} = 1; | |
| 109 if (@errors) { | |
| 110 $this->{$isValid} = 0; | |
| 111 $this->{$ValidationErrors} = \@errors; | |
| 112 } else { | |
| 113 $this->{$isValid} = 1; | |
| 114 delete $this->{$ValidationErrors}; | |
| 115 } | |
| 116 | |
| 117 return @errors; | |
| 118 } | |
| 119 | |
| 120 sub SelectErrors { | |
| 121 my ($this,$parentId) = @_; | |
| 122 | |
| 123 return [grep $_->Item->Parent->Id->Canonical eq $parentId, $this->ValidationErrors]; | |
| 124 } | |
| 125 | |
| 126 sub LoadValues { | |
| 127 my ($this,$rhValues) = @_; | |
| 128 | |
| 129 $this->{$isValidated} = 0; | |
| 130 $this->{$isValid} = 0; | |
| 131 | |
| 132 foreach my $key (keys %$rhValues) { | |
| 133 eval { $this->Item($key)->Value($rhValues->{$key}) }; | |
| 134 undef $@; | |
| 135 } | |
| 136 } | |
| 137 | |
| 138 | |
| 139 sub Dispose { | |
| 140 my ($this) = @_; | |
| 141 | |
| 142 delete @$this{$ValidationErrors,$MapFieldClasses,$LoadedFiledClasses,$Bindings}; | |
| 143 | |
| 144 $this->SUPER::Dispose; | |
| 145 } | |
| 146 | |
| 147 1; |
