module_shop_attributes_act_modify.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package modules
  2. import (
  3. "strings"
  4. "golang-fave/engine/wrapper"
  5. "golang-fave/utils"
  6. )
  7. func (this *Modules) RegisterAction_ShopAttributesModify() *Action {
  8. return this.newAction(AInfo{
  9. WantDB: true,
  10. Mount: "shop-attributes-modify",
  11. WantAdmin: true,
  12. }, func(wrap *wrapper.Wrapper) {
  13. pf_id := wrap.R.FormValue("id")
  14. pf_name := wrap.R.FormValue("name")
  15. pf_filter := wrap.R.FormValue("filter")
  16. if !utils.IsNumeric(pf_id) {
  17. wrap.MsgError(`Inner system error`)
  18. return
  19. }
  20. if pf_name == "" {
  21. wrap.MsgError(`Please specify attribute name`)
  22. return
  23. }
  24. if pf_filter == "" {
  25. wrap.MsgError(`Please specify attribute in filter`)
  26. return
  27. }
  28. // Collect fields and data
  29. filter_values := map[string]int{}
  30. for key, values := range wrap.R.PostForm {
  31. if len(key) > 6 && key[0:6] == "value." {
  32. for _, value := range values {
  33. if value != "" {
  34. filter_values[value] = utils.StrToInt(key[6:])
  35. }
  36. }
  37. }
  38. }
  39. if pf_id == "0" {
  40. if err := wrap.DB.Transaction(func(tx *wrapper.Tx) error {
  41. // Insert row
  42. res, err := tx.Exec(
  43. `INSERT INTO shop_filters SET
  44. name = ?,
  45. filter = ?
  46. ;`,
  47. pf_name,
  48. pf_filter,
  49. )
  50. if err != nil {
  51. return err
  52. }
  53. // Get inserted id
  54. lastID, err := res.LastInsertId()
  55. if err != nil {
  56. return err
  57. }
  58. // Block rows
  59. if _, err := tx.Exec("SELECT id FROM shop_filters WHERE id = ? FOR UPDATE;", lastID); err != nil {
  60. return err
  61. }
  62. // Insert values
  63. for vname, _ := range filter_values {
  64. if _, err = tx.Exec(
  65. `INSERT INTO shop_filters_values SET
  66. filter_id = ?,
  67. name = ?
  68. ;`,
  69. lastID,
  70. vname,
  71. ); err != nil {
  72. return err
  73. }
  74. }
  75. return nil
  76. }); err != nil {
  77. wrap.MsgError(err.Error())
  78. return
  79. }
  80. wrap.Write(`window.location='/cp/shop/attributes/';`)
  81. } else {
  82. if err := wrap.DB.Transaction(func(tx *wrapper.Tx) error {
  83. // Block rows
  84. if _, err := tx.Exec("SELECT id FROM shop_filters WHERE id = ? FOR UPDATE;", utils.StrToInt(pf_id)); err != nil {
  85. return err
  86. }
  87. if _, err := tx.Exec("SELECT id FROM shop_filters_values WHERE filter_id = ? FOR UPDATE;", utils.StrToInt(pf_id)); err != nil {
  88. return err
  89. }
  90. if _, err := tx.Exec(
  91. `SELECT
  92. shop_filter_product_values.id
  93. FROM
  94. shop_filter_product_values
  95. LEFT JOIN shop_filters_values ON shop_filters_values.id = shop_filter_product_values.filter_value_id
  96. WHERE
  97. shop_filters_values.id IS NOT NULL AND
  98. shop_filters_values.filter_id = ?
  99. FOR UPDATE;`,
  100. utils.StrToInt(pf_id),
  101. ); err != nil {
  102. return err
  103. }
  104. // Update row
  105. if _, err := tx.Exec(
  106. `UPDATE shop_filters SET
  107. name = ?,
  108. filter = ?
  109. WHERE
  110. id = ?
  111. ;`,
  112. pf_name,
  113. pf_filter,
  114. utils.StrToInt(pf_id),
  115. ); err != nil {
  116. return err
  117. }
  118. // Delete not existed rows
  119. ignore_ids := []string{}
  120. for _, vid := range filter_values {
  121. if vid != 0 {
  122. ignore_ids = append(ignore_ids, utils.IntToStr(vid))
  123. }
  124. }
  125. if len(ignore_ids) > 0 {
  126. if _, err := tx.Exec(
  127. `DELETE
  128. shop_filter_product_values
  129. FROM
  130. shop_filter_product_values
  131. LEFT JOIN shop_filters_values ON shop_filters_values.id = shop_filter_product_values.filter_value_id
  132. WHERE
  133. shop_filters_values.id IS NOT NULL AND
  134. shop_filters_values.filter_id = ? AND
  135. shop_filter_product_values.filter_value_id NOT IN (`+strings.Join(ignore_ids, ",")+`)
  136. ;`,
  137. utils.StrToInt(pf_id),
  138. ); err != nil {
  139. return err
  140. }
  141. if _, err := tx.Exec(
  142. `DELETE FROM shop_filters_values WHERE filter_id = ? AND id NOT IN (`+strings.Join(ignore_ids, ",")+`);`,
  143. utils.StrToInt(pf_id),
  144. ); err != nil {
  145. return err
  146. }
  147. }
  148. // Insert new values, update existed rows
  149. for vname, vid := range filter_values {
  150. if vid == 0 {
  151. if _, err := tx.Exec(
  152. `INSERT INTO shop_filters_values SET
  153. filter_id = ?,
  154. name = ?
  155. ;`,
  156. utils.StrToInt(pf_id),
  157. vname,
  158. ); err != nil {
  159. return err
  160. }
  161. } else {
  162. if _, err := tx.Exec(
  163. `UPDATE shop_filters_values SET
  164. name = ?
  165. WHERE
  166. id = ? AND
  167. filter_id = ?
  168. ;`,
  169. vname,
  170. vid,
  171. utils.StrToInt(pf_id),
  172. ); err != nil {
  173. return err
  174. }
  175. }
  176. }
  177. return nil
  178. }); err != nil {
  179. wrap.MsgError(err.Error())
  180. return
  181. }
  182. wrap.Write(`window.location='/cp/shop/attributes-modify/` + pf_id + `/';`)
  183. }
  184. })
  185. }