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 子目录保存

如果希望对上传的文件分子目录保存,可以设置autoSubsubName参数来完成

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函数实例化模型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. echo $file['savepath'].$file['savename'];
posted @ 2016-08-02 17:02  沙瑞金书记  阅读(250)  评论(0编辑  收藏  举报