Skip to content

Latest commit

 

History

History
92 lines (77 loc) · 3.47 KB

frp.org

File metadata and controls

92 lines (77 loc) · 3.47 KB

frp

FRP

В качестве модельной задачи представим что у нас есть некоторая форма регистрации:

+----------------------------------------+
| Registration form                      |
|                                        |
|                      +---------------+ |
| электронная почта    |               | |
|                      +---------------+ |
|                                        |
|                      +---------------+ |
| пароль               |               | |
|                      +---------------+ |
|                                        |
|                      +---------------+ |
| подтверждение пароля |               | |
|                      +---------------+ |
|                                        |
| /----------\                           |
| | Register |                           |
| \----------/                           |
+----------------------------------------+
(define-form register ("Registration form")
  ((define-field  email    () "Электронная почта")
   (define-field  password (:type "password") "Пароль")
   (define-field  confirm  (:type "password") "Подтверждение пароля")
   (define-button register () "Зарегистроваться")))

Теперь мы хотим чтобы кнопка “Зарегистрироваться” была недоступна, если поля формы не содержат корректное значение (чтобы это не значило) Опишем, что статус кнопки зависит от полей:

(define-button register
    (:status (if (reduce #'(lambda (acc x)
                             (and (is-correct acc)
                                  (is-correct x)))
                         (list email password confirm))
                 :enabled
                 :disabled))
  "Зарегистроваться")

Какие-же значения считать корректными? Ну, например, пароль никак не может быть пустым, так и запишем:

(defmethod is_correct ((field password))
  (not (is_empty (get-value field))))

Подтверждение пароля помимо этого должно совпадать с паролем:

(defmethod is_correct ((field confirm))
  (and (not (is_empty (get-value field)))
       (equal (get-value field)
              (get-value (get-field confirm)))))

Ну а email должен быть не зарегистрирован:

(defmethod is_correct ((field email))
  (and (not (is_empty (get-value field)))
       (not (is-registered-email (get-value field)))))