Mercurial > pub > Impl
view Lib/Form/ValueItem/List.pm @ 30:dd4d72600c69
ORM in works
author | Sergey |
---|---|
date | Tue, 03 Nov 2009 16:31:47 +0300 |
parents | 03e58a454b20 |
children | 16ada169ca75 |
line wrap: on
line source
package Form::ValueItem::List; use Common; use base qw(Form::ValueItem); BEGIN { DeclareProperty ListValues => ACCESS_READ; DeclareProperty CurrentItem => ACCESS_READ; } sub CTOR { my $this = shift; $this->SUPER::CTOR(@_); $this->{$ListValues} = []; my $source = $this->Form->Bindings->{$this->Attributes->{source}}; if (ref $source eq 'CODE') { $this->LoadList($source->()); } elsif (ref $source and (UNIVERSAL::isa($source,'HASH') or UNIVERSAL::isa($source,'ARRAY'))){ $this->LoadList($source); } else { if (not $source) { warn "a source isn't specified for the listvalue ".$this->Id->Canonical; } else { warn "an unsupported source type ".(ref $source)." for the listvalue".$this->Id->Canonical; } } } sub Value { my $this = shift; if (@_) { my $newValue = shift; $this->{$CurrentItem}->{active} = 0 if $this->{$CurrentItem}; my ($item) = (defined $newValue ? grep {defined $_->{id} and $_->{id} eq $newValue} @{$this->{$ListValues}} : undef); if ($item) { $this->{$CurrentItem} = $item; $item->{active} = 1; return $this->SUPER::Value($newValue); } else { undef $this->{$CurrentItem}; return $this->SUPER::Value(undef); } } else { return $this->SUPER::Value; } } sub LoadList { my ($this,$refList) = @_; if (ref $refList and UNIVERSAL::isa($refList,'HASH')) { $this->{$CurrentItem} = undef; $this->{$ListValues} = [ sort { $a->{name} cmp $b->{name} } map { Form::ValueItem::List::Item->new($_,ref $refList->{$_} eq 'ARRAY' ? @{$refList->{$_}} : $refList->{$_})} keys %{$refList}]; $this->SUPER::Value(undef); } elsif (ref $refList and UNIVERSAL::isa($refList,'ARRAY')) { $this->{$CurrentItem} = undef; $this->{$ListValues} = [map { Form::ValueItem::List::Item->new(ref $_ eq 'ARRAY' ? @$_ : $_ )} @$refList]; $this->SUPER::Value(undef); } else { die new Exception('An unexpected list type'); } } package Form::ValueItem::List::Item; use fields qw( id description name active ); sub new { my ($class,$id,$name,$desc) = @_; my $this=fields::new($class); $this->{id} = $id; $this->{name} = $name; $this->{description} = $desc; return $this; } #compatibility with TToolkit sub Id { $_[0]->{id}; } sub Description { $_[0]->{description}; } sub Active { $_[0]->{active}; } sub Name { $_[0]->{name}; } 1;