ci框架微信开发-自定义菜单,ci框架自定义菜单在ci框架下面实现了自定义菜单功能.写了一个model,一个类库.顺便附带access_token的实现方式
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串
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 '0', `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 '0', primary key (`id`)) engine=myisam auto_increment=0 default charset=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的方法,其实要做一个加盐处理,要么会有恶心的人做恶心的事情.
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 = load->library(makemenu);
然后调用 $this->makemenu->dolist();
就会推送到微信的服务器. 还需要注意在入口文件定义两个常量 appid和appsecret .
放出来给大家,希望有用,也给我自己备份个.
http://www.bkjia.com/phpjc/926157.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/926157.htmltecharticleci框架微信开发-自定义菜单,ci框架自定义菜单 在ci框架下面实现了自定义菜单功能.写了一个model,一个类库.顺便附带access_token的实现方式...