Menu.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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\Menu as MenuModel;
  15. use app\cms\model\Column as ColumnModel;
  16. use app\cms\model\Page as PageModel;
  17. use util\Tree;
  18. use think\Db;
  19. /**
  20. * 菜单控制器
  21. * @package app\cms\admin
  22. */
  23. class Menu extends Admin
  24. {
  25. /**
  26. * 菜单列表
  27. * @param null $id 导航id
  28. * @author 蔡伟明 <314013107@qq.com>
  29. * @return mixed
  30. */
  31. public function index($id = null)
  32. {
  33. if ($id === null) $this->error('缺少参数');
  34. // 查询
  35. $map = $this->getMap();
  36. // 数据列表
  37. $data_list = Db::view('cms_menu', true)
  38. ->view('cms_column', ['name' => 'column_name'], 'cms_menu.column=cms_column.id', 'left')
  39. ->view('cms_page', ['title' => 'page_title'], 'cms_menu.page=cms_page.id', 'left')
  40. ->where('cms_menu.nid', $id)
  41. ->order('cms_menu.sort,cms_menu.pid,cms_menu.id')
  42. ->select();
  43. foreach ($data_list as &$item) {
  44. if ($item['type'] == 0) {
  45. $item['title'] = $item['column_name'];
  46. } elseif ($item['type'] == 1) {
  47. $item['title'] = $item['page_title'];
  48. }
  49. }
  50. if (empty($map)) {
  51. $data_list = Tree::toList($data_list);
  52. }
  53. $btnAdd = ['icon' => 'fa fa-plus', 'title' => '新增子菜单', 'href' => url('add', ['nid' => $id, 'pid' => '__id__'])];
  54. // 使用ZBuilder快速创建数据表格
  55. return ZBuilder::make('table')
  56. ->setSearch(['cms_menu.title|cms_column.name|cms_page.title' => '标题'])// 设置搜索框
  57. ->addColumns([ // 批量添加数据列
  58. ['id', 'ID'],
  59. ['title', '标题', 'callback', function($value, $data){
  60. return isset($data['title_prefix']) ? $data['title_display'] : $value;
  61. }, '__data__'],
  62. ['type', '类型', 'text', '', ['栏目链接', '单页链接', '自定义链接']],
  63. ['target', '打开方式', 'select', ['_self' => '当前窗口', '_blank' => '新窗口']],
  64. ['create_time', '创建时间', 'datetime'],
  65. ['update_time', '更新时间', 'datetime'],
  66. ['sort', '排序', 'text.edit'],
  67. ['status', '状态', 'switch'],
  68. ['right_button', '操作', 'btn']
  69. ])
  70. ->addTopButton('back', ['href' => url('nav/index')])
  71. ->addTopButton('add', ['href' => url('add', ['nid' => $id])])
  72. ->addTopButtons('enable,disable')// 批量添加顶部按钮
  73. ->addRightButton('custom', $btnAdd)
  74. ->addRightButton('edit')
  75. ->addRightButton('delete', ['data-tips' => '删除后无法恢复。'])// 批量添加右侧按钮
  76. ->setRowList($data_list)// 设置表格数据
  77. ->addValidate('Nav', 'title')
  78. ->fetch(); // 渲染模板
  79. }
  80. /**
  81. * 新增
  82. * @param null $nid 导航id
  83. * @param int $pid 菜单父级id
  84. * @author 蔡伟明 <314013107@qq.com>
  85. * @return mixed
  86. */
  87. public function add($nid = null, $pid = 0)
  88. {
  89. if ($nid === null) $this->error('缺少参数');
  90. // 保存数据
  91. if ($this->request->isPost()) {
  92. // 表单数据
  93. $data = $this->request->post();
  94. // 验证
  95. $result = $this->validate($data, 'Menu');
  96. if(true !== $result) $this->error($result);
  97. if ($menu = MenuModel::create($data)) {
  98. // 记录行为
  99. action_log('menu_add', 'cms_menu', $menu['id'], UID, $data['title']);
  100. $this->success('新增成功', url('index', ['id' => $nid]));
  101. } else {
  102. $this->error('新增失败');
  103. }
  104. }
  105. // 显示添加页面
  106. return ZBuilder::make('form')
  107. ->addFormItems([
  108. ['hidden', 'nid', $nid],
  109. ['hidden', 'pid', $pid],
  110. ['radio', 'type', '类型', '', ['栏目链接', '单页链接', '自定义链接'], 0],
  111. ['select', 'column', '栏目', '<code>必选</code>', ColumnModel::getTreeList(0, false)],
  112. ['select', 'page', '单页', '<code>必选</code>', PageModel::getTitleList()],
  113. ['text', 'title', '菜单标题', '<code>必填</code>,只用于区分'],
  114. ['text', 'url', 'URL', "<code>必填</code>。如果是模块链接,请填写<code>模块/控制器/操作</code>,如:<code>admin/menu/add</code>。如果是普通链接,则直接填写url地址,如:<code>http://www.dolphinphp.com</code>"],
  115. ['text', 'css', 'CSS类', '可选'],
  116. ['text', 'rel', '链接关系网(XFN)', '可选,即链接的rel值'],
  117. ['radio', 'target', '打开方式', '', ['_self' => '当前窗口', '_blank' => '新窗口'], '_self'],
  118. ['text', 'sort', '排序', '', 100],
  119. ['radio', 'status', '立即启用', '', ['否', '是'], 1]
  120. ])
  121. ->setTrigger('type', '0', 'column')
  122. ->setTrigger('type', '1', 'page')
  123. ->setTrigger('type', '2', 'title,url')
  124. ->fetch();
  125. }
  126. /**
  127. * 编辑
  128. * @param null $id 菜单id
  129. * @author 蔡伟明 <314013107@qq.com>
  130. * @return mixed
  131. */
  132. public function edit($id = null)
  133. {
  134. if ($id === null) $this->error('缺少参数');
  135. // 保存数据
  136. if ($this->request->isPost()) {
  137. // 表单数据
  138. $data = $this->request->post();
  139. // 验证
  140. $result = $this->validate($data, 'Menu');
  141. if(true !== $result) $this->error($result);
  142. if (MenuModel::update($data)) {
  143. // 记录行为
  144. action_log('menu_edit', 'cms_menu', $id, UID, $data['title']);
  145. $this->success('编辑成功', url('index', ['id' => $data['nid']]));
  146. } else {
  147. $this->error('编辑失败');
  148. }
  149. }
  150. // 显示添加页面
  151. return ZBuilder::make('form')
  152. ->addFormItems([
  153. ['hidden', 'id'],
  154. ['hidden', 'nid'],
  155. ['radio', 'type', '类型', '', ['栏目链接', '单页链接', '自定义链接']],
  156. ['select', 'column', '栏目', '<code>必选</code>', ColumnModel::getTreeList(0, false)],
  157. ['select', 'page', '单页', '<code>必选</code>', PageModel::getTitleList()],
  158. ['text', 'title', '菜单标题', '<code>必填</code>,只用于区分'],
  159. ['text', 'url', 'URL', "<code>必填</code>。如果是模块链接,请填写<code>模块/控制器/操作</code>,如:<code>admin/menu/add</code>。如果是普通链接,则直接填写url地址,如:<code>http://www.dolphinphp.com</code>"],
  160. ['text', 'css', 'CSS类', '可选'],
  161. ['text', 'rel', '链接关系网(XFN)', '可选,即链接的rel值'],
  162. ['radio', 'target', '打开方式', '', ['_self' => '当前窗口', '_blank' => '新窗口'], '_self'],
  163. ['text', 'sort', '排序', '', 100],
  164. ['radio', 'status', '立即启用', '', ['否', '是'], 1]
  165. ])
  166. ->setFormData(MenuModel::get($id))
  167. ->setTrigger('type', '0', 'column')
  168. ->setTrigger('type', '1', 'page')
  169. ->setTrigger('type', '2', 'title,url')
  170. ->fetch();
  171. }
  172. /**
  173. * 删除菜单
  174. * @param null $ids 菜单id
  175. * @author 蔡伟明 <314013107@qq.com>
  176. * @return mixed
  177. */
  178. public function delete($ids = null)
  179. {
  180. // 检查是否有子菜单
  181. if (MenuModel::where('pid', $ids)->find()) {
  182. $this->error('请先删除或移动该菜单下的子菜单');
  183. }
  184. return $this->setStatus('delete');
  185. }
  186. /**
  187. * 启用菜单
  188. * @param array $record 行为日志
  189. * @author 蔡伟明 <314013107@qq.com>
  190. * @return mixed
  191. */
  192. public function enable($record = [])
  193. {
  194. return $this->setStatus('enable');
  195. }
  196. /**
  197. * 禁用菜单
  198. * @param array $record 行为日志
  199. * @author 蔡伟明 <314013107@qq.com>
  200. * @return mixed
  201. */
  202. public function disable($record = [])
  203. {
  204. return $this->setStatus('disable');
  205. }
  206. /**
  207. * 设置菜单状态:删除、禁用、启用
  208. * @param string $type 类型:delete/enable/disable
  209. * @param array $record
  210. * @author 蔡伟明 <314013107@qq.com>
  211. * @return mixed
  212. */
  213. public function setStatus($type = '', $record = [])
  214. {
  215. $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
  216. $menu_title = MenuModel::where('id', 'in', $ids)->column('title');
  217. return parent::setStatus($type, ['menu_'.$type, 'cms_menu', 0, UID, implode('、', $menu_title)]);
  218. }
  219. /**
  220. * 快速编辑
  221. * @param array $record 行为日志
  222. * @author 蔡伟明 <314013107@qq.com>
  223. * @return mixed
  224. */
  225. public function quickEdit($record = [])
  226. {
  227. $id = input('post.pk', '');
  228. $field = input('post.name', '');
  229. $value = input('post.value', '');
  230. $menu = MenuModel::where('id', $id)->value($field);
  231. $details = '字段(' . $field . '),原值(' . $menu . '),新值:(' . $value . ')';
  232. return parent::quickEdit(['menu_edit', 'cms_menu', $id, UID, $details]);
  233. }
  234. }