6.1 渲染模板

一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。

map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。

它的渲染函数有一个可选的变量键值对map

通过 ctx.Render() 方法来渲染模板,例如:

  1. func (r *Render) Serve(ctx *faygo.Context) error {
  2. return ctx.Render(200, "../_syso/index.tpl", faygo.Map{
  3. "TITLE": "faygo",
  4. "VERSION": faygo.VERSION,
  5. "CONTENT": "Welcome To faygo",
  6. "AUTHOR": "HenryLee",
  7. })
  8. }

注: 变量名必须以字母(A-Z或a-z)开始,可以包含数字,下划线,变量名大小写敏感。

6.1.1 变量查找

上面的例子中,我们给模板index.tpl传递了简单的值,大部分是string类型。

实际上模板系统还可以处理更复杂的数据结构,如slice、map和struct等,这时我们可以通过字符 . 来获取它们的成员

下面为通过 . 访问map value的示例:

  1. func (r *Render) Serve(ctx *faygo.Context) error {
  2. return ctx.Render(200, "static/_syso/index.html", faygo.Map{
  3. "Date": map[string]string{"year": "2017", "month": "01", "day": "01"},
  4. })
  5. }
  1. The month is {{ Date.month }} and the year is {{ Date.year }}. //The month is 01 and the year is 2017.

小数点也可以用来调用切片的索引:

  1. func (r *Render) Serve(ctx *faygo.Context) error {
  2. return ctx.Render(200, "static/_syso/index.html", faygo.Map{
  3. "items": []string{"apples", "bananas", "carrots"},
  4. })
  5. }
  1. Item 2 is {{ items.2 }}. //Item 2 is carrots.

总结一下,当模板系统遇到变量名里有小数点时会按以下顺序查找:

  1. 字典查找,如foo[“bar”]
  2. 属性查找,如foo.bar
  3. 方法调用,如foo.bar()
  4. 列表的索引查找,如foo[bar]

小数点可以多级纵深查询,例如 {{ person.name.upper }} 表示字典查询 person['name'] 然后调用 upper() 方法

6.1.2 关于方法调用

方法调用要比其他的查询稍微复杂一点

例:

  1. {% if helper_functions.is_server_online("florian-schlachter.de") %}Server is up!{% endif %}
  2. {% if (check_access("admin", userprofile.username) && userprofile.is_verified()) || admin_happyhour %}
  3. ...
  4. {% endif %}
  5. {{ make_statuscode_verbose(user.lang, make_http_request(server.url, "/index.php").statuscode) }}

6.1.3 不合法的变量怎样处理

默认情况下如果变量不存在,模板系统会把它渲染成空string,例如:

  1. func (r *Render) Serve(ctx *faygo.Context) error {
  2. return ctx.Render(200, "static/_syso/index.html", faygo.Map{
  3. "Name": "John",
  4. })
  5. }
  1. Your name is {{ name }}. //Your name is .