您的位置:首页 > 编程语言 > PHP开发

ThinkPHP学习笔记

2014-02-25 16:13 615 查看
Thinkphp学习文档:http://doc.thinkphp.cn/manual/start.html

thinkphp命名
文件名采用驼峰法,首字母大写,
类名和文件名一致方法和属性采用驼峰法,首字母大写
函数名采用小写字母加下划线
数据表加字段采用小写字母加下划线
配置参数和常量使用大写字母加下划线以
双下划线打头的是魔术方法


目录    说明
Common    项目公共文件目录,一般放置项目的公共函数
Conf    项目配置目录,项目所有的配置文件都放在这里
Lang    项目语言包目录(可选 如果不需要多语言支持 可删除)
Lib    项目类库目录,通常包括Action和Model子目录
Tpl    项目模板目录,支持模板主题
Runtime    项目运行时目录,包括Cache(模板缓存)、Temp(数据缓存)、Data(数据目录)和Logs(日志文件)子目录,如果存在分组的话,则首先是分组目录。


thinkphp惯例配置文件
Thinkphp/common/convention.php
项目配置文件
Conf/config.php


thinkPHP缓存
define('RUNTIME_PATH','./MyApp/temp/');   定义缓存存放路径
define('NO_CACHE_RUNTIME',True);    不生成核心缓存
define('STRIP_RUNTIME_SPACE',false);  对于编译缓存的内容是否去掉空白和注释


thinkPHP类库导入,Think,ORG,Com将默认为系统基类库下相关目录
import("Think[ORG][Com].util.session")  将导入系统基类的lib/Think[ORG][Com]/util/session.class.php
import("MyApp.Action.UserAction")  将导入MyApp/lib/Action/UserAction.class.php
等同于 import("@.Action.UserAction");
Vendor('Zend.Filter.Dir')  将导入第三方类库目录vendor/zend/fileter/dir.php
'APP_AUTOLOAD_PATH'     => 'Think.Util.,ORG.Util.', 设置附加文件的自动导入路径,增加了一个ORG目录下
,注意需要多加一个点。


thinkPHP分组
配置文件中加入
'APP_GROUP_LIST'=>'Home,Admin',
'DEFAULT_GROUP'=>'Home',
项目目录结构中,每层加上Home,Admin的文件夹分层
访问效果
index.php/Home/index,由于Home是默认分组,所以还可以写为 index.php/index
idnex.php/Admin/index
model类可以不分组


URL伪静态
'URL_HTML_SUFFIX'  =>'.shtml',   将所有路径后加上.shtml的伪静态效果
URL重写
apache的http.conf配置文件中加载 mod_rewrite.so模块
AllowOverride None的None改为All
确保URL_MODEL设置为2
将.htaccess文件放到入口文件同级目录下
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
重启后就可以省略掉index.php


URL访问不再区分大小写
'URL_CASE_INSENSITIVE' => true
但如果我们定义一个UserTypeAction模块类,相应的多单词的模块名将变为
/index.php/user_type/list
而不能是
/index.php/usertype/list


空操作
如果系统找不到相应的方法,将定位于_empty方法
Public function _empty(){
如果找不到相应的模块,将定位于空模块EmptyAction
Class EmptyAction extends Action{


调用其他项目的其他模块中的方法
R("User","importUser","App2")   调用app2项目中的 UserAction模块中的importUser方法
R方法的调用格式:
R('[项目://][分组/]模块/操作','参数','控制器层名称')
R('Admin://Tool/User/info') //表示调用Admin项目Tool分组的User模块的info操作方法
R('User/info',array(15))    表示调用当前项目的User模块的info操作方法,并且id参数传入15


重定向
success可以设置为ajax返回,如:$this->success("新增成功!",true)
还可以使用重定向    $this->redirect('User/list', array('cate_id'=>2), 5,'页面跳转中~')
停留5秒后跳转刡User模块癿list操作,并且显示页面跳转中字样


thinkphp的curd操作
连贯操作不分前后,select在最后即可
where方法,查询范围定义
table定义要操作的数据表 $model->table('think_user user')->where('id=1')->select();
data方法在新增和保存数据之前对数据对象赋值
field方法定义要查询的字段 $model->field('id,nickname as name')->select();
order方法 对结果进行排序 order('id desc,statue desc')
limit方法对结果限制 limit('offset,length')
distinct对查询结果进行唯一过滤 $model->disctinct(true)->select()
插入数据
  方式一:
$model=M('User');
$model->create();
$model->add();
 方式二:
   M('User')->add($data); 

读取数据
$model=M('User');
  //不等于条件(id!=2),where条件的写法
  $where['id'] = array('neq',2);
  //查询id为1,2,5的值,where条件:
  where(array('id'=>array('in','1,2,5')));

$list=$model->where('status=1')->order('create_time')->limit(10)->select()/find()/getField('id,name');//返回的是数组
find方法只返回一条记录,getField方法返回指定字段值
更新数据
  方式一:
$model=M('User');
$data['name']='Thinkphp';
$data['email']='Thinkphp@gmail.con';
$model->where('id=5')->save($data);
  方式二:
  M('User')->save($data);//$data中含主键
或者:
$model=M('User');
$model->where('id=5')->setField('name','Thinkphp');
->setField(array('name','email'),array('Thinkphp','Thinkphp@gmail.com'));
->setInc('score','id=5',3); id等于5的用户积分加3
->setDec('score','id=5',3) id等于5的用户积分减5
删除数据
$model=M('User');
$model->where('id=5')->delete();
$model->where('status=0')->delete();

实例化空模型类

如果需要使用原生 SQL ,需要实例化一个空模型:

M()->query('SELECT * FROM think_user');

thinkphp自动验证和自动完成
令牌验证
在action中建立接受提交数据的方法,写入create方法  if( $user->create()){}
在模板中建立<form>,method设置为post方法,将自动加上令牌
在配置文件中可以使用 'TOKEN_ON'=>false;来关闭令牌
自动验证
需要在model中定义$validate属性,格式为:
array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间)
验证字段:需要验证的字段
验证规则:需要验证的规则,需要结合附加规则
错误提示:如果出现错误,需要一个什么样的提示
验证条件:0存在字段就验证(默认) 1必须验证 2值不为控时候验证
附加规则:配合验证规则,regex 前面是使用正则验证 function前面是使用函数验证 confirm 前面定义的是一个字段名,验证两个字段是否相等 equal验证是否等于某一个值 in验证是否在某个范围内 unique验证是否唯一 callback使用方法验证,前面规则是本类的一个方法
TP封装:require 字段必须验证;eamil 验证邮箱;url 验证url地址;currency 货币;number 数字
验证时间:1 新增数据时候验证 2 编辑数据时候验证 3 全部情况下验证(默认)

UserModel.class.php
class UserModel extends Model{                                  //对应数据库中的表user
protected $_validate=array(
array('username','require','用户名必填'),
array('username','checklen','用户名长度过长或过短',0,'callback'),
array('password','require','密码必填'),
array('repassword','require','重复密码必填'),
array('password','repassword','两次密码不一致',0,'confirm'),
array('createtime','number','您输入的不是数字'),
array('createip','email','邮箱格式不正确'),
array('verify','require','验证码必须!'), //默认情冴下用正则迕行验证
array('name','','帐号名称已绊存在!',0,’unique’,1), // 在新增癿旪候验证name字段是否唯一
);
function checklen($data){
if(strlen($data)>15 || strlen($data)<5){
return false;
}else{
return true;
}
}

}
UserAction.class.php
class UserAction extends Action {
function reg(){
$this->display();
}

function regadd(){
$user=D('user');
if($user->create()){
if($user->add()){
$this->success('注册成功');
}else{
$this->error('注册失败');
}
}else{
$this->error($user->getError());
}
}
}
自动完成
在model类定义的$_auto属性,可以完成数据自动处理,格式为:
array(填充字段,填充内容,填充条件,附加规则)
填充字段:需要处理的字段
填充条件:1新增时候处理 2更新数据的时候处理 3所有情况都处理
附加规则:function使用函数 callback回调方法,内容是当前模型的一个方法 field填充内容是一个字段的值 string填充的是一个字符串
protected $_auto = array (
array( 'status','1'),   //  新增的时候把 status字段设置为 1
array('password','md5',1,'function') ,  //  对password 字段在新增的时候使 md5 函数处理
array('name','getName',1,'callback'), // 对name字段在新增癿旪候回调getName方法
array('createtime','time',3,'function' ),  //  对create_time 字段在更新的时候写入当前时间戳
);


模板设置:
普通标签默认开始标记是 {,结束标记是 }。也可以通过设置TMPL_L_DELIM和TMPL_R_DELIM进行更改。例如,我们在项目配置文件中定义:
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',


1.自定义路径自动加载:在配置文件中convention.php配置
'APP_AUTOLOAD_PATH' =>'@.Common,@.Tool',
2.加载第三方类库:如Think/Extend/Vendor/Mine/MyTest.class.php
Vendor('Mine.MyTest','','.class.php');//后缀默认是.php,如果是.class.php需传
第三个参数,第二个参数表示基本路径,空表示Think/Extend/Vendor/
导入之后,先new一下类就可以使用类中的方法了,第三方类可以完全脱离Thinkphp
框架而存在,不必遵循Thinkphp的命名规范,类的文件名可以是.php也可以是.class.php。
3.M方法和D方法的区别
ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,
而 D方法 用于实例化一个用户定义模型类。
M方法 和 D方法 都可以在模型类文件不存在的情况下直接使用的,但显然 M方法 更高效;
但要使用模型类里面业务逻辑,就必须使用 D方法。
注意:D('User'),表名的首字母要大写
4.加载自定义配置文件my.php


(1)在config.php文件中的这项加上自定义文件my.php的路径,以下是在同一目录下的情况:
  'LOAD_EXT_CONFIG' => 'my'
(2)my.php中的内容:
<?php
return array(
'site' => 'zrptest.com'
);





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: