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