今天说一下自定义菜单模块
配置问题之前已经说了,这里就不重复了
一、后台自定义菜单管理
后台添加菜单
自定义菜单的数据字典
DROP TABLE IF EXISTS `ys_wx_menu`;
CREATE TABLE `ys_wx_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单标题',
`pid` int(11) NOT NULL DEFAULT 0 COMMENT '父级菜单id',
`type` tinyint(2) NOT NULL DEFAULT 0 COMMENT '响应动作类型(0表示网页,1表示点击,2表示小程序)',
`sort` tinyint(2) NOT NULL DEFAULT 1 COMMENT '排序',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单数值',
`create_time` int(10) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
微信后台的自定义菜单是可视化的,太麻烦。这里直接用普通的表单管理
问题:
添加菜单时,若无二级菜单,一级菜单选择网页的话,必须添加网页链接,且链接格式必须正确,否则会同步出错
二、 菜单同步
这里比较麻烦的就是创建菜单的数据拼接,下面是我自己的拼接代码
$data = db('wx_menu')->where(['pid' => 0])->select();
$secMenuData = [];
foreach ($data as $key => $val){
$secMenuData[$key]['name'] = $val['name'];
// 有二级菜单的时候 一级不需要链接 留空
if(empty($val['url'])) {
// 找二级菜单的信息
$son = db('wx_menu')->where(['pid' => $val['id']])->select();
if(!empty($son)){
foreach ($son as $k => $value) {
$secMenuData[$key]['sub_button'][] = [
'type' => 'view',
'url' => $value['url'],
'name' => $value['name'],
];
}
}
}else{
$secMenuData[$key]['type'] = 'view';
$secMenuData[$key]['url'] = $val['url'];
}
}
$secMenuData = ['button'=>$secMenuData];
$menuJson = json_encode($secMenuData,JSON_UNESCAPED_UNICODE);
// dump(cache('wechat_token'));die;
// dump($secMenuData);
// dump($menuJson);die;
$res = $this->api->create_menu($menuJson);
拼接后的数据如下
{
"button":[
{
"type":"view",
"name":"官方网站",
"url":"https://baidu.com"
},
{
"name":"技术笔记",
"sub_button":[
{
"type":"view",
"name":"PHP",
"url":"https://blog.csdn.net/fate_sky8521"
},
{
"type":"view",
"name":"Python",
"url":"https://blog.csdn.net/fate_sky8521"
},
{
"type":"view",
"name":"Linux",
"url":"https://blog.csdn.net/fate_sky8521"
}]
}]
}
自定义菜单就是这样,有问题再来补充