我正在努力将一个站点从PHP移植到Snap w/Heist.我已经将一些更简单的形式移植到成功使用Digestive Functors,但现在我必须做一些需要使用子表单的棘手的形式.
此应用程序管理为零售商店生产传单,因此需要完成的任务之一是添加广告尺寸并在打印的传单上定义其物理尺寸.尺寸将根据页面类型(可由传单所有者配置)及其方向(只能由管理员控制)而有所不同.

这种形式保证至少有3个单元格,最有可能有9个单元格(如上图所示的PHP版本),但理论上可以有无限数量.
这是我到目前为止维度子表单的内容:
data AdDimensions = AdDimensions
{ sizeId :: Int64
, layoutId :: Int64
, dimensions :: Maybe String
}
adDimensionsForm :: Monad m => AdDimensions -> Form Text m AdDimensions
adDimensionsForm d = AdDimensions
<$> "size_id" .: stringRead "Must be a number" (Just $ sizeId d)
<*> "layout_id" .: stringRead "Must be a number" (Just $ layoutId d)
<*> "dimensions" .: opionalString (dimensions d)
Run Code Online (Sandbox Code Playgroud)
表单定义感觉不太正确(也许我在这里完全错误的想法?). AdDimensions.dimensions应该是a Maybe String,因为在运行查询时从数据库返回时它将为null,以获取新广告大小的size_id/layout_id的所有可能组合的列表,但是从类似查询中它不会为null将在创建编辑表单时运行.字段本身是必需的(在数据库中ad_dimensions.dimensions设置not null). …
如何使用消化函数创建一个具有以编程方式生成的复选框列表的表单,该表单将返回一个列表.例如:
[x] Milk
[ ] Cereals
[x] Ground meat
Run Code Online (Sandbox Code Playgroud)
会回来的["Milk", "Ground meat"].
我期待类型会是这样的:
form :: (Functor m, Monad m) => [String] -> HappstackForm m Html BlazeFormHtml [String]
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用应用程序表单,我一直在想如何实现一个验证依赖于其他字段的字段的表单.例如,注册表单有password和confirm_password字段,我想验证password == confirm_password.
我可以在表单运行后在处理程序中完成,但这意味着丢失错误消息.
编辑:忘了提,我主要使用Yesods的应用形式,但它们似乎非常接近消化函数
我正在尝试理解编译的拼接以及如何将它们与消化函子形式一起使用.有人有任何代码示例吗?
我有一个处理添加和编辑的地址表单(如果添加则为Nothing,如果编辑则为Just Address).到目前为止,我已经通过一些项目对州和国家的选择进行了硬编码.
addressForm :: Monad m => Maybe Address -> [Address] -> Form Text m Address
addressForm a addrs =
Address
<$> "id" .: choiceWith (addrToChoice addrs) (fmap id a)
<*> "name" .: string (fmap name a)
<*> "street" .: string (fmap street a)
<*> "city" .: string (fmap city a)
<*> "state" .: choiceWith stateChoices (fmap state a)
<*> "country" .: choiceWith countryChoicesRequired (fmap country a)
<*> "zipcode" .: string (fmap zipcode a)
stateChoices :: [(Text, (Maybe String, Text))] …Run Code Online (Sandbox Code Playgroud)