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 '',
`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 '',
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 .
放出来给大家,希望有用,也给我自己备份个.
CI框架微信开发-自定义菜单的更多相关文章
- 记微信开发(自定义回复&关注回复)
记微信开发(自定义回复&关注回复) 记微信开发(自定义回复&关注回复) code: <?php/** * wechat php test *///define your toke ...
- 微信 创建自定义菜单 向微信发起的post请求
微信 创建自定义菜单 向微信发起的post请求 Map<String, Object> res = new HashMap<String, Object>(); try { S ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(74)-微信公众平台开发-自定义菜单
系列目录 引言 1.如果不借用Senparc.Weixin SDK自定义菜单,编码起来,工作量是非常之大 2.但是借助SDK似乎一切都是简单得不要不要的 3.自定义菜单无需要建立数据库表 4.自定义菜 ...
- 微信公众平台开发----自定义菜单、消息处理及获取OpenID(C#)
一.成为开发者 服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL).Token和EncodingAESKey,如下图所示: 其中 ...
- .net MVC微信开发自定义View类型菜单时在相应控制器获取用户OpenID的问题
因为公司的项目在接收微信服务器Post过来的数据包是有指定的入口,所以在相应控制器里无法接收到微信服务器Post过来的数据,所以无法获得OpenID,也尝试过先在入口哪里解析获得OpenID再通过Se ...
- 仿微信底部自定义菜单 移动web
最近在做微信开发,要实现微信公众号改版—-改成微官网形式,即移动web页面中实现公众号的主页面,包括了公众号的菜单在底部显示 本文针对仿公众号底部菜单这个功能实现进行总结.实现采用html和css.J ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
- php 微信3 自定义菜单
<pre name="code" class="php"><pre name="code" class="htm ...
- CI框架入门笔记
当前(2019-03-22)CodeIgniter 框架的最新版本是 3.1.5,于2017年6月发布,距今快两年了也没有更新,这与 Laravel 的更新速度相比差距太大了.因为确实,它是一个很古老 ...
随机推荐
- AngularJS 基础教程一:
一:了解AngularJS AngularJS是一款非常优秀的前端高级 JS 框架,由 Misko Hevery 等人创建 2009 年被 Google 收购,用于其多款产品 有一个全职的开发团队继续 ...
- c# 大量拼接xml时内存溢出解决方法
public static string SelectUNnormalPriceSTrans(EUNnormalPriceS rqInfo) { string guidStrJianJclFirst ...
- tomcat server.xml 配置示例
规划: 网站网页目录:/web/www 域名:www.test1.com 论坛网页目录:/web/bbs URL:bbs.test1.com/bbs 网站管理 ...
- 新唐的icp和isp
ICP 的意思是 "在电路编程"(in Circuit Programming),PC 电脑可以运行 “NuMicro ICP Programming Tool”软件通过 Nu-L ...
- KEIL的宏汇编器A51介绍
A51是一种具有通用特性和用法的重定位宏汇编器.它与Intel公司的MASM51宏汇编器具有很好兼容性,支持模块化编程,可以方便地与高级语言接口.A51宏汇编器支持汇编伪指令.宏处理指令以及汇编控制命 ...
- linux xargs 使用
xargs是一条Unix和类Unix操作系统的常用命令.它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题[1]. 例如,下面的命令: rm `find /path -type ...
- 快速批量导入庞大数据到SQL SERVER数据库(ADO.NET)
原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/11/11/1331060.html 如果你需要在程序中批量插入成千上万行的数据,你会怎么编写 ...
- 发几个速度快可以用的google IP,谷歌IP(转)
google搜索引擎打不开时的解决办法,谷歌(google)的IP是多少? google IP镜像. 这里搜集了几个经过测试可用的IP,用来在不能域名访问google的时候进行访问,实时更新! 前面几 ...
- 简述tcp协议对http性能的影响及优化
当网站服务器并发连接达到一定程度时,你可能需要考虑服务器系统中tcp协议设置对http服务器的影响. tcp相关延时主要包括: 1.tcp连接时建立握手: 2.tcp慢启动拥塞控制: 3.数据聚集的N ...
- 初探JS正则表达式
1.概述 正则表达式是一个描述字符模式的对象.Javascript的正则表达式语法的是Perl5的正则表达式的子集.JS正则表达式有两种使用方式,文本模式和RegExp对象模式,实例如下: v ...