|
@@ -130,19 +130,117 @@ func (this *Modules) blog_ActionCategoryAdd(wrap *wrapper.Wrapper, pf_id, pf_nam
|
|
|
}
|
|
|
|
|
|
func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
|
|
|
- // TODO: add parent change updates if parent was changed
|
|
|
- _, err := wrap.DB.Query(`
|
|
|
- UPDATE blog_cats SET
|
|
|
- name = ?,
|
|
|
- alias = ?
|
|
|
- WHERE
|
|
|
- id = ?
|
|
|
- ;`,
|
|
|
- pf_name,
|
|
|
- pf_alias,
|
|
|
- pf_id,
|
|
|
- )
|
|
|
- return err
|
|
|
+ parentId := this.blog_GetCategoryParentId(wrap, utils.StrToInt(pf_id))
|
|
|
+
|
|
|
+ if utils.StrToInt(pf_parent) == parentId {
|
|
|
+ // If parent not changed, just update category data
|
|
|
+ _, err := wrap.DB.Query(`
|
|
|
+ UPDATE blog_cats SET
|
|
|
+ name = ?,
|
|
|
+ alias = ?
|
|
|
+ WHERE
|
|
|
+ id > 1 AND
|
|
|
+ id = ?
|
|
|
+ ;`,
|
|
|
+ pf_name,
|
|
|
+ pf_alias,
|
|
|
+ pf_id,
|
|
|
+ )
|
|
|
+ return err
|
|
|
+ } else {
|
|
|
+ // Parent is changed, move category to new parent
|
|
|
+ // Load target category data
|
|
|
+ data := utils.MySql_blog_category{
|
|
|
+ A_id: 0,
|
|
|
+ A_user: 0,
|
|
|
+ }
|
|
|
+ err := wrap.DB.QueryRow(`
|
|
|
+ SELECT
|
|
|
+ id,
|
|
|
+ user
|
|
|
+ FROM
|
|
|
+ blog_cats
|
|
|
+ WHERE
|
|
|
+ id > 1 AND
|
|
|
+ id = ?
|
|
|
+ LIMIT 1;`,
|
|
|
+ utils.StrToInt(pf_id),
|
|
|
+ ).Scan(
|
|
|
+ &data.A_id,
|
|
|
+ &data.A_user,
|
|
|
+ )
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ ///////////////////////////////////////////////////////////////////////
|
|
|
+ // 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
|
|
|
+ }
|
|
|
+
|
|
|
+ // Delete
|
|
|
+ if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("DELETE FROM blog_cats WHERE id = ?;", pf_id); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - 1, rgt = rgt - 1 WHERE lft > @ml AND 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 rgt > @mr;"); err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // Insert
|
|
|
+ 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 (?, ?, ?, ?, @mr, @mr + 1);", data.A_id, data.A_user, 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) RegisterAction_BlogCategoriesModify() *Action {
|
|
@@ -239,7 +337,7 @@ func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- // Update and insert new category
|
|
|
+ // Update and delete target category
|
|
|
if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
|
|
|
tx.Rollback()
|
|
|
wrap.MsgError(err.Error())
|