Mojolicious-Plugin-FormFields
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/FormFields.pm view on Meta::CPAN
for my $name (keys %{$self->{fields}}) {
my $field = $self->_field($name);
unless($field->valid) {
$valid = 0;
$self->{errors}->{$name} = $field->error;
}
}
$valid;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $name = shift;
Carp::croak 'field name required' unless $name;
(my $method = $AUTOLOAD) =~ s/[^':]+:://g;
$self->_field($name)->$method(@_);
# Some hacky shit going on here...
$self->{fields}->{$name} = 1;
$self;
}
sub _field
{
my ($self, $name) = @_;
$self->{c}->field($self->_path($name), $self->{object});
}
sub _fields
{
my ($self, $name) = @_;
$self->{c}->fields($self->_path($name), $self->{object});
}
1;
__END__
=pod
=head1 NAME
Mojolicious::Plugin::FormFields - Lightweight form builder with validation and filtering
=head1 SYNOPSIS
$self->plugin('FormFields');
# In your controller
sub edit
{
my $self = shift;
my $user = $self->users->find($self->param('id'));
$self->stash(user => $user);
}
sub update
{
my $self = shift;
my $user = $self->params('user');
$self->field('user.name')->is_required;
$self->field('user.password')->is_required->is_equal('user.confirm_password');
if($self->valid) {
$self->users->save($user);
$self->redirect_to('/profile');
return;
}
$self->stash(user => $user);
}
# In your view
field('user.name')->text
field('user.name')->error unless field('user.name')->valid
field('user.password')->password
field('user.age')->select([10,20,30])
field('user.password')->password
field('user.taste')->radio('me_gusta')
field('user.taste')->radio('estoy_harto_de')
field('user.orders.0.id')->hidden
# Fields for a collection
my $kinfolk = field('user.kinfolk');
for my $person (@$kinfolk) {
$person->hidden('id')
$person->text('name')
}
# Or, scope it to the 'user' param
my $user = fields('user')
$user->hidden('id')
$user->text('name')
$user->error('name') unless $user->valid('name')
$user->label('admin')
$user->checkbox('admin')
$user->password('password')
$user->select('age', [ [X => 10], [Dub => 20] ])
$user->file('avatar')
$user->textarea('bio', size => '10x50')
my $kinfolk = $user->fields('kinfolk')
for my $person (@$kinfolk) {
$person->text('name')
# ...
}
=head1 DESCRIPTION
C<Mojolicious::Plugin::FormFields> allows you to bind objects and data structures to form fields. It also performs validation and filtering via L<Validate::Tiny>.
=head1 CREATING FIELDS
Fields can be bound to a hash, an array, something blessed, or any combination of the three.
They are created by calling the C<< L</field> >> helper with a path to the value you want to bind,
( run in 1.079 second using v1.01-cache-2.11-cpan-0d23b851a93 )