#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