HTML-FormHandler

 view release on metacpan or  search on metacpan

lib/HTML/FormHandler.pm  view on Meta::CPAN

    catch {
        die "Error occurred localizing error message for " . $self->name . ".  $_";
    };
    $self->push_form_errors($out);
    return;
}

sub get_default_value { }
sub _can_deflate { }

sub update_fields {
    my $self = shift;
    if( $self->has_update_field_list ) {
        my $updates = $self->update_field_list;
        foreach my $field_name ( keys %{$updates} ) {
            $self->update_field($field_name, $updates->{$field_name} );
        }
        $self->clear_update_field_list;
    }
    if( $self->has_defaults ) {
        my $defaults = $self->defaults;
        foreach my $field_name ( keys %{$defaults} ) {
            $self->update_field($field_name, { default => $defaults->{$field_name} } );
        }
        $self->clear_defaults;
    }
}

sub update_field {
    my ( $self, $field_name, $updates ) = @_;

    my $field = $self->field($field_name);
    unless( $field ) {
        die "Field $field_name is not found and cannot be updated by update_fields";
    }
    while ( my ( $attr_name, $attr_value ) = each %{$updates} ) {
        confess "invalid attribute '$attr_name' passed to update_field"
            unless $field->can($attr_name);
        if( $attr_name eq 'tags' ) {

lib/HTML/FormHandler.pm  view on Meta::CPAN

Used to dynamically set particular field attributes on the 'process' (or
'run') call. (Will not create fields.)

    $form->process( update_field_list => {
       foo_date => { format => '%m/%e/%Y', date_start => '10-01-01' } },
       params => $params );

The 'update_field_list' is processed by the 'update_fields' form method,
which can also be used in a form to do specific field updates:

    sub update_fields {
        my $self = shift;
        $self->field('foo')->temp( 'foo_temp' );
        $self->field('bar')->default( 'foo_value' );
        $self->next::method();
    }

(Note that you although you can set a field's 'default', you can't set a
field's 'value' directly here, since it will
be overwritten by the validation process. Set the value in a field
validation method.)

lib/HTML/FormHandler/Manual/Cookbook.pod  view on Meta::CPAN

       $self->item->hostname( $self->hostname );
    };

Then just use an additional parameter when you create/process your form:

    $form->process( item => $item, params => $params, hostname => $c->req->host );

Some kinds of DB relationships need to have primary keys which might be more easily
set in the update_model method;

    sub update_model {
        my $self = shift;
        my $values = $self->values;
        $values->{some_field}->{some_key} = 'some_value';
        $self->_set_value($values);
        $self->next::method;
    }

If you need to access a database field in order to create the value for a
form field you can use a C< default_* > method.

lib/HTML/FormHandler/Manual/Cookbook.pod  view on Meta::CPAN

            }
        }
        # Note 7
        # sort into admin flag first, then family_name
        @is_admin = sort { $a->{family} cmp $b->{family} } @is_admin;
        @is_not_admin = sort { $a->{family} cmp $b->{family} } @is_not_admin;
        return { admin_roles => [@is_admin, @is_not_admin] };
    }

    # Note 8
    sub update_model {
        my $self = shift;

        my $families = $self->schema->resultset('Family');
        my $family_roles = $self->value->{admin_roles};
        foreach my $elem ( @{$family_roles} ) {
            my $fam = $families->find( $elem->{family_id} );
            my $has_admin_flag = $fam->search_related('user_roles', { role_id => 2 } )->count > 0;
            if( $elem->{admin_flag} == 1 && !$has_admin_flag ) {
                $fam->create_related('user_roles', { role_id => 2 } );
            }

lib/HTML/FormHandler/Manual/Cookbook.pod  view on Meta::CPAN

        my $self = shift;
        my $rows = [$self->resultset->all];
        return { employers => $rows };
    }
    has_field 'employers' => ( type => 'Repeatable' );
    has_field 'employers.employer_id' => ( type => 'PrimaryKey' );
    has_field 'employers.name';
    has_field 'employers.category';
    has_field 'employers.country';

    sub update_model {
        my $self = shift;
        my $values = $self->values->{employers};
        foreach my $row (@$values) {
            delete $row->{employer_id} unless defined $row->{employer_id};
            $self->resultset->update_or_create( $row );
        }
    }

=head2 Server-provided dynamic value for field

lib/HTML/FormHandler/Manual/Cookbook.pod  view on Meta::CPAN

    sub default_foo {
        my $self = shift;
        return $self->form_id;
    }
    ....
    $form->process( form_id => 'my_form', params => $params );

You can set a Moose attribute in the form class and set it in an update_fields
method:

    sub update_fields {
        my $self = shift;
        $self->field('foo')->default('my_form');
    }

=head2 Static form, dynamic field IDs

The problem: you have a form that will be used in multiple places on a page, but you
want to use a static form instead of doing 'new' for each. You can pass a form name in
on the process call and use 'html_prefix' in the form:

lib/HTML/FormHandler/Model.pm  view on Meta::CPAN


sub lookup_options { }


sub validate_model { }


sub clear_model { }


sub update_model { }

use namespace::autoclean;
1;

__END__

=pod

=encoding UTF-8

lib/HTML/FormHandler/Model/CDBI.pm  view on Meta::CPAN

        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

lib/HTML/FormHandler/Model/Object.pm  view on Meta::CPAN

package HTML::FormHandler::Model::Object;
# ABSTRACT: stub for Object model
$HTML::FormHandler::Model::Object::VERSION = '0.40068';
use Moose::Role;

sub update_model {
    my $self = shift;

    my $item = $self->item;
    return unless $item;
    foreach my $field ( $self->all_fields ) {
        my $name = $field->name;
        next unless $item->can($name);
        $item->$name( $field->value );
    }
}

t/field_setup/update_fields.t  view on Meta::CPAN

    package Test::Field::Updates;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has 'form_id' => ( isa => 'Str', is => 'rw' );

    has_field 'foo';
    has_field 'bar';
    has_field 'blah' => ( type => 'Hidden' );

    sub update_fields {
        my $self = shift;
        $self->field('foo')->temp( 'foo_temp' );
        $self->field('bar')->default( 'foo_value' );
        $self->field('blah')->default( $self->form_id );
    }
}

$form = Test::Field::Updates->new;
$fif = {};
$form->process( form_id => 'page1form', params => $fif );

t/form_setup/no_update.t  view on Meta::CPAN

use Test::More;

{
    package MyApp::Form::Test;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has_field 'foo';
    has_field 'bar';

    sub update_model {
        my $self = shift;
        my $values = $self->values;
        $values->{foo} = 'updated';
        $self->_set_value($values);
    }
}

my $form = MyApp::Form::Test->new;
my $params = { foo => 'pfoo', bar => 'pbar' };
$form->process( params => $params );

t/memory_cycles.t  view on Meta::CPAN

    has_field 'entries.foo' => (
        type     => 'Text',
        required => 1,
    );
    has_field 'entries.bar' => (
        type     => 'Text',
        required => 1,
    );
    has_field 'some_select' => ( type => 'Select', inactive => 1 );

    sub update_model {
        my $self = shift;
        my $value = $self->field('some_select')->value;
    }
}

my $form = new_ok( 'My::RepeatableForm' );

my $params = {
    reqname => 'Testrequest',
    'entries.1.foo' => 'test1',

t/repeatable/reload.t  view on Meta::CPAN

    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has_field 'foo';
    has_field 'bar';
    has_field 'my_rep' => ( type => 'Repeatable' );
    has_field 'my_rep.rep_id' => ( type => 'PrimaryKey' );
    has_field 'my_rep.one';
    has_field 'my_rep.two';

    sub update_model {
        my $self = shift;
        my $value = $self->value;
        my $index = 1;
        foreach my $rep ( @{ $value->{my_rep} } ) {
            $rep->{rep_id} = $index;
            $index++;
        }
        $self->item( $value );
    }
}



( run in 0.288 second using v1.01-cache-2.11-cpan-4d4bc49f3ae )