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 )