NavMenuController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. // +—————————————————————————————————————————————————————————————————————
  3. // | Created by Yunbao
  4. // +—————————————————————————————————————————————————————————————————————
  5. // | Copyright (c) 2013~2022 http://www.yunbaokj.com All rights reserved.
  6. // +—————————————————————————————————————————————————————————————————————
  7. // | Author: https://gitee.com/yunbaokeji
  8. // +—————————————————————————————————————————————————————————————————————
  9. // | Date: 2022-02-17
  10. // +—————————————————————————————————————————————————————————————————————
  11. namespace app\admin\controller;
  12. use app\admin\model\NavMenuModel;
  13. use cmf\controller\AdminBaseController;
  14. use tree\Tree;
  15. /**
  16. * Class NavMenuController 前台菜单管理控制器
  17. * @package app\admin\controller
  18. */
  19. class NavMenuController extends AdminBaseController
  20. {
  21. /**
  22. * 导航菜单
  23. * @adminMenu(
  24. * 'name' => '导航菜单',
  25. * 'parent' => 'admin/Nav/index',
  26. * 'display'=> false,
  27. * 'hasView'=> true,
  28. * 'order' => 10000,
  29. * 'icon' => '',
  30. * 'remark' => '导航菜单',
  31. * 'param' => ''
  32. * )
  33. */
  34. public function index()
  35. {
  36. $intNavId = $this->request->param("nav_id", 0, 'intval');
  37. $navMenuModel = new NavMenuModel();
  38. if (empty($intNavId)) {
  39. $this->error("请指定导航!");
  40. }
  41. $objResult = $navMenuModel->where("nav_id", $intNavId)->order(["list_order" => "ASC"])->select();
  42. $arrResult = $objResult ? $objResult->toArray() : [];
  43. $tree = new Tree();
  44. $tree->icon = ['&nbsp;&nbsp;&nbsp;│ ', '&nbsp;&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;&nbsp;└─ '];
  45. $tree->nbsp = '&nbsp;&nbsp;&nbsp;';
  46. $array = [];
  47. foreach ($arrResult as $r) {
  48. $r['str_manage'] = '<a class="btn btn-xs btn-primary" href="' . url("NavMenu/add", ["parent_id" => $r['id'], "nav_id" => $r['nav_id']]) . '">添加子菜单</a>
  49. <a class="btn btn-xs btn-primary" href="' . url("NavMenu/edit", ["id" => $r['id'], "parent_id" => $r['parent_id'], "nav_id" => $r['nav_id']]) . '">编辑</a>
  50. <a class="btn btn-xs btn-danger js-ajax-delete" href="' . url("NavMenu/delete", ["id" => $r['id'], 'nav_id' => $r['nav_id']]) . '">删除</a> ';
  51. $r['status'] = $r['status'] ? "显示" : "隐藏";
  52. $array[] = $r;
  53. }
  54. $tree->init($array);
  55. $str = "<tr>
  56. <td><input name='list_orders[\$id]' type='text' size='3' value='\$list_order' class='input input-order'></td>
  57. <td>\$id</td>
  58. <td >\$spacer\$name</td>
  59. <td>\$status</td>
  60. <td>\$str_manage</td>
  61. </tr>";
  62. $categories = $tree->getTree(0, $str);
  63. $this->assign("categories", $categories);
  64. $this->assign('nav_id', $intNavId);
  65. return $this->fetch();
  66. }
  67. /**
  68. * 添加导航菜单
  69. * @adminMenu(
  70. * 'name' => '添加导航菜单',
  71. * 'parent' => 'index',
  72. * 'display'=> false,
  73. * 'order' => 10000,
  74. * 'hasView'=> true,
  75. * 'icon' => '',
  76. * 'remark' => '添加导航菜单',
  77. * 'param' => ''
  78. * )
  79. */
  80. public function add()
  81. {
  82. $navMenuModel = new NavMenuModel();
  83. $intNavId = $this->request->param("nav_id", 0, 'intval');
  84. $intParentId = $this->request->param("parent_id", 0, 'intval');
  85. $objResult = $navMenuModel->where("nav_id", $intNavId)->order(["list_order" => "ASC"])->select();
  86. $arrResult = $objResult ? $objResult->toArray() : [];
  87. $tree = new Tree();
  88. $tree->icon = ['&nbsp;│ ', '&nbsp;├─ ', '&nbsp;└─ '];
  89. $tree->nbsp = '&nbsp;';
  90. $array = [];
  91. foreach ($arrResult as $r) {
  92. $r['str_manage'] = '<a href="' . url("NavMenu/add", ["parent_id" => $r['id']]) . '">添加子菜单</a> | <a href="'
  93. . url("NavMenu/edit", ["id" => $r['id']]) . '">编辑</a> | <a class="J_ajax_del" href="'
  94. . url("NavMenu/delete", ["id" => $r['id']]) . '">删除</a> ';
  95. $r['status'] = $r['status'] ? "显示" : "隐藏";
  96. $r['selected'] = $r['id'] == $intParentId ? "selected" : "";
  97. $array[] = $r;
  98. }
  99. $tree->init($array);
  100. $str = "<option value='\$id' \$selected>\$spacer\$name</option>";
  101. $navTrees = $tree->getTree(0, $str);
  102. $this->assign("nav_trees", $navTrees);
  103. $navs = $navMenuModel->selectNavs();
  104. $this->assign('navs', $navs);
  105. $this->assign("nav_id", $intNavId);
  106. return $this->fetch();
  107. }
  108. /**
  109. * 添加导航菜单提交保存
  110. * @adminMenu(
  111. * 'name' => '添加导航菜单提交保存',
  112. * 'parent' => 'index',
  113. * 'display'=> false,
  114. * 'hasView'=> false,
  115. * 'order' => 10000,
  116. * 'icon' => '',
  117. * 'remark' => '添加导航菜单提交保存',
  118. * 'param' => ''
  119. * )
  120. */
  121. public function addPost()
  122. {
  123. $navMenuModel = new NavMenuModel();
  124. $arrData = $this->request->post();
  125. if (isset($arrData['external_href'])) {
  126. $arrData['href'] = htmlspecialchars_decode($arrData['external_href']);
  127. } else {
  128. $arrData['href'] = htmlspecialchars_decode($arrData['href']);
  129. $arrData['href'] = base64_decode($arrData['href']);
  130. }
  131. $navMenuModel->allowField(true)->isUpdate(false)->save($arrData);
  132. $this->success(lang("EDIT_SUCCESS"), url("NavMenu/index", ['nav_id' => $arrData['nav_id']]));
  133. }
  134. /**
  135. * 编辑导航菜单
  136. * @adminMenu(
  137. * 'name' => '编辑导航菜单',
  138. * 'parent' => 'index',
  139. * 'display'=> false,
  140. * 'hasView'=> true,
  141. * 'order' => 10000,
  142. * 'icon' => '',
  143. * 'remark' => '编辑导航菜单',
  144. * 'param' => ''
  145. * )
  146. */
  147. public function edit()
  148. {
  149. $navMenuModel = new NavMenuModel();
  150. $intNavId = $this->request->param("nav_id", 0, 'intval');
  151. $intId = $this->request->param("id", 0, 'intval');
  152. $intParentId = $this->request->param("parent_id", 0, 'intval');
  153. $objResult = $navMenuModel
  154. ->where("nav_id", $intNavId)
  155. ->where("id", "neq", $intId)
  156. ->order(["list_order" => "ASC"])
  157. ->select();
  158. $arrResult = $objResult ? $objResult->toArray() : [];
  159. $tree = new Tree();
  160. $tree->icon = ['&nbsp;│ ', '&nbsp;├─ ', '&nbsp;└─ '];
  161. $tree->nbsp = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  162. $array = [];
  163. foreach ($arrResult as $r) {
  164. $r['str_manage'] = '<a href="' . url("NavMenu/add", ["parent_id" => $r['id'], "nav_id" => $intNavId]) . '">添加子菜单</a> | <a href="'
  165. . url("NavMenu/edit", ["id" => $r['id'], "nav_id" => $intNavId]) . '">编辑</a> | <a class="js-ajax-delete" href="'
  166. . url("NavMenu/delete", ["id" => $r['id'], "nav_id" => $intNavId]) . '">删除</a> ';
  167. $r['status'] = $r['status'] ? "显示" : "隐藏";
  168. $r['selected'] = $r['id'] == $intParentId ? "selected" : "";
  169. $array[] = $r;
  170. }
  171. $tree->init($array);
  172. $str = "<option value='\$id' \$selected>\$spacer\$name</option>";
  173. $nav_trees = $tree->getTree(0, $str);
  174. $this->assign("nav_trees", $nav_trees);
  175. $objNav = $navMenuModel->where("id", $intId)->find();
  176. $arrNav = $objNav ? $objNav->toArray() : [];
  177. $arrNav['href_old'] = $arrNav['href'];
  178. if (strpos($arrNav['href'], "{") === 0 || $arrNav['href'] == 'home') {
  179. $arrNav['href'] = base64_encode($arrNav['href']);
  180. }
  181. $this->assign($arrNav);
  182. $navs = $navMenuModel->selectNavs();
  183. $this->assign('navs', $navs);
  184. $this->assign("nav_id", $intNavId);
  185. $this->assign("parent_id", $intParentId);
  186. return $this->fetch();
  187. }
  188. /**
  189. * 编辑导航菜单提交保存
  190. * @adminMenu(
  191. * 'name' => '编辑导航菜单提交保存',
  192. * 'parent' => 'index',
  193. * 'display'=> false,
  194. * 'hasView'=> false,
  195. * 'order' => 10000,
  196. * 'icon' => '',
  197. * 'remark' => '编辑导航菜单提交保存',
  198. * 'param' => ''
  199. * )
  200. */
  201. public function editPost()
  202. {
  203. $navMenuModel = new NavMenuModel();
  204. $intId = $this->request->param('id', 0, 'intval');
  205. $arrData = $this->request->post();
  206. if (isset($arrData['external_href'])) {
  207. $arrData['href'] = htmlspecialchars_decode($arrData['external_href']);
  208. } else {
  209. $arrData['href'] = htmlspecialchars_decode($arrData['href']);
  210. $arrData['href'] = base64_decode($arrData['href']);
  211. }
  212. $navMenuModel->update($arrData, ["id" => $intId], true);
  213. $this->success(lang("EDIT_SUCCESS"), url("NavMenu/index", ['nav_id' => $arrData['nav_id']]));
  214. }
  215. /**
  216. * 删除导航菜单
  217. * @adminMenu(
  218. * 'name' => '删除导航菜单',
  219. * 'parent' => 'index',
  220. * 'display'=> false,
  221. * 'hasView'=> false,
  222. * 'order' => 10000,
  223. * 'icon' => '',
  224. * 'remark' => '删除导航菜单',
  225. * 'param' => ''
  226. * )
  227. */
  228. public function delete()
  229. {
  230. $navMenuModel = new NavMenuModel();
  231. $intId = $this->request->param("id", 0, "intval");
  232. $intNavId = $this->request->param("nav_id", 0, "intval");
  233. if (empty($intId)) {
  234. $this->error(lang("NO_ID"));
  235. }
  236. $count = $navMenuModel->where("parent_id", $intId)->count();
  237. if ($count > 0) {
  238. $this->error("该菜单下还有子菜单,无法删除!");
  239. }
  240. $navMenuModel->where("id", $intId)->delete();
  241. $this->success(lang("DELETE_SUCCESS"), url("NavMenu/index", ['nav_id' => $intNavId]));
  242. }
  243. /**
  244. * 导航菜单排序
  245. * @adminMenu(
  246. * 'name' => '导航菜单排序',
  247. * 'parent' => 'index',
  248. * 'display'=> false,
  249. * 'hasView'=> false,
  250. * 'order' => 10000,
  251. * 'icon' => '',
  252. * 'remark' => '导航菜单排序',
  253. * 'param' => ''
  254. * )
  255. */
  256. public function listOrder()
  257. {
  258. $navMenuModel = new NavMenuModel();
  259. $status = parent::listOrders($navMenuModel);
  260. if ($status) {
  261. $this->success("排序更新成功!");
  262. } else {
  263. $this->error("排序更新失败!");
  264. }
  265. }
  266. }