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

Я следую учебнику для библиотеку 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#v:-60--43--43-

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


person hugomg    schedule 26.12.2013    source источник


Ответы (1)


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

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

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

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

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

person hugomg    schedule 27.12.2013