DiyViewEdit.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\event;
  11. use app\Controller;
  12. use app\model\diy\Template;
  13. use app\model\web\DiyView as DiyViewModel;
  14. /**
  15. * 自定义页面编辑
  16. */
  17. class DiyViewEdit extends Controller
  18. {
  19. /**
  20. * 行为扩展的执行入口必须是run
  21. * @param $data
  22. * @return mixed
  23. */
  24. public function handle($data)
  25. {
  26. $diy_view = new DiyViewModel();
  27. $diy_template = new Template();
  28. if (empty($data[ 'is_default' ])) {
  29. $data[ 'is_default' ] = 1;
  30. }
  31. $template_id = $data[ 'template_id' ] ?? 0; // 所属模板id
  32. $title = $data[ 'title' ] ?? ''; // 页面名称
  33. // 页面类型
  34. if (!empty($data[ 'page_type' ])) {
  35. $name = $data[ 'page_type' ];
  36. } else {
  37. $name = 'DIY_VIEW_RANDOM_' . time();
  38. }
  39. if (!empty($data[ 'id' ]) || !empty($data[ 'name' ])) {
  40. $diy_view_condition = [
  41. [ 'site_id', '=', $data[ 'site_id' ] ],
  42. ];
  43. if (!empty($data[ 'id' ])) {
  44. $diy_view_condition[] = [ 'id', '=', $data[ 'id' ] ];
  45. } elseif (!empty($data[ 'name' ])) {
  46. $diy_view_condition[] = [ 'name', '=', $data[ 'name' ] ];
  47. $name = $data[ 'name' ];
  48. // 查询模板页面类型
  49. $diy_template_info = $diy_template->getTemplateInfo([ [ 'name', '=', $name ] ], 'name')[ 'data' ];
  50. if (!empty($diy_template_info)) {
  51. $diy_view_condition[] = [ 'is_default', '=', 1 ];
  52. }
  53. }
  54. $diy_view_info = $diy_view->getSiteDiyViewDetail($diy_view_condition)[ 'data' ];
  55. if (!empty($diy_view_info)) {
  56. $name = $diy_view_info[ 'name' ];
  57. $template_id = $diy_view_info[ 'template_id' ];
  58. }
  59. $this->assign("diy_view_info", $diy_view_info);
  60. }
  61. // 查询模板页面类型
  62. $diy_template_info = $diy_template->getTemplateInfo([ [ 'name', '=', $name ] ], 'title,name,rule')[ 'data' ];
  63. $diy_view_utils = [];
  64. $extend_comp = []; // 第三方扩展的特定页面组件
  65. $util_condition = [];
  66. if (!empty($diy_template_info)) {
  67. $diy_template_info[ 'rule' ] = json_decode($diy_template_info[ 'rule' ], true);
  68. // 支持的自定义页面(为空表示公共组件都支持)
  69. if (!empty($diy_template_info[ 'rule' ][ 'support' ])) {
  70. $util_condition[] = [ 'support_diy_view', 'in', $diy_template_info[ 'rule' ][ 'support' ], 'or' ];
  71. }
  72. // 组件类型
  73. if (!empty($diy_template_info[ 'rule' ][ 'util_type' ])) {
  74. $util_condition[] = [ 'type', 'in', $diy_template_info[ 'rule' ][ 'util_type' ] ];
  75. }
  76. $diy_view_utils[] = [
  77. 'type' => $diy_template_info[ 'name' ],
  78. 'type_name' => '页面组件',
  79. 'list' => []
  80. ];
  81. $title = $diy_template_info[ 'title' ];
  82. $this->assign('page_type', $diy_template_info[ 'name' ]);
  83. } else {
  84. // 自定义页面,只查询公共组件
  85. $util_condition[] = [ 'support_diy_view', '=', '' ];
  86. }
  87. $utils = $diy_view->getDiyViewUtilList($util_condition)[ 'data' ];
  88. if (!empty($utils)) {
  89. // 先遍历,组件分类
  90. foreach ($utils as $k => $v) {
  91. $value = [];
  92. $value[ 'type' ] = $v[ 'type' ];
  93. $value[ 'type_name' ] = $diy_view->getTypeName($v[ 'type' ]);
  94. $value[ 'list' ] = [];
  95. if (!in_array($value, $diy_view_utils)) {
  96. array_push($diy_view_utils, $value);
  97. }
  98. }
  99. // 遍历每一个组件,将其添加到对应的分类中
  100. foreach ($utils as $k => $v) {
  101. foreach ($diy_view_utils as $diy_k => $diy_v) {
  102. $is_add = true;
  103. if (!empty($v[ 'addon_name' ])) {
  104. $is_exit = addon_is_exit($v[ 'addon_name' ], $data[ 'site_id' ]);
  105. // 检查插件是否存在
  106. if ($is_exit == 0) {
  107. $is_add = false;
  108. }
  109. }
  110. // 特定页面组件归类
  111. if (!empty($v[ 'support_diy_view' ]) && $v[ 'support_diy_view' ] == $diy_v[ 'type' ] && $is_add) {
  112. if ($v[ 'type' ] == 'EXTEND') {
  113. // 第三方扩展的特定页面组件
  114. $extend_comp[] = $v;
  115. } else {
  116. array_push($diy_view_utils[ $diy_k ][ 'list' ], $v);
  117. }
  118. break;
  119. } elseif ($diy_v[ 'type' ] == $v[ 'type' ] && $is_add) {
  120. array_push($diy_view_utils[ $diy_k ][ 'list' ], $v);
  121. }
  122. }
  123. }
  124. }
  125. // 第三方组件——>特定页面组件
  126. if (!empty($extend_comp)) {
  127. foreach ($diy_view_utils as $k => $v) {
  128. if ($v[ 'type' ] == 'EXTEND') {
  129. if (empty($v[ 'list' ])) {
  130. $diy_view_utils[ $k ][ 'type_name' ] = '页面组件';
  131. $diy_view_utils[ $k ][ 'list' ] = array_merge($extend_comp, $diy_view_utils[ $k ][ 'list' ]);
  132. } else {
  133. // 页面组件排在第一位置
  134. array_splice($diy_view_utils, $k, 0, [
  135. [
  136. 'type' => 'EXTEND',
  137. 'type_name' => '页面组件',
  138. 'list' => $extend_comp
  139. ]
  140. ]);
  141. }
  142. }
  143. }
  144. }
  145. // 清除组件分类下空列表
  146. foreach ($diy_view_utils as $k => $v) {
  147. if (empty($v[ 'list' ])) {
  148. unset($diy_view_utils[ $k ]);
  149. }
  150. }
  151. $diy_view_utils = array_values($diy_view_utils);
  152. $this->assign('diy_view_utils', $diy_view_utils);
  153. $this->assign("time", time());
  154. $this->assign("name", $name); // 页面标识
  155. $this->assign('template_id', $template_id); // 所属模板id
  156. $this->assign('title', $title); // 页面名称
  157. $request_url = 'shop/diy/edit';
  158. $replace = [];
  159. if (!empty($data[ 'app_module' ]) && $data[ 'app_module' ] == 'store') {
  160. $replace = [
  161. 'STORE_CSS' => __ROOT__ . '/addon/store/store/view/public/css',
  162. 'STORE_JS' => __ROOT__ . '/addon/store/store/view/public/js',
  163. 'STORE_IMG' => __ROOT__ . '/addon/store/store/view/public/img',
  164. ];
  165. $this->assign("extend_base", 'addon/store/store/view/base.html');
  166. } else {
  167. $this->assign("extend_base", 'app/shop/view/base.html');
  168. }
  169. $this->assign("request_url", $request_url);
  170. $this->assign('store_is_exit', addon_is_exit('store', $data[ 'site_id' ]));
  171. $template = dirname(realpath(__DIR__)) . '/shop/view/diy/edit.html';
  172. return $this->fetch($template, [], $replace);
  173. }
  174. }