Değişen sayıda girdi alanıyla formları dinamik olarak nasıl oluştururum?Dinamik form oluşturma ile yesod
listEditForm :: [String] -> Html -> MForm App App (FormResult Text, Widget)
listEditForm xs = renderDivs $ mconcat [ areq textField (String.fromString x) Nothing | x <- xs]
ancak bu Text
ve beklendiği gibi değil [Text]
, tesadüf sahip Text
olduğu sonuç tipi Monoid
bir örneğini, örn var
Yönetilen yakın olan Int
ile başarısız olur.
Çeşitli formları bir araya getiren bir çalışma alternatif girişimim var, ancak bir şekilde bu oyuncak örneği için çalışıyor, ancak gerçek girişim tuhaf bir şekilde başarısız oluyor. Her neyse, bu doğru bir yaklaşım olduğunu düşünmüyorum:
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|]