فرمهای پیشرفته
کلاس AdvancedForm اعتبارسنجی فرم، محافظت CSRF، و کمک به رندر برای قالبهای Jinja را فراهم میکند.
ساخت یک فرم
یک کلاس فرم با ارثبری از AdvancedForm بسازید و متد fields() را پیادهسازی کنید:
import 'package:finch/finch_route.dart';
class RegisterForm extends AdvancedForm {
@override
List<FormField> fields() => [
FormField(
name: 'name',
label: 'نام کامل',
validators: [
FormValidator.required(),
FormValidator.minLength(2),
FormValidator.maxLength(100),
],
),
FormField(
name: 'email',
label: 'ایمیل',
validators: [
FormValidator.required(),
FormValidator.email(),
],
),
FormField(
name: 'password',
label: 'رمز عبور',
validators: [
FormValidator.required(),
FormValidator.minLength(8),
],
),
];
}
اعتبارسنجی فرم
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},
);
},
);
}
اعتبارسنجها
| اعتبارسنج | توضیح |
|---|---|
FormValidator.required() |
فیلد نباید خالی باشد |
FormValidator.email() |
باید آدرس ایمیل معتبر باشد |
FormValidator.minLength(n) |
حداقل n کاراکتر |
FormValidator.maxLength(n) |
حداکثر n کاراکتر |
FormValidator.min(n) |
مقدار عددی ≥ n |
FormValidator.max(n) |
مقدار عددی ≤ n |
FormValidator.regex(pattern) |
باید با regex مطابقت داشته باشد |
FormValidator.match('other') |
باید با فیلد دیگری برابر باشد |
FormValidator.custom(fn) |
تابع اعتبارسنجی سفارشی |
محافظت CSRF
AdvancedForm به صورت خودکار تأیید CSRF را مدیریت میکند. در قالب، یک input مخفی اضافه کنید:
<form method="POST">
{{ form.csrfInput() }}
{# ... فیلدهای فرم ... #}
<button type="submit">ثبتنام</button>
</form>
وضعیت فیلد در قالب
شیء form وضعیت فیلد و پیامهای خطا را نمایش میدهد:
<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
برای endpoint های JSON، هنگامی که درخواست Content-Type: application/json است، فرم خودکار JSON برمیگرداند:
return form.check(
onValid: () async => rq.renderData(data: {'success': true}),
onInvalid: () async => rq.renderData(
data: {'errors': form.getErrors()},
statusCode: 422,
),
);