Revel 使用?[Go 模板](http://www.golang.org/pkg/text/template/), 在下面兩個目錄中查找模板:
* 應用程序的?`views`?目錄 (包括所有的子目錄)
* Revel的?`templates`?目錄.
比如有一個控制器?`Hello`?,方法名為?`World`, Revel 會查找名字為?`views/Hello/World.html`的模板。模板名字不區分大小寫,所以?`views/hello/world.html`?與?`views/HeLlO/wOrLd.HtMl`都是匹配的模板.
Revel 提供了錯誤頁面模板 (在開發模式中友好的顯示編譯錯誤), 開發者也可以重寫這些模板,比如`app/views/errors/500.html`.
## 渲染上下文
Revel 使用 RenderArgs map 渲染模板。除了開發者傳送的數據, Revel 也提供一些有用的數據:
* “errors” - 驗證錯誤(map,請參考文檔?[`Validation.ErrorMap`](http://gorevel.cn/docs/docs/godoc/validation.html#Validation.ErrorMap)
* “flash” - 上個請求flash的數據
## 模板功能
Go 提供了一些?[模板函數](http://www.golang.org/pkg/text/template/#Functions)。Revel 也增加了一些模板函數。請閱讀下面的文檔 或?[查看源代碼](http://gorevel.cn/docs/docs/godoc/template.html#variables).
### eq
一個簡單的 “a == b” 測試.
例如:
~~~
<div class="message {{if eq .User "you"}}you{{end}}">
~~~
### set
在當前模板上下文中設置一個變量
例如:
~~~
{{set . "title" "Basic Chat room"}}
<h1>{{.title}}</h1>
~~~
### append
添加變量到一個數組中, 或者在模板上下文中創建一個數組
例如:
~~~
{{append . "moreScripts" "js/jquery-ui-1.7.2.custom.min.js"}}
{{range .moreStyles}}
<link rel="stylesheet" type="text/css" href="/public/{{.}}">
{{end}}
~~~
### field
input 字段輔助函數.
給出一個字段名, 函數會生成包含下面成員的結構:
* Id: 字段Id, 轉換為一個HTML字段的ID。
* Name: 字段名稱
* Value: 當前上下文中字段的值
* Flash: 帶回的字段值
* Error: 字段錯誤消息(如果有錯誤)
* ErrorClass: 原始的字符串 “hasError”, 如果沒有錯誤就是一個 ””.
[瀏覽 godoc.](http://gorevel.cn/docs/docs/godoc/field.html)
例如:
~~~
{{with $field := field "booking.CheckInDate" .}}
<p class="{{$field.ErrorClass}}">
<strong>Check In Date:</strong>
<input type="text" size="10" name="{{$field.Name}}" class="datepicker" value="{{$field.Flash}}">
* <span class="error">{{$field.Error}}</span>
</p>
{{end}}
~~~
### option
使用輔助函數生成 HTML?`option`?字段。
例如:
~~~
{{with $field := field "booking.Beds" .}}
<select name="{{$field.Name}}">
{{option $field "1" "One king-size bed"}}
{{option $field "2" "Two double beds"}}
{{option $field "3" "Three beds"}}
</select>
{{end}}
~~~
### radio
使用輔助函數生成 HTML radio?`input`?字段
例如:
~~~
{{with $field := field "booking.Smoking" .}}
{{radio $field "true"}} Smoking
{{radio $field "false"}} Non smoking
{{end}}
~~~
### nl2br
將換行符轉換成 HTML 的 break.
例如:
~~~
You said:
<div class="comment">{{nl2br .commentText}}</div>
~~~
### pluralize
一個輔助的復數函數
例如:
~~~
There are {{.numComments}} comment{{pluralize (len comments) "" "s"}}
~~~
### raw
輸出原生的、未轉義的文本
例如:
~~~
<div class="body">{{raw .blogBody}}</div>
~~~
## Including
Go 模板允許你在模板中包含其他模板,比如:
~~~
{{template "header.html" .}}
~~~
注意: * 相對路徑是?`app/views`
## 溫馨提示
Revel 應用程序有效利用 Go 模板,請看看下面的例子:
* `revel/samples/booking/app/views/header.html`
* `revel/samples/booking/app/views/Hotels/Book.html`
使用輔助函數,為模板設置標題和額外的樣式。
例如:
~~~
<html>
<head>
<title>{{.title}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" media="screen" href="/public/css/main.css">
<link rel="shortcut icon" type="image/png" href="/public/img/favicon.png">
{{range .moreStyles}}
<link rel="stylesheet" type="text/css" href="/public/{{.}}">
{{end}}
<script src="/public/js/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/public/js/sessvars.js" type="text/javascript" charset="utf-8"></script>
{{range .moreScripts}}
<script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
{{end}}
</head>
~~~
在模板中這樣使用:
~~~
{{set . title "Hotels"}}
{{append . "moreStyles" "ui-lightness/jquery-ui-1.7.2.custom.css"}}
{{append . "moreScripts" "js/jquery-ui-1.7.2.custom.min.js"}}
{{template "header.html" .}}
~~~
## 自定義模板函數
應用程序可以注冊自定義模板函數
例如:
~~~
func init() {
revel.TemplateFuncs["eq"] = func(a, b interface{}) bool { return a == b }
}
~~~