TP5 小知识
来源:互联网 发布:见父自然知孝 编辑:程序博客网 时间:2024/05/29 04:02
1.tp5获取前端传过来的值
用tp3的时候,表单传的值直接用$_POST获取,今天用到tp5的时候,看到了助手函数里面的input(),支持默认值和过滤。
input($key = '', $default = null, $filter = '') //变量名,默认值,过滤方法
例如
input('post.comments', '挂件', 'htmlspecialchars');
2.tp5的model里查询结果返回的是对象,那怎么获取data里面的数据呢?
比如$res是返回的对象, 它的data里面有我们查询的id和username,
如果是用的find()直接 $res['id'] $res['username'] 即可获得。
如果是select() 那么是二维数组,$res[0]['id'],$res[0]['username'] 即可获得二维数组中的键为0的数组的相关值
有兴趣知道原因可看:
http://blog.csdn.net/qq_15096707/article/details/62227624
3.tp5 点击更换验证码js
onclick="javascript:this.src=this.src+'?time='+Math.random()"
直接写在验证码的img标签里面,不用写函数了。
tp5验证码常用配置:写在全局config.php里面即可。
'captcha' => [ //验证码字符集合 'codeSet' =>'ASDFGHJKLPUYTREWQXCVBNM123456789asdfghjkmnbvcxqwertyp', // 验证码位数 'length' => 4, //验证后重置 'reset' =>true, //图片宽度 'imageW'=>150, //图片高度 'imageH'=>30, //使用背景图片 "useImgBg" =>false, //验证码字体大小(px) "fontSize" =>17, //是否画混淆曲线 "useCurve" => true, //是否添加杂点 "useNoise" =>false, //验证码过期时间(s) "expire" =>600, ],
4.tp5 数据库操作新增或保存save()
模型的新增和更新方法都是save
方法,系统有一套默认的规则来识别当前的数据需要更新还是新增。
- 实例化模型后调用save方法表示新增;
- 查询数据后调用save方法表示更新;
- save方法传入更新条件后表示更新;
如果你的数据操作比较复杂,可以显式的指定当前调用save
方法是新增操作还是更新操作。
显式更新数据:
// 实例化模型$user = new User;// 显式指定更新数据操作$user->isUpdate(true) ->save(['id' => 1, 'name' => 'thinkphp']); //最好不要用这个,直接update(条件)来更新
显式新增数据:
$user = User::get(1);$user->name = 'thinkphp';// 显式指定当前操作为新增操作$user->isUpdate(false)->save();
手册上有声明:注意不要在一个模型实例里面做多次更新,会导致部分重复数据不再更新,正确的方式应该是先查询后更新或者使用模型类的update
方法更新。
那么更新的时候 直接 $user->update('条件')即可,可不用save()来更新。
新增的时候 用save() 最好指定 isUpdate(false)。
5.tp5助手函数url()的路由地址不支持解析非索引数组变量,url()里面第一个参数不能是非索引数组的值
<div id='menu_list'><ul>{volist name="res" id="val"}<?php var_dump($val);//这是输出$val,方便观察?><li><a href='{:url("$val[0]")}'>{$val.name}</a></li>{/volist}</ul></div>
如上面的代码所示,{:url("$val[0]")} 会被解析成<?php echo $val[0]?>
页面正常输出:
如果$val的下标不是数字,那么{:url('')}里面第一个参数是不能正确解析的
<div id='menu_list'><ul>{volist name="res" id="val"}<?php var_dump($val)?><li><a href='{:url("$val['url']")}'>{$val.name}</a></li>{/volist}</ul></div>
结果如图:
报错提示,看解析结果,即可发现, 模版解析后输出的$val['url']中的单引号 会和href的单引号组合,从而导致错误,
当然写$val.url也是一样的结果,不管单引号和双引号如何调换,拼接,我都没有成功,最终只有把下标url变成数字。
也就是$val[0]。当然,助手函数明确说明了第一个是路由地址,应该理解成字符串,一般都是直接写地址了,估计也就我会写成变量传过来,有兴趣的话可以改一下助手函数。
url('index/blog/read','id=5&name=thinkphp');url('index/blog/read',['id'=>5,'name'=>'thinkphp']);上面两个,是正常的调用,参数如下
url('地址表达式',['参数'],['URL后缀'],['域名'])
6.tp5 ajax请求返回渲染后的模板
这个问题出现的原因是因为我想局部刷新左侧菜单,但是我通过返回的数组用Js追加元素的方式刷新以后会出现布局的偏移,虽然是一点点,但是很难受,最后想到了之前tp3.2.3可以直接返回模板,所以就想在tp5也这么处理,这样局部刷新就很简单,不用遍历数据,清空,追加等等操作。
正常的请求不都是 echo json_encode($arr)嘛,今天想着把渲染后的模板返回给ajax请求,试了半天也没试出来,
去TP官方论坛,特意找到了版主问了这个问题,版主几分钟后上线回答问题,没有回答我,估计是我问的太简单了。
最后在tp群里找到了解决的方法。
多次尝试代码如下:
$this->assign('res_t',$res_t); //模板赋值$html=$this->fetch('common/left'); //渲染模板,但是不直接returnreturn $html; //输出返回值 在这里输出的就是left.html的页面内容,输出的是字符串类型的
上面这个是自己结合群里提到的试验出来的,但是实际上还是要看手册,大腿告诉我,我这么写不规范,规范的写法应该是返回数组,通过js追加元素实现局部刷新,但是写法还是可以标准一些:
$this->assign('res_t',$res_t);Config::set('default_ajax_return','html'); //配置ajax默认的返回格式return $this->fetch('common/left'); //这样就不会输出模版,完成渲染并当作返回值,如果没有上面的配置,return $this->fetch()会报错
至于ajax接收到返回值,只需要用jquery转换成对象就可以了:
console.log($(data).html()) //这个输出的就是html内容。$(data) 就把返回值data由字符串格式转换成了对象
对于这个问题像个半天,总结了一下还是自己看手册没看全,如果知道更改了默认格式就可以 return $this->fetch();那么就不会折腾一下午了。当然,最后也发现遍历数组追加元素偏移的原因是一个class 属性少了一个字母...少了一个字母...一个字母....
当然了,这也是经验,毕竟自己踩过的坑,印象才最深刻,还是要感谢新加的群里的大神们的热心帮助,让我找到了解决问题的门路,独学而无友,则孤陋而寡闻。
当工作环境已经没人能给你思路,自己也看不见能让技术提高的机会的时候,趁着年轻,多走走。
7.tp5 url带参数,url传参数get不到
格式
{:url('admin/index/index',['id'=>1,'name'=>'admin'])}
控制器里获得参数不能用$_GET
$request = Request::instance();$res=$request->param();halt($res);//包含id和name
8.tp5关联模型,关联模型后查询结果对象取值,关联模型在model里进行查询
后记:关联模型好像不能关联删除和更新(可能是我操作的不对,也可能是本身就不可以了),关联模型查询出来的数据对象取值又比较麻烦,鉴于不能关联删除,已经没有优势,还是用链式操作进行关联查询吧 (2017-11-29)
今天看了一下关联模型,在手册上的例子都是在控制器中直接查询数据,如果在model里查询数据该怎么关联查询呢?
首先,需要设置关联模型:
//关联模型 public function connectmenushow(){ //一对一关联 还有一对多和从属关联,这里不列举了,去手册上看 return $this->hasOne('AdminMenuShow', 'uid', 'id')->field('uid,menu_id'); }
hasOne('a','b','c')//关联的模型a,外键b,当前模型的主键c
如果关联模型不懂的话 可以看这篇文章:http://blog.csdn.net/github_37512301/article/details/75675054
我想说的是查询数据和取出值:
手册上的例子是在控制器里用db 连接数据库查询,在model里这样查询:
public function show_admin(){$res=self::with('connectmenushow')->select();//connectmenushow 是上面设置关联的函数名foreach ($res as $k => $v) {//关联模型数据对象$obj = $v->relation;$arr[$k]['menu_id'] = $obj["connectmenushow"]['menu_id']; //这是关联模型的数据$arr[$k]['username'] = $v['username'];//主表数据$arr[$k]['password'] = $v['password'];//主表数据}halt($arr);}
主要用到了 with() ,打印结果是对象,但是对象里面有个relation属性,如图:
这里面包含上面关联模型设置的表里面的字段数据,获取这些数据要先从$v这个对象中选中这个属性,然后选中数组,然后先择相应的下标,这样即可获得关联查询的所有内容。
有帮助的话,点个赞,谢谢
- TP5 小知识
- tp5第一个小项目
- tp5的一些小方法
- 以小程序初识tp5
- TP5
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 小知识
- 【舞伴问题 -- 链队列实现】
- 如何绕过面试题中的小坑
- Jedis常见异常汇总
- CSS中:visited链接伪类的怪癖
- Mysql 字段拼接
- TP5 小知识
- 如何用 css 修出好看的照片
- 牛客网---2016---搜狐发奖金
- DrawerLayout 侧滑菜单
- 记录一次spring mvc事务不起作用的解决方案
- (算法分析Week10)Letter Combinations of a Phone Number[Medium]
- Python文件操作
- DDoS攻击之SSL Flood攻击
- 机器学习(十):随机森林与Bagging