func (s SearchForm) Validate(v *revel.Validation, locale string) { if str := strings.Trim(s.Title, " "); str != "" { v.MinSize(str, 6).Message(revel.Message(locale, "search.form.validate.title.min", 6)).Key("s.Title") } if str := strings.Trim(s.Runtime, " "); str != "" { rt, err := strconv.Atoi(str) if err != nil { v.Error(revel.Message(locale, "search.form.validate.runtime.number")).Key("s.Runtime") } else { v.Range(rt, 50, 120).Message(revel.Message(locale, "search.form.validate.runtime.range")).Key("s.Runtime") } } if str := strings.Trim(s.OriginalAirDate, " "); str != "" { v.Match(str, regexp.MustCompile("^(January|February|March|April|May|June|July|August|September|October|November|December).*$")).Message(revel.Message(locale, "search.form.validate.originalairdate.match")).Key("s.OriginalAirDate") } }
func CategoryFilters(db *gorm.DB, filters []string, locale string) []json_models.Filter { var result []json_models.Filter filterValues := func(filter string) []json_models.FilterValue { var rows []json_models.FilterValue rows = append(rows, json_models.FilterValue{Id: 0, Value: "---"}) filterFuncs[filter](db, &rows) return rows } for _, filter := range filters { result = append(result, json_models.Filter{ revel.Message(locale, filter+"_filter"), filterValues(filter), }) } return result }
func init() { // Filters is the default set of global filters. revel.Filters = []revel.Filter{ revel.PanicFilter, // Recover from panics and display an error page instead. route.RouterFilter, // revel.RouterFilter, // Use the routing table to select the right Action // AuthFilter, // Invoke the action. revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters. revel.ParamsFilter, // Parse parameters into Controller.Params. revel.SessionFilter, // Restore and write the session cookie. // 使用SessionFilter标准版从cookie中得到sessionID, 然后通过MssessionFilter从Memcache中得到 // session, 之后MSessionFilter将session只存sessionID然后返回给SessionFilter返回到web // session.SessionFilter, // leanote session // session.MSessionFilter, // leanote memcache session revel.FlashFilter, // Restore and write the flash cookie. revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie. // revel.I18nFilter, // Resolve the requested language i18n.I18nFilter, // Resolve the requested language by leanote revel.InterceptorFilter, // Run interceptors around the action. revel.CompressFilter, // Compress the result. revel.ActionInvoker, // Invoke the action. } revel.TemplateFuncs["raw"] = func(str string) template.HTML { return template.HTML(str) } revel.TemplateFuncs["trim"] = func(str string) string { str = strings.Trim(str, " ") str = strings.Trim(str, " ") str = strings.Trim(str, "\n") str = strings.Trim(str, " ") // 以下两个空格不一样 str = strings.Trim(str, " ") str = strings.Trim(str, " ") return str } revel.TemplateFuncs["add"] = func(i int) string { i = i + 1 return fmt.Sprintf("%v", i) } revel.TemplateFuncs["sub"] = func(i int) int { i = i - 1 return i } // 增加或减少 revel.TemplateFuncs["incr"] = func(n, i int) int { n = n + i return n } revel.TemplateFuncs["join"] = func(arr []string) template.HTML { if arr == nil { return template.HTML("") } return template.HTML(strings.Join(arr, ",")) } revel.TemplateFuncs["concat"] = func(s1, s2 string) template.HTML { return template.HTML(s1 + s2) } revel.TemplateFuncs["concatStr"] = func(strs ...string) string { str := "" for _, s := range strs { str += s } return str } revel.TemplateFuncs["decodeUrlValue"] = func(i string) string { v, _ := url.ParseQuery("a=" + i) return v.Get("a") } revel.TemplateFuncs["json"] = func(i interface{}) string { b, _ := json.Marshal(i) return string(b) } revel.TemplateFuncs["jsonJs"] = func(i interface{}) template.JS { b, _ := json.Marshal(i) return template.JS(string(b)) } revel.TemplateFuncs["datetime"] = func(t time.Time) template.HTML { return template.HTML(t.Format("2006-01-02 15:04:05")) } revel.TemplateFuncs["dateFormat"] = func(t time.Time, format string) template.HTML { return template.HTML(t.Format(format)) } revel.TemplateFuncs["unixDatetime"] = func(unixSec string) template.HTML { sec, _ := strconv.Atoi(unixSec) t := time.Unix(int64(sec), 0) return template.HTML(t.Format("2006-01-02 15:04:05")) } // interface是否有该字段 revel.TemplateFuncs["has"] = func(i interface{}, key string) bool { t := reflect.TypeOf(i) _, ok := t.FieldByName(key) return ok } // tags // 2014/12/30 标签添加链接 revel.TemplateFuncs["blogTags"] = func(renderArgs map[string]interface{}, tags []string) template.HTML { if tags == nil || len(tags) == 0 { return "" } locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string) tagStr := "" lenTags := len(tags) tagPostUrl, _ := renderArgs["tagPostsUrl"].(string) for i, tag := range tags { str := revel.Message(locale, tag) var classes = "label" if strings.HasPrefix(str, "???") { str = tag } if InArray([]string{"red", "blue", "yellow", "green"}, tag) { classes += " label-" + tag } else { classes += " label-default" } classes += " label-post" var url = tagPostUrl + "/" + url.QueryEscape(tag) tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>" if i != lenTags-1 { tagStr += " " } } return template.HTML(tagStr) } revel.TemplateFuncs["blogTagsForExport"] = func(renderArgs map[string]interface{}, tags []string) template.HTML { if tags == nil || len(tags) == 0 { return "" } tagStr := "" lenTags := len(tags) for i, tag := range tags { str := tag var classes = "label" if InArray([]string{"red", "blue", "yellow", "green"}, tag) { classes += " label-" + tag } else { classes += " label-default" } classes += " label-post" tagStr += "<span class=\"" + classes + "\" >" + str + "</span>" if i != lenTags-1 { tagStr += " " } } return template.HTML(tagStr) } revel.TemplateFuncs["msg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.HTML { str, ok := renderArgs[revel.CurrentLocaleRenderArg].(string) if !ok { return "" } return template.HTML(i18n.Message(str, message, args...)) } // 不用revel的msg revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML { locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string) str := i18n.Message(locale, key) if strings.HasPrefix(str, "???") { str = key } return template.HTML(str) } // lea++ revel.TemplateFuncs["blogTagsLea"] = func(renderArgs map[string]interface{}, tags []string, typeStr string) template.HTML { if tags == nil || len(tags) == 0 { return "" } locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string) tagStr := "" lenTags := len(tags) tagPostUrl := "http://lea.leanote.com/" if typeStr == "recommend" { tagPostUrl += "?tag=" } else if typeStr == "latest" { tagPostUrl += "latest?tag=" } else { tagPostUrl += "subscription?tag=" } for i, tag := range tags { str := revel.Message(locale, tag) var classes = "label" if strings.HasPrefix(str, "???") { str = tag } if InArray([]string{"red", "blue", "yellow", "green"}, tag) { classes += " label-" + tag } else { classes += " label-default" } classes += " label-post" var url = tagPostUrl + url.QueryEscape(tag) tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>" if i != lenTags-1 { tagStr += " " } } return template.HTML(tagStr) } /* revel.TemplateFuncs["blogTags"] = func(tags []string) template.HTML { if tags == nil || len(tags) == 0 { return "" } // TODO 这里判断语言, 从语言包中拿 tagMap := map[string]string{"red": "红色", "yellow": "黄色", "blue": "蓝色", "green": "绿色"} tagStr := "" lenTags := len(tags) for i, tag := range tags { if text, ok := tagMap[tag]; ok { tagStr += text } else { tagStr += tag } if i != lenTags - 1 { tagStr += "," } } return template.HTML(tagStr) } */ revel.TemplateFuncs["li"] = func(a string) string { return "" } // str连接 revel.TemplateFuncs["urlConcat"] = func(url string, v ...interface{}) string { html := "" for i := 0; i < len(v); i = i + 2 { item := v[i] if i+1 == len(v) { break } value := v[i+1] if item != nil && value != nil { keyStr, _ := item.(string) valueStr, err := value.(string) if !err { valueInt, _ := value.(int) valueStr = strconv.Itoa(valueInt) } if keyStr != "" && valueStr != "" { s := keyStr + "=" + valueStr if html != "" { html += "&" + s } else { html += s } } } } if html != "" { if strings.Index(url, "?") >= 0 { return url + "&" + html } else { return url + "?" + html } } return url } revel.TemplateFuncs["urlCond"] = func(url string, sorterI, keyords interface{}) template.HTML { return "" } // http://stackoverflow.com/questions/14226416/go-lang-templates-always-quotes-a-string-and-removes-comments revel.TemplateFuncs["rawMsg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.JS { str, ok := renderArgs[revel.CurrentLocaleRenderArg].(string) if !ok { return "" } return template.JS(revel.Message(str, message, args...)) } // 为后台管理sorter th使用 // 必须要返回HTMLAttr, 返回html, golang 会执行安全检查返回ZgotmplZ // sorterI 可能是nil, 所以用interfalce{}来接收 /* data-url="/adminUser/index" data-sorter="email" class="th-sortable {{if eq .sorter "email-up"}}th-sort-up{{else}}{{if eq .sorter "email-down"}}th-sort-down{{end}}{{end}}" */ revel.TemplateFuncs["sorterTh"] = func(url, sorterField string, sorterI interface{}) template.HTMLAttr { sorter := "" if sorterI != nil { sorter, _ = sorterI.(string) } html := "data-url=\"" + url + "\" data-sorter=\"" + sorterField + "\"" html += " class=\"th-sortable " if sorter == sorterField+"-up" { html += "th-sort-up\"" } else if sorter == sorterField+"-down" { html += "th-sort-down" } html += "\"" return template.HTMLAttr(html) } // pagination revel.TemplateFuncs["page"] = func(urlBase string, page, pageSize, count int) template.HTML { if count == 0 { return "" } totalPage := int(math.Ceil(float64(count) / float64(pageSize))) preClass := "" prePage := page - 1 if prePage == 0 { prePage = 1 } nextClass := "" nextPage := page + 1 var preUrl, nextUrl string preUrl = urlBase + "?page=" + strconv.Itoa(prePage) nextUrl = urlBase + "?page=" + strconv.Itoa(nextPage) // 没有上一页了 if page == 1 { preClass = "disabled" preUrl = "#" } // 没有下一页了 if totalPage <= page { nextClass = "disabled" nextUrl = "#" } return template.HTML("<li class='" + preClass + "'><a href='" + preUrl + "'>Previous</a></li> <li class='" + nextClass + "'><a href='" + nextUrl + "'>Next</a></li>") } // life // https://groups.google.com/forum/#!topic/golang-nuts/OEdSDgEC7js // http://play.golang.org/p/snygrVpQva // http://grokbase.com/t/gg/golang-nuts/142a6dhfh3/go-nuts-text-template-using-comparison-operators-eq-gt-etc-on-non-existent-variable-causes-the-template-to-stop-outputting-but-with-no-error-correct-behaviour /* revel.TemplateFuncs["gt"] = func(a1, a2 interface{}) bool { switch a1.(type) { case string: switch a2.(type) { case string: return reflect.ValueOf(a1).String() > reflect.ValueOf(a2).String() } case int, int8, int16, int32, int64: switch a2.(type) { case int, int8, int16, int32, int64: return reflect.ValueOf(a1).Int() > reflect.ValueOf(a2).Int() } case uint, uint8, uint16, uint32, uint64: switch a2.(type) { case uint, uint8, uint16, uint32, uint64: return reflect.ValueOf(a1).Uint() > reflect.ValueOf(a2).Uint() } case float32, float64: switch a2.(type) { case float32, float64: return reflect.ValueOf(a1).Float() > reflect.ValueOf(a2).Float() } } return false } */ /* {{range $i := N 1 10}} <div>{{$i}}</div> {{end}} */ revel.TemplateFuncs["N"] = func(start, end int) (stream chan int) { stream = make(chan int) go func() { for i := start; i <= end; i++ { stream <- i } close(stream) }() return } // init Email revel.OnAppStart(func() { // 数据库 db.Init("", "") // email配置 InitEmail() InitVd() // memcache.InitMemcache() // session服务 // 其它service service.InitService() controllers.InitService() admin.InitService() member.InitService() service.ConfigS.InitGlobalConfigs() api.InitService() }) }