tp-note
1、AJAX传路径
img中的路径URL通过ajax传值出现错误时,在JS中调用
encodeURLComponent(URL);方法进行编码后传值,在处理页面
调用urldecode(URL);方法进行解码
2、TP验证码
2.1 生成验证码的操作方法
1 functions yzm() 2 { 3 $Verify = new \Think\Verify(); 4 $Verify->entry(); 5 }
备注:
a.如果需要生成多个验证码,entty方法需要传入标记信息;
b.验证码的参数设定
1 $config = array( 2 'expire' => 1000,//验证码有效时间(秒) 3 'useImgBg => false,//是否使用背景图片,默认false,开启后随机使用 ThinkPHP/Library/Think/Verify/bgs 目录下面的图片 4 'fontSize' => 30,// 验证码字体大小(像素) 5 'useCurve' => true,//是否使用混淆曲线 6 'imageW' => 0,//验证码宽度,0为自动计算 7 'imageH' => 0,//验证码高度,0为自动计算 8 'length' => 3,// 验证码位数 9 'fontttf' => '5.ttf',//指定验证码字体,默认自动选择,也可指定ThinkPHP/Library/Think/Verify/ttfs/目录下的字体文件 10 'useNoise' => false, // 关闭验证码杂点); 11 12 $Verify = new \Think\Verify($config);
2.2显示页面
1 <div> 2 <img id="yzm" src="__CONTROLLER__/yzm" /> 3 <input type="text" /> 4 </div>
2.3检测验证码的操作方法id为验证码标记
1 function check_verify($code, $id = '') 2 { 3 $verify = new \Think\Verify(); 4 return $verify->check($code, $id); 5 }
2.4点击改变验证码
1 <script type="javascript> 2 $("#yzm").click(function(){ 3 $(this).attr("src","__CONTROLLER__/yzm"); 4 }) 5 </script>
3、文件上传
3.1 显示页面
1 <form action="__ACTION__" enctype="multipart/form-data" method="post" > 2 <input type="file" name="photo" /> 3 <input type="submit" value="提交" > 4 </form>
3.2 上传文件操作方法
1 function ShangChuan()
2 {
3 if(empty($_POST)
4 {
5 $this->display();
6 }
7 else
8 {
9 $upload = new \Think\Upload();// 实例化上传类
10 $upload->maxSize = 3145728 ;// 设置附件上传大小
11 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
12 $upload->rootPath = './Public/';//设置上传文件根路径
13 $upload->savePath = './Public/Uploads/'; // 设置附件上传目录
14 // 上传文件
15 $info = $upload->upload();
16 if(!$info)
17 {
18 // 上传错误提示错误信息
19 $this->error($upload->getError());
20 }
21 else
22 {
23 // 上传成功,获取上传文件信息
24 echo $file['savepath'].$file['savename']; //获取上传文件路径和名称
25 } 26 } 27 }
3.3 上传文件命名规则
a.函数方式命名
如果传入的字符串是一个函数名,那么表示采用函数动态生成上传文件名(不包括文件后缀)
1 $upload->saveName = 'time';// 采用时间戳命名 2 $upload->saveName = 'com_create_guid';// 采用GUID序列命名 3 $upload->saveName = 'myfun'; // 采用自定义函数命名
如果是只有一个参数或者没有参数的函数,直接使用字符串设置即可,如果需要传入额外的参数,可以使用数组方式
1 $upload->saveName = array('date','Y-m-d'); // 采用date函数生成命名规则 传入Y-m-d参数 2 $upload->saveName = array('myFun',array('__FILE__','val1','val2'));// 如果有多个参数需要传入的话 可以使用数组
b.直接设置上传文件名
如果传入的参数不是一个函数名,那么就会直接当做是上传文件名
1 $upload->saveName = time().'_'.mt_rand();//采用时间戳加一个随机数的组合字符串方式 2 $upload->saveName = 'ThinkPHP';//固定设置一个上传文件的命名规则
c.保持上传文件名不变
1 upload->saveName = '';
一般来说不建议保持不变,因为会导致相同的文件名上传后被覆盖的情况。
3.4 子目录保存
如果希望对上传的文件分子目录保存,可以设置autoSub
和subName
参数来完成
1 // 开启子目录保存 并以日期(格式为Ymd)为子目录 2 $upload->autoSub = true; 3 $upload->subName = array('date','Ymd');
可以使用自定义函数来保存
1 // 开启子目录保存 并调用自定义函数get_user_id生成子目录 2 $upload->autoSub = true; 3 $upload->subName = 'get_user_id';
注意:如果get_user_id函数未定义的话,会直接以get_user_id字符串作为子目录的名称保存。
4、关于JS和CSS路径问题
找路径是从入口文件index.php来找的,在存放JS和CSS的时候可以放到public文件夹下
a.使用import标签 type属性默认js,起始路径是Public目录,如果指定其他目录可使用basepath属性修改
1 <import file="Js.Util.Array" basepath="./Common" />
js文件导入,两种方式均可,也可导入多个js文件,用逗号隔开
1 <import type='js' file="Js.Util.Array" /> 2 <import file="Js.Util.Array" /> 3 4 <import file="Js.Util.Array,Js.Util.Date" />
css文件导入,必须指定type属性值
1 <import type='css' file="Css.common" />
b.load标签,通过文件方式导入当前项目的公共JS或者CSS,无需指定type属性,可自动判断
1 <load href="__PUBLIC__/Js/Common.js" /> 2 <load href="__PUBLIC__/Css/Common.css" />
c.js和css标签,用法和load一致
1 <js href="/Public/Js/Common.js" /> 2 <css href="/Public/Css/common.css" />
5、第三方类引入
有两块地方可以放第三方类:(1)模块下面;(2)Library下面新建文件夹或者旧的文件夹里面;
放进去之后,需要添加命名空间,命名空间从根命名空间写起
注意类文件的命名规则和类名的规则
6、Ajax返回
(1)url要变为MVC模式,指向的不是具体页面,是操作方法
(2)在操作方法里面返回值的时候,使用ajaxReturn()方法返回,注意返回类型,返回类型要和第二个参数一致
(3)date的name要与数据库里的列名一致
ajaxReturn方法调用,第二个参数返回数据格式默认JSON,可按需改变为"xml"XML格式,"eval"DATE格式
1 $data = 'ok'; 2 $this->ajaxReturn($data);
也可以通过配置DEFAULT_AJAX_RETURN进行设置
7、会话Session Cookie
默认情况下,初始化之后系统会自动启动session,如果不希望系统自动启动session的话,可以设置SESSION_AUTO_START
为false
Session赋值:session('name','value');//设置session
Session取值:
$value = session('name');
删除session:session('name',null);// 删除name
session(null);// 清空当前的session
判断一个session值是否已经设置:session('?name');
// 判断名称为name的session值是否已经设置
Cookie与Session用法基本相同
8、防止用户绕过登录直接访问操作方法
做一个控制器的父类,在该父类里面写一个构造方法,构造方法里面判断session里面有没有值
9、控制器
9.1 配置
读取配置:获取已经设置的参数值:C('参数名称')
设置新的值:C('参数名称','新的参数值');
9.2 获取系统常量信息 get_defined_constants(true);
获取TP框架的根目录:__ROOT__
获取当前操作方法的路径(包含变量和参数):__SELF__
获取入口文件路径:__APP__
获取当前模块路径:__MODULE__
获取当前控制器的路径:__CONTROLLER__
获取当前操作方法的路径(不包含变量和参数):__ACTION__
10、命名空间
命名空间相当于一个虚拟的目录,正常管理文件使用文件夹--物理区分
TP框架的初始命名空间是:ThinkPHP\Library
在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\Library)
a.系统目录下根命名空间是ThinkPHP\Library下面的文件夹名称命名的
b.模块的根命名空间是以模块名命名的
在定义命名空间的时候需要从根写起例如:Home\Controller 例如:Think\Model;
如果要使用某个类文件,引入该类命名空间的时候:使用use关键字,后面写该类的命名空间 后面加上 "\文件名"
如果不想引入命名空间:在造类的对象的时候可以使用\(初始命名空间)来找到对应的类
例如:new \Think\Page(30);
11、空操作、空控制器
当访问空控制器时,提示非法操作,会暴露很多系统信息,安全性降低
11.1 空操作方法
在控制器父类中的魔术方法:__CALL() 控制器不存在时自动调用,可以通过两种方法解决
a.在子类中增加_empty()方法
1 function _empty(){ 2 echo "访问信息不存在"; 3 }
b.在View/Main/文件夹中新建模板文件
11.2 空控制器
在Home/Controller/文件夹中创建EmptyController.class.php文件
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class EmptyController extends Controller 5 { 6 public function _empty() 7 { 8 echo"访问页面不存在,请确认地址栏是否输入正确"; 9 } 10 }
12、视图模板
12.1 变量
注入变量:$this->assign('name',$name);
模板显示:$this->display();
12.2 模版继承
每个区块由<block></block>
标签组成,block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的,
block标签中可以包含任何模板内容,包括其他标签和变量,或者是加载外部文件,一个模板中可以定义任意多个名称标识不重复的区块。如下"base.html"模版
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <block name="title"><title>标题</title></block> 5 </head> 6 <body> 7 <block name="menu">菜单</block> 8 <block name="left">左边分栏</block> 9 <block name="main">主内容</block> 10 <block name="right">右边分栏</block> 11 <block name="footer">底部</block> 12 </body> 13 </html>
子模板中使用了extend标签定义需要继承的模板,extend标签的用法和include标签一样,你也可以加载其他模板或者使用绝对文件路径加载
1 <extend name="base" />
在当前子模板中,只能定义基础模板中已经定义的区块而不能定义其他的模板内容,否则将会直接忽略。可以对基础模板中的区块进行重载定义,
如果没有重新定义的话,则表示沿用基础模板中的区块定义,如果定义了一个空的区块,则表示删除基础模板中的该区块内容。
12.3 包含文件
在当前模版文件中包含其他的模版文件使用include标签,标签用法:
1 <include file='模版表达式或者模版文件1,模版表达式或者模版文件2,...' />
模版表达式的定义规则为:模块@主题/控制器/操作
12.4 内置标签
a. IF标签
1 <if condition="($name eq 1) OR ($name gt 100) "> value1 2 <elseif condition="$name eq 2"/>value2 3 <else /> value3 4 </if>
在condition属性中可以支持eq等判断表达式,同上面的比较标签,但是不支持带有”>”、”<”等符号的用法,因为会混淆模板解析
修饰符 | 备用词 |
== | eq |
!= | ne,neq |
> | gt |
< | lt |
>= | gte,ge |
<= | lte,le |
! | not |
% | mod |
b.Foreach标签
例如: {$vo.id}:{$vo.name} name表示数据源 item表示循环变量。
1 <foreach name="list" item="vo" key="k" > 2 {$k}|{$vo.id}:{$vo.name} 3 </foreach>
13、数据库操作
13.1 Model:数据库中每张表对应一个模型类名是表名,类里面的成员变量是列名把一张表对应为一个类,其中一条数据对应一个对象
如果我们对该表的模型没有特殊操作的话可以不用建立该模型
实例化Model的三种方法:
a. $goods = new 命名空间GoodsModel();
b. $goods = D(‘模型标志’); 实例化Model对象
c. $obj = M(); 实例化父类对象
13.2 查询连贯操作
1 $car = M("Car"); //实例化数据库 2 $car->select()); //返回所有数据的二维数组 3 $attr = $car->where("brand='b002'")->select();//where方法可以添加查询条件 4 $attr = $car->table("Nation")->select();//table方法可以切换操作表 5 $attr = $car->field("Code,Name")->select();//可以指定查询的字段 6 $attr = $car->order("Oil desc")->select();//排序 7 8 $attr = $car->limit(2,2)->select(); //分页查询,如果一个参数n的话就是取前n个 9 10 $attr = $car->page(3,2)->select();//扩展,取第n页的几条数据 11 12 $attr = $car->field("Brand,count(*)")->group("Brand")->select();//分组查询 13 14 select * from Info join Nation on 条件 15 $attr = $car->join("Brand on Car.Brand = Brand.Brand_Code")->select();//连接查询 16 17 $attr = $car->distinct(true)->field("Brand")->select();//去重 18 $attr= $car->avg("Price"); //聚合函数
19 $attr = $car->find();//根据主键取一条数据,不写主键值默认返回第一条 20 $attr = $car->select("c001,c002"); //根据主键值查询,返回二维数组 21 22 $attr = $car->where("Name like '%奥迪%'")->order("Powers desc")->select();
13.3 添加数据
方式一:使用add(); 需要一个关联数组作为参数,key必须为字段名称
$model = D("Info"); $attr = array( 'Code'=>'p100', 'Name'=>'回家', 'Sex'=>true, 'Nation'=>'n002', 'Birthday'=>'1998-2-3' ); $attr["Code"] = "p111"; $attr["Name"] = "数据"; $attr["Sex"] = false; $attr["Nation"] = "n001"; $attr["Birthday"] = "1990-2-3";*/ $model->add($attr);
方式二:AR方式 操作实例化的对象
1 $model->Code = "p112"; 2 $model->Name = "火炬"; 3 $model->Sex =true; 4 $model->Nation = "n003"; 5 $model->Birthday = "1999-2-3"; 6 7 $model->add();
方式三:自动收集表单
1 function Add() 2 { 3 if(empty($_POST)) 4 { 5 $this->display(); 6 } 7 else 8 { 9 $model = D("Info"); 10 $model->create(); //自动收集表单并且创建数据 11 $model->Sex = $_POST["Sex"]=="男"?true:false; 12 $z = $model->add(); 13 if($z) 14 { 15 $this->success("添加数据成功!","Add",3); 16 } 17 else 18 { 19 $this->error("添加失败!","Add",5); 20 } 21 22 } 23 24 }
13.4 数据修改
方式一:数组方式
1 $attr = array( 2 "Code"=>"p001", 3 "Name"=>"张三", 4 "Sex"=>true, 5 "Nation"=>"n001", 6 "Birthday"=>"1999-2-3"); 7 //调用save方法来修改数据 8 $model->save($attr);
方式二:AR方式
1 $model->Name="王五"; 2 $model->Nation = "n001"; 3 4 $model->where("Code='p013'")->save();
方式三:自动收集表单修改
1 function Update() 2 { 3 $model = D("Info"); 4 if(empty($_POST)) 5 { 6 $code = "p001"; 7 $attr = $model->find($code); 8 9 $this->assign("shuju",$attr); 10 $this->display(); 11 } 12 else 13 { 14 $model->create(); 15 $model->save(); 16 } 17 }
主键值不允许修改,只用于查询定位
13.5 删除数据
1 function Delete() 2 { 3 //删除数据 4 $model = D("Info"); 5 6 //方式一:根据主键值删 7 $model->delete("p112"); 8 9 //方式二:根据条件删 10 $model->where("Nation='n001'")->delete(); 11 }
13.6 表单验证
a. 静态验证:在模型类(model)里面预先定义好该模型的自动验证规则;
定义格式:
array(
array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
......
);
1 namespace Home\Model; 2 use Think\Model; 3 class UserModel extends Model{ 4 protected $_validate = array( 5 array('verify','require','验证码必须!'), //默认情况下用正则进行验证
6 array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一 7 array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内 8 array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致 9 array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式 );}
静态定义方式因为必须定义模型类,所以只能用D函数实例化模型
echo $file['savepath'].$file['savename'];