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 );
}
}