Fields.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <?php
  2. namespace app\admin\controller\cms;
  3. use addons\cms\library\Service;
  4. use app\common\controller\Backend;
  5. use app\common\model\Config;
  6. /**
  7. * 模型字段表
  8. *
  9. * @icon fa fa-circle-o
  10. */
  11. class Fields extends Backend
  12. {
  13. /**
  14. * Fields模型对象
  15. */
  16. protected $model = null;
  17. protected $modelValidate = true;
  18. protected $modelSceneValidate = true;
  19. protected $noNeedRight = ['rulelist'];
  20. protected $multiFields = 'isfilter,iscontribute';
  21. public function _initialize()
  22. {
  23. parent::_initialize();
  24. $this->model = new \app\admin\model\cms\Fields;
  25. $this->view->assign("statusList", $this->model->getStatusList());
  26. $this->view->assign('typeList', Config::getTypeList());
  27. $this->view->assign('regexList', Config::getRegexList());
  28. $this->assignconfig('withoutModelList', ['channel', 'page', 'special', 'block']);
  29. $this->assignconfig('contributeFields', \app\admin\model\cms\Fields::getContributeFields());
  30. $this->assignconfig('publishFields', \app\admin\model\cms\Fields::getPublishFields());
  31. }
  32. /**
  33. * 查看
  34. */
  35. public function index()
  36. {
  37. $source = $this->request->param('source', '');
  38. $source_id = $this->request->param('source_id', 0);
  39. $condition = ['source' => $source, 'source_id' => $source_id];
  40. $prefix = \think\Config::get('database.prefix');
  41. //设置过滤方法
  42. $this->request->filter(['strip_tags']);
  43. if ($this->request->isAjax()) {
  44. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  45. $total = $this->model
  46. ->where($condition)
  47. ->where($where)
  48. ->order($sort, $order)
  49. ->count();
  50. $list = $this->model
  51. ->where($condition)
  52. ->where($where)
  53. ->order($sort, $order)
  54. ->limit($offset, $limit)
  55. ->select();
  56. if ($source == 'model') {
  57. $fieldList = Service::getTableFields("{$prefix}cms_archives");
  58. $model = \app\admin\model\cms\Modelx::get($source_id);
  59. if (!$model) {
  60. $this->error("模型未找到");
  61. }
  62. $setting = $model->setting;
  63. $titles = isset($setting['titlelist']) ? $setting['titlelist'] : [];
  64. $list = collection($list)->toArray();
  65. array_unshift($fieldList, ['name' => 'content', 'title' => __('Content'), 'type' => 'text']);
  66. foreach ($fieldList as $field) {
  67. $item = [
  68. 'id' => $field['name'],
  69. 'state' => false,
  70. 'source_id' => $source_id,
  71. 'source' => '-',
  72. 'name' => $field['name'],
  73. 'title' => $field['title'] . (isset($titles[$field['name']]) && $titles[$field['name']] != $field['title'] ? "({$titles[$field['name']]})" : ''),
  74. 'type' => Config::getTypeList()[$field['type']],
  75. 'issystem' => true,
  76. 'isfilter' => isset($setting['filterfields']) && is_array($setting['filterfields']) && in_array($field['name'], $setting['filterfields']) ? 1 : 0,
  77. 'iscontribute' => isset($setting['contributefields']) && is_array($setting['contributefields']) && in_array($field['name'], $setting['contributefields']) ? 1 : 0,
  78. 'ispublish' => isset($setting['publishfields']) && is_array($setting['publishfields']) && in_array($field['name'], $setting['publishfields']) ? 1 : 0,
  79. 'isorder' => isset($setting['orderfields']) && is_array($setting['orderfields']) && in_array($field['name'], $setting['orderfields']) ? 1 : 0,
  80. 'status' => 'normal',
  81. 'createtime' => 0,
  82. 'updatetime' => 0
  83. ];
  84. $list[] = $item;
  85. }
  86. } elseif (in_array($source, ['channel', 'page', 'special', 'block'])) {
  87. $fieldList = Service::getTableFields("{$prefix}cms_" . $source);
  88. $fields = [];
  89. foreach ($list as $index => $item) {
  90. $item['type'] = Config::getTypeList()[$item['type']];
  91. $fields[] = $item['name'];
  92. }
  93. foreach ($fieldList as $index => $field) {
  94. if (in_array($field['name'], $fields)) {
  95. continue;
  96. }
  97. $item = [
  98. 'id' => $field['name'],
  99. 'state' => false,
  100. 'source_id' => $source_id,
  101. 'source' => '-',
  102. 'name' => $field['name'],
  103. 'title' => $field['title'],
  104. 'type' => Config::getTypeList()[$field['type']],
  105. 'issystem' => true,
  106. 'isfilter' => 0,
  107. 'iscontribute' => 0,
  108. 'ispublish' => 0,
  109. 'isorder' => 0,
  110. 'status' => 'normal',
  111. 'createtime' => 0,
  112. 'updatetime' => 0
  113. ];
  114. $list[] = $item;
  115. }
  116. } elseif ($source == 'diyform') {
  117. $diyform = \app\admin\model\cms\Diyform::get($source_id);
  118. if (!$diyform) {
  119. $this->error("表单未找到");
  120. }
  121. $setting = $diyform->setting;
  122. $titles = isset($setting['titlelist']) ? $setting['titlelist'] : [];
  123. $fieldList = [
  124. ['name' => 'id', 'title' => 'ID', 'type' => '整型'],
  125. ['name' => 'memo', 'title' => __('Memo'), 'type' => '字符串'],
  126. ['name' => 'createtime', 'title' => __('Createtime'), 'type' => '整型'],
  127. ['name' => 'updatetime', 'title' => __('Updatetime'), 'type' => '整形'],
  128. ['name' => 'status', 'title' => __('Status'), 'type' => '枚举'],
  129. ];
  130. foreach ($fieldList as $index => $field) {
  131. $item = [
  132. 'id' => $field['name'],
  133. 'state' => false,
  134. 'source_id' => $source_id,
  135. 'source' => '-',
  136. 'name' => $field['name'],
  137. 'title' => $field['title'] . (isset($titles[$field['name']]) && $titles[$field['name']] != $field['title'] ? "({$titles[$field['name']]})" : ''),
  138. 'type' => Config::getTypeList()[$field['type']],
  139. 'issystem' => true,
  140. 'isfilter' => isset($setting['filterfields']) && is_array($setting['filterfields']) && in_array($field['name'], $setting['filterfields']) ? 1 : 0,
  141. 'iscontribute' => 0,
  142. 'ispublish' => 0,
  143. 'isorder' => isset($setting['orderfields']) && is_array($setting['orderfields']) && in_array($field['name'], $setting['orderfields']) ? 1 : 0,
  144. 'status' => 'normal',
  145. 'createtime' => 0,
  146. 'updatetime' => 0
  147. ];
  148. $list[] = $item;
  149. }
  150. }
  151. $result = array("total" => $total, "rows" => $list);
  152. return json($result);
  153. }
  154. $this->assignconfig('params', "/source/{$source}/source_id/{$source_id}");
  155. $this->assignconfig('source', $source);
  156. $this->view->assign('source', $source);
  157. $this->view->assign('source_id', $source_id);
  158. if (in_array($source, ['model', 'diyform'])) {
  159. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  160. $this->view->assign('model', $model);
  161. $modelList = $source == 'model' ? \app\admin\model\cms\Modelx::all() : \app\admin\model\cms\Diyform::all();
  162. $this->view->assign('modelList', $modelList);
  163. }
  164. return $this->view->fetch();
  165. }
  166. /**
  167. * 添加
  168. */
  169. public function add()
  170. {
  171. $source = $this->request->param('source', '');
  172. $source_id = $this->request->param('source_id', 0);
  173. $this->view->assign('source', $source);
  174. $this->view->assign('source_id', $source_id);
  175. $this->renderTable();
  176. return parent::add();
  177. }
  178. /**
  179. * 编辑
  180. */
  181. public function edit($ids = null)
  182. {
  183. if (is_numeric($ids)) {
  184. $this->renderTable();
  185. return parent::edit($ids);
  186. } else {
  187. $source = $this->request->param('source');
  188. $source_id = $this->request->param('source_id');
  189. $prefix = \think\Config::get('database.prefix');
  190. $fieldList = Service::getTableFields("{$prefix}cms_archives");
  191. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  192. if (!$model) {
  193. $this->error("模型未找到");
  194. }
  195. $setting = $model->setting;
  196. $name = $ids;
  197. $title = '';
  198. foreach ($fieldList as $index => $item) {
  199. if ($item['name'] == $name) {
  200. $title = $item['title'];
  201. break;
  202. }
  203. }
  204. $setting['filterlist'] = isset($setting['filterlist']) ? $setting['filterlist'] : [];
  205. $setting['titlelist'] = isset($setting['titlelist']) ? $setting['titlelist'] : [];
  206. $title = isset($setting['titlelist'][$name]) ? $setting['titlelist'][$name] : $title;
  207. if ($this->request->isPost()) {
  208. $row = $this->request->post("row/a");
  209. foreach (['filter', 'contribute', 'order'] as $index => $item) {
  210. if ($source == 'diyform' && $item == 'contribute') {
  211. continue;
  212. }
  213. $field = $item . 'fields';
  214. $setting[$field] = isset($setting[$field]) ? $setting[$field] : [];
  215. $setting[$field] = array_diff($setting[$field], [$name]);
  216. if (isset($row['is' . $item]) && $row['is' . $item]) {
  217. $setting[$field] = array_merge($setting[$field], [$name]);
  218. }
  219. if ($item == 'filter') {
  220. if (isset($row['is' . $item]) && $row['is' . $item]) {
  221. $setting['filterlist'][$name] = $row['filterlist'];
  222. }
  223. }
  224. }
  225. $setting['titlelist'][$name] = $row['title'];
  226. $model->save(['setting' => $setting]);
  227. $this->success();
  228. }
  229. $row = [
  230. 'source' => $this->request->param('source'),
  231. 'source_id' => $this->request->param('source_id'),
  232. 'name' => $name,
  233. 'title' => $title,
  234. 'isfilter' => isset($setting['filterfields']) && in_array($name, $setting['filterfields']),
  235. 'iscontribute' => isset($setting['contributefields']) && in_array($name, $setting['contributefields']),
  236. 'isorder' => isset($setting['orderfields']) && in_array($name, $setting['orderfields']),
  237. 'filterlist' => isset($setting['filterlist']) && isset($setting['filterlist'][$name]) ? $setting['filterlist'][$name] : '',
  238. ];
  239. $this->view->assign("row", $row);
  240. return $this->view->fetch('cms/fields/archives');
  241. }
  242. }
  243. /**
  244. * 渲染表
  245. */
  246. protected function renderTable()
  247. {
  248. $tableList = [];
  249. $dbname = \think\Config::get('database.database');
  250. $list = \think\Db::query("SELECT `TABLE_NAME`,`TABLE_COMMENT` FROM `information_schema`.`TABLES` where `TABLE_SCHEMA` = '{$dbname}';");
  251. foreach ($list as $key => $row) {
  252. $tableList[$row['TABLE_NAME']] = $row['TABLE_COMMENT'];
  253. }
  254. $this->view->assign("tableList", $tableList);
  255. }
  256. /**
  257. * 批量操作
  258. * @param string $ids
  259. */
  260. public function multi($ids = "")
  261. {
  262. if (!$this->request->isPost()) {
  263. $this->error(__("Invalid parameters"));
  264. }
  265. $params = $this->request->request('params');
  266. parse_str($params, $paramsArr);
  267. if (isset($paramsArr['iscontribute']) && !is_numeric($ids)) {
  268. if (!$ids || !in_array($ids, \app\admin\model\cms\Fields::getContributeFields())) {
  269. $this->error('参数错误');
  270. }
  271. $source_id = $this->request->param('source_id', 0);
  272. $model = \app\admin\model\cms\Modelx::get($source_id);
  273. if (!$model) {
  274. $this->error("模型未找到");
  275. }
  276. $setting = $model['setting'];
  277. $contributefields = isset($setting['contributefields']) ? $setting['contributefields'] : [];
  278. if ($paramsArr['iscontribute']) {
  279. $contributefields[] = $ids;
  280. } else {
  281. $contributefields = array_values(array_diff($contributefields, [$ids]));
  282. }
  283. $setting['contributefields'] = $contributefields;
  284. $model->setting = $setting;
  285. $model->save();
  286. $this->success("");
  287. }
  288. if (isset($paramsArr['ispublish']) && !is_numeric($ids)) {
  289. if (!$ids || !in_array($ids, \app\admin\model\cms\Fields::getPublishFields())) {
  290. $this->error('参数错误');
  291. }
  292. $source_id = $this->request->param('source_id', 0);
  293. $model = \app\admin\model\cms\Modelx::get($source_id);
  294. if (!$model) {
  295. $this->error("模型未找到");
  296. }
  297. $setting = $model['setting'];
  298. $publishfields = isset($setting['publishfields']) ? $setting['publishfields'] : [];
  299. if ($paramsArr['ispublish']) {
  300. $publishfields[] = $ids;
  301. } else {
  302. $publishfields = array_values(array_diff($publishfields, [$ids]));
  303. }
  304. $setting['publishfields'] = $publishfields;
  305. $model->setting = $setting;
  306. $model->save();
  307. $this->success("");
  308. }
  309. if (isset($paramsArr['isorder']) && !is_numeric($ids)) {
  310. if (!$ids) {
  311. $this->error('参数错误');
  312. }
  313. $source = $this->request->param('source', '');
  314. $source_id = $this->request->param('source_id', 0);
  315. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  316. if (!$model) {
  317. $this->error("模型未找到");
  318. }
  319. $setting = $model['setting'];
  320. $orderfields = isset($setting['orderfields']) ? $setting['orderfields'] : [];
  321. if ($paramsArr['isorder']) {
  322. $orderfields[] = $ids;
  323. } else {
  324. $orderfields = array_values(array_diff($orderfields, [$ids]));
  325. }
  326. $setting['orderfields'] = $orderfields;
  327. $model->setting = $setting;
  328. $model->save();
  329. $this->success("");
  330. }
  331. if (isset($paramsArr['isfilter']) && !is_numeric($ids)) {
  332. if (!$ids) {
  333. $this->error('参数错误');
  334. }
  335. $source = $this->request->param('source', '');
  336. $source_id = $this->request->param('source_id', 0);
  337. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  338. if (!$model) {
  339. $this->error("模型未找到");
  340. }
  341. $setting = $model['setting'];
  342. $filterfields = isset($setting['filterfields']) ? $setting['filterfields'] : [];
  343. if ($paramsArr['isfilter']) {
  344. $filterfields[] = $ids;
  345. } else {
  346. $filterfields = array_values(array_diff($filterfields, [$ids]));
  347. }
  348. $setting['filterfields'] = $filterfields;
  349. $model->setting = $setting;
  350. $model->save();
  351. $this->success("");
  352. }
  353. return parent::multi($ids);
  354. }
  355. /**
  356. * 规则列表
  357. * @internal
  358. */
  359. public function rulelist()
  360. {
  361. //主键
  362. $primarykey = $this->request->request("keyField");
  363. //主键值
  364. $keyValue = $this->request->request("keyValue", "");
  365. $keyValueArr = array_filter(explode(',', $keyValue));
  366. $regexList = Config::getRegexList();
  367. $list = [];
  368. foreach ($regexList as $k => $v) {
  369. if ($keyValueArr) {
  370. if (in_array($k, $keyValueArr)) {
  371. $list[] = ['id' => $k, 'name' => $v];
  372. }
  373. } else {
  374. $list[] = ['id' => $k, 'name' => $v];
  375. }
  376. }
  377. return json(['list' => $list]);
  378. }
  379. }