0

0

CI框架微信开发-自定义菜单

php中文网

php中文网

发布时间:2016-08-08 09:32:45

|

1326人浏览过

|

来源于php中文网

原创

在ci框架下面实现了自定义菜单功能.写了一个model,一个类库.顺便附带access_token的实现方式

php
class Makemenu{
    public $menustr;
    public function __construct(){
    }
    public function init(){
        $this->dolist();
        return  $this->setmenu();
    }
    private function dolist(){
        $CI =& get_instance();
        $CI -> load ->model("Menu_model","menu");
        $plist = $CI->menu ->isplist();
        foreach($plist as $pid){
            $pidarr[] = $pid['pid'];
        }
        $list = $CI->menu ->maketree($CI->menu->getlist());
        foreach($list as $btn){
            if(in_array($btn['id'],$pidarr)){
                //生成不带key和url的链接作为父级菜单
                $btn_arr[$btn['id']] = array("type"=>$btn['menutype'],
                                                        "name"=>$btn['content']);
            }elseif($btn['pid'] == 0){
                //生成有操作的一级菜单
                $btn_arr[$btn['id']] = array("type"=>$btn['menutype'],
                                                        "name"=>$btn['content'],
                                                        "key"=>$btn['clickkey'],
                                                        "url"=>$btn['url']);
            }else{
                //生成子菜单
                $btn_arr[$btn['pid']]['sub_button'][] = array("type"=>$btn['menutype'],
                                                        "name"=>$btn['content'],
                                                        "key"=>$btn['clickkey'],
                                                        "url"=>$btn['url']);
            }
        }
        $btnarr['button'] = array_values($btn_arr);
        $r = $this->menustr = json_encode($btnarr,JSON_UNESCAPED_UNICODE);
        return $r;
    }
    private function setmenu(){
        $accesstoken = get_access_token();
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$accesstoken}";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $this->menustr);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $info = curl_exec($ch);
        if (curl_errno($ch)) {
            return curl_error($ch);
        }
        curl_close($ch);
        return $info;
    }
}

上面是library里面的内容,主要是根据数据表生成菜单的json串

php

class Menu_model extends CI_Model {
    public $table_name;
    public function __construct(){
        parent::__construct();
        $this->load->database();
        $this->table_name = "data_menu";
    }
    public function query($sql){
        return $this->db->query($sql);
    }
    public function getone($id){
        $get_sql  = "select * from {$this->table_name} where id = {$id}";
        return $this->query($get_sql)->row();
    }
    public function addone($data){
        if(($data['pid'] == 0)&&($this->checksum()>=3)){
            //一级菜单不超过3个
            return "toomany1";
        }elseif(($data['pid']!=0)&&($this->checksum($data['pid']))>=7){
            //二级菜单不超过7个
            return "toomany2";
        }
        if(is_array($data)&&!empty($data)){
            $keys = "`".implode("`,`",array_keys($data))."`";
            $vals = "'".implode("','",array_values($data))."'";
            $insert_sql = "insert into {$this->table_name} ($keys) values ($vals)";
            return $this->query($insert_sql);
        }else{
            return false;
        }
    }
    public function del($id){
        $infos = $this->getone($id);
        $del_sql = "delete from {$this->table_name} where id = {$id} and pid = {$id}";
        return $this->query($del_sql);
    }
    private function checksum($id = ''){
        if($id == ''){
            $get_sql = "select count(1) as total from {$this->table_name} where pid =0";
        }else{
            $id = intval($id);
            $get_sql = "select count(1) as total from {$this->table_name} where pid ={$id}";
        }
        $r = $this->db->query($get_sql)->row();
        return $r->total;
    }
    public function getplist(){
        //获取一级菜单
        $get_sql = "select * from {$this->table_name} where pid=0 order by menuorder asc";
        return $this->db->query($get_sql)->result_array();
    }
    public function isplist(){
        $get_sql = "select pid from {$this->table_name} where pid <> 0 group by pid";
        return $this->db->query($get_sql)->result_array();
    }
    public function getlist(){
        $get_sql = "select * from {$this->table_name} where 1 order by pid asc, menuorder asc";
        return $this->db->query($get_sql)->result_array();
    }
    public function maketree($data){
        $pids = array();
        foreach($data as $k=>$v){
            if($v['pid'] == 0){
                $pids[$v['id']][] = $v;
            }else{
                $pids[$v['pid']][] = $v;
            }
        }
        list($t1,$t2,$t3) = array_values($pids);
        $r = array_merge_recursive(is_array($t1)?$t1:array(),is_array($t2)?$t2:array(),is_array($t3)?$t3:array());
        return $r;
    }
    public function update($data){
        if(is_array($data)&&!empty($data)){
            $id = $data['id'];
            unset($data['id']);
            foreach($data as $k=>$v){
                $update_arr[] = "`".$k."` = '".$v."'";
            }
            $update_fs = implode(",",$update_arr);
            $update_sql = "update {$this->table_name} set {$update_fs} where id = {$id}";
            return $this->query($update_sql);
        }else{
            return false;
        }
    }

}

上面是model里面的各种方法.

数据库的表结构如下,附创建表的语句.

CREATE TABLE `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(20) DEFAULT NULL,
  `pid` int(11) DEFAULT '0',
  `menutype` enum('click','view','scancode_push','scancode_waitmsg','pic_sysphoto','pic_photo_or_album','pic_weixin','location_select') DEFAULT 'view' COMMENT '消息类型',
  `url` varchar(200) DEFAULT NULL COMMENT '链接地址',
  `clickkey` varchar(20) DEFAULT NULL COMMENT '事件KEY',
  `menuorder` int(11) DEFAULT NULL COMMENT '排序',
  `submenu` tinyint(2) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

  Field Type Comment
主键 id int(11) NOT NULL
  content varchar(20) NULL
  pid int(11) NULL
  menutype enum('click','view','scancode_push','scancode_waitmsg','pic_sysphoto','pic_photo_or_album','pic_weixin','location_select') NULL 消息类型
  url varchar(200) NULL 链接地址
  clickkey varchar(20) NULL 事件KEY
  menuorder int(11) NULL 排序
  submenu tinyint(2) NULL

下面是写在system/core/common.php下面的获取token的方法,其实要做一个加盐处理,要么会有恶心的人做恶心的事情.

function get_access_token(){
        //从微信服务器获取access_token  并保留一个小时
        $old_filename = APPPATH."cache/".md5(date("YmdH",time()-3600)).".php";
        @unlink($old_filename);
        $filename = APPPATH."cache/".md5(date("YmdH",time())).".php";
        if(is_file($filename)){
            $r = include($filename);
        }else{
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
            $access_token =  file_get_contents($url);
            $res = "var_export(json_decode($access_token,1),1).";";
            file_put_contents($filename,$res);
            $r =  include($filename);
        }
        return ($r['access_token']);
    }

前面的菜单管理就不写了,就是管理那个表的数据,保证数据表里面的数据没问题即可.

在控制器里面只需要

乐彼多用户商城系统LBMall(.net)
乐彼多用户商城系统LBMall(.net)

乐彼多用户商城系统,采用ASP.NET分层技术和AJAX技术,运营于高速稳定的微软.NET+MSSQL 2005平台;完全具备搭建超大型网络购物多用户网上商城的整体技术框架和应用层次LBMall 秉承乐彼软件优秀品质,后台人性化设计,管理窗口识别客户端分辨率自动调整,独立配置的菜单操作锁,使管理操作简单便捷。待办事项1、新订单、支付、付款、短信提醒2、每5分钟自动读取3、新事项声音提醒 店铺管理1

下载

$this->load->library("Makemenu");

然后调用  $this->makemenu->dolist();

就会推送到微信的服务器.   还需要注意在入口文件定义两个常量   APPID和APPSECRET    .

放出来给大家,希望有用,也给我自己备份个.

以上就介绍了CI框架微信开发-自定义菜单,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

71

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

108

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

152

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

58

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

44

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

20

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

131

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

45

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AngularJS教程
AngularJS教程

共24课时 | 2.7万人学习

CSS3实现按钮特效视频教程
CSS3实现按钮特效视频教程

共15课时 | 3.2万人学习

细说PHP第三季
细说PHP第三季

共58课时 | 11.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号