如何创建自定义菜单?

!创建自定义菜单需注意:

a.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
b.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

c.创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5  分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

如想创建如下图样式的菜单:


同步到手机上如下:


1.首先我们需要创建数据库如图结构:


2.我们需要用thinkphp框架来实现,同时还需要我们自己把LaneWeChat-master微信框架导入到thinkphp(应用目录)中,还有要把css样式,图片,ueditor,以及前台页自己完成,如果有可用的直接导入即可;最好将CSS样式,图片,ueditor放到一个文件下,导入到public中;前台页与其他前台页放到一块,方便调用。

我的结构如下:


3.再创建一个控制器(eg:MenuController.class.php)如下代码:

<?php
namespace Home\Controller;
use Think\Controller;
// define('WECHAT_APPID', 'wx4d2b6e6eac5a069c');
// define('WECHAT_APPSECRET', 'ea1baf18f1ece70c3d8de637a01b9378');
class MenuController extends Controller {
	public function menuedit(){
		$data=I('post.data');
		foreach ($data as &$value) {
			if($value['type']=='event'){
				$value['type']=$value['code'];
				$value['code']='k_'. rand(100,999);
			}
		}
		include APP_PATH . 'LaneWeChat/lanewechat.php';
		$ret= \LaneWeChat\Core\Menu::setMenu($data);
		$this->ajaxReturn($ret);
	}
}


4.写完后上传到服务器,第一次要把WECHAT_APPID,WECHAT_APPSECRET写上,否则自己的微信无法同步,之后再注释掉即可。

但这只是一个一级菜单,好多功能都无法实现,如想实现更多功能,需要我们写更多代码!

接下来,我们来学习做二级菜单:

1.我们1~3步还按照上边的做,我们直接来说代码,首先我们来完成获取当前使用的公众号,在MpController.class.php中写以下代码,主要来获取公众号的id,以及将未使用的公众号切换为正在使用的公众号。

  //接入公众号,$id主键
  public function enter($id){
    $mp=M('mp')->find($id);
    $mp['url']='http://'.$_SERVER['HTTP_HOST'].U('mp/index/index',array('id'=>$mp['id']));
    $this->assign('mp',$mp);
    $this->display();
   }
    //将某公众号作为当前使用的公众号
   public function usemp($id){
    $model=M('mp');
    $model->where("id!=$id")->setField('is_use',0);
    $model->where("id=$id")->setField('is_use',1);
    //$this->success('更新成功');
    $this->redirect('index');
   }

4.写完后上传到服务器,第一次要把WECHAT_APPID,WECHAT_APPSECRET写上,否则自己的微信无法同步,之后再注释掉即可。

但这只是一个一级菜单,好多功能都无法实现

2.仍在Menu控制器中获取当前使用的公众号,代码如下:


//获取当前使用的公众号
		$mp=getCurrentMp();
		if (empty($mp)) {
			$this->ajaxReturn(array('error'=>true,'msg'=>'无使用的公众号','url'=>U('mp/index')));
			exit;
		}

3.当然前台也需要写点儿,但需要自己完成,这里不解释了,我们只写php的。

4.完成了获取当前公众号,接下来就完成获取access_token了,代码如下:

		//写入数据库
		$data1=I('post.data');
		$arr=array();
		foreach ($data1 as $key => $value) {
			$row=array();
			$row['mp_id']=$mp['id'];
			$row['index']=$value['id'];
			$row['pindex']=$value['pid'];
			$row['name']=$value['name'];
			$row['content']=$value['code'];
			$row['type']=$value['type'];
			$row['sort']=$value['sort'];
			$arr[]=$row;
		}
		$model=M('mp_menu');
		$model->where("mp_id={$mp['id']}")->delete();
		$model->addAll($arr);
		// $this->ajaxReturn(array('error'=>true,'data'=>$data1));
		// exit;

		//创建菜单--先处理数据,格式要符合要求
		$data2=$data1;
		foreach ($data1 as $key1 => $value1) {
			foreach ($data2 as $key2 => $value2) {
			//如果一级菜单下有二级菜单,则只保留name		
			if($value1['id']==$value2['pid']){
				$data1[$key1]['type']='';
				$data1[$key1]['code']='';
				break;
			}
		}

		unset($data1[$key1]['sort']);

		//处理event
		if($value1['type']=='event'){
			$data1[$key1]['type']=$value1['code'];
			$data1[$key1]['code']='k_'. rand(100,999);
		}
		}

		//this->ajaxReturn($data1);
		//exit;

		include APP_PATH . 'LaneWeChat/lanewechat.php';
		$ret=Menu::setMenu($data);
		file_put_contents('menu.txt', $ret);
		// $this->ajaxReturn($ret);		
	}
 Menu控制器完整代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
use LaneWeChat\Core\Menu;

// define('WECHAT_APPID', 'wx4d2b6e6eac5a069c');
// define('WECHAT_APPSECRET', 'ea1baf18f1ece70c3d8de637a01b9378');

//菜单
class MenuController extends Controller {
	//发布公众号自定义菜单
	public function menuedit(){
		//获取当前使用的公众号
		$mp=getCurrentMp();
		if (empty($mp)) {
			$this->ajaxReturn(array('error'=>true,'msg'=>'无使用的公众号','url'=>U('mp/index')));
			exit;
		}
		//写入数据库
		$data1=I('post.data');
		$arr=array();
		foreach ($data1 as $key => $value) {
			$row=array();
			$row['mp_id']=$mp['id'];
			$row['index']=$value['id'];
			$row['pindex']=$value['pid'];
			$row['name']=$value['name'];
			$row['content']=$value['code'];
			$row['type']=$value['type'];
			$row['sort']=$value['sort'];
			$arr[]=$row;
		}
		$model=M('mp_menu');
		$model->where("mp_id={$mp['id']}")->delete();
		$model->addAll($arr);
		// $this->ajaxReturn(array('error'=>true,'data'=>$data1));
		// exit;


		//创建菜单--先处理数据,格式要符合要求
		$data2=$data1;
		foreach ($data1 as $key1 => $value1) {
			foreach ($data2 as $key2 => $value2) {
			//如果一级菜单下有二级菜单,则只保留name		
			if($value1['id']==$value2['pid']){
				$data1[$key1]['type']='';
				$data1[$key1]['code']='';
				break;
			}
		}
		unset($data1[$key1]['sort']);
		//处理event
		if($value1['type']=='event'){
			$data1[$key1]['type']=$value1['code'];
			$data1[$key1]['code']='k_'. rand(100,999);
		}
		}
		//this->ajaxReturn($data1);
		//exit;

		include APP_PATH . 'LaneWeChat/lanewechat.php';
		$ret=Menu::setMenu($data);
		file_put_contents('menu.txt', $ret);
		// $this->ajaxReturn($ret);		
	}
} 

Menu控制器精简完整代码如下:但menu.lib.php需要改动

<?php
namespace Home\Controller;
use Think\Controller;
use LaneWeChat\Core\Menu;

// define('WECHAT_APPID', 'wx4d2b6e6eac5a069c');
// define('WECHAT_APPSECRET', 'ea1baf18f1ece70c3d8de637a01b9378');

//菜单
class MenuController extends Controller 
{
	public function access_token(){
		var_dump(getAccess_token());
	}
	public function index(){
		$mp=getCurrentMp();
		if (empty($mp)) {
			$this->error('无使用的公众号',U('mp/index'));
		}
		$data=M('mp_menu')->where("mp_id={$mp['id']}")->order('id')->select();
		// dump($data);
		// exit;
		$data2=$data;
		foreach ($data as $k => $v) {
			foreach ($data2 as $k2 => $v2) {
				if ($v['index']==$v2['pindex']) {
					$data[$k]['sub'][]=$v2;
					unset($data[$k2]);
				}
			}
		}
		// print_r($data);
		// exit;
		$this->assign('mpInfo',$mp);
		$this->assign('list',$data);
		$this->display();
	}

	//发布公众号自定义菜单
	public function menuedit(){
		//获取当前使用的公众号
		$mp=getCurrentMp();
		if (empty($mp)) {
			$this->ajaxReturn(array('error'=>true,'msg'=>'无使用的公众号','url'=>U('mp/index')));
			exit;
		}

		//写入数据库
		$data1=I('post.data');
		
		foreach ($data1 as &$value){
			$value['mp_id']=$mp['id'];
		}
		$model=M('mp_menu');
		
		$model->where("mp_id={$mp['id']}")->delete();
		$model->addAll($data1);
			
		include APP_PATH . 'LaneWeChat/lanewechat.php';
		$ret=Men::setMenu($data1);
		
		if($ret){
			$this->ajaxReturn(array('msg' =>'创建菜单成功'));

		}else{
			$this->ajaxReturn(array('msg' =>$ret));			
		}
	}	
} 

最后效果图:



链接自己的服务器,手机微信同步即可使用!


版权声明:本文为anqingya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/anqingya/article/details/79921281