Fields.php 15 KB

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