YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证表单安全和信息的有效性。而且也很节省校验代码的编写时间。
下面来列举Yii提供给我们的简单的校验代码:
boolean : CBooleanValidator 的别名, 确保属性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue .
captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码.
compare : CCompareValidator 的别名, 确保了特性的值等于另一个特性或常量.
email : CEmailValidator 的别名,确保了特性的值是一个有效的电邮地址.
default : CDefaultValueValidator 的别名, 为特性指派了一个默认值.
exist : CExistValidator 的别名, 确保属性值存在于指定的数据表字段中.
file : CFileValidator 的别名, 确保了特性包含了一个上传文件的名称.
filter : CFilterValidator 的别名, 使用一个filter转换属性.
in : CRangeValidator 的别名, 确保了特性出现在一个预订的值列表里.
length : CStringValidator 的别名, 确保了特性的长度在指定的范围内.
match : CRegularExpressionValidator 的别名, 确保了特性匹配一个正则表达式.
numerical : CNumberValidator 的别名, 确保了特性是一个有效的数字.
required : CRequiredValidator 的别名, 确保了特性不为空.
type : CTypeValidator 的别名, 确保了特性为指定的数据类型.
unique : CUniqueValidator 的别名, 确保了特性在数据表字段中是唯一的.
url : CUrlValidator 的别名, 确保了特性是一个有效的路径.
使用规则如下例:
public function rules()
{
return array(
array('project_id, type_id, status_id, owner_id, requester_id,', 'numerical', 'integerOnly'=>true),
array('name', 'length', 'max'=>256),
array('description', 'length', 'max'=>2000),
array('create_time,create_user_id,update_user_id, update_time', 'safe'),
array('id, name, description, project_id, type_id, status_id, owner_id', 'on'=>'search'),
);
}
在view中使用如下:
<div class="col-sm-4" id="hanggao50">
<?php echo $from->textField($model,'email',array('class'=>'form-control','style'=>'margin-top:8px;','placeholder'=>'联系人邮箱'));?></div>
<div class="col-sm-4" id="hanggao50"><span style="color:#F00; font-size:12px;"><?php echo $from->error($model,'email');?></span></div>
但是,有的时候我们根据实际开发需求会想要自己定义验证规则,那么我们应该怎么取实现呢?
最简单的定义验证规则的方法是在使用它的模型(model)内部定义。
在该模型(models)中添加验证函数:
//这是一个姓名校验的函数
function checkSurname($attribute,$params){
$realName=$this->contact;
if(empty($realName)){
$this->addError($attribute, "您输入的姓氏!");
}else{
if(!preg_match('/^[\x{4e00}-\x{9fa5}]+$/u',$realName)){//匹配2到四个汉字
$this->addError($attribute, "请您填写中文真实姓名!");
}
$surname="赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵堪汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董粱杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘缪干解应宗宣丁贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄魏加封芮羿储靳汲邴糜松井段富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭厉戎祖武符刘姜詹束龙叶幸司韶郜黎蓟薄印宿白怀蒲台从鄂索咸籍赖卓蔺屠蒙池乔阴郁胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍郤璩桑桂濮牛寿通边扈燕冀郏浦尚农温别庄晏柴瞿阎充慕连茹习宦艾鱼容向古易慎戈廖庚终暨居衡步都耿满弘匡国文寇广禄阙东殴殳沃利蔚越夔隆师巩厍聂晁勾敖融冷訾辛阚那简饶空曾毋沙乜养鞠须丰巢关蒯相查后江红游竺权逯盖益桓公万俟司马上官欧阳夏侯诸葛闻人东方赫连皇甫尉迟公羊澹台公冶宗政濮阳淳于仲孙太叔申屠公孙乐正轩辕令狐钟离闾丘长孙慕容鲜于宇文司徒司空亓官司寇仉督子车颛孙端木巫马公西漆雕乐正壤驷公良拓拔夹谷宰父谷粱晋楚闫法汝鄢涂钦段干百里东郭南门呼延妫海羊舌微生岳帅缑亢况後有琴梁丘左丘东门西门商牟佘佴伯赏南宫墨哈谯笪年爱阳佟第五言福肖";
$fist =mb_substr($realName,0,1,'utf-8');
if(!strstr($surname,$fist)){
$this->addError($attribute, "您输入的姓氏未找到!");
}
}
}
然后在在rules中 添加代码:
array('contact','checkSurname'),
就可以进行姓名的校验了
完整的方法:继承 CValidator 类
如果你想把规则使用在多个模型(model)中,最好的方法时继承 CValidator 类。
继承这个类你可以使用像 CActiveForm::$enableClientValidation (Yii 1.1.7 版本后可用) 类似的其他功能。
创建类文件
首先要做的是创建类文件.最好的方法时类的文件名和类名相同,可以使用 yii 的延迟加载(lazy loading)功能。
让我们在应用(application)的扩展(extensiions)目录(在 protected 文件夹下)下新建一个文件夹.
将目录命名为: MyValidators
然后创建文件: passwordStrength.php
在文件中创建我们的验证方法
//判断两个字符串是否相同,若需校验的字符串不为空且与参考字符串相同则报错
class diffCompare extends CValidator{
public $compareAttribute;//在类中创建属性,此属性为在验证规则中使用的参数.CValidator 会自动根据参数来填充这些属性.
public $message;
/**
* Validates the attribute of the object.
* If there is any error, the error message is added to the object.
* @param CModel $object the object being validated
* @param string $attribute the attribute being validated
*/
protected function validateAttribute($object,$attribute)
{//重写父类的抽象方法(abstract method) validateAttribute
$compareAttribute = $this->compareAttribute;
if($object->$compareAttribute == $object->$attribute && $object->$attribute != ''){
$this->addError($object,$attribute,'<span style="color:red;">'.$this->message.'</span>');
}
}
}
将编写好的rule文件用required方式引用到需要使用的model文件中:
require("protected/extensions/MyValidators/diffCompare.php");
然后在在rules中 添加代码:
array('designated_person', 'diffCompare', 'compareAttribute'=>'phone','message'=> '不可指定自己为服务商'),
经过以上两种方法就可以制作出格式统一又符合自己项目需求的个性化校验规则了。