Browse Source

Blog post must have one main category too

Vova Tkach 5 years ago
parent
commit
6ef7044a3d

+ 29 - 1
modules/module_blog.go

@@ -133,6 +133,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					user,
 					name,
 					alias,
+					category,
 					briefly,
 					content,
 					UNIX_TIMESTAMP(datetime) as datetime,
@@ -149,6 +150,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				&row.A_user,
 				&row.A_name,
 				&row.A_alias,
+				&row.A_category,
 				&row.A_briefly,
 				&row.A_content,
 				&row.A_datetime,
@@ -369,6 +371,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				A_user:     0,
 				A_name:     "",
 				A_alias:    "",
+				A_category: 0,
 				A_content:  "",
 				A_datetime: 0,
 				A_active:   0,
@@ -387,6 +390,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 						user,
 						name,
 						alias,
+						category,
 						briefly,
 						content,
 						active
@@ -401,6 +405,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					&data.A_user,
 					&data.A_name,
 					&data.A_alias,
+					&data.A_category,
 					&data.A_briefly,
 					&data.A_content,
 					&data.A_active,
@@ -463,13 +468,36 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					Hint:    "Example: our-news",
 					Max:     "255",
 				},
+				{
+					Kind:    builder.DFKText,
+					Caption: "Category",
+					Name:    "category",
+					Value:   "0",
+					CallBack: func(field *builder.DataFormField) string {
+						return `<div class="form-group n4">` +
+							`<div class="row">` +
+							`<div class="col-md-3">` +
+							`<label for="lbl_category">Category</label>` +
+							`</div>` +
+							`<div class="col-md-9">` +
+							`<div>` +
+							`<select class="selectpicker form-control" id="lbl_category" name="category" data-live-search="true">` +
+							`<option title="Nothing selected" value="0">&mdash;</option>` +
+							this.blog_GetCategorySelectOptions(wrap, 0, data.A_category, []int{}) +
+							`</select>` +
+							`</div>` +
+							`</div>` +
+							`</div>` +
+							`</div>`
+					},
+				},
 				{
 					Kind:    builder.DFKText,
 					Caption: "Categories",
 					Name:    "cats",
 					Value:   "0",
 					CallBack: func(field *builder.DataFormField) string {
-						return `<div class="form-group n4">` +
+						return `<div class="form-group n5">` +
 							`<div class="row">` +
 							`<div class="col-md-3">` +
 							`<label for="lbl_parent">Categories</label>` +

+ 15 - 0
modules/module_blog_act_modify.go

@@ -17,6 +17,7 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 		pf_id := wrap.R.FormValue("id")
 		pf_name := wrap.R.FormValue("name")
 		pf_alias := wrap.R.FormValue("alias")
+		pf_category := wrap.R.FormValue("category")
 		pf_briefly := wrap.R.FormValue("briefly")
 		pf_content := wrap.R.FormValue("content")
 		pf_active := wrap.R.FormValue("active")
@@ -30,6 +31,11 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 			return
 		}
 
+		if !utils.IsNumeric(pf_category) {
+			wrap.MsgError(`Inner system error`)
+			return
+		}
+
 		if pf_name == "" {
 			wrap.MsgError(`Please specify post name`)
 			return
@@ -44,6 +50,11 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 			return
 		}
 
+		// Default is ROOT
+		if pf_category == "0" {
+			pf_category = "1"
+		}
+
 		if pf_id == "0" {
 			var lastID int64 = 0
 			if err := wrap.DB.Transaction(func(tx *wrapper.Tx) error {
@@ -53,6 +64,7 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 						user = ?,
 						name = ?,
 						alias = ?,
+						category = ?,
 						briefly = ?,
 						content = ?,
 						datetime = ?,
@@ -61,6 +73,7 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 					wrap.User.A_id,
 					pf_name,
 					pf_alias,
+					utils.StrToInt(pf_category),
 					pf_briefly,
 					pf_content,
 					utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
@@ -133,6 +146,7 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 					`UPDATE blog_posts SET
 						name = ?,
 						alias = ?,
+						category = ?,
 						briefly = ?,
 						content = ?,
 						active = ?
@@ -141,6 +155,7 @@ func (this *Modules) RegisterAction_BlogModify() *Action {
 					;`,
 					pf_name,
 					pf_alias,
+					utils.StrToInt(pf_category),
 					pf_briefly,
 					pf_content,
 					utils.StrToInt(pf_active),

+ 8 - 0
modules/module_blog_categories_act_delete.go

@@ -26,6 +26,14 @@ func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
 			if _, err := tx.Exec("SELECT category_id FROM blog_cat_post_rel WHERE category_id = ? FOR UPDATE;", utils.StrToInt(pf_id)); err != nil {
 				return err
 			}
+			if _, err := tx.Exec("SELECT id FROM blog_posts WHERE category = ? FOR UPDATE;", utils.StrToInt(pf_id)); err != nil {
+				return err
+			}
+
+			// Set root category
+			if _, err := tx.Exec("UPDATE blog_posts SET category = 1 WHERE category = ?;", utils.StrToInt(pf_id)); err != nil {
+				return err
+			}
 
 			// Process
 			if _, err := tx.Exec("DELETE FROM blog_cat_post_rel WHERE category_id = ?;", utils.StrToInt(pf_id)); err != nil {

+ 21 - 1
modules/module_index_act_mysql_setup.go

@@ -107,6 +107,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 				user int(11) NOT NULL COMMENT 'User id',
 				name varchar(255) NOT NULL COMMENT 'Post name',
 				alias varchar(255) NOT NULL COMMENT 'Post alias',
+				category int(11) NOT NULL,
 				briefly text NOT NULL COMMENT 'Post brief content',
 				content text NOT NULL COMMENT 'Post content',
 				datetime datetime NOT NULL COMMENT 'Creation date/time',
@@ -325,6 +326,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 				user = ?,
 				name = ?,
 				alias = ?,
+				category = ?,
 				briefly = ?,
 				content = ?,
 				datetime = ?,
@@ -334,6 +336,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			1,
 			"Why should we eat wholesome food?",
 			"why-should-we-eat-wholesome-food",
+			9,
 			"<p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
@@ -349,6 +352,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 				user = ?,
 				name = ?,
 				alias = ?,
+				category = ?,
 				briefly = ?,
 				content = ?,
 				datetime = ?,
@@ -358,6 +362,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			1,
 			"Latest top space movies",
 			"latest-top-space-movies",
+			12,
 			"<p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
@@ -373,6 +378,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 				user = ?,
 				name = ?,
 				alias = ?,
+				category = ?,
 				briefly = ?,
 				content = ?,
 				datetime = ?,
@@ -382,6 +388,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			1,
 			"The best juices for a child",
 			"the-best-juices-for-a-child",
+			8,
 			"<p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Et malesuada fames ac turpis egestas sed tempus urna et. Euismod elementum nisi quis eleifend. Nisi porta lorem mollis aliquam ut porttitor. Ac turpis egestas maecenas pharetra convallis posuere. Nunc non blandit massa enim nec dui. Commodo elit at imperdiet dui accumsan sit amet nulla. Viverra accumsan in nisl nisi scelerisque. Dui nunc mattis enim ut tellus. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus ornare suspendisse sed nisi lacus. Nulla facilisi morbi tempus iaculis. Ut eu sem integer vitae justo eget magna fermentum iaculis. Ullamcorper sit amet risus nullam eget felis eget nunc. Volutpat sed cras ornare arcu dui vivamus. Eget magna fermentum iaculis eu non diam.</p><p>Arcu ac tortor dignissim convallis aenean et tortor. Vitae auctor eu augue ut lectus arcu. Ac turpis egestas integer eget aliquet nibh praesent. Interdum velit euismod in pellentesque massa placerat duis. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Nisl rhoncus mattis rhoncus urna neque viverra justo. Odio ut enim blandit volutpat. Ac auctor augue mauris augue neque gravida. Ut lectus arcu bibendum at varius vel. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Dolor sit amet consectetur adipiscing elit duis tristique. Semper quis lectus nulla at volutpat diam ut. Sapien eget mi proin sed.</p>",
 			utils.UnixTimestampToMySqlDateTime(utils.GetCurrentUnixTimestamp()),
@@ -458,7 +465,7 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			return
 		}
 		if _, err = tx.Exec(
-			`INSERT INTO settings (name, value) VALUES ('database_version', '000000007');`,
+			`INSERT INTO settings (name, value) VALUES ('database_version', '000000008');`,
 		); err != nil {
 			tx.Rollback()
 			wrap.MsgError(err.Error())
@@ -619,6 +626,11 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			wrap.MsgError(err.Error())
 			return
 		}
+		if _, err = tx.Exec(`ALTER TABLE blog_posts ADD KEY FK_blog_posts_category (category);`); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
 		if _, err = tx.Exec(`ALTER TABLE pages ADD UNIQUE KEY alias (alias);`); err != nil {
 			tx.Rollback()
 			wrap.MsgError(err.Error())
@@ -768,6 +780,14 @@ func (this *Modules) RegisterAction_IndexMysqlSetup() *Action {
 			wrap.MsgError(err.Error())
 			return
 		}
+		if _, err = tx.Exec(`
+			ALTER TABLE blog_posts ADD CONSTRAINT FK_blog_posts_category
+			FOREIGN KEY (category) REFERENCES blog_cats (id) ON DELETE RESTRICT;
+		`); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
 		if _, err = tx.Exec(`
 			ALTER TABLE pages ADD CONSTRAINT FK_pages_user
 			FOREIGN KEY (user) REFERENCES users (id) ON DELETE RESTRICT;

+ 1 - 0
support/migrate/000000001.go

@@ -13,4 +13,5 @@ var Migrations = map[string]func(*sqlw.DB, string) error{
 	"000000005": Migrate_000000005,
 	"000000006": Migrate_000000006,
 	"000000007": Migrate_000000007,
+	"000000008": Migrate_000000008,
 }

+ 32 - 0
support/migrate/000000008.go

@@ -0,0 +1,32 @@
+package migrate
+
+import (
+	"golang-fave/engine/sqlw"
+)
+
+func Migrate_000000008(db *sqlw.DB, host string) error {
+	// Changes
+	if _, err := db.Exec(`ALTER TABLE blog_posts ADD COLUMN category INT(11) NOT NULL DEFAULT 1 AFTER alias;`); err != nil {
+		return err
+	}
+
+	// Indexes
+	if _, err := db.Exec(`ALTER TABLE blog_posts ADD KEY FK_blog_posts_category (category);`); err != nil {
+		return err
+	}
+
+	// References
+	if _, err := db.Exec(`
+		ALTER TABLE blog_posts ADD CONSTRAINT FK_blog_posts_category
+		FOREIGN KEY (category) REFERENCES blog_cats (id) ON DELETE RESTRICT;
+	`); err != nil {
+		return err
+	}
+
+	// Remove default
+	if _, err := db.Exec(`ALTER TABLE blog_posts ALTER category DROP DEFAULT;`); err != nil {
+		return err
+	}
+
+	return nil
+}

+ 3 - 0
support/schema.sql

@@ -17,6 +17,7 @@ CREATE TABLE blog_posts (
 	user int(11) NOT NULL COMMENT 'User id',
 	name varchar(255) NOT NULL COMMENT 'Post name',
 	alias varchar(255) NOT NULL COMMENT 'Post alias',
+	category int(11) NOT NULL,
 	briefly text NOT NULL COMMENT 'Post brief content',
 	content text NOT NULL COMMENT 'Post content',
 	datetime datetime NOT NULL COMMENT 'Creation date/time',
@@ -117,6 +118,7 @@ ALTER TABLE blog_cats ADD KEY lft (lft), ADD KEY rgt (rgt);
 ALTER TABLE blog_cats ADD KEY FK_blog_cats_user (user);
 ALTER TABLE blog_posts ADD UNIQUE KEY alias (alias);
 ALTER TABLE blog_posts ADD KEY FK_blog_posts_user (user);
+ALTER TABLE blog_posts ADD KEY FK_blog_posts_category (category);
 ALTER TABLE pages ADD UNIQUE KEY alias (alias);
 ALTER TABLE pages ADD KEY alias_active (alias,active) USING BTREE;
 ALTER TABLE pages ADD KEY FK_pages_user (user);
@@ -146,6 +148,7 @@ ALTER TABLE blog_cat_post_rel ADD CONSTRAINT FK_blog_cat_post_rel_post_id FOREIG
 ALTER TABLE blog_cat_post_rel ADD CONSTRAINT FK_blog_cat_post_rel_category_id FOREIGN KEY (category_id) REFERENCES blog_cats (id) ON DELETE RESTRICT;
 ALTER TABLE blog_cats ADD CONSTRAINT FK_blog_cats_user FOREIGN KEY (user) REFERENCES users (id) ON DELETE RESTRICT;
 ALTER TABLE blog_posts ADD CONSTRAINT FK_blog_posts_user FOREIGN KEY (user) REFERENCES users (id) ON DELETE RESTRICT;
+ALTER TABLE blog_posts ADD CONSTRAINT FK_blog_posts_category FOREIGN KEY (category) REFERENCES blog_cats (id) ON DELETE RESTRICT;
 ALTER TABLE pages ADD CONSTRAINT FK_pages_user FOREIGN KEY (user) REFERENCES users (id) ON DELETE RESTRICT;
 ALTER TABLE shop_cat_product_rel ADD CONSTRAINT FK_shop_cat_product_rel_product_id FOREIGN KEY (product_id) REFERENCES shop_products (id) ON DELETE RESTRICT;
 ALTER TABLE shop_cat_product_rel ADD CONSTRAINT FK_shop_cat_product_rel_category_id FOREIGN KEY (category_id) REFERENCES shop_cats (id) ON DELETE RESTRICT;

+ 1 - 0
utils/mysql_struct_blog_post.go

@@ -5,6 +5,7 @@ type MySql_blog_post struct {
 	A_user     int
 	A_name     string
 	A_alias    string
+	A_category int
 	A_briefly  string
 	A_content  string
 	A_datetime int