我正在从
PHP移植一个网站到Heatt.我已经移植了一些更简单的形式来成功地使用消化器官,但现在我必须做一些需要使用子表单的棘手形式.
该应用程序管理为零售商店生产传单,因此需要完成的任务之一是添加广告尺寸并在打印的传单上定义其物理尺寸.尺寸将根据页面类型(由Flyer所有者可配置)及其方向(只能由管理员控制)而有所不同.
这种形式保证至少有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)
表单定义不太正确(这可能是完全错误的想法)? AdDimensions.dimensions应该是Maybe字符串,因为当运行查询时从数据库返回时,它将为null,以获取新广告大小的size_id / layout_id的所有可能组合的列表,但不会为空来自在创建编辑表单时将运行的类似查询.字段本身是必需的(ad_dimensions.dimensions在数据库中设置为不为空).
从这里,我不知道去哪里去告诉父表格,它有一个子表单列表,或者我如何使用Heist渲染他们.
解决方法
很久以前,我写了
a special combinator for this消化器官-0.2.这是一个非常
full featured solution,包括
javascript code允许动态添加和删除字段.该代码基于克里斯和我为消化功能者最终取代的formlet包所做的更早的实现.这个功能从来没有被移植到使用消化吸收器0.3的新API.
这个问题很棘手,有一些微妙的角落,所以我建议你花点时间看看代码.我认为Jasper可能会接受一个良好的代码端口到当前版本的消化器官.只是没有人完成了这项工作.