Comment générer dynamiquement des formulaires avec un nombre variable de champs de saisie?Génération de formulaire dynamique avec yesod
Le plus proche j'ai réussi est:
listEditForm :: [String] -> Html -> MForm App App (FormResult Text, Widget)
listEditForm xs = renderDivs $ mconcat [ areq textField (String.fromString x) Nothing | x <- xs]
mais cela a le type de résultat Text
et non [Text]
comme prévu, posséder à la coïncidence que Text
est une instance de Monoid
, par exemple il échoue avec Int
.
J'ai une tentative de travail alternatif, qui combine plusieurs formes, mais d'une manière ou d'une autre cela ne fonctionne que pour cet exemple de jouet, alors que la tentative réelle échoue étrangement. Quoi qu'il en soit, je ne pense pas que ce soit la bonne approche:
data MapPair = MapPair { mpKey :: T.Text, mpValue :: Maybe T.Text }
editForm mmp = renderTable $ MapPair
<$> areq textField "Key" (mpKey <$> mmp)
<*> aopt textField "Value" (mpValue <$> mmp)
pair2mp (v,k) = MapPair { mpKey = v, mpValue = Just k }
getEditR = do
sess <- getSession
let sesslist = Map.toList $ Map.map (decodeUtf8With lenientDecode) sess
forms <- forM sesslist (\a -> generateFormPost $ editForm $ Just $ pair2mp a)
defaultLayout [whamlet|
<h1>Edit Value Pairs
$forall (widget,enctype) <- forms
<form method=post [email protected]{EditR} enctype=#{enctype}>
^{widget}
<input type=submit>
|]
postEditR = do
sess <- getSession
let sesslist = Map.toList $ Map.map (decodeUtf8With lenientDecode) sess
forM_ sesslist (\a -> do
((res,_),_) <- runFormPost $ editForm $ Just $ pair2mp a
case res of
(FormSuccess (MapPair {mpKey=mk, mpValue=(Just mv)})) -> setSession mk mv
_ -> return()
)
defaultLayout [whamlet|ok|]