【问题标题】:Yesod form with multiple buttons带有多个按钮的 Yesod 表单
【发布时间】:2011-08-14 03:44:22
【问题描述】:

我有一个 Yesod 表单,用于编辑一些使用 Markdown 编写的静态页面的内容(使用 Pandoc 处理)。我想要两个按钮 - 一个处理标记并在表单下方显示结果的“预览”按钮,以及一个将内容保存到数据库的“提交”按钮。

使用 Yesod 最简单的方法是什么? Yesod 书中的所有表单示例都只有一个按钮。我查看了公开的函数/api,但即使我在表单中添加了多个具有不同名称和/或值的提交按钮,我也无法弄清楚如何让 Yesod 告诉我按下了哪个按钮。

谁能给我一个简单的示例,说明在 Yesod 中有多个按钮的表单,它们会触发不同的操作?

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    您可以只使用输入表单函数来获取原始值,并在各种按钮上显式设置名称属性。 HTML 中的类似内容:

    <input type="submit" name="preview" value="Preview">
    

    在 Haskell 代码中:

    res <- runFormPost ...
    isPreview <- runInputPost $ iopt boolField "preview"
    if isPreview then ... else ...
    

    抱歉,如果这没有进行类型检查,我现在没有正常的开发系统。但我认为这是正确的通用方法。

    【讨论】:

    • 我实际上找不到 runInputPost。在最新版本的 yesod-form 中,它位于 Yesod.Form.Input 中。但是,Yesod hackage 的最新版本是 0.8.2.1,它依赖于旧版本的 yesod-form,即 0.1.*。我是否需要更新到新版本的 Yesod 才能使用此方法?如果是这样,新版本何时会在 Hackage 上发布?
    • 对不起,我以为你在测试版,我错了。您可以只使用当前 yesod-form 中的等效函数,即 runFormPost'stringInput。我们希望明天发布 0.9 候选版本。
    • 我已经下载了它,但是我遇到了问题。 yesod-json 依赖于名为“aeson-native”的东西,它不在 hackage 上。只是aeson吗?
    • 如果我将“aeson-native”更改为“aeson”,也会出现其他错误。例如,现在我在编译 Yesod.Auth 时得到 'Yesod/Auth/Kerberos.hs:100:20: Not in scope: `html''。我查看了它导入的模块,也找不到它所指的“html”。这些构建问题是否已知?
    • 它实际上不是一个布尔字段。该字段是一个包含 (IIRC) 按钮名称的文本字段。仅当按下按钮时才会出现值。因此,您执行iopt textField "preview" 之类的操作,然后如果值为 Just something 则执行一件事,如果为 Nothing 则执行另一件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多