#1 jake

前面我们已经介绍了spVerifier的规则验证及信息提示方法,接下来我们继续开发spVerifier的能力,在验证中加入自己创建的验证规则。

首先我们看一下例子

class user extends spModel 
{
        public $pk = 'uid';
        public $table = 'user';

        // 我们定义自己的验证规则
        var $addrules = array(
                // 自定义验证规则的函数名可以有两种形式
                // 第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用
                // 第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。
                'youare' => 'checkname', //  '规则名称' => '验证函数名'
                'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
                // 当然我们还可以定义更多的自定义规则
        );

        var $verifier = array(
                "rules" => array( // 规则
                        'username' => array(
                                'notnull' => TRUE,
                                'minlength' => 5,
                                'maxlength' => 12,
                                'youare' => 'jake' // 加入了新的验证规则和验证值
                        ),
                        'phone' => array( // 这里要验证手机号
                                'notnull' => TRUE,
                                'is_phone' => TRUE, // 自定义的手机号验证规则
                        ),
                ),
                "messages" => array( // 提示信息
                        'username' => array(
                                'notnull' => "姓名不能为空",
                                'minlength' => "姓名不能少于5个字符",
                                'maxlength' => "姓名不能大于20个字符",
                                'youare' => "看来你不是jake", // 这里是规则不通过时的提示
                        ),
                        'phone' => array(
                                'notnull' => "手机号不能为空",
                                'is_phone' => "请填写正确的手机号",
                        ),
                )
        );


        // 这里是user类的check_phone方法函数
        // 请注意,自定义验证规则的函数,参数务必是($val, $right)
        function check_phone($val, $right){
                if( is_numeric($val) && strlen($val) == 11 ){
                        return TRUE; // $right是等于TRUE的
                }else{
                        return FALSE; // 也就是 !$right
                }
        }
}

// 这里是独立的函数checkname
// 它的参数同样也必须是($val, $right)
function checkname($val, $right){
        if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
                return TRUE; // 返回TRUE则通过验证
        }else{
                return FALSE; // 返回FALSE则无法通过验证
        }
}               

下面我们来详细说明一下创建自定义验证规则的过程:

一、首先我们需要在user类(spModel继承类)中,设置$addrules,这样就能定义我们的自建规则的处理函数了。$addrules是一个数组,数组项的键是规则名称,值就是一个规则处理函数的定义。定义的函数可以有两种形式:

第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用

第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。

var $addrules = array(
                'youare' => 'checkname', //  '规则名称' => '验证函数名'
                'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
        );               

这里就已经定义了youare和is_phone两个规则,youare的处理函数是独立函数checkname(),而is_phone的处理函数是user类的check_phone方法。

二、写作处理函数的代码。我们先看看checkname()的代码:

// 这里是独立的函数checkname
// 它的参数同样也必须是($val, $right)
function checkname($val, $right){
        if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
                return TRUE; // 返回TRUE则通过验证
        }else{
                return FALSE; // 返回FALSE则无法通过验证
        }
}               

正如注释内说明的一样,处理函数的参数必须是($val, $right),它们分别代码了输入的字符($val),正确的字符($right)。

请注意,spVerifier同时还提供了第三个参数$values。以下两种写法都是正确的:

function checkname($val, $right){

或者

function checkname($val, $right, $values){

$values是一个数组,主要的作用是保存了其他的输入字符,当自建的验证函数需要到其他的输入字符时,就可以直接使用$values。比如说在验证用户籍贯时,用户同时输入了省份和城市,那么在验证城市的时候,也是需要获取省份进行共同验证的。

spVerifier规定了规则处理函数必须返回TRUE或者FALSE,返回TRUE是通过了验证,返回FALSE是无法通过验证。

如果函数返回的并非TRUE/FALSE,那程序有可能判断成非FALSE,即是TRUE的,所以请严格的控制规则处理函数仅返回TRUE/FALSE。

规则处理函数同时也可以是类的方法函数:

class user extends spModel 
{
        // 这里是user类的check_phone方法函数
        // 请注意,自定义验证规则的函数,参数务必是($val, $right)
        function check_phone($val, $right){
                if( is_numeric($val) && strlen($val) == 11 ){
                        return TRUE; // $right是等于TRUE的
                }else{
                        return FALSE; // 也就是 !$right
                }
        }
}       

与user::is_phone的调用形式不同,规则处理函数在调用类方法的时候,是使用spClass(user)->is_phone(...)形式的,这样调用有利于对象的初始化。

上面介绍了如何创建自己的验证规则,那么现在我们可以自己动手试试,比如建立一个验证用户名是否重复的规则,或建立一个过滤留言中不良词语的规则吧。



2012-08-04 16:49:10