Menu.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Think.Admin
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://think.ctolog.com
  8. // +----------------------------------------------------------------------
  9. // | 开源协议 ( https://mit-license.org )
  10. // +----------------------------------------------------------------------
  11. // | github开源项目:https://github.com/zoujingli/Think.Admin
  12. // +----------------------------------------------------------------------
  13. namespace app\wechat\controller;
  14. use controller\BasicAdmin;
  15. use service\LogService;
  16. use service\ToolsService;
  17. use think\Db;
  18. /**
  19. * 微信菜单管理
  20. * Class Menu
  21. * @package app\wechat\controller
  22. * @author Anyon <zoujingli@qq.com>
  23. * @date 2017/03/27 14:43
  24. */
  25. class Menu extends BasicAdmin {
  26. /**
  27. * 指定当前页面标题
  28. * @var string
  29. */
  30. public $title = '微信菜单定制';
  31. /**
  32. * 指定默认操作的数据表
  33. * @var string
  34. */
  35. public $table = 'WechatMenu';
  36. /**
  37. * 微信菜单的类型
  38. * @var array
  39. */
  40. protected $menu_type = array(
  41. 'view' => '跳转URL',
  42. 'click' => '点击推事件',
  43. 'scancode_push' => '扫码推事件',
  44. 'scancode_waitmsg' => '扫码推事件且弹出“消息接收中”提示框',
  45. 'pic_sysphoto' => '弹出系统拍照发图',
  46. 'pic_photo_or_album' => '弹出拍照或者相册发图',
  47. 'pic_weixin' => '弹出微信相册发图器',
  48. 'location_select' => '弹出地理位置选择器',
  49. );
  50. /**
  51. * 显示列表操作
  52. */
  53. public function index() {
  54. return parent::_list(Db::name($this->table), false, true);
  55. }
  56. /**
  57. * 列表数据处理
  58. * @param array $data
  59. */
  60. protected function _index_data_filter(&$data) {
  61. $data = ToolsService::arr2tree($data, 'index', 'pindex');
  62. }
  63. /**
  64. * 微信菜单编辑
  65. */
  66. public function edit() {
  67. if ($this->request->isPost()) {
  68. $post = $this->request->post();
  69. !isset($post['data']) && $this->error('访问出错,请稍候再试!');
  70. $data = $post['data'];
  71. if (empty($data)) {
  72. Db::name($this->table)->where('1=1')->delete();
  73. load_wechat('Menu')->deleteMenu();
  74. $this->success('删除并取消微信菜单成功!', '');
  75. }
  76. foreach ($data as &$vo) {
  77. if (isset($vo['content'])) {
  78. $vo['content'] = str_replace('"', "'", $vo['content']);
  79. }
  80. }
  81. if (Db::name($this->table)->where('1=1')->delete() !== false && Db::name($this->table)->insertAll($data) !== false) {
  82. $result = $this->_push();
  83. if ($result['status']) {
  84. LogService::write('微信管理', '发布微信菜单成功');
  85. $this->success('保存发布菜单成功!', '');
  86. }
  87. $this->error('菜单发布失败,' . $result['errmsg']);
  88. }
  89. $this->error('保存发布菜单失败!');
  90. }
  91. }
  92. /**
  93. * 取消菜单
  94. */
  95. public function cancel() {
  96. $wehcat = &load_wechat('Menu');
  97. if (false !== $wehcat->deleteMenu()) {
  98. $this->success('菜单取消成功,重新关注可立即生效!', '');
  99. }
  100. $this->error('菜单取消失败,' . $wehcat->errMsg);
  101. }
  102. /**
  103. * 菜单推送
  104. */
  105. protected function _push() {
  106. $result = Db::name($this->table)
  107. ->field('id,index,pindex,name,type,content')
  108. ->where('status', '1')
  109. ->order('sort ASC,id ASC')
  110. ->select();
  111. foreach ($result as &$row) {
  112. empty($row['content']) && $row['content'] = uniqid();
  113. switch ($row['type']) {
  114. case 'view':
  115. $row['url'] = preg_match('#^(\w+:)?//#i', $row['content']) ? $row['content'] : url($row['content'], '', true, true);
  116. break;
  117. case 'event':
  118. if (isset($this->menu_type[$row['content']])) {
  119. $row['type'] = $row['content'];
  120. $row['key'] = "wechat_menu#id#{$row['id']}";
  121. }
  122. break;
  123. case 'media_id':
  124. $row['media_id'] = $row['content'];
  125. break;
  126. default :
  127. (!in_array($row['type'], $this->menu_type)) && $row['type'] = 'click';
  128. $row['key'] = "wechat_menu#id#{$row['id']}";
  129. }
  130. unset($row['content']);
  131. }
  132. $menus = ToolsService::arr2tree($result, 'index', 'pindex', 'sub_button');
  133. //去除无效的字段
  134. foreach ($menus as &$menu) {
  135. unset($menu['index'], $menu['pindex'], $menu['id']);
  136. if (empty($menu['sub_button'])) {
  137. continue;
  138. }
  139. foreach ($menu['sub_button'] as &$submenu) {
  140. unset($submenu['index'], $submenu['pindex'], $submenu['id']);
  141. }
  142. unset($menu['type']);
  143. }
  144. $wechat = &load_wechat('Menu');
  145. if (false !== $wechat->createMenu(['button' => $menus])) {
  146. return array('status' => true, 'errmsg' => '');
  147. }
  148. return array('status' => false, 'errmsg' => $wechat->errMsg);
  149. }
  150. }