04
模板函数
基本函数
变量可以使用符号 | 在函数间传递
{{.Con | markdown | addlinks}}
{{.Name | printf "%s"}}
使用括号
{{printf "nums is %s %d" (printf "%d %d" 1 2) 3}}
and
{{and .X .Y .Z}}
and 会逐一判断每个参数,将返回第一个为空的参数,否则就返回最后一个非空参数
or
{{or .X .Y .Z}}
or 会逐一判断每个参数,将返回第一个非空的参数,否则就返回最后一个参数
call
{{call .Field.Func .Arg1 .Arg2}}
call 可以调用函数,并传入参数
调用的函数需要返回 1 个值或者 2 个值,返回两个值时,第二个值用于返回 error 类型的错误。返回的错误不等于 nil 时,执行将终止。
Index
index 支持 map, slice, array, string,读取指定类型对应下标的值
this.Data["Maps"] = map[string]string{"name": "Beego"}
{{index .Maps "name"}}
len
{{printf "The content length is %d" (.Content|len)}}
返回对应类型的长度,支持类型:map, slice, array, string, chan
not
not 返回输入参数的否定值,if true then false else true
对应 fmt.Sprint
printf
对应 fmt.Sprintf
println
对应 fmt.Sprintln
urlquery
{{urlquery "http://beego.me"}}
将返回
http%3A%2F%2Fbeego.me
eq / ne / lt / le / gt/ ge
这类函数一般配合在 if 中使用
eq 和其他函数不一样的地方是,支持多个参数,和下面的逻辑判断相同
arg1==arg2 || arg1==arg3 || arg1==arg4 ...
与 if 一起使用
{{if eq true .Var1 .Var2 .Var3}}{{end}}
{{if lt 100 200}}{{end}}
内置模板函数
- dateformat
实现了时间的格式化,返回字符串,使用方法 {{dateformat .Time "2006-01-02T15:04:05Z07:00"}}。 - date
实现了类似 PHP 的 date 函数,可以很方便的根据字符串返回时间,使用方法 {{date .T "Y-m-d H:i:s"}}。 - compare
实现了比较两个对象的比较,如果相同返回 true,否者 false,使用方法 {{compare .A .B}}。 - substr
实现了字符串的截取,支持中文截取的完美截取,使用方法 {{substr .Str 0 30}}。 - html2str
实现了把 html 转化为字符串,剔除一些 script、css 之类的元素,返回纯文本信息,使用方法 {{html2str .Htmlinfo}}。 - str2html
实现了把相应的字符串当作 HTML 来输出,不转义,使用方法 {{str2html .Strhtml}}。 - htmlquote
实现了基本的 html 字符转义,使用方法 {{htmlquote .quote}}。 - htmlunquote
实现了基本的反转移字符,使用方法 {{htmlunquote .unquote}}。 - renderform
根据 StructTag 直接生成对应的表单,使用方法 {{&struct | renderform}}。 - assets_js
为 js 文件生成一个 <script> 标签. 使用方法 {{assets_js src}} - assets_css
为 css 文件生成一个 <link> 标签. 使用方法 {{assets_css src}} - config
获取 AppConfig 的值. 使用方法 {{config configType configKey defaultValue}}. 可选的 configType 有 String, Bool, Int, Int64, Float, DIY - map_get
获取 map 的值
// In controller Data["m"] = map[string]interface{} { "a": 1, "1": map[string]float64{ "c": 4, }, } // In view {{ map_get .m "a" }} // return 1 {{ map_get .m 1 "c" }} // return 4
- urlfor
获取控制器方法的 URL
{{urlfor "TestController.List"}}
自定义模板函数
beego 支持用户定义模板函数,但是必须在 web.Run() 调用之前,设置如下:
func hello(in string)(out string){ out = in + "world" return } web.AddFuncMap("hi",hello)
定义之后你就可以在模板中这样使用了:
{{.Content | hi}}
05
静态文件
Go 语言内部其实已经提供了 http.ServeFile,通过这个函数可以实现静态文件的服务。beego 针对这个功能进行了一层封装,通过下面的方式进行静态文件注册:
web.SetStaticPath("/static","public")
- 第一个参数是路径,url 路径信息
- 第二个参数是静态文件目录(相对应用所在的目录)
beego 支持多个目录的静态文件注册,用户可以注册如下的静态文件目录:
web.SetStaticPath("/images","images") web.SetStaticPath("/css","css") web.SetStaticPath("/js","js")
设置了如上的静态目录之后,用户访问 /images/login/login.png,那么就会访问应用对应的目录下面的 images/login/login.png 文件。如果是访问 /static/img/logo.png,那么就访问 public/img/logo.png文件。
默认情况下 beego 会判断目录下文件是否存在,不存在直接返回 404 页面,如果请求的是 index.html,那么由于 http.ServeFile 默认是会跳转的,不提供该页面的显示。
因此 beego 可以设置
web.BConfig.WebConfig.DirectoryIndex=true 这样来使得显示 index.html 页面。而且开启该功能之后,用户访问目录就会显示该目录下所有的文件列表。
06
分页
这里所说的分页,指的是大量数据显示时,每页显示固定的数量的数据,同时显示多个分页链接,用户点击翻页链接或页码时进入到对应的网页。分页算法中需要处理的问题:
- 当前数据一共有多少条。
- 每页多少条,算出总页数。
- 根据总页数情况,处理翻页链接。
- 对页面上传入的 Get 或 Post 数据,需要从翻页链接中继续向后传。
- 在页面显示时,根据每页数量和当前传入的页码,设置查询的 Limit 和 Skip,选择需要的数据。
- 其他的操作,就是在 View 中显示翻页链接和数据列表的问题了。
模板处理过程中经常需要分页,那么如何进行有效的开发和操作呢?我们开发组针对这个需求开发了如下的例子,希望对大家有用
- 工具类
https://github.com/beego/wetalk/blob/master/modules/utils/paginator.go - 模板
https://github.com/beego/wetalk/blob/master/views/base/paginator.html - 使用方法
https://github.com/beego/wetalk/blob/master/routers/base/base.go#L458
07
总结
本文整理了 beego 关于模板的使用方法,文章内容来自 beego 官方手册,作者提供的仅是 beego 模板的学习路径,读者也可以直接阅读官方手册。