Fields.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  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' => $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. $fields[] = $item['name'];
  91. }
  92. foreach ($fieldList as $index => $field) {
  93. if (in_array($field['name'], $fields)) {
  94. continue;
  95. }
  96. $item = [
  97. 'id' => $field['name'],
  98. 'state' => false,
  99. 'source_id' => $source_id,
  100. 'source' => '-',
  101. 'name' => $field['name'],
  102. 'title' => $field['title'],
  103. 'type' => $field['type'],
  104. 'issystem' => true,
  105. 'isfilter' => 0,
  106. 'iscontribute' => 0,
  107. 'ispublish' => 0,
  108. 'isorder' => 0,
  109. 'status' => 'normal',
  110. 'createtime' => 0,
  111. 'updatetime' => 0
  112. ];
  113. $list[] = $item;
  114. }
  115. } elseif ($source == 'diyform') {
  116. $diyform = \app\admin\model\cms\Diyform::get($source_id);
  117. if (!$diyform) {
  118. $this->error("表单未找到");
  119. }
  120. $setting = $diyform->setting;
  121. $titles = isset($setting['titlelist']) ? $setting['titlelist'] : [];
  122. $fieldList = [
  123. ['name' => 'id', 'title' => 'ID', 'type' => 'int'],
  124. ['name' => 'memo', 'title' => __('Memo'), 'type' => 'string'],
  125. ['name' => 'createtime', 'title' => __('Createtime'), 'type' => 'int'],
  126. ['name' => 'updatetime', 'title' => __('Updatetime'), 'type' => 'int'],
  127. ['name' => 'status', 'title' => __('Status'), 'type' => 'enum'],
  128. ];
  129. foreach ($fieldList as $index => $field) {
  130. $item = [
  131. 'id' => $field['name'],
  132. 'state' => false,
  133. 'source_id' => $source_id,
  134. 'source' => '-',
  135. 'name' => $field['name'],
  136. 'title' => $field['title'] . (isset($titles[$field['name']]) && $titles[$field['name']] != $field['title'] ? "({$titles[$field['name']]})" : ''),
  137. 'type' => $field['type'],
  138. 'issystem' => true,
  139. 'isfilter' => isset($setting['filterfields']) && is_array($setting['filterfields']) && in_array($field['name'], $setting['filterfields']) ? 1 : 0,
  140. 'iscontribute' => 0,
  141. 'ispublish' => 0,
  142. 'isorder' => isset($setting['orderfields']) && is_array($setting['orderfields']) && in_array($field['name'], $setting['orderfields']) ? 1 : 0,
  143. 'status' => 'normal',
  144. 'createtime' => 0,
  145. 'updatetime' => 0
  146. ];
  147. $list[] = $item;
  148. }
  149. }
  150. $result = array("total" => $total, "rows" => $list);
  151. return json($result);
  152. }
  153. $this->assignconfig('params', "/source/{$source}/source_id/{$source_id}");
  154. $this->assignconfig('source', $source);
  155. $this->view->assign('source', $source);
  156. $this->view->assign('source_id', $source_id);
  157. if (in_array($source, ['model', 'diyform'])) {
  158. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  159. $this->view->assign('model', $model);
  160. $modelList = $source == 'model' ? \app\admin\model\cms\Modelx::all() : \app\admin\model\cms\Diyform::all();
  161. $this->view->assign('modelList', $modelList);
  162. }
  163. return $this->view->fetch();
  164. }
  165. /**
  166. * 添加
  167. */
  168. public function add()
  169. {
  170. $source = $this->request->param('source', '');
  171. $source_id = $this->request->param('source_id', 0);
  172. $this->view->assign('source', $source);
  173. $this->view->assign('source_id', $source_id);
  174. $this->renderTable();
  175. return parent::add();
  176. }
  177. /**
  178. * 编辑
  179. */
  180. public function edit($ids = null)
  181. {
  182. if (is_numeric($ids)) {
  183. $this->renderTable();
  184. return parent::edit($ids);
  185. } else {
  186. $source = $this->request->param('source');
  187. $source_id = $this->request->param('source_id');
  188. $prefix = \think\Config::get('database.prefix');
  189. $fieldList = Service::getTableFields("{$prefix}cms_archives");
  190. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  191. if (!$model) {
  192. $this->error("模型未找到");
  193. }
  194. $setting = $model->setting;
  195. $name = $ids;
  196. $title = '';
  197. foreach ($fieldList as $index => $item) {
  198. if ($item['name'] == $name) {
  199. $title = $item['title'];
  200. break;
  201. }
  202. }
  203. $setting['filterlist'] = isset($setting['filterlist']) ? $setting['filterlist'] : [];
  204. $setting['titlelist'] = isset($setting['titlelist']) ? $setting['titlelist'] : [];
  205. $title = isset($setting['titlelist'][$name]) ? $setting['titlelist'][$name] : $title;
  206. if ($this->request->isPost()) {
  207. $row = $this->request->post("row/a");
  208. foreach (['filter', 'contribute', 'order'] as $index => $item) {
  209. if ($source == 'diyform' && $item == 'contribute') {
  210. continue;
  211. }
  212. $field = $item . 'fields';
  213. $setting[$field] = isset($setting[$field]) ? $setting[$field] : [];
  214. $setting[$field] = array_diff($setting[$field], [$name]);
  215. if (isset($row['is' . $item]) && $row['is' . $item]) {
  216. $setting[$field] = array_merge($setting[$field], [$name]);
  217. }
  218. if ($item == 'filter') {
  219. if (isset($row['is' . $item]) && $row['is' . $item]) {
  220. $setting['filterlist'][$name] = $row['filterlist'];
  221. }
  222. }
  223. }
  224. $setting['titlelist'][$name] = $row['title'];
  225. $model->save(['setting' => $setting]);
  226. $this->success();
  227. }
  228. $row = [
  229. 'source' => $this->request->param('source'),
  230. 'source_id' => $this->request->param('source_id'),
  231. 'name' => $name,
  232. 'title' => $title,
  233. 'isfilter' => isset($setting['filterfields']) && in_array($name, $setting['filterfields']),
  234. 'iscontribute' => isset($setting['contributefields']) && in_array($name, $setting['contributefields']),
  235. 'isorder' => isset($setting['orderfields']) && in_array($name, $setting['orderfields']),
  236. 'filterlist' => isset($setting['filterlist']) && isset($setting['filterlist'][$name]) ? $setting['filterlist'][$name] : '',
  237. ];
  238. $this->view->assign("row", $row);
  239. return $this->view->fetch('cms/fields/archives');
  240. }
  241. }
  242. /**
  243. * 渲染表
  244. */
  245. protected function renderTable()
  246. {
  247. $tableList = [];
  248. $dbname = \think\Config::get('database.database');
  249. $list = \think\Db::query("SELECT `TABLE_NAME`,`TABLE_COMMENT` FROM `information_schema`.`TABLES` where `TABLE_SCHEMA` = '{$dbname}';");
  250. foreach ($list as $key => $row) {
  251. $tableList[$row['TABLE_NAME']] = $row['TABLE_COMMENT'];
  252. }
  253. $this->view->assign("tableList", $tableList);
  254. }
  255. /**
  256. * 批量操作
  257. * @param string $ids
  258. */
  259. public function multi($ids = "")
  260. {
  261. if (!$this->request->isPost()) {
  262. $this->error(__("Invalid parameters"));
  263. }
  264. $params = $this->request->request('params');
  265. parse_str($params, $paramsArr);
  266. if (isset($paramsArr['iscontribute']) && !is_numeric($ids)) {
  267. if (!$ids || !in_array($ids, \app\admin\model\cms\Fields::getContributeFields())) {
  268. $this->error('参数错误');
  269. }
  270. $source_id = $this->request->param('source_id', 0);
  271. $model = \app\admin\model\cms\Modelx::get($source_id);
  272. if (!$model) {
  273. $this->error("模型未找到");
  274. }
  275. $setting = $model['setting'];
  276. $contributefields = isset($setting['contributefields']) ? $setting['contributefields'] : [];
  277. if ($paramsArr['iscontribute']) {
  278. $contributefields[] = $ids;
  279. } else {
  280. $contributefields = array_values(array_diff($contributefields, [$ids]));
  281. }
  282. $setting['contributefields'] = $contributefields;
  283. $model->setting = $setting;
  284. $model->save();
  285. $this->success("");
  286. }
  287. if (isset($paramsArr['ispublish']) && !is_numeric($ids)) {
  288. if (!$ids || !in_array($ids, \app\admin\model\cms\Fields::getPublishFields())) {
  289. $this->error('参数错误');
  290. }
  291. $source_id = $this->request->param('source_id', 0);
  292. $model = \app\admin\model\cms\Modelx::get($source_id);
  293. if (!$model) {
  294. $this->error("模型未找到");
  295. }
  296. $setting = $model['setting'];
  297. $publishfields = isset($setting['publishfields']) ? $setting['publishfields'] : [];
  298. if ($paramsArr['ispublish']) {
  299. $publishfields[] = $ids;
  300. } else {
  301. $publishfields = array_values(array_diff($publishfields, [$ids]));
  302. }
  303. $setting['publishfields'] = $publishfields;
  304. $model->setting = $setting;
  305. $model->save();
  306. $this->success("");
  307. }
  308. if (isset($paramsArr['isorder']) && !is_numeric($ids)) {
  309. if (!$ids) {
  310. $this->error('参数错误');
  311. }
  312. $source = $this->request->param('source', '');
  313. $source_id = $this->request->param('source_id', 0);
  314. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  315. if (!$model) {
  316. $this->error("模型未找到");
  317. }
  318. $setting = $model['setting'];
  319. $orderfields = isset($setting['orderfields']) ? $setting['orderfields'] : [];
  320. if ($paramsArr['isorder']) {
  321. $orderfields[] = $ids;
  322. } else {
  323. $orderfields = array_values(array_diff($orderfields, [$ids]));
  324. }
  325. $setting['orderfields'] = $orderfields;
  326. $model->setting = $setting;
  327. $model->save();
  328. $this->success("");
  329. }
  330. if (isset($paramsArr['isfilter']) && !is_numeric($ids)) {
  331. if (!$ids) {
  332. $this->error('参数错误');
  333. }
  334. $source = $this->request->param('source', '');
  335. $source_id = $this->request->param('source_id', 0);
  336. $model = $source == 'model' ? \app\admin\model\cms\Modelx::get($source_id) : \app\admin\model\cms\Diyform::get($source_id);
  337. if (!$model) {
  338. $this->error("模型未找到");
  339. }
  340. $setting = $model['setting'];
  341. $filterfields = isset($setting['filterfields']) ? $setting['filterfields'] : [];
  342. if ($paramsArr['isfilter']) {
  343. $filterfields[] = $ids;
  344. } else {
  345. $filterfields = array_values(array_diff($filterfields, [$ids]));
  346. }
  347. $setting['filterfields'] = $filterfields;
  348. $model->setting = $setting;
  349. $model->save();
  350. $this->success("");
  351. }
  352. return parent::multi($ids);
  353. }
  354. /**
  355. * 规则列表
  356. * @internal
  357. */
  358. public function rulelist()
  359. {
  360. //主键
  361. $primarykey = $this->request->request("keyField");
  362. //主键值
  363. $keyValue = $this->request->request("keyValue", "");
  364. $keyValueArr = array_filter(explode(',', $keyValue));
  365. $regexList = Config::getRegexList();
  366. $list = [];
  367. foreach ($regexList as $k => $v) {
  368. if ($keyValueArr) {
  369. if (in_array($k, $keyValueArr)) {
  370. $list[] = ['id' => $k, 'name' => $v];
  371. }
  372. } else {
  373. $list[] = ['id' => $k, 'name' => $v];
  374. }
  375. }
  376. return json(['list' => $list]);
  377. }
  378. }