|
@@ -21,7 +21,8 @@ func (this *Modules) blog_GetCategorySelectOptions(wrap *wrapper.Wrapper, id int
|
|
|
blog_cats AS node,
|
|
|
blog_cats AS parent
|
|
|
WHERE
|
|
|
- node.lft BETWEEN parent.lft AND parent.rgt
|
|
|
+ node.lft BETWEEN parent.lft AND parent.rgt AND
|
|
|
+ node.id > 1
|
|
|
GROUP BY
|
|
|
node.id
|
|
|
ORDER BY
|
|
@@ -47,7 +48,11 @@ func (this *Modules) blog_GetCategorySelectOptions(wrap *wrapper.Wrapper, id int
|
|
|
if string(values[0]) == parentIdStr {
|
|
|
selected = " selected"
|
|
|
}
|
|
|
- sub := strings.Repeat("— ", utils.StrToInt(string(values[4])))
|
|
|
+ depth := utils.StrToInt(string(values[4])) - 1
|
|
|
+ if depth < 0 {
|
|
|
+ depth = 0
|
|
|
+ }
|
|
|
+ sub := strings.Repeat("— ", depth)
|
|
|
result += `<option value="` + html.EscapeString(string(values[0])) + `"` + disabled + selected + `>` + sub + html.EscapeString(string(values[2])) + `</option>`
|
|
|
}
|
|
|
}
|
|
@@ -79,13 +84,85 @@ func (this *Modules) blog_GetCategoryParentId(wrap *wrapper.Wrapper, id int) int
|
|
|
}
|
|
|
|
|
|
func (this *Modules) blog_ActionCategoryAdd(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
|
|
|
- //
|
|
|
+ // Start transaction with table lock
|
|
|
+ _, err := wrap.DB.Exec("LOCK TABLE blog_cats WRITE;")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ tx, err := wrap.DB.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ // Update and insert new category
|
|
|
+ if _, err = tx.Exec("SELECT @ml := lft FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @ml;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @ml;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @ml + 1, @ml + 2);", wrap.User.A_id, pf_name, pf_alias); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ // Update and insert new category
|
|
|
+ if _, err = tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @mr;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @mr;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE id = ?;", pf_parent); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @mr, @mr + 1);", wrap.User.A_id, pf_name, pf_alias); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // Commit all changes and unlock table
|
|
|
+ err = tx.Commit()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = wrap.DB.Exec("UNLOCK TABLES;")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
|
|
|
- //
|
|
|
- return nil
|
|
|
+ _, err := wrap.DB.Query(
|
|
|
+ `UPDATE blog_cats SET
|
|
|
+ name = ?,
|
|
|
+ alias = ?
|
|
|
+ WHERE
|
|
|
+ id = ?
|
|
|
+ ;`,
|
|
|
+ pf_name,
|
|
|
+ pf_alias,
|
|
|
+ pf_id,
|
|
|
+ )
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
|
|
@@ -118,6 +195,29 @@ func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+ // Set root category as default
|
|
|
+ if pf_parent == "0" {
|
|
|
+ pf_parent = "1"
|
|
|
+ } else {
|
|
|
+ // Check if parent category exists
|
|
|
+ var parentId int
|
|
|
+ err := wrap.DB.QueryRow(`
|
|
|
+ SELECT
|
|
|
+ id
|
|
|
+ FROM
|
|
|
+ blog_cats
|
|
|
+ WHERE
|
|
|
+ id > 1 AND
|
|
|
+ id = ?
|
|
|
+ LIMIT 1;`,
|
|
|
+ pf_parent,
|
|
|
+ ).Scan(&parentId)
|
|
|
+ if err != nil {
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if pf_id == "0" {
|
|
|
if err := this.blog_ActionCategoryAdd(wrap, pf_id, pf_name, pf_alias, pf_parent); err != nil {
|
|
|
wrap.MsgError(err.Error())
|
|
@@ -133,3 +233,67 @@ func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
|
|
|
+ return this.newAction(AInfo{
|
|
|
+ WantDB: true,
|
|
|
+ Mount: "blog-categories-delete",
|
|
|
+ WantAdmin: true,
|
|
|
+ }, func(wrap *wrapper.Wrapper) {
|
|
|
+ pf_id := wrap.R.FormValue("id")
|
|
|
+
|
|
|
+ if !utils.IsNumeric(pf_id) {
|
|
|
+ wrap.MsgError(`Inner system error`)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Start transaction with table lock
|
|
|
+ _, err := wrap.DB.Exec("LOCK TABLE blog_cats WRITE;")
|
|
|
+ if err != nil {
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tx, err := wrap.DB.Begin()
|
|
|
+ if err != nil {
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Update and insert new category
|
|
|
+ if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt, @mw := rgt - lft + 1 FROM blog_cats WHERE id = ?;", pf_id); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("DELETE FROM blog_cats WHERE lft BETWEEN @ml AND @mr AND id > 1;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt - @mw WHERE rgt > @mr;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - @mw WHERE lft > @mr;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Commit all changes and unlock table
|
|
|
+ err = tx.Commit()
|
|
|
+ if err != nil {
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _, err = wrap.DB.Exec("UNLOCK TABLES;")
|
|
|
+ if err != nil {
|
|
|
+ wrap.MsgError(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Reload current page
|
|
|
+ wrap.Write(`window.location.reload(false);`)
|
|
|
+ })
|
|
|
+}
|