ThinkPHP学习笔记

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' );


 
时不我待,不负韶华!立刻行动!不吃学习的苦就会吃生活的苦!
原文地址:https://www.cnblogs.com/zrp2013/p/3567007.html