zoukankan      html  css  js  c++  java
  • 自动完成

    ThinkPHP 模型层提供的数据处理方法,主要用于数据的自
    动处理和过滤,使用 create()方法创建数据是会自动完成。

    一. 完成规则

    自动完成一般通过默认字段写入、安全字段过滤以及业务逻辑的自动处理等。有两种方
    式实现自动完成的规则:1.静态方式:在模型类里通过$_auto 属性定义处理规则;2 动态
    方式:使用模型类的 auto 方法动态创建自动处理规则。

    1 //完成规则
    2 array(
    3 array(完成字段1,完成规则,[完成条件,附加规则]),
    4 array(完成字段2,完成规则,[完成条件,附加规则]),
    5 ......
    6 );

    完成字段:必填,需要的字段名;
    完成规则:必填,配合附加规则完成;
    完成条件:可选,具体如下:
    1.self::MODEL_INSERT 或 1,新增数据的时候处理(默认);
    2.self::MODEL_UPDATE 或 2,更新数据的时候处理;
    3.self::MODEL_BOTH 或 3,所有情况均处理。


    附加规则:可选,配合完成规则使用,包括一下规则:

     规则  说明
     function  函数完成,定义的验证规则是一个函数名
     callback  方法完成,定义的验证规则是当前模型类的一个方法
     field  用其他字段填充,表示填充的内容是一个其他字段的值
     string   字符串(默认)
     ignore  为空则忽略(3.1.2新增)

    二. 静态定义
    在模型类里预先定义好该模型的自动完成规则,就是静态定义。

    在  Home/controller/UserController.class.php 里插入以下代码:

    1 public function add() {
    2             $user=D('User');
    3             $data['user']='蜡笔大新';
    4             $data['email']='bbb@qq.com';
    5             if($user->create($data)) {
    6                 $user->add();
    7             }
    8         }

    注意一下的是: $user->add(); 里不再需要加上$data了否则后面的功能就实现不了了。

    然后在 Home/Model/UserModel.class.php 插入以下代码:

     1 <?php
     2 namespace HomeModel;
     3 use ThinkModel;
     4 
     5 class UserModel extends Model {
     6     protected $_auto = array(
     7         array('count','1'),
     8         array('user','sha1',3,'function'),
     9         );
    10 }

    这时当执行 Home/controller/UserController.class.php 的add()函数时,添加到数据库的数据中的count下的数值会自动加一,同时user会使用sha1加密,

     array('user','sha1',3,'function'), 中使用了function,当并没有在conmon文件夹下的common下建立function.php,并在其中建立function sha1函数,

    是因为sha1加密函数是ThinkPHP自带的,已经封装好了,md5加密方式也是。

    还有诸如:

    1 array('user','email',3,'field'),

    是把email写入到用户名中。

    callback,给用户名加前缀

    这时就是当添加用户名到数据库时,给上传的用户名加上前缀

     在 Home/controller/UserController.class.php 下插入:

    1 public function add() {
    2             $user=D('User');
    3             $data['id']=12;
    4             $data['user']='dedede';
    5             $data['email']='dead@qq.com';
    6             if($user->create($data)) {
    7                 $user->add();
    8             }
    9         }

    然后在 Home/Model/UserModel.class.php 中插入:

     1 <?php
     2 namespace HomeModel;
     3 use ThinkModel;
     4 
     5 class UserModel extends Model {
     6     protected $_auto = array(
     7         array('user','updateUser','3','callback','_'),//'_'即为updateUser($str,$prefix)中的$prefix
     8         );
     9 
    10     protected function updateUser($str,$prefix) {
    11         return $prefix.$str;
    12     }
    13 }

    这时每次往数据库插入一条数据,都会在user下的用户名前加上'_'

    1 //ignore,用于修改时密码留空时,忽略修改
    2 array('password', '', 2, 'ignore'),

    这是在 Home/controller/UserController.class.php 中当提交的时候用户名为空时,则忽略掉不改变数据库中的用户名,只改变密码就好了。

    三. 动态完成
    动态完成就是把完成的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比较混乱

     1 public function add() {
     2             $rules=array(
     3                 array('user','sha1',3,'function'),
     4                 );
     5             $user=M('User');
     6             $data['user']='蜡笔小新';
     7             if($user->auto($rules)->create($data)) {
     8                 $user->add();
     9             }
    10         }

    需要注意的是在得到添加的数据时,auto前面不要加$符号。

  • 相关阅读:
    11.29
    11.28
    11.24
    11.21
    11.17
    11.15
    11.14
    11.9
    11.5
    11.3
  • 原文地址:https://www.cnblogs.com/jacson/p/4501175.html
Copyright © 2011-2022 走看看