* @since 2021-08-01 */ namespace App\Http\Controllers\Admin\Stencil; use App\Http\Controllers\Controller; use App\Http\Models\Site; use App\Http\Services\TemplateLibraryApiService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Contracts\View\Factory; use Illuminate\View\View; use Illuminate\Support\Collection; use Illuminate\Http\JsonResponse; class TplController extends Controller { const TEMPLATE_PID = -1; const VARIABLE_PID = -2; private $templateLibraryApiService; /** * 模版站服务类 * TplController constructor. * @param TemplateLibraryApiService $templateLibraryApiService */ public function __construct(TemplateLibraryApiService $templateLibraryApiService) { $this->templateLibraryApiService = $templateLibraryApiService; } /** * 页面模版管理 * @param $siteId * @return Factory|View */ public function index($siteId) { try { $site = Site::query()->where('id', $siteId)->first(); $templateList = $this->templateLibraryApiService->arraySort($this->getContentTemplateList($siteId), 'name'); $templateVarList = $this->templateLibraryApiService->arraySort($this->getContentTemplateVar($siteId), 'name'); $trees = list_to_tree(array_merge($templateList, $templateVarList), 'id', 'parent_id', 'children'); return view('admin.stencil.tpl', [ 'trees' => $trees, 'site' => $site, 'siteId' => $siteId, 'templateList' => $templateList, 'variable' => $this->arraySort(json_decode(json_encode($this->getTemplateList($siteId, true)), true),'name'), 'template' => $this->arraySort(json_decode(json_encode($this->getVariableList($siteId)), true),'name'), ]); } catch (\Throwable $exception) { echo $exception->getMessage(); } } /** * 获取内容模版列表 * @param $siteId * @return array */ public function getContentTemplateList($siteId) { $templateList = $this->getTemplateList($siteId); $list1 = []; if (!empty($templateList)) { foreach ($templateList as $key => $value) { $list1 [] = [ 'id' => $value->id, 'parent_id' => $value->parent_id, 'name' => "{$value->name}(#{$value->id})", 'title' => $value->name ?? '', 'alias' => $value->alias ?? '', 'rank' => $value->rank ?? 0, 'description' => $value->description ?? '', 'allow_write_file' => $value->allow_write_file ?? '', 'allow_clear_cache' => $value->allow_clear_cache ?? '', 'url_level' => $value->url_level ?? '', 'images' => json_decode($value->images, true) ?? [], 'level' => $value->level ?? 0, 'type' => 1,//模版,用于区分模版和变量 ]; } $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $relatedIdList = $connection->table('content_template_relate')->get()->toArray(); foreach ($list1 as $key => $value) { $list1[$key]['varIdList'] = []; foreach ($relatedIdList as $kk => $vv) { if ($value['id'] == $vv->tid) { $list1[$key]['varIdList'][] = $vv->vid; } } } } return $list1; } /** * 获取模版列表 * @param $siteId * @param bool $type 是否只获取一级列表 * @return Collection */ private function getTemplateList($siteId, $type = false) { $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $template = $connection->table('content_template'); if ($type) { $template->where('level', 2); } $templateList = $template ->where('status', '<', 2) ->orderBy('rank', 'asc') ->orderBy('id', 'asc') ->get(); return $templateList; } /** * 获取变量列表 * @param $siteId * @return Collection */ private function getVariableList($siteId) { $variableList = DB::connection($this->templateLibraryApiService->connection($siteId)) ->table('content_template_var') ->where('status', '<', 2) ->orderBy('rank', 'asc') ->orderBy('id', 'asc') ->get(); return $variableList; } /** * 获取模版变量 * @param $siteId * @return array */ public function getContentTemplateVar($siteId) { $variableList = $this->getVariableList($siteId); $list2 = []; if (!empty($variableList)) { $list2[] = [ 'id' => self::VARIABLE_PID, 'parent_id' => 0, 'name' => 'Variable', 'title' => '', 'alias' => '', 'rank' => 0, 'description' => '', 'allow_write_file' => '', 'allow_clear_cache' => '', 'url_level' => '', 'html' => '', 'input_length' => 0, 'width' => 0, 'height' => 0, 'size' => 0, 'input_value' => '', 'regex_match' => '', 'regex_error' => '', 'type' => 2,//模版,用于区分模版和变量 ]; foreach ($variableList as $key => $value) { $list2 [] = [ 'id' => $value->id, 'parent_id' => $list2[0]['id'], 'name' => "{$value->name}(#{$value->id})", 'title' => $value->name ?? '', 'alias' => $value->caption, 'rank' => $value->rank, 'description' => $value->description, 'allow_write_file' => $value->allow_write_file ?? '', 'allow_clear_cache' => $value->allow_clear_cache ?? '', 'url_level' => $value->url_level ?? '', 'html' => '', 'input_opts' => $value->input_opts ?? '', 'input_length' => $value->input_length ?? 0, 'width' => $value->width ?? 0, 'height' => $value->height ?? 0, 'size' => $value->size ?? 0, 'input_type' => $value->input_type, 'input_value' => $value->input_value, 'regex_match' => $value->regex_match, 'regex_error' => $value->regex_error, 'type' => 2, ]; } $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $relatedIdList = $connection->table('content_template_relate')->get()->toArray(); foreach ($list2 as $key => $value) { $list2[$key]['templateIdList'] = []; foreach ($relatedIdList as $kk => $vv) { if ($value['id'] == $vv->vid) { $list2[$key]['templateIdList'][] = $vv->tid; } } } } return $list2; } /** * 保存模版 * @param Request $request * @param $siteId * @return JsonResponse */ public function templateSave(Request $request, $siteId) { $request = $request->all(); $update = [ 'name' => $request['title'] ?? '', 'description' => $request['description'] ?? '', 'url_rule' => $request['sub_type'] ?? 2, 'alias' => $request['alias'] ?? '', 'rank' => $request['rank'] ?? 0, 'url_level' => $request['url_level'] ?? 0, 'images' => json_encode($request['images'] ?? []), ]; if (empty($request['template_id'])) { return response()->json(['message' => '请选择子菜单操作'], 400); } $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if (!empty($request['checkboxList'])) { $connection->table('content_template_relate')->where('tid', $request['template_id'])->delete(); $list = $request['checkboxList']; $data = []; foreach ($list as $value) { $result = [ 'vid' => $value, 'tid' => $request['template_id'], ]; $data[] = $result; } $connection->table('content_template_relate')->insert($data); } else { $connection->table('content_template_relate')->where('tid', $request['template_id'])->delete(); } $connection->table('content_template')->where('id', $request['template_id'])->update($update); return response()->json(['message' => '操作成功']); } /** * 保存变量 * @param Request $request * @param $siteId * @return JsonResponse */ public function variableSave(Request $request, $siteId) { $request = $request->all(); $update = [ 'name' => $request['title2'] ?? '', 'description' => $request['description'] ?? '', 'caption' => $request['alias'] ?? '', 'rank' => $request['rank'] ?? 0, 'input_type' => $request['input_type'] ?? '', 'input_opts' => $request['input_opts'] ?? '', 'input_length' => $request['input_length'] ?? '', 'width' => $request['width'] ?? 0, 'height' => $request['height'] ?? 0, 'size' => $request['size'] ?? 0, 'input_value' => $request['input_value'] ?? '', 'regex_match' => $request['regex_match'] ?? '', 'regex_error' => $request['regex_error'] ?? '', ]; if (empty($request['variable_id'])) { return response()->json(['message' => '请选择子菜单操作'], 400); } $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if (!empty($request['checkboxList'])) { $connection->table('content_template_relate')->where('vid', $request['variable_id'])->delete(); $list = $request['checkboxList']; $data = []; foreach ($list as $value) { $result = [ 'vid' => $request['variable_id'], 'tid' => $value, ]; $data[] = $result; } $connection->table('content_template_relate')->insert($data); } else { $connection->table('content_template_relate')->where('vid', $request['variable_id'])->delete(); } $connection->table('content_template_var')->where('id', $request['variable_id'])->update($update); return response()->json(['message' => '操作成功']); } /** * 添加变量 * @param Request $request * @param $siteId * @return JsonResponse */ public function templateAddNode(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if ($result['pid'] == self::TEMPLATE_PID && $result['type'] == 1) { $data = [ 'name' => $result['node'], 'parent_id' => self::TEMPLATE_PID, 'alias' => $result['node'], 'level' => ++$result['level'] ?? 0, 'description' => '', 'html' => '', 'rank' => 0, 'allow_write_file' => 0, 'allow_clear_cache' => 0, 'create_time' => time() ]; $connection->table('content_template')->insert($data); } elseif ($result['pid'] != self::TEMPLATE_PID && $result['type'] == 1) { $data = [ 'name' => $result['node'], 'parent_id' => $result['pid'], 'alias' => $result['node'], 'level' => ++$result['level'] ?? 0, 'description' => '', 'html' => '', 'rank' => 0, 'allow_write_file' => 0, 'allow_clear_cache' => 0, 'create_time' => time() ]; $connection->table('content_template')->insert($data); } elseif ($result['pid'] == self::VARIABLE_PID && $result['type'] == 2) { $data = [ 'name' => $result['node'], 'caption' => $result['node'], 'description' => '', 'input_type' => 'text', 'input_value' => '', 'input_opts' => '', 'input_length' => 0, 'allow_blank' => 0, 'regex_match' => '', 'regex_error' => '', 'rank' => 0, 'status' => 0, 'width' => 0, 'height' => 0, 'size' => 0, 'create_time' => time(), ]; $connection->table('content_template_var')->insert($data); } else { return response()->json(['message' => '不允许添加子级变量'], 400); } return response()->json(['message' => '操作成功']); } /** * 删除变量 * @param Request $request * @param $siteId * @return JsonResponse */ public function templateDelNode(Request $request, $siteId) { $request = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if ($request['pid'] == self::VARIABLE_PID) { $result = $connection->table('content_template_var')->where('id', $request['id'])->delete(); } else { $result = $connection->table('content_template')->where('id', $request['id'])->delete(); } if (empty($result)) { return response()->json(['message' => '服务器发生错误', '400']); } else { return response()->json(['message' => '操作成功']); } } }