thinkphp专题提供thinkphp的最新资讯内容,帮你更好的了解thinkphp。
现在的网站基本都会用上ajax来和后台交换数据了,这有当然也是有利有弊。今天想说的是当使用ajax的时候该怎么友好的提示。 说到ajax就要说起javascript,这个语言因为是前台用户端执行的,如果用户的网速跟不上,js文件没有下载到本地ajax表现出来就有问题,碰上很需要提示的地方,没有提示或者根本就不执行多么的悲剧。下面举个例子: 我要删除一条记录,点击链接的时候因为js文件没有下载到本地
请求js代码: Register.checkAccountForReturnPd = function(account,callback){ RCommon.showPdReturnError('tip_account',''); RCommon.showPdReturnError('question_tip',''); RCommon.showPdReturnError('answe
效果 说明   基于thinkphp3.2.3版本的框架实现,利用ajax从后台数据库中获取数据,其中获取数据是用模糊搜索方式,返回json数据,然后在模板中利用js将数据显示到搜索框下拉面板中。 模板 <script> var myloader = function(param,success,error){ var q = param.q || ''; if (q.length <= 0) {
jqgrid上要显示图片和上传图片的列,格式如下: {label:'图片',name:'icon',index:'icon',autowidth:true,formatter:alarmFormatter,editable:true,edittype:'custom', editoptions:{custom_element: ImgUpload, custom_value:GetImgValue
datatables插件+ajax大大提高了页面的访问速度,我用的Thinkphp框架做的数据处理,下面贴代码: 1.html文件   <table id="test" class="table table-striped table-bordered table-hover">                                         <thead>            
友情提醒:内容有点多 总体思路 thinkphp通过RESTful方式提供数据给angular,前端(包括模板页面)全部由angular来接管。 示例 实现一个用户管理模块,走通增删改查4个操作,通过该示例,演示如何在thinkphp中使用angularjs。 一. 准备工作 1. 加载所需的js和css文件 angular.min.js angular    核心库文件 angular-ui-r
PHP是网站后台开发语言,其重要的操作对象莫过于数据库,之前有了解过mysqli和pdo,但ThinkPHP的数据库交互必须使用其特定的封装方法,或者可以认为其是对PHP数据库操作的进一步封装,以达到更加安全和高效。ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。 数据库连接配置在APP目录下的database.php中进行相关参数的配置 测试准备工作建立数据表tb_test,并在database.php中配置('prefix'  => 'tb_',)使表前缀为tb_,然后建立模板Test.php,控制器Testx.php控制器Testx.php实现1 <?php2 //其中user为模块名,需对应更改3 namespace appusercontroller;45 //导入建立的模板,其中user为模块名,Test为模板类6 use appusermodelTest;789 class Testx10 {11 public function show()12 {13 $test=new Test();//得到模板的操作对象14 $res=$test->testshow();//调用模板中的方法15 dump($res);//输出1617 }18 } SQL语句数据库操作使用execute()和query()方法实现数据库操作,是直接使用SQL原生语句进行数据表操作execute可实现数据表的增、删、改,操作后会返回影响行数query可实现数据表的增、删、改、查,只有查询会返回结果 模板Test.php实现:1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function testshow(){910 //---------execute的使用----------11 //插入方法112 //返回操作行数113 //$res=Test::execute("insert into tb_test values(1,'dong1','dong11','dong111')");1415 //插入方法216 //返回操作行数117 //$res=Test::execute("insert into tb_test values(?,?,?,?)",[9,"W2","X1","N1"]);181920 //-----------query的使用----------21 //查询22 //返回查询结果数组23 //$res=Test::query("select * from tb_test");2425 //插入26 //无结果返回27 $res=Test::query("insert into tb_test values(?,?,?,?)",[19,"W12","X12","N12"]);2829 return $res;3031 }32 }基于PDO的添加语句模板Test.php实现:1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function testshow(){910 //返回影响行数111 //$daa = ['text1' => '东小东', 'text2' => '100'];12 //$res=Test::insert($daa);131415 //得到最后一次操作的id16 //$res= Test::getLastInsID();171819 //一次性插入多条数据20 $indata=[21 ['text1' => '东小东1', 'text2' => '100'],22 ['text1' => '东小东2', 'text2' => '100'],23 ['text1' => '东小东3', 'text2' => '100'],24 ];25 //返回影响行数326 $res=Test::insertAll($indata);2728 return $res;2930 }31 }基于PDO的删除语句模板Test.php实现:1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function testshow(){910 //返回影响行数1112 //条件为id=313 //$res=Test::where('id',3)->delete();1415 //条件为id>3016 $res=Test::where('id','>',30)->delete();1718 return $res;2920 }21 }基于PDO的修改语句模板Test.php实现:1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function testshow(){910 //返回影响行数,如果修改的值和原来相同,则返回01112 //更新13 //$res=Test::where('id', 9)->update(['text3' => '99999']);141516 //自增217 //$res=Test::where('text1', "东小东1")->setInc('id', 2);1819 //自减220 $res=Test::where('text1', "dongxiaodong")->setDec('id', 2);2122 return $res;2324 }25 }基于PDO的查询语句模板Test.php实现:1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function testshow(){91011 //查询数据库表的全部信息12 //返回二维数组,结果不存在返回空数组13 //$res=Test::select();1415 //指定条件查询16 //$res=Test::where("text1","dong1")->select();171819 //查询符合条件的第一条数据,结果不存在返回null20 //返回一维数组21 //$res=Test::where("text1","W2")->find();222324 //查询某个字段的值,只能查询到第一个,失败返回空25 //$res=Test::where("text1","dong1")->value('text2');262728 //查询某个字段的值,查询所有,失败返回空数组29 //$res=Test::where("text1","W12")->column('text3');303132 //模糊查询 like,不区分大小写,返回数组33 $res=Test::where("text1","like","%W%")->select();3435 //区间查询,返回数组36 //$res=Test::where("id","between",[2,7])->select();373839 //统计行数40 echo count($res);4142 //打印单个数据43 //echo $res[0]["text1"];4445 //find方法打印46 //echo $res["text1"];474849 return $res;505152 //每次处理2条数据,适用于对大数据处理53 /*54 Test::chunk(2, function($users) {5556 foreach ($users as $user) {57 dump($user);58 echo "------------";59 //功能60 }61 echo "********************";6263 });64 */65 }66 }Where和whileOr条件的补充1 <?php2 //其中user为模块名,需对应更改3 namespace appusermodel;4 use thinkModel;5 class Test extends Model6 {78 public function tes
    网页会话即是实现页面跳转及数据传递,在web开发中,Cookie和Session的使用是极其重要的,GET和POST是最常使用的页面间数据传递的方法,相对于PHP脚本基础,在ThinkPHP中对网页会话都进行了上层封装。 脚本的会话基础:PHP的会话控制 页面跳转:在控制器或模板中要做页面跳转时使用1 exit(header("Location: ../控制器/方法")); 超链接:在视图的HTML里如果要超链接到本地的控制器则需要使用1 href="{:url('控制器/方法')}" JS传递参数:利用其传递GET数据到后台,实现数据交互1 window.location.href="../控制器/方法?u_id="+u_id+"&u_state=停用"; GET和POST的数据获取:1 <?php2 namespace appindexcontroller;34 use thinkRequest;56 class Xiao7 {8 public function xiao2(){910 //获取到访问信息11 $re=Request::instance();1213 echo "当前域名:".$re->domain();1415 echo "获取 GET 或者 POST 参数值:".$re->param("name");//也可以为input("name");16 dump(input());//$也可以为:re->param() 打印所有获取的值1718 $methodx=$re->method();19 echo "当前的请求方法:".$methodx;2021 //获取get数据22 if($methodx=="GET"){23 echo $re->get("getn")."<br/>";24 dump($re->get());25 }2627 //获取post数据28 if($methodx=="POST"){29 echo $re->post("postn")."<br/>";30 dump($re->post());3132 }3334 }3536 } Session的基本使用:1 <?php2 namespace appindexcontroller;34 //导入必要的模块5 use thinkSession;67 class Xiao8 {9 public function xiao2(){10 //设置值11 Session::set('name1','thinkphp');1213 //判断session值是否存在14 if(Session::has("name1")){15 echo "--------------------------";16 }1718 //获取某个值19 echo Session::get('name1');2021 //删除某个值22 //Session::delete('name1');23 //清空所有24 Session::clear();2526 //session数组的设置27 Session::set("n2.nn1","aa1");28 Session::set("n2.nn2","aa2");29 //获取某个值30 echo Session::get("n2.nn1");31 //打印数组中所有值32 dump(Session::get("n2"));3334 }3536 } Cookie的基本使用:1 <?php2 namespace appindexcontroller;34 //导入必要的模块5 use thinkCookie;67 class Xiao8 {9 public function xiao2(){1011 //cookie单值,时间单位为秒12 Cookie::set('name1','value',3600);13 //cookie数组14 Cookie::set('name',[1,2,3]);15 //判断是否存在16 if(Cookie::has("name")){17 //打印出数组18 dump(Cookie::get("name"));19 }20 //删除某个21 Cookie::delete('name');22 //清空所有23 Cookie::clear();24 }2526 } 利用Session的登入判断:      Session的值是保存在WEB服务器中的,利用其来做当次的登入判断是常用的一种方式,首先应该在用户名密码匹配成功后进行Session的写操作,接下来是验证Session内容,进行登入判断。     本来觉得验证写在控制器中就好了,结果发现一旦程序庞大后每个控制器中的方法就多了,因为每个方法就代表着一个入口,所以这是不可取的。如果把Session判断写在模板的构造函数中,因为模板表示这一个数据库的数据表且基本上控制器中的方法都会设计到数据表的操作,这样整体下来很好的实现了登入验证功能。 先导入必要模块:1 use thinkSession; 模板的构造函数编写:1 //构造函数2 function 类名(){34 //判断session5 if(!Session::get("username")){67 //非登入,跳转页面8 exit(header("Location: ../控制器/登入的方法名"));910 }1112 } 注意:构造函数需要与类同名,经过测试发现PHP自带的万能类构造方法__construct()是不能使用的   
原文:赵桐正thinkphp教程笔记 ,有修改常用配置    常用配置config.php:<?phpreturn array(//'配置项'=>'配置值''URL_PATHINFO_DEPR' => '/', //修改URL分隔符'TMPL_L_DELIM' => '<{',//左定界符'TMPL_R_DELIM' => '}>',//右定界符//数据库相关'DB_PREFIX' => 'mb_','DB_DSN' => 'mysql://root:admin@localhost:3306/myblog',//打开页面跟踪'SHOW_PAGE_TRACE' => true,//模板文件'TMPL_TEMPLATE_SUFFIX' => '.tpl',//后缀名'TMPL_FILE_DEPR' => '_', //修改模板文件目录层次//模板主题'DEFAULT_THEME' => 'my','TMPL_DETECT_THEME' => true,'THEME_LIST' => 'your,my',//支持的模板列表//自定义模板常量'TMPL_PARSE_STRING' => array('__CSS__' => __ROOT__.'/Public/css','__JS__' => __ROOT__.'/Public/js'),);?>数据库连接    在config.php中配置:'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置用户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端口号'DB_PREFIX'=>'tp_', //设置表前缀//也可以使用DSN方法进行配置,表前缀要单独配置'DB_DSN'=>'mysql://root:root@localhost :3306/thinkphp',//使用DSN方式配置数据库信息,如果两种方式同时存在,以DSN方式为优先    连接:需要在方法中通过new Model(表名)的形式操作数据库$m=new Model('User');$arr=$m->select();    还有一种简写方式://M() 等效为 new Model();$m=M('User');$arr=$m->select();    使用模型的实例可以对数据进行操作,操作的工作一般就是对数据库进行 增删改查 CURD    增 -C Create $m->add()     删 -D Delete $m->delete()     改 -U Update $m->save()     查 -R Read   $m->select() 通过 $m->getDbError(); 可以输出数据库的错误信息读取数据    对数据的读取 Read$m=new Model('User');$m=M('User');//select$m->select();//获取所有数据,以数组形式返回//find$m->find($id);//获取单条数据//getField(字段名)//获取一个具体的字段值$arr=$m->where('id=2')->getField('username');添加数据    对数据的添加 Create  $m=new Model('User');$m=M('User');//$m->字段名=值$m -> 'name' = 'tim';$ret = $m->add();//返回值$ret是新增的id号删除数据    对数据的删除$m=M('User');$ret = $m->delete(2); //删除id为2的数据$ret = $m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据//返回值$ret是受影响行数更新数据    对数据的更新$m=M('User');$data['id']=1;$data['username']='ztz2';$ret = $m->save($data);//返回值$ret是受影响行数数据库查询方式1、普通查询方式    a、字符串$arr=$m->where("sex=0 and username='gege'")->find();    b、数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();//注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值$data['sex']=0;$data['username']='gege';$data['_logic']='or';2、表达式查询方式//id < 6$data['id']=array('lt',6);$arr=$m->where($data)->select();//其他比较操作符//EQ 等于//NEQ不等于//GT 大于//EGT大于等于//LT 小于//ELT小于等于//LIKE 模糊查询$data['username']=array('like','%ge');//NOTLIKE$data['username']=array('notlike','%ge%'); //notlike中间没有空格//注意:如果一个字段要匹配多个通配符$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系$arr=$m->where($data)->select();//BETWEEN$data['id']=array('between',array(5,7));//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )$data['id']=array('not between',array(5,7));//注意,not 和 between中间一定要有空格//IN$data['id']=array('in',array(4,6,7));//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )//NOT IN$data['id']=array('not in',array(4,6,7));//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )3、区间查询$data['id']=array(array('gt',4),array('lt',10));//默认关系是 and 的关系//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) )$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');4、统计查询count //获取个数max //获取最大数min //获取最小数avg //获取平均数sum //获取总和5、SQL直接查询    a、query 主要数处理读取数据的    成功返回数据的结果集,失败返回boolean false$m=M();$result=$m->query("select * from t_user where id >50");    b、execute 用于更新个写入操作        成功返回影响行数,失败返回boolean false$m=M();$result=$m->execute("insert into t_user(`username`) values('ztz3')");常用连贯操作    1.where 帮助我们设置查询条件    2.order 对结果进行排序$arr=$m->order('id desc')->select();$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();    3.limit限制结果limit(2,5)limit('2,5')limit(10)//limit(0,10)    4.field设置查询字段field('username as name,id')field(array('username'=>'name','id')field('id',true) //获取除了id以外的所有字段    5.table        6.group    7.having    8.otheralias //用于给当前数据表定义别名 字符串page //用于查询分页(内部会转换成limit) 字符串和数字join* //用于对查询的join支持 字符串和数组union* //用于对查询的union支持 字符串、数组和对象distinct //用于查询的distinct支持 布尔值lock //用于数据库的锁机制 布尔值cache //用于查询缓存 支持多个参数(以后在缓存部分再详细描述)relation
现状thinkphp3.1.3版本中的验证码字符分布不均匀,在自定义宽高时很明显。调用代码:Image::buildImageVerify(6, 5, 'png', 150, 50);生成的验证码效果如下图所示:优化找到源码(ThinkPHPExtendLibraryORGUtilImage.class.php的buildImageVerify方法内):修改如下:$w = floor($width / $length);for ($i = 0; $i < $length; $i++) {imagestring($im, 5, mt_rand($i * $w, $i * $w + $w - 15), mt_rand(5, $height - 15), $randval{$i}, $stringColor);}优化后效果:
相对于之前随笔写的《ThinkPHP5.0实现app支付宝支付功能》来说,php对接app微信支付功能就相对简单的多了,最近有加我的朋友问到app微信支付,所以我把app微信支付的demo展示出来供大家参考一下,希望对做这个功能的人员给予参考和帮助,首先还是到支付页面:微信支付的步骤大致和支付宝支付的步骤差不多,这里我讲的详细一点。第一步:建立一个支付控制器pay.php,是由上个页面选择好支付方式之后确认支付后需要经过的控制器(这里选择的是微信支付),代码 如下:<?phpnamespace appmobilecontroller;use thinkController;class Pay extends Controller{public function pay_order(){$res = new OrderGoods();//获取订单号$where['id'] = input('post.order_sn');$reoderSn = input('post.order_sn');//查询订单信息$order_info = $res->where($where)->find();//获取支付方式$pay_type = input('post.pay_type');//微信支付 或者支付宝支付//获取支付金额$money = input('post.totle_sum');//判断支付方式switch ($pay_type) {case 'ali';//如果支付方式为支付宝支付break;case 'wx';$type['pay_type'] = 'wx';//更新支付方式为微信$res->where($where)->update($type);$wx = new Wxpay();//实例化微信支付控制器$body = '订单号' . $order_info;//支付说明$out_trade_no = $reoderSn;//订单号$total_fee = $money * 100;//支付金额(乘以100)$notify_url = '';//回调地址$order = $wx->getPrePayOrder($body, $out_trade_no, $total_fee, $notify_url);//调用微信支付的方法if ($order['prepay_id']){//判断返回参数中是否有prepay_id$order1 = $wx->getOrder($order['prepay_id']);//执行二次签名返回参数echo json_encode(array('status' => 1, 'prepay_order' => no_null($order1)));} else {echo json_encode(array('status' => 0, 'msg' => $order['err_code_des']));}break;}}}然后创建微信支付控制器了。命名为wx.php,用于执行微信支付,代码如下:<?phpnamespace appmobilecontroller;use thinkController;use thinkDb;class WxPay extends Controller{/*配置参数*/private $config = array('appid' => "",//"wxcf1dded808489e2c", /*微信开放平台上的应用id*/'mch_id' => "",//"1440493402", /*微信申请成功之后邮件中的商户id*/'api_key' => "" /*在微信商户平台上自己设定的api密钥 32位*/);//获取预支付订单public function getPrePayOrder($body, $out_trade_no, $total_fee, $notify_url){$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";$onoce_str = $this->getRandChar(32);$data["appid"] = $this->config["appid"];$data["body"] = $body;$data["mch_id"] = $this->config['mch_id'];$data["nonce_str"] = $onoce_str;$data["notify_url"] = $notify_url;$data["out_trade_no"] = $out_trade_no;$data["spbill_create_ip"] = $this->get_client_ip();$data["total_fee"] = $total_fee;$data["trade_type"] = "APP";$s = $this->getSign($data, false);$data["sign"] = $s;$xml = $this->arrayToXml($data);$response = $this->postXmlCurl($xml, $url);//将微信返回的结果xml转成数组// return $this->xmlstr_to_array($response);return xmlToArray($response);}//执行第二次签名,才能返回给客户端使用public function getOrder($prepayId){$data["appid"] = $this->config["appid"];$data["noncestr"] = $this->getRandChar(32);;$data["package"] = "Sign=WXPay";$data["partnerid"] = $this->config['mch_id'];$data["prepayid"] = $prepayId;$data["timestamp"] = time();$s = $this->getSign($data, false);$data["sign"] = $s;return $data;}/*生成签名*/function getSign($Obj){foreach ($Obj as $k => $v){$Parameters[strtolower($k)] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//echo "【string】 =".$String."</br>";//签名步骤二:在string后加入KEY$String = $String."&key=".$this->config['api_key'];// echo "<textarea width: 50%; height: 150px;'>$String</textarea> <br />";//签名步骤三:MD5加密$result_ = strtoupper(md5($String));return $result_;}//获取指定长度的随机字符串function getRandChar($length){$str = null;$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";$max = strlen($strPol)-1;for($i=0;$i<$length;$i++){$str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数}return $str;}//数组转xmlfunction arrayToXml($arr){$xml = "<xml>";foreach ($arr as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}$xml.="</xml>";return $xml;}//post https请求,CURLOPT_POSTFIELDS xml格式function postXmlCurl($xml,$url,$second=30){//初始化curl$ch = curl_init();//超时时间curl_setopt($ch,CURLOPT_TIMEOUT,$second);//这里设置代理,如果有的话//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);curl_setopt($ch,CURLOPT_URL, $url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//运行curl$data = curl_exec($ch);//返回结果if($data){curl_close($ch);return $data;}else{$error = curl_errno($ch);echo "curl出错,错误码:$error"."<br>";echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a&
最近做一个后台发送消息推送到app(android和ios)的功能,该功能采用的是个推接口,基于php的,我用TP5来实现这个推送流程。先看官方demo吧。可以先参考官方给到的例子来看http://docs.getui.com/getui/server/php/push/。由于该APP下载量比较大,考虑到要推送给所有下载app的用户,所以这里就不能用针对于单个用户进行推送了,必须针对应用群体进行推送。场景如下:  文档中给到的php例子是这个:<?php//消息推送Demoheader("Content-Type: text/html; charset=utf-8");require_once(dirname(__FILE__) . '/' . 'IGt.Push.php');define('APPKEY','请输入您的APPKEY');define('APPID','请输入您的APPID');define('MASTERSECRET','请输入您的MASTERSECRET');define('HOST','http://sdk.open.api.igexin.com/apiex.htm');define('CID','请输入您的CID');pushMessageToApp();function pushMessageToApp(){$igt = new IGeTui(HOST,APPKEY,MASTERSECRET);$template = IGtLinkTemplateDemo();//个推信息体//基于应用消息体$message = new IGtAppMessage();$message->set_isOffline(true);$message->set_offlineExpireTime(10 * 60 * 1000);//离线时间单位为毫秒,例,两个小时离线为3600*1000*2$message->set_data($template);$appIdList=array(APPID);$phoneTypeList=array('ANDROID');$provinceList=array('浙江');$tagList=array('haha');$cdt = new AppConditions();$cdt->addCondition(AppConditions::PHONE_TYPE, $phoneTypeList);$cdt->addCondition(AppConditions::REGION, $provinceList);$cdt->addCondition(AppConditions::TAG, $tagList);$message->set_appIdList($appIdList);$message->set_conditions($cdt);$rep = $igt->pushMessageToApp($message);var_dump($rep);echo ("<br><br>");}function IGtLinkTemplateDemo(){$template = new IGtLinkTemplate();$template ->set_appId(APPID);//应用appid$template ->set_appkey(APPKEY);//应用appkey$template ->set_title("请输入通知标题");//通知栏标题$template ->set_text("请输入通知内容");//通知栏内容$template ->set_logo("");//通知栏logo$template ->set_isRing(true);//是否响铃$template ->set_isVibrate(true);//是否震动$template ->set_isClearable(true);//通知栏是否可清除$template ->set_url("http://www.getui.com/");//打开连接地址//$template->set_notifyStyle(0);//$template->set_duration(BEGINTIME,ENDTIME); //设置ANDROID客户端在此时间区间内展示消息//iOS推送需要设置的pushInfo字段// $apn = new IGtAPNPayload();// $apn->alertMsg = "alertMsg";// $apn->badge = 11;// $apn->actionLocKey = "启动";// // $apn->category = "ACTIONABLE";// // $apn->contentAvailable = 1;// $apn->locKey = "请输入通知栏内容";// $apn->title = "请输入通知栏标题";// $apn->titleLocArgs = array("titleLocArgs");// $apn->titleLocKey = "请输入通知栏标题";// $apn->body = "body";// $apn->customMsg = array("payload"=>"payload");// $apn->launchImage = "launchImage";// $apn->locArgs = array("locArgs");//// $apn->sound=("test1.wav");;// $template->set_apnInfo($apn);return $template;}?>然后下载sdk,下载地址:http://docs.getui.com/download.html然后看我自己实现流程:当我在后台对某一条消息进行推送的时候 利用ajax传过来消息标题和内容,在控制器中用一个方法去接收://手机推送public function pushPhone(){$this->base();if ($this->token == 2) {return '';}$list_id = Request::instance()->param('list_id');$list_title = Request::instance()->param('list_title');$info = new geTui();//实例化个推类$listId = ['type' => 'list','value' => $list_id,'title' => '消息标题','content' => $list_title,//消息内容];$res = $info->pushMessageToApp($listId);/调用推送类if ($res['result'] == 'ok') {return ['code' => '1', 'msg' => '推送成功!'];} else {return ['code' => '0', 'msg' => '推送失败!'];}}看一下这个geTui类存放位置以及代码:我把下载的sdk放在extend文件夹下了。然后重新创建了一个名为geTui的php文件<?phpnamespace apppush;use thinkLoader;class GeTui{private $host = 'http://sdk.open.api.igexin.com/apiex.htm';//测试private $appkey = '';private $appid = '';private $mastersecret = '';//群推接口案例function pushMessageToApp($mes,$listId){import('getui.IGt', '', '.Push.php');$igt = new IGeTui($this->host, $this->appkey, $this->mastersecret);$template = $this->IGtTransmissionTemplateDemos($mes,$listId);//$template = IGtLinkTemplateDemo();//个推信息体//基于应用消息体Loader::import('getuiigetuiIGT.AppMessage', EXTEND_PATH);$message = new IGtAppMessage();$message->set_isOffline(true);$message->set_offlineExpireTime(10 * 60 * 1000);//离线时间单位为毫秒,例,两个小时离线为3600*1000*2$message->set_data($template);$appIdList=array($this -> appid);$phoneTypeList=array('ANDROID');//忽略了$provinceList=array('浙江');//这个也忽略了$tagList=array('haha');//用户属性//$age = array("0000", "0010");//$cdt = new AppConditions();// $cdt->addCondition(AppConditions::PHONE_TYPE, $phoneTypeList);// $cdt->addCondition(AppConditions::REGION, $provinceList);//$cdt->addCondition(AppConditions::TAG, $tagList);//$cdt->addCondition("age", $age);$message->set_appIdList($appIdList);//$message->set_conditions($cdt->getCondition());$rep = $igt->pushMessageToApp($message);return $rep;
$cond['platform_id'] = array('eq', $p['keyword']);$cond['uid'] = array('eq', $p['keyword']);$cond['_logic'] = 'or';         $cond = array();        $cond['_complex1'] = array(            'dna1' => array('like', '%'.$animals[0].'%'),            'dna2' => array('like', '%'.$animals[1].'%'),        );        $cond['_complex2'] = array(            'dna1' => array('like', '%'.$animals[1].'%'),            'dna2' => array('like', '%'.$animals[0].'%'),        );        $cond['_logic'] = 'or';        $conf = $core_combine->where($cond)->find(); 
我们要实现如下图分页效果 这个分页类是在thinkphp框架内置的分页类的基础上修改而来;原分页类的一些设计,在实际运用中感觉不是很方便; 1、只有一页内容时不显示分页; 2、原分页类在当前页是第一页
由于用惯了tp3.2,改用tp5有些还是感觉别扭的 直接上问题:项目中需要用到引入公共导航、头部、底部、右边部分等等 首先要弄清楚thinkphp5的配置项是哪个文件,众所周知:config.php,
thinkphp编辑器回显问题如下: 解决办法如下: 对于编辑器发布的内容,前台模板显示为html的解决办法是: 在模板输出字段加入html_entity_decode()函数
直接看上面的代码 然后看下面的示例代码 解释如下:$data为分配到模板的变量,tag为公司标签集变量 拿循环出的标签集里t_Id 判断是否在 $data.c_Tag里面来确定是否输出 checked
ThinkPHP5.0+JQuery实现文件的异步上传功能
1 $file_name = '后弦 - 下完这场雨 (铃声).mp3'; 2 $arr = $this->getInfo($file_name);//返回音频的信息 3 $ti
因项目没有PC站所以没有写电脑网站支付。 Pay.php支付控制器 模型:Weixin.php Weixin.php Alipay.php 支付宝需要的submit文件:点击下载 wx.html在使用