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 .
放出来给大家,希望有用,也给我自己备份个.

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Avatar di Netflix ialah representasi visual identiti penstriman anda. Pengguna boleh melangkaui avatar lalai untuk menyatakan keperibadian mereka. Teruskan membaca artikel ini untuk mengetahui cara menetapkan gambar profil tersuai dalam apl Netflix. Cara cepat menetapkan avatar tersuai dalam Netflix Dalam Netflix, tiada ciri terbina dalam untuk menetapkan gambar profil. Walau bagaimanapun, anda boleh melakukan ini dengan memasang sambungan Netflix pada penyemak imbas anda. Mula-mula, pasang gambar profil tersuai untuk sambungan Netflix pada penyemak imbas anda. Anda boleh membelinya di kedai Chrome. Selepas memasang sambungan, buka Netflix pada penyemak imbas anda dan log masuk ke akaun anda. Navigasi ke profil anda di penjuru kanan sebelah atas dan klik

Bagaimana untuk menyesuaikan imej latar belakang dalam Win11? Dalam sistem win11 yang baru dikeluarkan, terdapat banyak fungsi tersuai, tetapi ramai rakan tidak tahu cara menggunakan fungsi ini. Sesetengah rakan berpendapat bahawa imej latar belakang agak monoton dan ingin menyesuaikan imej latar belakang, tetapi tidak tahu bagaimana untuk menyesuaikan imej latar belakang Jika anda tidak tahu bagaimana untuk menentukan imej latar belakang, editor telah menyusun langkah-langkah untuk sesuaikan imej latar belakang dalam Win11 di bawah Jika anda berminat Jika ya, lihat di bawah! Langkah-langkah untuk menyesuaikan imej latar belakang dalam Win11: 1. Klik butang menang pada desktop dan klik Tetapan dalam menu pop timbul, seperti yang ditunjukkan dalam rajah. 2. Masukkan menu tetapan dan klik Pemperibadian, seperti yang ditunjukkan dalam rajah. 3. Masukkan Pemperibadian dan klik pada Latar Belakang, seperti yang ditunjukkan dalam gambar. 4. Masukkan tetapan latar belakang dan klik untuk menyemak imbas gambar

Gambar rajah Venn ialah gambar rajah yang digunakan untuk mewakili hubungan antara set. Untuk mencipta rajah Venn kita akan menggunakan matplotlib. Matplotlib ialah perpustakaan visualisasi data yang biasa digunakan dalam Python untuk mencipta carta dan graf interaktif. Ia juga digunakan untuk mencipta imej dan carta interaktif. Matplotlib menyediakan banyak fungsi untuk menyesuaikan carta dan graf. Dalam tutorial ini, kami akan menggambarkan tiga contoh untuk menyesuaikan gambar rajah Venn. Terjemahan Bahasa Cina Contoh ialah: Contoh Ini adalah contoh mudah untuk mencipta persilangan dua gambar rajah Venn terlebih dahulu, kami mengimport perpustakaan yang diperlukan dan venn yang diimport; Kemudian kami mencipta set data sebagai set Python, selepas itu kami menggunakan fungsi "venn2()" untuk mencipta

Bagaimana untuk menyesuaikan tetapan kekunci pintasan dalam Eclipse? Sebagai pembangun, menguasai kekunci pintasan ialah salah satu kunci untuk meningkatkan kecekapan semasa pengekodan dalam Eclipse. Sebagai persekitaran pembangunan bersepadu yang berkuasa, Eclipse bukan sahaja menyediakan banyak kekunci pintasan lalai, tetapi juga membenarkan pengguna untuk menyesuaikannya mengikut keutamaan mereka sendiri. Artikel ini akan memperkenalkan cara untuk menyesuaikan tetapan kekunci pintasan dalam Eclipse dan memberikan contoh kod khusus. Buka Eclipse First, buka Eclipse dan masukkan

CakePHP ialah rangka kerja PHP yang berkuasa yang menyediakan pembangun dengan banyak alat dan ciri berguna. Salah satu daripadanya ialah penomboran, yang membantu kami membahagikan sejumlah besar data kepada beberapa halaman, menjadikan penyemakan imbas dan manipulasi lebih mudah. Secara lalai, CakePHP menyediakan beberapa kaedah penomboran asas, tetapi kadangkala anda mungkin perlu mencipta beberapa kaedah penomboran tersuai. Artikel ini akan menunjukkan kepada anda cara membuat penomboran tersuai dalam CakePHP. Langkah 1: Cipta kelas penomboran tersuai Pertama, kita perlu mencipta kelas penomboran tersuai. ini

Kemas kini iOS 17 untuk iPhone membawa beberapa perubahan besar kepada Apple Music. Ini termasuk bekerjasama dengan pengguna lain pada senarai main, memulakan main balik muzik daripada peranti berbeza apabila menggunakan CarPlay dan banyak lagi. Salah satu ciri baharu ini ialah keupayaan untuk menggunakan silang pudar dalam Apple Music. Ini akan membolehkan anda beralih dengan lancar antara trek, yang merupakan ciri hebat apabila mendengar berbilang lagu. Crossfading membantu meningkatkan keseluruhan pengalaman mendengar, memastikan anda tidak terkejut atau terkeluar daripada pengalaman apabila trek berubah. Jadi, jika anda ingin memanfaatkan sepenuhnya ciri baharu ini, berikut ialah cara menggunakannya pada iPhone anda. Cara Mendayakan dan Menyesuaikan Crossfade untuk Muzik Apple Anda Memerlukan Yang Terkini

Cara melaksanakan middleware tersuai dalam CodeIgniter Pengenalan: Dalam pembangunan web moden, middleware memainkan peranan penting dalam aplikasi. Ia boleh digunakan untuk melaksanakan beberapa logik pemprosesan yang dikongsi sebelum atau selepas permintaan sampai kepada pengawal. CodeIgniter, sebagai rangka kerja PHP yang popular, juga menyokong penggunaan middleware. Artikel ini akan memperkenalkan cara untuk melaksanakan perisian tengah tersuai dalam CodeIgniter dan memberikan contoh kod mudah. Gambaran keseluruhan Middleware: Middleware ialah sejenis permintaan

Vue ialah rangka kerja JavaScript popular yang menyediakan banyak fungsi dan API yang mudah untuk membantu pembangun membina aplikasi bahagian hadapan interaktif. Dengan keluaran Vue3, fungsi render telah menjadi kemas kini penting. Artikel ini akan memperkenalkan konsep dan tujuan fungsi render dalam Vue3 dan cara menggunakannya untuk menyesuaikan fungsi rendering. Apakah fungsi render? Dalam Vue, templat ialah kaedah rendering yang paling biasa digunakan, tetapi dalam Vue3, anda boleh menggunakan kaedah lain: r
