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 | <父类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的方法,其实要做一个加盐处理,要么会有恶心的人做恶心的事情.
<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 .
放出来给大家,希望有用,也给我自己备份个.

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Netflix上的头像是你流媒体身份的可视化代表。用户可以超越默认的头像来展示自己的个性。继续阅读这篇文章,了解如何在Netflix应用程序中设置自定义个人资料图片。如何在Netflix中快速设置自定义头像在Netflix中,没有内置功能来设置个人资料图片。不过,您可以通过在浏览器上安装Netflix扩展来实现此目的。首先,在浏览器上安装Netflix扩展的自定义个人资料图片。你可以在Chrome商店买到它。安装扩展后,在浏览器上打开Netflix并登录您的帐户。导航至右上角的个人资料,然后单击

Win11如何自定义背景图片?在最新发布的win11系统中,里面有许多的自定义功能,但是很多小伙伴不知道应该如何使用这些功能。就有小伙伴觉得背景图片比较单调,想要自定义背景图,但是不知道如何操作自定义背景图,如果你不知道如何定义背景图片,小编下面整理了Win11自定义背景图片步骤,感兴趣的话一起往下看看把!Win11自定义背景图片步骤1、点击桌面win按钮,在弹出的菜单中点击设置,如图所示。2、进入设置菜单,点击个性化,如图所示。3、进入个性化,点击背景,如图所示。4、进入背景设置,点击浏览图片

维恩图是用来表示集合之间关系的图。要创建维恩图,我们将使用matplotlib。Matplotlib是一个在Python中常用的数据可视化库,用于创建交互式的图表和图形。它也用于制作交互式的图像和图表。Matplotlib提供了许多函数来自定义图表和图形。在本教程中,我们将举例说明三个示例来自定义Venn图。Example的中文翻译为:示例这是一个创建两个维恩图交集的简单示例;首先,我们导入了必要的库并导入了venns。然后我们将数据集创建为Python集,之后,我们使用“venn2()”函数创

如何在Eclipse中自定义快捷键设置?作为一名开发人员,在使用Eclipse进行编码时,熟练掌握快捷键是提高效率的关键之一。Eclipse作为一款强大的集成开发环境,不仅提供了许多默认的快捷键,还允许用户根据自己的偏好进行个性化的定制。本文将介绍如何在Eclipse中自定义快捷键设置,并给出具体的代码示例。打开Eclipse首先,打开Eclipse,并进入

CakePHP是一个强大的PHP框架,为开发人员提供了很多有用的工具和功能。其中之一是分页,它可以帮助我们将大量数据分成几页,从而简化浏览和操作。默认情况下,CakePHP提供了一些基本的分页方法,但有时你可能需要创建一些自定义的分页方法。这篇文章将向您展示如何在CakePHP中创建自定义分页。步骤1:创建自定义分页类首先,我们需要创建一个自定义分页类。这个

适用于iPhone的iOS17更新为AppleMusic带来了一些重大变化。这包括在播放列表中与其他用户协作,在使用CarPlay时从不同设备启动音乐播放等。这些新功能之一是能够在AppleMusic中使用交叉淡入淡出。这将允许您在曲目之间无缝过渡,这在收听多个曲目时是一个很棒的功能。交叉淡入淡出有助于改善整体聆听体验,确保您在音轨更改时不会受到惊吓或退出体验。因此,如果您想充分利用这项新功能,以下是在iPhone上使用它的方法。如何為AppleMusic啟用和自定Crossfade您需要最新的

如何在CodeIgniter中实现自定义中间件引言:在现代的Web开发中,中间件在应用程序中起着至关重要的作用。它们可以用来执行在请求到达控制器之前或之后执行一些共享的处理逻辑。CodeIgniter作为一个流行的PHP框架,也支持中间件的使用。本文将介绍如何在CodeIgniter中实现自定义中间件,并提供一个简单的代码示例。中间件概述:中间件是一种在请求

Vue是一款流行的JavaScript框架,它提供了许多方便的功能和API以帮助开发者构建交互式的前端应用程序。随着Vue3的发布,render函数成为了一个重要的更新。本文将介绍Vue3中render函数的概念、用途和如何使用它自定义渲染函数。什么是render函数在Vue中,template是最常用的渲染方式,但是在Vue3中,可以使用另外一种方式:r
