HTML-FormFu-Model-DBIC

 view release on metacpan or  search on metacpan

lib/HTML/FormFu/Model/DBIC.pm  view on Meta::CPAN

            }

            # remove 'delete' checkbox from the last repetition ?

            if ( $config->{empty_rows} ) {

                my $new_row_count
                    = $config->{empty_rows}
                    ? $config->{empty_rows}
                    : 1;

                my @reps = reverse @{ $block->get_elements };

                for my $i ( 0 .. ( $new_row_count - 1 ) ) {

                    my $rep = $reps[$i];

                    my ($del_field)
                        = grep { $_->model_config->{delete_if_true} }
                        @{ $rep->get_fields };

                    if ( defined $del_field ) {
                        $del_field->parent->remove_element($del_field);
                    }
                }
            }
        }
        else {
            if ( defined( my $row = $dbic->$rel ) ) {
                default_values( $self, $row, { base => $block } );
            }
        }
    }
    return;
}

sub create {
    my ( $self, $attrs ) = @_;

    croak "invalid arguments" if @_ > 2;

    my $form = $self->form;
    my $base = defined $attrs->{base} ? delete $attrs->{base} : $form;

    my $schema = $form->stash->{schema}
        or croak 'schema required on form stash, if no row object provided';

    my $resultset
        = $attrs->{resultset}
        || $base->model_config->{resultset}
        || $form->model_config->{resultset}
        or croak 'could not find resultset name';

    $resultset = $schema->resultset($resultset);

    my $dbic = $resultset->new_result( {} );

    return $self->update( $dbic, { %$attrs, base => $base } );
}

sub update {
    my ( $self, $dbic, $attrs ) = @_;

    croak "row object missing" if !defined $dbic;

    my $form = $self->form;
    my $base = defined $attrs->{base} ? delete $attrs->{base} : $form;

    $base = $form->get_all_element( { nested_name => $attrs->{nested_base} } )
        if defined $attrs->{nested_base}
            && ( !defined $base->nested_name
                || $base->nested_name ne $attrs->{nested_base} );

    my $rs   = $dbic->result_source;
    my @rels = $rs->relationships;
    my @cols = $rs->columns;

    # check for belongs_to relationships with a required foreign key
    my (@belongs_to_rels, @other_rels);

    foreach my $rel (@rels) {
        # 'fk_columns' is set for belong_to rels in DBIx::Class::Relationship::BelongsTo
        my @fk_columns = keys %{ $dbic->relationship_info($rel)->{attrs}{fk_columns} };

        if (@fk_columns) {
            push @belongs_to_rels, $rel;
        } else {
            push @other_rels, $rel;
        }
    }

    # add belongs_to rels before insert
    if (@belongs_to_rels) {
        # tell _save_relationships not to update $dbic yet, just add the rels
        my %attrs = ( %$attrs, no_update => 1 );
        _save_relationships( $self, $base, $dbic, $form, $rs, \%attrs, \@belongs_to_rels );
    }


    _save_columns( $base, $dbic, $form ) or return;

    $dbic->update_or_insert;

    _save_relationships( $self, $base, $dbic, $form, $rs, $attrs, \@other_rels );

    _save_multi_value_fields_many_to_many( $base, $dbic, $form, $attrs, \@rels,
        \@cols );

    _save_repeatable_many_to_many( $self, $base, $dbic, $form, $attrs, \@rels,
        \@cols );

    # handle non-rel, non-column, nested_base accessors.
    # - this highlights a failing of the approach of iterating over
    # db cols + rels - we should maybe refactor to iterate over
    # form blocks and fields instead ?

    for my $block ( @{ $base->get_all_elements } ) {
        next if $block->is_field;
        next if !$block->can('nested_name');

        my $rel = $block->nested_name;



( run in 2.382 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )