Model.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 海豚PHP框架 [ DolphinPHP ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2016~2017 河源市卓锐科技有限公司 [ http://www.zrthink.com ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://dolphinphp.com
  8. // +----------------------------------------------------------------------
  9. // | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
  10. // +----------------------------------------------------------------------
  11. namespace app\cms\admin;
  12. use app\admin\controller\Admin;
  13. use app\common\builder\ZBuilder;
  14. use app\cms\model\Model as DocumentModel;
  15. use app\admin\model\Menu as MenuModel;
  16. use think\Db;
  17. use think\Cache;
  18. /**
  19. * 内容模型控制器
  20. * @package app\cms\admin
  21. */
  22. class Model extends Admin
  23. {
  24. /**
  25. * 内容模型列表
  26. * @author 蔡伟明 <314013107@qq.com>
  27. */
  28. public function index()
  29. {
  30. // 查询
  31. $map = $this->getMap();
  32. // 数据列表
  33. $data_list = DocumentModel::where($map)->order('sort,id desc')->paginate();
  34. // 字段管理按钮
  35. $btnField = [
  36. 'title' => '字段管理',
  37. 'icon' => 'fa fa-fw fa-navicon',
  38. 'href' => url('field/index', ['id' => '__id__'])
  39. ];
  40. // 使用ZBuilder快速创建数据表格
  41. return ZBuilder::make('table')
  42. ->setSearch(['name' => '标识', 'title' => '标题']) // 设置搜索框
  43. ->addColumns([ // 批量添加数据列
  44. ['id', 'ID'],
  45. ['icon', '图标', 'icon'],
  46. ['title', '标题'],
  47. ['name', '标识'],
  48. ['table', '附加表'],
  49. ['type', '模型', 'text', '', ['系统', '普通', '独立']],
  50. ['create_time', '创建时间', 'datetime'],
  51. ['sort', '排序', 'text.edit'],
  52. ['status', '状态', 'switch'],
  53. ['right_button', '操作', 'btn']
  54. ])
  55. ->addFilter('type', ['系统', '普通', '独立'])
  56. ->addTopButtons('add,enable,disable') // 批量添加顶部按钮
  57. ->addRightButtons(['edit', 'custom' => $btnField, 'delete' => ['data-tips' => '删除模型将同时删除该模型下的所有字段,且无法恢复。']]) // 批量添加右侧按钮
  58. ->setRowList($data_list) // 设置表格数据
  59. ->fetch(); // 渲染模板
  60. }
  61. /**
  62. * 新增内容模型
  63. * @author 蔡伟明 <314013107@qq.com>
  64. * @return mixed
  65. */
  66. public function add()
  67. {
  68. // 保存数据
  69. if ($this->request->isPost()) {
  70. $data = $this->request->post();
  71. if ($data['table'] == '') {
  72. $data['table'] = config('database.prefix') . 'cms_document_' . $data['name'];
  73. } else {
  74. $data['table'] = str_replace('#@__', config('database.prefix'), $data['table']);
  75. }
  76. // 验证
  77. $result = $this->validate($data, 'Model');
  78. if(true !== $result) $this->error($result);
  79. // 严格验证附加表是否存在
  80. if (table_exist($data['table'])) {
  81. $this->error('附加表已存在');
  82. }
  83. if ($model = DocumentModel::create($data)) {
  84. // 创建附加表
  85. if (false === DocumentModel::createTable($model)) {
  86. $this->error('创建附加表失败');
  87. }
  88. // 创建菜单节点
  89. $map = [
  90. 'module' => 'cms',
  91. 'title' => '内容管理'
  92. ];
  93. $menu_data = [
  94. "module" => "cms",
  95. "pid" => Db::name('admin_menu')->where($map)->value('id'),
  96. "title" => $data['title'],
  97. "url_type" => "module_admin",
  98. "url_value" => "cms/content/{$data['name']}",
  99. "url_target" => "_self",
  100. "icon" => "fa fa-fw fa-list",
  101. "online_hide" => "0",
  102. "sort" => "100",
  103. ];
  104. MenuModel::create($menu_data);
  105. // 记录行为
  106. action_log('model_add', 'cms_model', $model['id'], UID, $data['title']);
  107. Cache::clear();
  108. $this->success('新增成功', 'index');
  109. } else {
  110. $this->error('新增失败');
  111. }
  112. }
  113. $type_tips = '此选项添加后不可更改。如果为 <code>系统模型</code> 将禁止删除,对于 <code>独立模型</code>,将强制创建字段id,cid,uid,model,title,create_time,update_time,sort,status,trash,view';
  114. // 显示添加页面
  115. return ZBuilder::make('form')
  116. ->addFormItems([
  117. ['text', 'name', '模型标识', '由小写字母、数字或下划线组成,不能以数字开头'],
  118. ['text', 'title', '模型标题', '可填写中文'],
  119. ['text', 'table', '附加表', '创建后不可更改。由小写字母、数字或下划线组成,如果不填写默认为 <code>'. config('database.prefix') . 'cms_document_模型标识</code>,如果需要自定义,请务必填写系统表前缀,<code>#@__</code>表示当前系统表前缀'],
  120. ['radio', 'type', '模型类别', $type_tips, ['系统模型', '普通模型', '独立模型(不使用主表)'], 1],
  121. ['icon', 'icon', '图标'],
  122. ['radio', 'status', '立即启用', '', ['否', '是'], 1],
  123. ['text', 'sort', '排序', '', 100],
  124. ])
  125. ->fetch();
  126. }
  127. /**
  128. * 编辑内容模型
  129. * @param null $id 模型id
  130. * @author 蔡伟明 <314013107@qq.com>
  131. * @return mixed
  132. */
  133. public function edit($id = null) {
  134. if ($id === null) $this->error('参数错误');
  135. // 保存数据
  136. if ($this->request->isPost()) {
  137. $data = $this->request->post();
  138. // 验证
  139. $result = $this->validate($data, 'Model.edit');
  140. if(true !== $result) $this->error($result);
  141. if (DocumentModel::update($data)) {
  142. cache('cms_model_list', null);
  143. cache('cms_model_title_list', null);
  144. // 记录行为
  145. action_log('model_edit', 'cms_model', $id, UID, "ID({$id}),标题({$data['title']})");
  146. $this->success('编辑成功', 'index');
  147. } else {
  148. $this->error('编辑失败');
  149. }
  150. }
  151. $list_model_type = ['系统模型', '普通模型', '独立模型(不使用主表)'];
  152. // 模型信息
  153. $info = DocumentModel::get($id);
  154. $info['type'] = $list_model_type[$info['type']];
  155. // 显示编辑页面
  156. return ZBuilder::make('form')
  157. ->addFormItems([
  158. ['hidden', 'id'],
  159. ['hidden', 'name'],
  160. ['static', 'name', '模型标识'],
  161. ['static', 'type', '模型类别'],
  162. ['static', 'table', '附加表'],
  163. ['text', 'title', '模型标题', '可填写中文'],
  164. ['icon', 'icon', '图标'],
  165. ['radio', 'status', '立即启用', '', ['否', '是']],
  166. ['text', 'sort', '排序'],
  167. ])
  168. ->setFormData($info)
  169. ->fetch();
  170. }
  171. /**
  172. * 删除内容模型
  173. * @param null $ids 内容模型id
  174. * @author 蔡伟明 <314013107@qq.com>
  175. * @return mixed|void
  176. */
  177. public function delete($ids = null)
  178. {
  179. if ($ids === null) $this->error('参数错误');
  180. $model = DocumentModel::where('id', $ids)->find();
  181. if ($model['type'] == 0) {
  182. $this->error('禁止删除系统模型');
  183. }
  184. // 删除表和字段信息
  185. if (DocumentModel::deleteTable($ids)) {
  186. // 删除主表中的文档
  187. if (false === Db::name('cms_document')->where('model', $ids)->delete()) {
  188. $this->error('删除主表文档失败');
  189. }
  190. // 删除菜单节点
  191. $map = [
  192. 'module' => 'cms',
  193. 'url_value' => "cms/content/{$model['name']}"
  194. ];
  195. if (false === Db::name('admin_menu')->where($map)->delete()) {
  196. $this->error('删除菜单节点失败');
  197. }
  198. // 删除字段数据
  199. if (false !== Db::name('cms_field')->where('model', $ids)->delete()) {
  200. cache('cms_model_list', null);
  201. cache('cms_model_title_list', null);
  202. return parent::delete();
  203. } else {
  204. return $this->error('删除内容模型字段失败');
  205. }
  206. } else {
  207. return $this->error('删除内容模型表失败');
  208. }
  209. }
  210. }