ThinkPHP 3.2.2中 的自动完成功能!

在处理表单的时候,如果表单的字段量比较大的时候,我们处理起来会比较费劲。这时候,ThinkPHP的自动完成功能可以很好的解决这个问题。

这里介绍的是ThinkPHP中的静态验证

静态定义方式因为必须定义模型类,所以只能用D函数实例化模型

这个表是用来测试用的。

我们需要一个表单:

    <form action="{:U('Tuser/insert')}" name="tuserForm" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="" /></td>
            </tr>
            <tr>
                <td>邮箱:</td>
                <td><input type="text" name="email" value="" /></td>
            </tr>
            <tr>
                <td>内容:</td>
                <td><textarea name="content" id=""></textarea></td>
            </tr>
            <tr>
                <td>验证码:</td>
                <td><input type="text" name="verify" value="" /><img src="{:U('Index/verify')}" alt="" onclick="this.src='{:U("Index/verify")}'+'?ran='+Math.random()" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="添 加" /></td>
            </tr>
        </table>
    </form>

这个页面中的表单!

 

 

下面的部分是关键,就是定义一个模型

namespace Home\Model;
use Think\Model;

class TestUserModel extends Model {
    /*自动完成*/
    protected $_validate = array(
        array('username','require','请输入用户名',1)
        ,array('username','/^[a-zA-Z]\w{3,19}$/','字母开头,4-20位数字字母或下划线',1,'regex',3)
        ,array('email','require','请输入邮箱',1)
        ,array('email','email','邮箱格式错误',1)
        ,array('email','','邮箱已经存在',0,'unique',1)
        ,array('content','require','请输入内容',1)
        ,array('content','checkContent','发布内容最少5个,最多255个字符',1,'callback',1)
        ,array('verify','require','请输入验证码',1)
        ,array('verify','checkVerify','验证码错误',0,'callback',1)
        );
    protected $_auto = array(
        array('create_time','time',1,'function')
        );


    protected function checkContent() {
        $content = I("content");
        if(strlen($content) <5 || strlen($content) >255) {
            return false;
        } else {
            return true;
        }
    }
    protected function checkVerify() {
        $code = I("verify");
        $verify = new \Think\Verify();
        return $verify->check($code, 1);
    }
}

详细解释一下这里的定义:

$_validate=array(

  array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间])

  ,array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间])

);

这是模型中必须要定义的一个数组,这个数组再定义各个表单中的字段规则:

数组中的“子数组”的元素:

①验证字段(必须):定义要操作的字段名,即表单中name="?"的?号部分

②验证规则(必须)

要进行验证的规则,需要结合附加规则,如果在使用正则验证的附加规则情况下,

系统还内置了一些常用正则验证的规则,可以直接作为验证规则使用,

系统内置的验证规则包括:require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字。除此之外的规则,用户自己定义。

③提示信息(必须)

用于验证失败后的提示信息定义

以上①②③部分是必须定义的部分:即验证字段、验证规则、提示信息

 

系统提供的内置验证规则往往不能满足所有需要,这时候我们就要定义附加规则:

④验证条件:

  • self::EXISTS_VALIDATE        或者        0 存在字段就验证(默认)
  • self::MUST_VALIDATE           或者         1 必须验证
  • self::VALUE_VALIDATE         或者         2 值不为空的时候验证

⑤附加规则:

规则说明
regex 正则验证,定义的验证规则是一个正则表达式(默认)
function 函数验证,定义的验证规则是一个函数名
callback 方法验证,定义的验证规则是当前模型类的一个方法
confirm 验证表单中的两个字段是否相同,定义的验证规则是一个字段名
equal 验证是否等于某个值,该值由前面的验证规则定义
notequal 验证是否不等于某个值,该值由前面的验证规则定义(3.1.2版本新增)
in 验证是否在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串
notin 验证是否不在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串(3.1.2版本新增)
length 验证长度,定义的验证规则可以是一个数字(表示固定长度)或者数字范围(例如3,12 表示长度从3到12的范围)
between 验证范围,定义的验证规则表示范围,可以使用字符串或者数组,例如1,31或者array(1,31)
notbetween 验证不在某个范围,定义的验证规则表示范围,可以使用字符串或者数组(3.1.2版本新增)
expire 验证是否在有效期,定义的验证规则表示时间范围,可以到时间,例如可以使用 2012-1-15,2013-1-15 表示当前提交有效期在2012-1-15到2013-1-15之间,也可以使用时间戳定义
ip_allow 验证IP是否允许,定义的验证规则表示允许的IP地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6
ip_deny 验证IP是否禁止,定义的验证规则表示禁止的ip地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6
unique 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值,当表单数据中包含主键字段时unique不可用于判断主键字段本身

⑥验证时间:

  • self::MODEL_INSERT        或者       1新增数据时候验证
  • self::MODEL_UPDATE       或者       2编辑数据时候验证
  • self::MODEL_BOTH          或者        3全部情况下验证(默认)

那么在控制器中应该如何使用这个模型类呢namespace Home\Controller;

use Think\Controller;

class TuserController extends Controller {
    public function insert() {
        if(!IS_POST) $this->error("页面不存在");
        $tuser = D("TestUser");
        if (!$tuser->create()){
            // 如果创建失败 表示验证没有通过 输出错误提示信息
            header("Content-Type:text/html;Charset=UTF-8");
            exit($tuser->getError());
        }else{
            // 验证通过 可以进行其他数据操作
            if($tuser->add()) {
          
        } else {
          
        }
} } }

这样一个表单的自动完成功能就实现了。ThinkPHP 3.2 过后的框架设计我觉得还是很值得学习的。

posted @ 2014-12-22 12:15  Zell~Dincht  阅读(1573)  评论(0编辑  收藏  举报