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 = " @spacer@catname "; $tree->init($categorys); $this->assign('categorys', $tree->getTree(0, $str)); return $this->fetch('authorization'); } elseif ($act == 'remove') { CategoryPrivModel::where('roleid', $id)->delete(); $this->success('删除成功!'); } if ($this->request->isAjax()) { $priv_num = []; $category_priv = CategoryPrivModel::field('count(*) as num,roleid')->group('roleid')->select()->toArray(); foreach ($category_priv as $v) { $priv_num[$v['roleid']] = $v['num']; } $list = Db::name('AuthGroup')->where('status', 1)->order('id', 'desc')->field('id,title')->select()->toArray(); foreach ($list as $k => $v) { $list[$k]['admin'] = $v['id'] == 1; $list[$k]['num'] = $priv_num[$v['id']] ?? 0; } return json(['code' => 0, 'data' => $list]); } $this->assign('cmsConfig', get_addon_config('cms')); return $this->fetch(); } public function public_cache() { try { $this->refreshCategoryRelationCache(); } catch (Exception $e) { $this->error($e->getMessage()); } $this->success('更新缓存成功!'); } private function refreshCategoryRelationCache() { $categorys = CategoryModel::order('listorder DESC, id DESC')->column('*', 'id'); if (empty($categorys)) { return true; } foreach ($categorys as $catid => $cat) { $arrparentid = CategoryModel::get_arrparentid($catid); $arrchildid = CategoryModel::get_arrchildid($catid, true); $child = is_numeric($arrchildid) ? 0 : 1; if ($cat['arrparentid'] != $arrparentid || $cat['arrchildid'] != $arrchildid || $cat['child'] != $child) { CategoryModel::where('id', $catid)->update(['arrparentid' => $arrparentid, 'arrchildid' => $arrchildid, 'child' => $child]); } Cache::delete('getCategory_' . $catid); if ($cat['parentid'] != 0 && !isset($categorys[$cat['parentid']])) { CategoryModel::destroy($catid); } } cms_cache('Category', null); return true; } public function count_items() { $result = CategoryModel::order('listorder DESC, id DESC')->select(); $models = Models::column('tablename', 'id'); foreach ($result as $r) { if ($r['type'] == 2 && isset($models[$r['modelid']])) { $number = Db::name(ucwords($models[$r['modelid']]))->where('catid', $r['id'])->count(); CategoryModel::where('id', $r['id'])->update(['items' => $number]); } else { CategoryModel::where('id', $r['id'])->update(['items' => 0]); } } $this->success('栏目数量校正成功!'); } public function multi() { $id = $this->request->param('id/d'); cms_cache('Category', null); getCategory($id, '', true); return parent::multi(); } private function get_dirpinyin($catname = '', $catdir = '', $id = 0) { $pinyin = new \Overtrue\Pinyin\Pinyin('Overtrue\Pinyin\MemoryFileDictLoader'); if (empty($catdir)) { $catdir = $pinyin->permalink($catname, ''); } if (strval(intval($catdir)) == strval($catdir)) { $catdir .= genRandomString(3); } $map = [['catdir', '=', $catdir]]; if ((int)$id > 0) { $map[] = ['id', '<>', $id]; } $result = Db::name('cms_category')->field('id')->where($map)->find(); if (!empty($result)) { return $this->get_dirpinyin($catname, $catdir . genRandomString(3), $id); } return $catdir; } public function public_tpl_file_list() { $id = $this->request->param('id/d'); $data = Models::where('id', $id)->find(); if ($data) { $this->success('', null, ['data' => $data['setting']]); } } }