検索
ホームページphp教程php手册CI框架微信开发-自定义菜单,ci框架自定义菜单

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

在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</span>(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    .

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。