TplController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <?php
  2. /**
  3. * 页面模版管理
  4. * @copyright 2021-浙江引擎力营销策划有限公司
  5. * @author Lc<sunshinecc1@163.com>
  6. * @since 2021-08-01
  7. */
  8. namespace App\Http\Controllers\Admin\Stencil;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Models\Site;
  11. use App\Http\Services\TemplateLibraryApiService;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Contracts\View\Factory;
  15. use Illuminate\View\View;
  16. use Illuminate\Support\Collection;
  17. use Illuminate\Http\JsonResponse;
  18. class TplController extends Controller
  19. {
  20. const TEMPLATE_PID = -1;
  21. const VARIABLE_PID = -2;
  22. private $templateLibraryApiService;
  23. /**
  24. * 模版站服务类
  25. * TplController constructor.
  26. * @param TemplateLibraryApiService $templateLibraryApiService
  27. */
  28. public function __construct(TemplateLibraryApiService $templateLibraryApiService)
  29. {
  30. $this->templateLibraryApiService = $templateLibraryApiService;
  31. }
  32. /**
  33. * 页面模版管理
  34. * @param $siteId
  35. * @return Factory|View
  36. */
  37. public function index($siteId)
  38. {
  39. try {
  40. $site = Site::query()->where('id', $siteId)->first();
  41. $templateList = $this->templateLibraryApiService->arraySort($this->getContentTemplateList($siteId), 'name');
  42. $templateVarList = $this->templateLibraryApiService->arraySort($this->getContentTemplateVar($siteId), 'name');
  43. $trees = list_to_tree(array_merge($templateList, $templateVarList), 'id', 'parent_id', 'children');
  44. return view('admin.stencil.tpl', [
  45. 'trees' => $trees,
  46. 'site' => $site,
  47. 'siteId' => $siteId,
  48. 'templateList' => $templateList,
  49. 'variable' => $this->arraySort(json_decode(json_encode($this->getTemplateList($siteId, true)), true),'name'),
  50. 'template' => $this->arraySort(json_decode(json_encode($this->getVariableList($siteId)), true),'name'),
  51. ]);
  52. } catch (\Throwable $exception) {
  53. echo $exception->getMessage();
  54. }
  55. }
  56. /**
  57. * 获取内容模版列表
  58. * @param $siteId
  59. * @return array
  60. */
  61. public function getContentTemplateList($siteId)
  62. {
  63. $templateList = $this->getTemplateList($siteId);
  64. $list1 = [];
  65. if (!empty($templateList)) {
  66. foreach ($templateList as $key => $value) {
  67. $list1 [] = [
  68. 'id' => $value->id,
  69. 'parent_id' => $value->parent_id,
  70. 'name' => "{$value->name}(#{$value->id})",
  71. 'title' => $value->name ?? '',
  72. 'alias' => $value->alias ?? '',
  73. 'rank' => $value->rank ?? 0,
  74. 'description' => $value->description ?? '',
  75. 'allow_write_file' => $value->allow_write_file ?? '',
  76. 'allow_clear_cache' => $value->allow_clear_cache ?? '',
  77. 'url_level' => $value->url_level ?? '',
  78. 'images' => json_decode($value->images, true) ?? [],
  79. 'level' => $value->level ?? 0,
  80. 'type' => 1,//模版,用于区分模版和变量
  81. ];
  82. }
  83. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  84. $relatedIdList = $connection->table('content_template_relate')->get()->toArray();
  85. foreach ($list1 as $key => $value) {
  86. $list1[$key]['varIdList'] = [];
  87. foreach ($relatedIdList as $kk => $vv) {
  88. if ($value['id'] == $vv->tid) {
  89. $list1[$key]['varIdList'][] = $vv->vid;
  90. }
  91. }
  92. }
  93. }
  94. return $list1;
  95. }
  96. /**
  97. * 获取模版列表
  98. * @param $siteId
  99. * @param bool $type 是否只获取一级列表
  100. * @return Collection
  101. */
  102. private function getTemplateList($siteId, $type = false)
  103. {
  104. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  105. $template = $connection->table('content_template');
  106. if ($type) {
  107. $template->where('level', 2);
  108. }
  109. $templateList = $template
  110. ->where('status', '<', 2)
  111. ->orderBy('rank', 'asc')
  112. ->orderBy('id', 'asc')
  113. ->get();
  114. return $templateList;
  115. }
  116. /**
  117. * 获取变量列表
  118. * @param $siteId
  119. * @return Collection
  120. */
  121. private function getVariableList($siteId)
  122. {
  123. $variableList = DB::connection($this->templateLibraryApiService->connection($siteId))
  124. ->table('content_template_var')
  125. ->where('status', '<', 2)
  126. ->orderBy('rank', 'asc')
  127. ->orderBy('id', 'asc')
  128. ->get();
  129. return $variableList;
  130. }
  131. /**
  132. * 获取模版变量
  133. * @param $siteId
  134. * @return array
  135. */
  136. public function getContentTemplateVar($siteId)
  137. {
  138. $variableList = $this->getVariableList($siteId);
  139. $list2 = [];
  140. if (!empty($variableList)) {
  141. $list2[] = [
  142. 'id' => self::VARIABLE_PID,
  143. 'parent_id' => 0,
  144. 'name' => 'Variable',
  145. 'title' => '',
  146. 'alias' => '',
  147. 'rank' => 0,
  148. 'description' => '',
  149. 'allow_write_file' => '',
  150. 'allow_clear_cache' => '',
  151. 'url_level' => '',
  152. 'html' => '',
  153. 'input_length' => 0,
  154. 'width' => 0,
  155. 'height' => 0,
  156. 'size' => 0,
  157. 'input_value' => '',
  158. 'regex_match' => '',
  159. 'regex_error' => '',
  160. 'type' => 2,//模版,用于区分模版和变量
  161. ];
  162. foreach ($variableList as $key => $value) {
  163. $list2 [] = [
  164. 'id' => $value->id,
  165. 'parent_id' => $list2[0]['id'],
  166. 'name' => "{$value->name}(#{$value->id})",
  167. 'title' => $value->name ?? '',
  168. 'alias' => $value->caption,
  169. 'rank' => $value->rank,
  170. 'description' => $value->description,
  171. 'allow_write_file' => $value->allow_write_file ?? '',
  172. 'allow_clear_cache' => $value->allow_clear_cache ?? '',
  173. 'url_level' => $value->url_level ?? '',
  174. 'html' => '',
  175. 'input_opts' => $value->input_opts ?? '',
  176. 'input_length' => $value->input_length ?? 0,
  177. 'width' => $value->width ?? 0,
  178. 'height' => $value->height ?? 0,
  179. 'size' => $value->size ?? 0,
  180. 'input_type' => $value->input_type,
  181. 'input_value' => $value->input_value,
  182. 'regex_match' => $value->regex_match,
  183. 'regex_error' => $value->regex_error,
  184. 'type' => 2,
  185. ];
  186. }
  187. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  188. $relatedIdList = $connection->table('content_template_relate')->get()->toArray();
  189. foreach ($list2 as $key => $value) {
  190. $list2[$key]['templateIdList'] = [];
  191. foreach ($relatedIdList as $kk => $vv) {
  192. if ($value['id'] == $vv->vid) {
  193. $list2[$key]['templateIdList'][] = $vv->tid;
  194. }
  195. }
  196. }
  197. }
  198. return $list2;
  199. }
  200. /**
  201. * 保存模版
  202. * @param Request $request
  203. * @param $siteId
  204. * @return JsonResponse
  205. */
  206. public function templateSave(Request $request, $siteId)
  207. {
  208. $request = $request->all();
  209. $update = [
  210. 'name' => $request['title'] ?? '',
  211. 'description' => $request['description'] ?? '',
  212. 'url_rule' => $request['sub_type'] ?? 2,
  213. 'alias' => $request['alias'] ?? '',
  214. 'rank' => $request['rank'] ?? 0,
  215. 'url_level' => $request['url_level'] ?? 0,
  216. 'images' => json_encode($request['images'] ?? []),
  217. ];
  218. if (empty($request['template_id'])) {
  219. return response()->json(['message' => '请选择子菜单操作'], 400);
  220. }
  221. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  222. if (!empty($request['checkboxList'])) {
  223. $connection->table('content_template_relate')->where('tid', $request['template_id'])->delete();
  224. $list = $request['checkboxList'];
  225. $data = [];
  226. foreach ($list as $value) {
  227. $result = [
  228. 'vid' => $value,
  229. 'tid' => $request['template_id'],
  230. ];
  231. $data[] = $result;
  232. }
  233. $connection->table('content_template_relate')->insert($data);
  234. } else {
  235. $connection->table('content_template_relate')->where('tid', $request['template_id'])->delete();
  236. }
  237. $connection->table('content_template')->where('id', $request['template_id'])->update($update);
  238. return response()->json(['message' => '操作成功']);
  239. }
  240. /**
  241. * 保存变量
  242. * @param Request $request
  243. * @param $siteId
  244. * @return JsonResponse
  245. */
  246. public function variableSave(Request $request, $siteId)
  247. {
  248. $request = $request->all();
  249. $update = [
  250. 'name' => $request['title2'] ?? '',
  251. 'description' => $request['description'] ?? '',
  252. 'caption' => $request['alias'] ?? '',
  253. 'rank' => $request['rank'] ?? 0,
  254. 'input_type' => $request['input_type'] ?? '',
  255. 'input_opts' => $request['input_opts'] ?? '',
  256. 'input_length' => $request['input_length'] ?? '',
  257. 'width' => $request['width'] ?? 0,
  258. 'height' => $request['height'] ?? 0,
  259. 'size' => $request['size'] ?? 0,
  260. 'input_value' => $request['input_value'] ?? '',
  261. 'regex_match' => $request['regex_match'] ?? '',
  262. 'regex_error' => $request['regex_error'] ?? '',
  263. ];
  264. if (empty($request['variable_id'])) {
  265. return response()->json(['message' => '请选择子菜单操作'], 400);
  266. }
  267. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  268. if (!empty($request['checkboxList'])) {
  269. $connection->table('content_template_relate')->where('vid', $request['variable_id'])->delete();
  270. $list = $request['checkboxList'];
  271. $data = [];
  272. foreach ($list as $value) {
  273. $result = [
  274. 'vid' => $request['variable_id'],
  275. 'tid' => $value,
  276. ];
  277. $data[] = $result;
  278. }
  279. $connection->table('content_template_relate')->insert($data);
  280. } else {
  281. $connection->table('content_template_relate')->where('vid', $request['variable_id'])->delete();
  282. }
  283. $connection->table('content_template_var')->where('id', $request['variable_id'])->update($update);
  284. return response()->json(['message' => '操作成功']);
  285. }
  286. /**
  287. * 添加变量
  288. * @param Request $request
  289. * @param $siteId
  290. * @return JsonResponse
  291. */
  292. public function templateAddNode(Request $request, $siteId)
  293. {
  294. $result = $request->all();
  295. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  296. if ($result['pid'] == self::TEMPLATE_PID && $result['type'] == 1) {
  297. $data = [
  298. 'name' => $result['node'],
  299. 'parent_id' => self::TEMPLATE_PID,
  300. 'alias' => $result['node'],
  301. 'level' => ++$result['level'] ?? 0,
  302. 'description' => '',
  303. 'html' => '',
  304. 'rank' => 0,
  305. 'allow_write_file' => 0,
  306. 'allow_clear_cache' => 0,
  307. 'create_time' => time()
  308. ];
  309. $connection->table('content_template')->insert($data);
  310. } elseif ($result['pid'] != self::TEMPLATE_PID && $result['type'] == 1) {
  311. $data = [
  312. 'name' => $result['node'],
  313. 'parent_id' => $result['pid'],
  314. 'alias' => $result['node'],
  315. 'level' => ++$result['level'] ?? 0,
  316. 'description' => '',
  317. 'html' => '',
  318. 'rank' => 0,
  319. 'allow_write_file' => 0,
  320. 'allow_clear_cache' => 0,
  321. 'create_time' => time()
  322. ];
  323. $connection->table('content_template')->insert($data);
  324. } elseif ($result['pid'] == self::VARIABLE_PID && $result['type'] == 2) {
  325. $data = [
  326. 'name' => $result['node'],
  327. 'caption' => $result['node'],
  328. 'description' => '',
  329. 'input_type' => 'text',
  330. 'input_value' => '',
  331. 'input_opts' => '',
  332. 'input_length' => 0,
  333. 'allow_blank' => 0,
  334. 'regex_match' => '',
  335. 'regex_error' => '',
  336. 'rank' => 0,
  337. 'status' => 0,
  338. 'width' => 0,
  339. 'height' => 0,
  340. 'size' => 0,
  341. 'create_time' => time(),
  342. ];
  343. $connection->table('content_template_var')->insert($data);
  344. } else {
  345. return response()->json(['message' => '不允许添加子级变量'], 400);
  346. }
  347. return response()->json(['message' => '操作成功']);
  348. }
  349. /**
  350. * 删除变量
  351. * @param Request $request
  352. * @param $siteId
  353. * @return JsonResponse
  354. */
  355. public function templateDelNode(Request $request, $siteId)
  356. {
  357. $request = $request->all();
  358. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  359. if ($request['pid'] == self::VARIABLE_PID) {
  360. $result = $connection->table('content_template_var')->where('id', $request['id'])->delete();
  361. } else {
  362. $result = $connection->table('content_template')->where('id', $request['id'])->delete();
  363. }
  364. if (empty($result)) {
  365. return response()->json(['message' => '服务器发生错误', '400']);
  366. } else {
  367. return response()->json(['message' => '操作成功']);
  368. }
  369. }
  370. }