modelClass = new CategoryModel; } public function index() { if ($this->request->isAjax()) { $models = Models::where('status', 1)->column('name', 'id'); $tree = new \util\Tree(); $tree->icon = [' │ ', ' ├─ ', ' └─ ']; $tree->nbsp = ' '; $categorys = []; $result = CategoryModel::order('listorder DESC, id DESC')->select(); $enabledLangs = LangModel::getEnabledList(); foreach ($result as $v) { $translate = CategoryModel::getTranslate($v['id'], LangModel::getDefaultMark()); if ($translate) { $v['catname'] = $translate['catname']; } $statusMap = []; foreach ($enabledLangs as $langItem) { $statusMap[$langItem->mark] = CategoryData::where(['catid' => $v['id'], 'lang' => $langItem->mark])->count() > 0 ? 1 : 0; } $v['lang_status'] = $statusMap; $v['modelname'] = $models[$v['modelid']] ?? '/'; $v['url'] = buildCatUrl($v['id'], $v['url']); $categorys[$v['id']] = $v; } $tree->init($categorys); $_list = $tree->getTreeList($tree->getTreeArray(0), 'catname'); return json(['code' => 0, 'count' => count($_list), 'data' => $_list]); } $langOptions = []; foreach (LangModel::getEnabledList() as $item) { $langOptions[] = [ 'mark' => $item->mark, 'name' => $item->name, 'code' => $item->code, ]; } $this->assignconfig('enabledLangs', $langOptions); return $this->fetch(); } public function add() { if ($this->request->isPost()) { $data = $this->request->post('row/a'); $data['setting'] = $data['setting'] ?? []; $lang = $data['lang'] ?? LangModel::getDefaultMark(); switch ($data['type']) { case 1: $scene = 'page'; break; case 2: $scene = 'list'; break; case 3: $scene = 'link'; break; default: $this->error('栏目类型错误~'); } if (!empty($data['isbatch'])) { $this->error('当前多语言版暂不支持栏目批量添加,请使用单条添加'); } $data['catdir'] = $this->get_dirpinyin($data['catname'] ?? '', $data['catdir'] ?? ''); Db::startTrans(); try { $this->validate($data, 'app\\admin\\validate\\cms\\Category.' . $scene); $this->modelClass->save($data); CategoryModel::saveTranslation($this->modelClass->id, [ 'catname' => $data['catname'] ?? '', 'description' => $data['description'] ?? '', 'meta_title' => $data['setting']['meta_title'] ?? '', 'meta_keywords' => $data['setting']['meta_keywords'] ?? '', 'meta_description' => $data['setting']['meta_description'] ?? '', ], $lang); $this->refreshCategoryRelationCache(); Db::commit(); } catch (ValidateException $e) { Db::rollback(); $this->error($e->getMessage()); } catch (\Throwable $e) { Db::rollback(); $this->error($e->getMessage()); } $this->success('添加成功!'); } $parentid = $this->request->param('parentid/d', 0); $Ca = []; if (!empty($parentid)) { $Ca = getCategory($parentid); if (empty($Ca)) { $this->error('父栏目不存在!'); } } $models = Models::where('status', 1)->where('module', 'cms')->select(); $array = CategoryModel::order('listorder DESC, id DESC')->column('*', 'id'); if (!empty($array) && is_array($array)) { $tree = new \util\Tree(); $tree->icon = [' │ ', ' ├─ ', ' └─ ']; $tree->nbsp = ' '; $str = ''; $tree->init($array); $categorydata = $tree->getTree(0, $str, $parentid); } else { $categorydata = ''; } $this->assign([ 'category' => $categorydata, 'models' => $models, 'parentid_modelid' => $Ca['modelid'] ?? 0, 'userGroup' => UserGroup::column('name', 'id'), 'cmsConfig' => get_addon_config('cms'), 'langs' => LangModel::getEnabledList(), 'currentLang' => LangModel::getDefaultMark(), ]); $this->assignconfig('parentid_modelid', $Ca['modelid'] ?? 0); return $this->fetch(); } public function edit() { if ($this->request->isPost()) { $catid = $this->request->param('id/d', 0); $row = Db::name('cms_category')->where('id', $catid)->find(); if (!$row) { $this->error('记录未找到'); } $row['setting'] = empty($row['setting']) ? [] : json_decode($row['setting'], true); $data = $this->request->post('row/a'); $data['setting'] = $data['setting'] ?? []; $lang = $data['lang'] ?? LangModel::getDefaultMark(); if (($data['parentid'] ?? 0) == $catid) { $this->error('上级栏目不能是自身!'); } switch ($data['type']) { case 1: $data['modelid'] = 0; $scene = 'page'; break; case 2: $scene = 'list'; break; case 3: $data['modelid'] = 0; $scene = 'link'; break; default: $this->error('栏目类型错误~'); } if ($lang === LangModel::getDefaultMark()) { $data['catdir'] = $this->get_dirpinyin($data['catname'] ?? '', $data['catdir'] ?? '', $catid); } else { $data['catdir'] = $row['catdir']; } Db::startTrans(); try { $mainData = $data; if ($lang !== LangModel::getDefaultMark()) { $mainData['catname'] = $row['catname']; $mainData['catdir'] = $row['catdir']; $mainData['description'] = $row['description']; $mainData['setting'] = [ 'meta_title' => $row['setting']['meta_title'] ?? '', 'meta_keywords' => $row['setting']['meta_keywords'] ?? '', 'meta_description' => $row['setting']['meta_description'] ?? '', 'category_template' => $row['setting']['category_template'] ?? '', 'list_template' => $row['setting']['list_template'] ?? '', 'show_template' => $row['setting']['show_template'] ?? '', 'page_template' => $row['setting']['page_template'] ?? '', ]; } $this->validate($mainData, 'app\\admin\\validate\\cms\\Category.' . $scene); Db::name('cms_category')->where('id', $catid)->update([ 'catname' => $mainData['catname'] ?? '', 'catdir' => $mainData['catdir'] ?? '', 'type' => $mainData['type'] ?? 1, 'target' => $mainData['target'] ?? '_self', 'modelid' => $mainData['modelid'] ?? 0, 'parentid' => $mainData['parentid'] ?? 0, 'image' => $mainData['image'] ?? '', 'icon' => $mainData['icon'] ?? '', 'description' => $mainData['description'] ?? '', 'url' => $mainData['url'] ?? '', 'setting' => json_encode($mainData['setting'] ?? [], JSON_UNESCAPED_UNICODE), 'listorder' => $mainData['listorder'] ?? 0, 'status' => $mainData['status'] ?? 0, ]); CategoryModel::saveTranslation($catid, [ 'catname' => $data['catname'] ?? '', 'description' => $data['description'] ?? '', 'meta_title' => $data['setting']['meta_title'] ?? '', 'meta_keywords' => $data['setting']['meta_keywords'] ?? '', 'meta_description' => $data['setting']['meta_description'] ?? '', ], $lang); Cache::delete('getCategory_' . $catid); $this->refreshCategoryRelationCache(); Db::commit(); } catch (ValidateException $e) { Db::rollback(); $this->error($e->getMessage()); } catch (\Throwable $e) { Db::rollback(); $this->error($e->getMessage()); } $this->success('修改成功!'); } $catid = $this->request->param('id/d', 0); $lang = $this->request->param('lang/s', LangModel::getDefaultMark()); if (empty($catid)) { $this->error('请选择需要修改的栏目!'); } $data = CategoryModel::find($catid); $translate = CategoryModel::getTranslate($catid, $lang); $setting = $data['setting']; if ($translate) { $data['catname'] = $translate['catname']; $data['description'] = $translate['description']; $setting['meta_title'] = $translate['meta_title']; $setting['meta_keywords'] = $translate['meta_keywords']; $setting['meta_description'] = $translate['meta_description']; } $models = Models::where('status', 1)->where('module', 'cms')->select(); $array = CategoryModel::order('listorder DESC, id DESC')->column('*', 'id'); if (!empty($array) && is_array($array)) { $tree = new \util\Tree(); $tree->icon = [' │ ', ' ├─ ', ' └─ ']; $tree->nbsp = ' '; $str = ''; $tree->init($array); $categorydata = $tree->getTree(0, $str, $data['parentid']); } else { $categorydata = ''; } $langStatus = []; foreach (LangModel::getEnabledList() as $item) { $langStatus[$item->mark] = CategoryData::where(['catid' => $catid, 'lang' => $item->mark])->count() > 0 ? 1 : 0; } $this->assign([ 'data' => $data, 'setting' => $setting, 'category' => $categorydata, 'models' => $models, 'privs' => CategoryPrivModel::where('catid', $catid)->select(), 'cmsConfig' => get_addon_config('cms'), 'userGroup' => UserGroup::column('name', 'id'), 'langs' => LangModel::getEnabledList(), 'currentLang' => $lang, 'defaultLang' => LangModel::getDefaultMark(), 'langStatus' => $langStatus, ]); return $this->fetch(); } public function cat_priv() { $act = $this->request->param('act'); $id = $this->request->param('id'); if ($act == 'authorization') { if (empty($id)) { $this->error('请指定需要授权的角色!'); } if ($this->request->isAjax()) { $data = $this->request->post(); $priv = []; if (isset($data['priv'])) { foreach ($data['priv'] as $k => $v) { foreach ($v as $q) { $priv[] = ['roleid' => $id, 'catid' => $k, 'action' => $q, 'is_admin' => 1]; } } CategoryPrivModel::where('roleid', $id)->delete(); (new CategoryPrivModel)->saveAll($priv); $this->success('栏目授权成功!'); } $this->error('请指定需要授权的栏目!'); } $tree = new \util\Tree(); $tree->icon = [' │ ', ' ├─ ', ' └─ ']; $tree->nbsp = ' '; $category_priv = CategoryPrivModel::where('roleid', $id)->select()->toArray(); $priv = []; foreach ($category_priv as $v) { $priv[$v['catid']][$v['action']] = true; } $categorys = CategoryModel::order('listorder DESC, id DESC')->select()->toArray(); foreach ($categorys as $k => $v) { if ($v['type'] == 1 || $v['child']) { $v['disabled'] = 'disabled'; $v['init_check'] = $v['add_check'] = $v['delete_check'] = $v['listorder_check'] = $v['move_check'] = $v['edit_check'] = $v['status_check'] = ''; } else { $v['disabled'] = ''; $v['add_check'] = isset($priv[$v['id']]['add']) ? 'checked' : ''; $v['delete_check'] = isset($priv[$v['id']]['delete']) ? 'checked' : ''; $v['listorder_check'] = isset($priv[$v['id']]['listorder']) ? 'checked' : ''; $v['move_check'] = isset($priv[$v['id']]['remove']) ? 'checked' : ''; $v['edit_check'] = isset($priv[$v['id']]['edit']) ? 'checked' : ''; $v['status_check'] = isset($priv[$v['id']]['status']) ? 'checked' : ''; } $v['init_check'] = isset($priv[$v['id']]['init']) ? 'checked' : ''; $categorys[$k] = $v; } $str = "