فرم‌های پیشرفته

کلاس 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,
  ),
);