跳至内容

Yesod Web 框架/视图

100% developed
来自维基教科书,开放的书籍,为开放的世界

Handler Monad 以多种格式之一返回内容,作为实现 HasReps 类的类型[1] 的组件 {RepHtml, RepJson, RepXml, RepPlain, the dual RepHtmlJson, a pair or list of pairs [(ContentType, Content)], ..}.[2][3] JSON 示例:[4][5][6]

HasRepschooseRep 默认实现根据客户端 accept 头部的首选内容类型列表选择要返回的文档表示形式。[1]

小部件[7] 是由特定命令(例如 setTitle)或结构(HTML)/行为(JavaScript)/样式(CSS)模板生成的 HTML DOM 代码片段,其类型实例化了类 ToWidget、ToWidgetHead 或 ToWidgetBody。

基于 Writer[9] 的 Widget Monad[8],以及对 defaultLayout 的参数,便于将小部件组合在一起。

模板插值 - 莎士比亚模板

[编辑 | 编辑源代码]

参见参考[10]。这些是遵循代码表达式在带不同字符前缀的括号内进行替换的通用模式的内容视图模板,以引用

模板表达式,使用 ^{...}
相同类型的其他模板,使用 ^{template params}
路由表达式,使用 @{...}
安全的(类型化的)URL,使用 @{HomeR}
消息表达式,使用 _{...}
i18n 消息渲染,使用 _{MsgMessage params}
其他 Haskell 表达式,使用 #{...}
Haskell 表达式渲染,使用 #{haskell_expression},其类型必须可转换。
    • hamlet HTML 模板的情况下,表达式类型必须是 Text.Blaze.ToMarkup 的实例[11]
    • 在 CSS 模板的情况下,表达式类型必须是 Text.Cassius.ToCss 的实例[12]
    • 在 JavaScript 模板的情况下,表达式类型必须是 Text.Julius.ToJavascript 的实例[13]
    • 在具有参数插值的 i18n 消息定义(在 "isoLang.msg" 文件中)的情况下,表达式类型必须是 Text.Shakespeare.I18N.ToMessage 的实例[14]
    • 在纯文本模板的情况下,表达式类型必须是 Text.Shakespeare.Text.ToText 的实例[15]

在表达式中使用非英语文本需要使用支持 Unicode 的类型 Text,因为 GHC 对类型 Stringshow 将非 ASCII 字符呈现为转义的数字代码。

  • 外部文件模板:模板内容可以使用编译时 splice 调用(如 $(expr))从外部文件加载。[16]
  • 外部文件的重载模式:参见文档[10]
可本地化(i18n)消息
[编辑 | 编辑源代码]

参见参考[17]。对于每种支持的语言 ISO 名称,messages 子文件夹中应该有一个文件,如 <iso-language>.msg,其中包含以下条目

ArticleUnexistant param@Int64: unexistant article #{param}

对于 en.msg 中的每个条目,都会生成一个消息构造函数,在消息名称前添加 "Msg" 前缀,因此示例 msg 可以作为以下内容引用

-- in code
myMsg = MsgArticleUnexistant myArticleId 
     
-- in templates
  _{MsgArticleUnexistant myArticleId}

stack 应用程序模板中缺少实际的 i18n 支持。您需要将 mkMessage "MyApp" directory isoLangDefault 添加到 "Foundation.hs" 文件中,才能实例化消息。[18]

HTML 类模板
[编辑 | 编辑源代码]
  • hamlet 准引用器(一个解析器,用于编译时 Template Haskell 代码)[19][20] 指定在 T.H. 牛津括号语法 [qq| ... |] 中,它引入了一个基于缩进的结构化 HTML 模板,其中以 "$" 为前缀的行是逻辑语句(参见文档[10])。[21] 仅为位于行首位置的标签生成自动闭合标签。
  • whamlet 准引用器返回一个 Widget 表达式。(在 [hamlet|..|] 之前保存 toWidget)。
toWidget [hamlet|
$doctype 5
<html>
    <head>
        <title>#{pageTitle} - My Site
        <link rel=stylesheet href=@{Stylesheet_route}>
    <body>
        <div>
           ^{headerTemplate}
        <div>
          <p><span style="font-weight:bold;">_{MsgArticleListTitle}</span>
          $if null articles
            <p>_{MsgSorryNoArticles}
          $else
            <ul>
                $forall art <- articles
                    <li>#{articleNumber art} .- #{articleTitle art}
        <div>
          ^{footerHamletTemplate}
|]
JavaScript 模板
[编辑 | 编辑源代码]
  • julius 准引用器:引入了一个 JavaScript 模板。[22] JavaScript 变体 CoffeeScript 和 Roy 语言[23] 也具有特定的 准引用器[19][22]
toWidgetHead [julius|

var myfunc = function(){document.location = "@{SomeRouteR}";}

^{extraJuliusTemplate}
|]
CSS 类模板
[编辑 | 编辑源代码]
  • cassius 准引用器:引入了一个基于缩进结构化的 CSS 模板。[24]
toWidget [cassius|
.box
    border: 1px solid #{myColor}
    background-image: url(@{MyImageR})

^{extraCassiusTemplate}
|]
  • lucius 准引用器:引入了一个使用标准语法和莎士比亚模板样式替换的 CSS 模板。[25]
toWidgetHead [lucius|
.box { border: 1px solid #{myColor} ;
       background-image: url(@{MyImageR}) ;
     }

^{extraLuciusTemplate}
|]
纯文本模板
[编辑 | 编辑源代码]
  • 用于电子邮件或 text/plain HTTP 内容类型。[26]
  1. 模板:lt:惰性文本,st:严格文本
  2. 带有左边界分隔符 "|" 的文本模板:lbt(惰性),sbt(严格)
[lt| Mr./Mrs. #{fullName} ... 
|]

特定视图

[编辑 | 编辑源代码]
  • 搜索引擎 XML 网站地图[27],其中 sitemap 返回一个 XML 网站地图作为 HTTP 响应,其中包含我们希望搜索引擎抓取的路由,以及用于指示抓取程序的属性,这些属性来自提供的 SitemapUrl 记录列表。
  • 导航面包屑。[28] 您需要为网站提供一个 YesodBreadcrumbs 实例,其中生成函数 breadcrumb 应该为每个面包屑返回标题和父路由。然后,查询函数 breadcrumbs 将返回当前路由标题和祖先(路由、标题)对。
  • 网页提要视图(RSS/Atom)。[29] 您拥有从给定的 Feed 结构中返回 RepRss、RepAtom 或双重 RepAtomRss 内容(在 accept 头部的首选内容类型列表中进行选择)的处理程序。

参考文献

[编辑 | 编辑源代码]
  1. a b "HasReps 类". Hackage.haskell.org. 检索于 2012-10-23.
  2. "RESTful 内容". Yesodweb.com. 检索于 2012-10-23.
  3. "ToContent 类". Hackage.haskell.org. 检索于 2012-10-23.
  4. "更多客户端 Yesod:todo 示例". Yesodweb.com. 2012-04-23. 检索于 2012-10-23.
  5. "JSON 网络服务". Yesodweb.com. 检索于 2012-10-23.
  6. "yesod-json 包". Hackage.haskell.org. 检索于 2012-10-23.
  7. "书 - 小部件". Yesodweb.com. 检索于 2012-10-23.
  8. "小部件单子". Hackage.haskell.org. 检索于 2012-10-23.
  9. "Writer 单子". Haskell.org. 检索于 2012-10-23.
  10. a b c "书 - 莎士比亚模板". Yesodweb.com. 检索于 2012-10-23.
  11. "Text.Blaze.ToMarkup 类". Hackage.haskell.org. 检索于 2012-10-23.
  12. "Text.Cassius.ToCss 类". Hackage.haskell.org. 检索于 2012-10-23.
  13. "Text.Julius.ToJavascript 类". Hackage.haskell.org. 检索于 2012-10-23.
  14. "Text.Shakespeare.I18N.ToMessage 类". Hackage.haskell.org. 检索于 2012-10-24.
  15. "Text.Shakespeare.Text.ToText 类". Hackage.haskell.org. 检索于 2012-10-24.
  16. "模板 Haskell". haskell.org. 检索于 2012-11-03.
  17. "书 - 国际化". Yesodweb.com. 检索于 2012-10-23.
  18. mkMessage
  19. a b "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26. 检索于 2012-10-23.
  20. "模板 Haskell 准引用". Haskell.org. 检索于 2012-11-02.
  21. "哈姆雷特模板模块". Hackage.haskell.org. 检索于 2012-10-23.
  22. a b "尤利乌斯模板模块". Hackage.haskell.org. 检索于 2012-10-23.
  23. "Roy 语言". Roy.brianmckenna.org. 检索于 2012-10-23.
  24. "卡西乌斯模板模块". Hackage.haskell.org. 检索于 2012-10-23.
  25. "卢修斯模板模块". Hackage.haskell.org. 检索于 2012-10-23.
  26. "莎士比亚纯文本模板模块". Hackage.haskell.org. 检索于 2012-10-24.
  27. "yesod-sitemap 包". Hackage.haskell.org. 检索于 2012-10-26.
  28. "YesodBreadcrumbs 类". Hackage.haskell.org. 检索于 2012-11-05.
  29. "yesod-newsfeed 包,用于 RSS / Atom 视图". Hackage.haskell.org. 检索于 2012-10-26.


华夏公益教科书