From b5409b101afbd625382a6a7f5ebd8a92dc873cd2 Mon Sep 17 00:00:00 2001 From: Martin Geno Date: Mon, 12 Sep 2016 20:34:09 +0200 Subject: [PATCH] [web] menu tree --- cmd/warehost-web/handler.go | 23 ++++++++++++++--------- cmd/warehost-web/model.go | 9 +++++---- cmd/warehost/build.default.go | 2 +- modul/web/models.go | 27 ++++++++++++++++++++++++++- webroot | 2 +- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/cmd/warehost-web/handler.go b/cmd/warehost-web/handler.go index f32fcf5..c56ca20 100644 --- a/cmd/warehost-web/handler.go +++ b/cmd/warehost-web/handler.go @@ -64,7 +64,7 @@ func handlerfunc(w http.ResponseWriter, r *http.Request) { logger = logger.WithField("hID", website.ID) var menus []*modul.Menu - dbconnection.Where("website = ? AND menu IS NULL", website.ID).Preload("Menu").Find(&menus) + dbconnection.Where("website = ?", website.ID).Preload("Menu").Find(&menus) var menu *modul.Menu for _, item := range menus { if item.Shorturl == "" && menu == nil { @@ -74,19 +74,24 @@ func handlerfunc(w http.ResponseWriter, r *http.Request) { menu = item } } + menus = modul.BuildMenuTree(menus) page := &modul.Page{WebsiteID: website.ID, MenuID: menu.ID} dbconnection.Where(page).Find(page) - logger.Info(page.ID) unsafe := blackfriday.MarkdownCommon([]byte(page.Content)) page.Content = string(bluemonday.UGCPolicy().SanitizeBytes(unsafe)) i := TemplateInfo{ - Host: host, - URL: url, - Page: page, - Menu: menus, + Website: website, + Host: host, + URL: url, + Page: page, + Menu: menus, + } + t, err := template.ParseGlob(fmt.Sprintf("%s/%d/%s/%s", config.Webroot, website.ID, "tmpl", "*.tmpl")) + logger.Info("done") + if err != nil { + w.Write([]byte(fmt.Sprintf("

Error on rendering Template

\n%s", err))) + } else { + t.Execute(w, i) } - t, _ := template.ParseGlob(fmt.Sprintf("%s/%d/%s/%s", config.Webroot, website.ID, "tmpl", "*.tmpl")) - logger.Info("") - t.Execute(w, i) } diff --git a/cmd/warehost-web/model.go b/cmd/warehost-web/model.go index a343d99..e7ccbe8 100644 --- a/cmd/warehost-web/model.go +++ b/cmd/warehost-web/model.go @@ -4,8 +4,9 @@ import modul "dev.sum7.de/sum7/warehost/modul/web" //TemplateInfo Information send to Template type TemplateInfo struct { - Host string - URL string - Page *modul.Page - Menu []*modul.Menu + Host string + URL string + Website *modul.Website + Page *modul.Page + Menu []*modul.Menu } diff --git a/cmd/warehost/build.default.go b/cmd/warehost/build.default.go index aae892c..fc04fa8 100644 --- a/cmd/warehost/build.default.go +++ b/cmd/warehost/build.default.go @@ -4,6 +4,6 @@ package main // MODUL variables const ( - MODULWEB = false + MODULWEB = true MODULHOST = false ) diff --git a/modul/web/models.go b/modul/web/models.go index ac65e9f..ffea555 100644 --- a/modul/web/models.go +++ b/modul/web/models.go @@ -53,7 +53,7 @@ type Menu struct { Name string `gorm:"type:varchar(255);column:name" json:"name"` Shorturl string `gorm:"type:varchar(255);column:url" json:"url"` ParentID sql.NullInt64 `sql:"type:bigint REFERENCES web_menu(id) ON UPDATE SET NULL ON DELETE SET NULL;column:menu"` - Menu []*Menu `gorm:"foreignkey:Menu" json:"menu"` + Children []*Menu `json:"menu"` } // TableName of struct @@ -71,6 +71,31 @@ type Page struct { // TableName of struct func (Page) TableName() string { return "web_page" } +// BuildMenuTree format a array of Menu to a Tree of Menu (with Children) +func BuildMenuTree(items []*Menu) []*Menu { + menumap := make(map[int64]*Menu) + var menuexit []*Menu + for _, item := range items { + if menumap[item.ID] == nil { + menumap[item.ID] = item + } + if menumap[item.ID].ID == -1 { + tmp := menumap[item.ID].Children + menumap[item.ID] = item + menumap[item.ID].Children = tmp + } + if !item.ParentID.Valid { + menuexit = append(menuexit, item) + } else { + if menumap[item.ParentID.Int64] == nil { + menumap[item.ParentID.Int64] = &Menu{ID: -1} + } + menumap[item.ParentID.Int64].Children = append(menumap[item.ParentID.Int64].Children, item) + } + } + return menuexit +} + // SyncModels to verify the database schema func SyncModels(dbconnection *gorm.DB) { dbconnection.AutoMigrate(&Website{}, &Domain{}, &Manager{}, &Media{}, &Menu{}, &Page{}) diff --git a/webroot b/webroot index 9e6988d..58aab8d 160000 --- a/webroot +++ b/webroot @@ -1 +1 @@ -Subproject commit 9e6988ddfbfe1957ba24fd556c738ab03c4e5791 +Subproject commit 58aab8dfd889cc4b5101524e8340c0f1321d7faa