HTML-FormHandler
view release on metacpan or search on metacpan
lib/HTML/FormHandler/Model/CDBI.pm view on Meta::CPAN
my $column = $field->name;
$item ||= $self->item;
return if $field->writeonly;
return
unless $item &&
( $item->can($column) ||
( ref $item eq 'HASH' && exists $item->{$column} ) );
my @values;
if ( ref $item eq 'HASH' ) {
@values = $item->{$column} if ref($item) eq 'HASH';
}
elsif ( !$item->isa('Class::DBI') ) {
@values = $item->$column;
}
else {
@values =
map { ref $_ && $_->isa('Class::DBI') ? $_->id : $_ } $item->$column;
}
my $value = @values > 1 ? \@values : shift @values;
$field->init_value($value);
$field->value($value);
}
sub validate_model {
my ($self) = @_;
return unless $self->validate_unique;
return 1;
}
sub validate_unique {
my ($self) = @_;
my @unique = map { $_->name } grep { $_->unique } $self->fields;
return 1 unless @unique;
my $item = $self->item;
my $class = ref($item) || $self->item_class;
my $found_error = 0;
for my $field ( map { $self->field($_) } @unique ) {
next if $field->errors;
my $value = $field->value;
next unless defined $value;
my $name = $field->name;
# unique means there can only be on in the database like it.
my $match = $class->search( { $name => $value } )->first || next;
next if $self->items_same( $item, $match );
my $field_error = $field->unique_message ||
'Value must be unique in the database';
$field->add_error($field_error);
$found_error++;
}
return $found_error;
}
sub update_model {
my ($self) = @_;
# Grab either the item or the object class.
my $item = $self->item;
my $class = ref($item) || $self->item_class;
my $updated_or_created;
# get a hash of all fields
my %fields = map { $_->name, $_ } grep { !$_->noupdate } $self->fields;
# First process the normal and has_a columns
# as that data is directly stored in the object
my %data;
# Loads columns (including has_a)
foreach my $col ( $class->columns('All') ) {
next unless exists $fields{$col};
my $field = delete $fields{$col};
# If the field is flagged "clear" then set to NULL.
my $value = $field->value;
if ($item) {
my $cur = $item->$col;
next unless $value || $cur;
next if $value && $cur && $value eq $cur;
$item->$col($value);
}
else {
$data{$col} = $value;
}
}
if ($item) {
$item->update;
$updated_or_created = 'updated';
}
else {
$item = $class->create( \%data );
$self->item($item);
$updated_or_created = 'created';
}
# Now check for mapping/has_many in any left over fields
for my $field_name ( keys %fields ) {
next unless $class->meta_info('has_many');
next unless my $meta = $class->meta_info('has_many')->{$field_name};
my $field = delete $fields{$field_name};
my $value = $field->value;
# Figure out which values to keep and which to add
my %keep;
%keep = map { $_ => 1 } ref $value ? @$value : ($value)
if defined $value;
# Get foreign class and its key that points to $class
my $foreign_class = $meta->foreign_class;
my $foreign_key = $meta->args->{foreign_key};
my $related_key = $meta->args->{mapping}->[0];
die "Failed to find related_key for field [$field] in class [$class]"
unless $related_key;
( run in 0.422 second using v1.01-cache-2.11-cpan-e93a5daba3e )