簡體   English   中英

在將表單提交數據發送到stringRead之前修改它

[英]Modifying form submission data before it gets sent to stringRead

我有一個Digestive Functors表單,如下所示:

dateTimeForm :: Monad m => Maybe LocalTime -> Form Text m LocalTime
dateTimeForm t = LocalTime
    <$> "date" .: stringRead "Must be a valid date" (localDay <$> t)
    <*> "time" .: stringRead "Must be a valid time" (localTimeOfDay <$> t)

我用於此表單的輸入元素是<input type="date" /><input type="time" /> 這適用於此表單的日期部分,但在時間部分不太好。 支持時間輸入元素的瀏覽器僅提交小時和分鍾(例如“18:00”),但TimeOfDay需要小時,分鍾秒。 這會導致stringRead失敗並且Digestive Functors向用戶報告錯誤(“必須是有效時間”)。

我嘗試解決這個問題,但如果用戶提交的時間無效,他們就不會再從Digestive Functors中獲得一個有吸引力的錯誤(Prelude.read:no parse)。

dateTimeForm :: Monad m => Maybe LocalTime -> Form Text m LocalTime
dateTimeForm t = toLocalTime
    <$> "date" .: stringRead "Must be a valid date" (localDay <$> t)
    <*> "time" .: string (show . localTimeOfDay <$> t)
    where
        toLocalTime d x = LocalTime d $ read $ if length x == 8 then x else x <> ":00"

我想我要找的是validate功能和maybeRead的一些幫助。 這似乎有效:

dateTimeForm :: Monad m => Maybe LocalTime -> Form Text m LocalTime
dateTimeForm t = LocalTime
    <$> "date" .: stringRead "Must be a valid date" (localDay <$> t)
    <*> "time" .: validate validTime (string (show . localTimeOfDay <$> t))
    where
        -- the time input element only submits hours and minutes ("18:00"), which is 5 characters long
        validTime x = case maybeRead (if length x == 5 then x <> ":00" else x) of
            Just x' -> Success x'
            _ -> Error "Must be a valid time"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM