首页  >  文章  >  后端开发  >  CI框架微信开发-自定义菜单

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

WBOY
WBOY原创
2016-08-08 09:32:451224浏览

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

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

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

<span>php

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

}</span>

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

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

<span>CREATE</span> <span>TABLE</span><span> `menu` (
  `id` </span><span>int</span>(<span>11</span>) <span>NOT</span> <span>NULL</span><span> AUTO_INCREMENT,
  `content` </span><span>varchar</span>(<span>20</span>) <span>DEFAULT</span> <span>NULL</span><span>,
  `pid` </span><span>int</span>(<span>11</span>) <span>DEFAULT</span> <span>'</span><span>0</span><span>'</span><span>,
  `menutype` enum(</span><span>'</span><span>click</span><span>'</span>,<span>'</span><span>view</span><span>'</span>,<span>'</span><span>scancode_push</span><span>'</span>,<span>'</span><span>scancode_waitmsg</span><span>'</span>,<span>'</span><span>pic_sysphoto</span><span>'</span>,<span>'</span><span>pic_photo_or_album</span><span>'</span>,<span>'</span><span>pic_weixin</span><span>'</span>,<span>'</span><span>location_select</span><span>'</span>) <span>DEFAULT</span> <span>'</span><span>view</span><span>'</span> COMMENT <span>'</span><span>消息类型</span><span>'</span><span>,
  `url` </span><span>varchar</span>(<span>200</span>) <span>DEFAULT</span> <span>NULL</span> COMMENT <span>'</span><span>链接地址</span><span>'</span><span>,
  `clickkey` </span><span>varchar</span>(<span>20</span>) <span>DEFAULT</span> <span>NULL</span> COMMENT <span>'</span><span>事件KEY</span><span>'</span><span>,
  `menuorder` </span><span>int</span>(<span>11</span>) <span>DEFAULT</span> <span>NULL</span> COMMENT <span>'</span><span>排序</span><span>'</span><span>,
  `submenu` </span><span>tinyint</span>(<span>2</span>) <span>DEFAULT</span> <span>'</span><span>0</span><span>'</span><span>,
  </span><span>PRIMARY</span> <span>KEY</span><span> (`id`)
) ENGINE</span><span>=</span>MyISAM AUTO_INCREMENT<span>=</span><span>0</span> <span>DEFAULT</span> CHARSET<span>=</span>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的方法,其实要做一个加盐处理,要么会有恶心的人做恶心的事情.

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

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

在控制器里面只需要

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

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

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

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

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

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