| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- <?php
- namespace app\admin\controller\cms;
- use app\admin\model\cms\Category as CategoryModel;
- use app\admin\model\cms\CategoryData;
- use app\admin\model\cms\CategoryPriv as CategoryPrivModel;
- use app\admin\model\cms\Models;
- use app\admin\model\general\Lang as LangModel;
- use app\admin\model\user\UserGroup;
- use app\common\controller\Backend;
- use think\Exception;
- use think\exception\ValidateException;
- use think\facade\Cache;
- use think\facade\Db;
- class Category extends Backend
- {
- protected $noNeedRight = ['count_items', 'public_cache', 'public_tpl_file_list'];
- protected function initialize()
- {
- parent::initialize();
- $this->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 = '<option value=@id @selected @disabled>@spacer @catname</option>';
- $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 = '<option value=@id @selected @disabled>@spacer @catname</option>';
- $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 = "<tr>
- <td align='center'><input type='checkbox' value='1' data-name='@id' lay-skin='primary'></td>
- <td>@spacer@catname</td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @init_check lay-skin='primary' value='init'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @add_check lay-skin='primary' value='add'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @edit_check lay-skin='primary' value='edit'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @delete_check lay-skin='primary' value='delete'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @listorder_check lay-skin='primary' value='listorder'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @status_check lay-skin='primary' value='status'></td>
- <td align='center'><input type='checkbox' name='priv[@id][]' @disabled @move_check lay-skin='primary' value='remove'></td>
- </tr>";
- $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']]);
- }
- }
- }
|