Чтобы начать с последнего вопроса, правильный способ извлечения привязок вручную (который web-server/formlets
использует для внутреннего использования) - это request-bindings/raw
в сочетании с вспомогательными функциями, которые работают с binding:form
и binding:file
структуры, такие как bindings-assq-all
. Документация, безусловно, должна быть изменена, чтобы более четко указывать на устаревший API.
Что касается формлетов, то шаблон для входных имен является частью дизайна абстракции формы, но это не то, что вы как ожидается, будут взаимодействовать напрямую. Может быть, вы уже знаете это, но, поскольку вы упоминаете formlet-process
, но не formlet-display
, мне интересно, возможно, вы наткнулись на web-server/formlets
, не видя всего этого фона (что легко сделать!). Есть статья academi c , в которой подробно описывается дизайн, но я постараюсь немного разобраться здесь (на примере из статьи).
Представьте, что вы хотите создать компонент формы, чтобы спросить пользователя о дате. Вам нужно написать код для двух разных задач: генерация HTML и обработка отправленного запроса. Однако эти задачи тесно взаимосвязаны. Если вы изменяете HTML, который вы генерируете (который, вероятно, будет включать несколько элементов ввода), вам часто придется вносить соответствующие изменения в код обработки. Нам нужен способ помочь отображению и обработке кода синхронизироваться c. Более того, после того как вы создали отличный компонент даты, вы можете использовать его несколько раз в одной и той же форме: возможно, вы даже захотите создать компонент диапазона дат. Поскольку HTML входные элементы идентифицируются уникальными идентификаторами, вам нужны некоторые средства абстракции, чтобы сделать ваш код многократно используемым.
Formlets предлагают решение этих проблем. Формула инкапсулирует код рендеринга и обработки, сохраняя их в синхронизации c. Чтобы ваши формулы действительно инкапсулировали некоторую функциональную единицу, библиотека web-server/formlets
генерирует все идентификаторы.
Это все немного абстрактно, поэтому вот пример использования формул для получения имени пользователя и пароля:
#lang web-server/insta
(require web-server/formlets)
(define (start request)
(define-values [username password]
(get-username+password-from-user))
(redirect/get)
(response/xexpr
`(html (head (title "You Logged In")
(meta ([charset "utf-8"]))
(meta ([name "viewport"]
[content "width=device-width,initial-scale=1"])))
(body (h1 "You Logged In")
(p (b "Your username: ") ,username)
;; obviously don't do this for real:
(p (b "Your password: ") ,password)))))
(define login-formlet
(formlet
(#%# (p (label "Username: "
,{=> (to-string
(required
(text-input
#:attributes '([required "required"]))))
username}))
(p (label "Password: "
,{=> (to-string
(required
(password-input
#:attributes '([required "required"]))))
password}))
(p (input ([type "submit"]
[value "Log In"]))))
(values username password)))
(define (get-username+password-from-user)
(send/formlet
login-formlet
#:wrap
(λ (rendered-form)
`(html (head (title "Please Log In")
(meta ([charset "utf-8"]))
(meta ([name "viewport"]
[content "width=device-width,initial-scale=1"])))
(body (h1 "Please Log In")
,rendered-form)))))