Mercurial > pub > Impl
comparison Lib/CDBI/Transform.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 CDBI::Transform::FormToObject; | |
| 2 use strict; | |
| 3 use warnings; | |
| 4 | |
| 5 use base qw(IMPL::Object::Autofill Form::Transform ); | |
| 6 use IMPL::Class::Property; | |
| 7 require IMPL::Exception; | |
| 8 | |
| 9 BEGIN { | |
| 10 public property Class => prop_all; | |
| 11 public property Namespace => prop_all; | |
| 12 } | |
| 13 | |
| 14 sub CTOR { | |
| 15 my $this = shift; | |
| 16 $this->superCTOR(@_); | |
| 17 | |
| 18 die new IMPL::InvalidArgumentException('Class is required') unless $this->Class; | |
| 19 } | |
| 20 | |
| 21 sub TransformContainer { | |
| 22 my ($this,$container) = @_; | |
| 23 | |
| 24 my $class; | |
| 25 if ($container->Name eq 'Form') { | |
| 26 $class = $this->Class; | |
| 27 } else { | |
| 28 $class = $this->_mk_class($container->Attributes->{'cdbi.class'}) or die new IMPL::Exception('cdbi.class isn\'t specified',$container->Id->Canonical); | |
| 29 } | |
| 30 | |
| 31 my %data; | |
| 32 | |
| 33 #my %columns = map {$_,1} $class->columns(); | |
| 34 | |
| 35 no strict 'refs'; | |
| 36 my @accessors = map $_->accessor, $class->columns();# grep $columns{lc $_}, keys %{"${class}::"}; | |
| 37 | |
| 38 # ôîðìèðóåì èç êîíòåéíåðà ôîðìû äàííûå äëÿ îáúåêòà | |
| 39 foreach my $column ( @accessors, 'id' ) { | |
| 40 my ($val) = $container->GetChild($column); | |
| 41 $data{$column} = $this->Transform($val) if $val; | |
| 42 } | |
| 43 | |
| 44 my $obj; | |
| 45 if ($data{id}) { | |
| 46 # edit value | |
| 47 | |
| 48 | |
| 49 $obj = $class->validateId($data{id}); | |
| 50 my %filter = map { $_, $obj->$_()} @accessors; | |
| 51 $filter{$_} = $data{$_} foreach keys %data; | |
| 52 my ($newObj) = $class->lookup(\%data); | |
| 53 die new IMPL::DuplicateException('The object already exists', $class) if ($newObj and $newObj->id != $data{id}); | |
| 54 | |
| 55 $obj->$_($data{$_}) foreach keys %data; | |
| 56 $obj->update(); | |
| 57 } else { | |
| 58 # new instance | |
| 59 die new IMPL::DuplicateException('The object already exists', $class) if $class->lookup(\%data); | |
| 60 $obj = $class->insert(\%data); | |
| 61 } | |
| 62 return $obj; | |
| 63 } | |
| 64 | |
| 65 sub _mk_class { | |
| 66 my ($this,$name) = @_; | |
| 67 | |
| 68 return unless $name; | |
| 69 return $name if $name =~ /::/; | |
| 70 return $this->Namespace ? $this->Namespace."::$name" : $name; | |
| 71 } | |
| 72 | |
| 73 package CDBI::Transform::ObjectToForm; | |
| 74 use base qw(IMPL::Transform); | |
| 75 | |
| 76 use IMPL::Class::Property; | |
| 77 | |
| 78 sub CTOR { | |
| 79 my $this = shift; | |
| 80 | |
| 81 $this->superCTOR( | |
| 82 Default => \&TransformObject, | |
| 83 Plain => sub { my ($this,$val) = @_; return $val; } | |
| 84 ); | |
| 85 } | |
| 86 | |
| 87 sub TransformObject { | |
| 88 my ($this,$object) = @_; | |
| 89 | |
| 90 return $object if not ref $object; | |
| 91 | |
| 92 my %data; | |
| 93 foreach my $column ( (map $_->accessor,$object->columns()),'id') { | |
| 94 my $value = $object->$column(); | |
| 95 | |
| 96 if (ref $value eq 'HASH') { | |
| 97 $data{"$column/$_"} = $value->{$_} foreach keys %$value; | |
| 98 } else { | |
| 99 $data{$column} = $value; | |
| 100 } | |
| 101 } | |
| 102 | |
| 103 return \%data; | |
| 104 } | |
| 105 1; | 
