Home > Backend Development > PHP Tutorial > CI framework WeChat development-custom menu

CI framework WeChat development-custom menu

WBOY
Release: 2016-08-08 09:32:45
Original
1259 people have browsed it

Implemented the custom menu function under the CI framework. Wrote a model and a class library. By the way, the implementation of access_token is also included

<?<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>
Copy after login

The above is the content in the library, which mainly generates the json string of the menu based on the data table

<?<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>
Copy after login

The above are the various methods in the model.

The table structure of the database is as follows, with the statements to create the table.

<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
Copy after login

Field Type Comment
Primary key 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 Message type
url varchar(200) NULL Link address
clickkey varchar(20) NULL Event KEY
menuorder int(11) NULL Sort
submenu tinyint(2) NULL

The following is the method of obtaining token written under system/core/common.php. In fact, it needs to be salted, otherwise disgusting people will do disgusting things.

<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>
Copy after login

I won’t write about the previous menu management. It just manages the data in that table and ensures that there is no problem with the data in the data table.

You only need

in the controller

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

Then call $this->makemenu->dolist();

It will be pushed to the WeChat server. You also need to pay attention to defining two constants APPID and APPSECRET in the entry file.

I released it for everyone, I hope it will be useful, and I will also make a backup copy for myself.

The above introduces the CI framework WeChat development-custom menu, including the content. I hope it will be helpful to friends who are interested in PHP tutorials.

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template