zoukankan      html  css  js  c++  java
  • CI框架微信开发-自定义菜单

    在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 <ID>
      content varchar(20) NULL <内容>
      pid int(11) NULL <父类ID>
      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 = "<?php return ".var_export(json_decode($access_token,1),1).";";
                file_put_contents($filename,$res);
                $r =  include($filename);
            }
            return ($r['access_token']);
        }

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

    在控制器里面只需要

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

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

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

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

  • 相关阅读:
    Codeforces Round #370 (Div. 2) D. Memory and Scores DP
    HDU 5876 Sparse Graph BFS 最短路
    HDU 5875 Function st + 二分
    HDU 5869 Different GCD Subarray Query 离线+树状数组
    2016 ACM/ICPC Asia Regional Dalian Online HDU 5877 Weak Pair treap + dfs序
    detection in video and image
    vs 2012打开vs2013的sln
    dl in image process
    classifier
    mark
  • 原文地址:https://www.cnblogs.com/swordphp/p/4159190.html
Copyright © 2011-2022 走看看