Catalyst-Plugin-Form-Processor

 view release on metacpan or  search on metacpan

lib/Catalyst/Plugin/Form/Processor.pm  view on Meta::CPAN

# ABSTRACT: Use Form::Processor with Catalyst


sub form {
    my ( $c, $args_ref, $form_name ) = @_;


    # Determine the form package name
    my $package;
    if ( defined $form_name ) {

        $package
            = $form_name =~ s/^\+//
            ? $form_name
            : ref( $c ) . '::Form::' . $form_name;
    }
    else {
        $package = $c->action->class;
        $package =~ s/::C(?:ontroller)?::/::Form::/;
        $package .= '::' . ucfirst( $c->action->name );
    }

    Class::Load::load_class( $package );


    # Single argument to Form::Processor->new means it's an item id or object.
    # Hash references must be turned into lists.

    my %args;
    if ( defined $args_ref ) {
        if ( ref $args_ref eq 'HASH' ) {
            %args = %{$args_ref};
        }
        elsif ( Scalar::Util::blessed( $args_ref ) ) {
            %args = (
                item    => $args_ref,
                item_id => $args_ref->id,
            );
        }
        else {
            %args = ( item_id => $args_ref );
        }
    }

    # Set schema name -- mostly for DBIC

    if ( $package->can( 'schema' ) ) {
        unless ( exists $args{schema} ) {
            my $schema_name = $c->config->{form}{model_name}
                || $c->stash->{model_name};


            $args{schema} = $c->model( $schema_name )->schema
                if defined $schema_name;
        }
    }

    $args{user_data}{context} = $c;

    # Since $c holds a reference to the form and the form holds
    # a reference to the context must weaken.
    Scalar::Util::weaken( $args{user_data}{context} );


    return $c->stash->{form} = $package->new( %args );

} ## end sub form



sub validate_form {
    my ( $c, @rest ) = @_;

    my $form = $c->form( @rest );

    return
        $c->form_posted
        && $form->validate( $c->req->parameters );

}




sub update_from_form {
    my ( $c, @rest ) = @_;

    my $form = $c->form( @rest ) || return;

    return
        $c->form_posted
        && $form->update_from_form( $c->req->parameters );

}


sub form_posted {
    my $c = shift;

    return $c->req->method eq 'POST' || $c->req->method eq 'PUT';
}


# Used to override finalize, but that's not called in a redirect.
# TODO: add support for multiple forms on a page (and multiple forms
# in the stash).
#
# And better, simply remove this.

before 'finalize' => sub {
    my $c = shift;


    my $form = $c->stash->{form} || return;


    # Disabled in configuration
    return if $c->config->{form}{no_fillin};


    return if $c->res->status != 200;



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