Form-Processor-Model-RDBO

 view release on metacpan or  search on metacpan

lib/Form/Processor/Model/RDBO.pm  view on Meta::CPAN

    if ( $@ ) {
        $foreign_manager = 'Rose::DB::Object::Manager';
        $foreign_manager->require or die "Unable to require $foreign_manager";
    }

    # Trying to determinate the active column the default value for
    # active_column is "name"
    my $active_column;
    if ( $foreign_class->can('active_column') ) {
        $active_column = $foreign_class->active_column;
    } elsif ( $self->can('active_column') ) {
        $active_column = $self->active_column;
    }

    # Check that active_column exists in foreign class columns list
    # If the active column does not exist in foreign class columns list
    # set it to '' (boolean false)
    #my @foreign_columns  = $foreign_class->meta->column_names;
    #$active_column = '' unless grep { $_ eq $active_column } @foreign_columns;
    # FIXME: can't simply check if column exists because relative column can be
    # specified: 't2.title'

    $active_column = "name" unless $active_column;

    my ( $primary_key )  = ( $foreign_class->meta->primary_key_column_names );

    my @options;
    # Fetch options only if active_column exists

    if ( $active_column ) {
        my %m_params = (
            'object_class' => $foreign_class,
            'select'       => [ $primary_key, $active_column ],
        );
        my $records = $foreign_manager->get_objects( %m_params);

        foreach my $r ( @$records ) {
            push @options,
              (
                  $r->$primary_key => $r->can( 'active_column_method' )
                ? $r->active_column_method()
                : $r->$active_column
              );
        }
    } else {
        warn 'active_column is undefined';
        @options = ();
    }
    
    return \@options;
}

=head2 update_from_form

Makes form validation and returns the filled RDBO item, filled by update_model.
It does not save the current item automatically. You should do this in your
code, after the call update_from_form.

=cut

sub update_from_form {
    my ( $self, $params ) = @_;
    return unless $self->validate( $params );
    return $self->update_model( $params );
}

=head2 update_model

Returns the new RDBO item, filled with passed form params. It does not save any
data to the database, just creates and fills new RDBO object.

=cut

sub update_model {
    my ( $self, $params ) = @_;

    my $item = $self->item;
    my $class = ref( $item ) || $self->object_class;

    my %fields = map { $_->name, $_ } grep { !$_->noupdate } $self->fields;

    $item = $class->new() unless $item;
    while ( my ( $name, $field ) = each %fields ) {
        if ( $item->can( $name ) ) {
            if (   !$field->isa( 'Form::Processor::Field::Select' )
                && defined $item->$name
                && defined $field->value )
            {
                next if $item->$name eq $field->value;
            }

            $item->$name( $field->value );
        }
    }

    return $item;
}

=head2 model_validate

Does simple validation of fields, that you specified as unique in your form
profile. You are free to override this method if you want to implement much
serious model validation.

=cut

sub model_validate
{
    my ($self) = @_;
    return unless $self->validate_unique;
    return 1;
}

=head2 validate_unique

Internal method. Does simple validation of fields, that you specified as unique
in your form profile.

=cut

sub validate_unique {
    my ( $self ) = @_;

    my $unique = $self->profile->{ unique } || return 1;

    my $item = $self->item;

    my $class = ref( $item ) || $self->object_class;

    my $found_error = 0;

    for my $field ( map { $self->field( $_ ) } @$unique ) {
        next if $field->errors;



( run in 1.241 second using v1.01-cache-2.11-cpan-39bf76dae61 )