Geavanceerde formulieren

De klasse AdvancedForm biedt formuliervalidatie, CSRF-beveiliging en render-hulpmiddelen voor Jinja-sjablonen.

Een formulier aanmaken

Maak een formulierklasse door AdvancedForm uit te breiden en de methode fields() te implementeren:

import 'package:finch/finch_route.dart';

class RegisterForm extends AdvancedForm {
  @override
  List<FormField> fields() => [
    FormField(
      name: 'name',
      label: 'Volledige naam',
      validators: [
        FormValidator.required(),
        FormValidator.minLength(2),
        FormValidator.maxLength(100),
      ],
    ),
    FormField(
      name: 'email',
      label: 'E-mailadres',
      validators: [
        FormValidator.required(),
        FormValidator.email(),
      ],
    ),
    FormField(
      name: 'password',
      label: 'Wachtwoord',
      validators: [
        FormValidator.required(),
        FormValidator.minLength(8),
      ],
    ),
  ];
}

Formuliervalidatie

Future<String> register() async {
  var form = RegisterForm();
  await form.init(rq);

  return form.check(
    onValid: () async {
      var name     = form.getValue('name');
      var email    = form.getValue('email');
      var password = form.getValue('password');

      await UserModel().create({
        'name': name,
        'email': email,
        'password': hashPassword(password),
      });

      return rq.redirect(url: '/dashboard');
    },
    onInvalid: () async {
      return rq.renderView(
        path: 'auth/register',
        params: {'form': form},
      );
    },
  );
}

Validators

Validator Beschrijving
FormValidator.required() Veld mag niet leeg zijn
FormValidator.email() Moet een geldig e-mailadres zijn
FormValidator.minLength(n) Minimaal n tekens
FormValidator.maxLength(n) Maximaal n tekens
FormValidator.min(n) Numerieke waarde ≥ n
FormValidator.max(n) Numerieke waarde ≤ n
FormValidator.regex(pattern) Moet overeenkomen met regex
FormValidator.match('other') Moet gelijk zijn aan een ander veld
FormValidator.custom(fn) Aangepaste validatiefunctie

CSRF-beveiliging

AdvancedForm verwerkt CSRF-verificatie automatisch. Voeg in het sjabloon een verborgen input toe:

<form method="POST">
  {{ form.csrfInput() }}
  {# ... formuliervelden ... #}
  <button type="submit">Registreren</button>
</form>

Veldstatus in het sjabloon

Het form-object geeft de veldstatus en foutmeldingen weer:

<div class="field {% if form.hasError('email') %}error{% endif %}">
  <label>{{ form.getLabel('email') }}</label>
  <input type="email" name="email" value="{{ form.getValue('email') }}">
  {% if form.hasError('email') %}
    <span class="error">{{ form.getError('email') }}</span>
  {% endif %}
</div>

API-modus

Voor JSON-eindpunten, wanneer het verzoek Content-Type: application/json is, geeft het formulier automatisch JSON terug:

return form.check(
  onValid: () async => rq.renderData(data: {'success': true}),
  onInvalid: () async => rq.renderData(
    data: {'errors': form.getErrors()},
    statusCode: 422,
  ),
);