Как создать все ошибки в одном списке при создании формы с помощью библиотеки Reform?

Я следую учебному пособию для библиотеки реформ. В настоящее время у меня есть форма с двумя обязательными полями и ее настройка, поэтому рядом с ней появляется сообщение об ошибке для каждого поля.

postForm :: MyForm MyRequest
postForm = 
    MyRequest <$> name <*> msg <* inputSubmit "post it!"
  where
    name = labelText "name:"  ++>
            (inputText "" `transformEither` required "Name is required") <++ br <++ errorList
    msg  = labelText "message:" ++>
            (inputText "" `transformEither` required "Message is required") <++ br <++ errorList

Например, если я отправлю эту форму пусто, проверка не удастся, и он попросит пользователя заполнить ее снова, и она будет выглядеть так:

name: [______]
  * Name is Required
message: [_____]
  * Message is required

Я хотел бы знать, как сделать один список ошибок для формы, например:

name: [______]
message: [_____]
  * Name is Required
  * Message is required

Я пытался делать

postForm :: MyForm MyRequest
postForm =
    (MyRequest <$> name <*> msg <* inputSubmit "post it!") <++ errorList
  where
    name = labelText "name:"  ++>
            (inputText "" `transformEither` required "Name is required") <++ br
    msg  = labelText "message:" ++>
            (inputText "" `transformEither` required "Message is required") <++ br

но тогда сообщения об ошибках вообще не отображаются!


Я не включаю полностью работоспособный пример, потому что для этого требуется куча дополнительных шаблонов, и я надеюсь, что моя проблема - просто вопрос улучшения аппликативной нотации. Вот сигнатуры типов для некоторых функций, используемых в случае, если это помогает:

type MyForm = Form (ServerPartT IO) [Input] ReqError H.Html ()

<++ :: (Monad m, Monoid view)
    => Form m input error view proof a
    -> Form m input error view () ()
    -> Form m input error view proof a

errorList :: (Monad m, ToMarkup error)
    => Form m input error Html () ()

http://hackage.haskell.org/package/reform-0.2.1/docs/Text-Reform-Core.html

http://hackage.haskell.org/package/reform-blaze-0.2.0/docs/Text-Reform-Blaze-Common.html

1 ответ

Решение

Вместо использования errorList функция, использование childErrorList, Он также будет содержать ошибки из подчиненных форм.

(MyRequest <$> name <*> msg <* inputSubmit "post it!") <++ childErrorList

Скобки вокруг родительской формы важны. Если вы делаете

MyRequest <$> name <*> msg <* inputSubmit "post it!" <++ childErrorList

тогда оператор предшествует сделать так, чтобы childErrorList только получает ошибки от кнопки отправки (ни одной вообще) вместо всей формы.

Другие вопросы по тегам