CI validation规则 转 js validate 规则
需求:ci form中的validation 很好用,但如果前台js validate 也得写一套一样的规则。验证页面少还好点,有10个form页面修改起来那就太惨了。为了大家不再遭罪,我写CI validation 转 js validate 规则的函数放给大家论坛中的代码被转义了,下载代码在附件里。
if ( ! function_exists('rules_ci2js')){
function rules_ci2js($rules){
if(!$rules) return "rules:'',\\n messages:''";
$CI =& get_instance();
$CI->lang->load('validation');
$i=0;
$form_tmp=array();
foreach($rules as $field=>$r){
$_arr=explode("|",$r);
$__arr=array();
$__arr_message=array();
foreach($_arr as $v){
if(ereg("({3})_length\\[(+)\\]",$v,$tmp)){
$__arr[]="{$tmp}length:{$tmp}";
$__arr_message["{$tmp}length"]=langx("{$tmp}_length",array(langx($field),$tmp));
}
if(ereg("({3})_number\\[(+)\\]",$v,$tmp)){
$__arr[]="{$tmp}:{$tmp}";
$__arr_message["{$tmp}"]=langx("{$tmp}_number",array(langx($field),$tmp));
}
if(ereg("matches\\[(.+)\\]",$v,$tmp)){
$__arr[]="equalTo:'#{$tmp}'";
$__arr_message["equalTo"]=langx("matches",array(langx($field),langx($tmp)));
}
if($v=="required"){
$__arr[]="{$v}:true";
$__arr_message["required"]=langx($v,langx($field));
}
if($v=="numeric"){
$__arr[]="number:true";
$__arr_message["number"]=langx($v,langx($field));
}
if($v=="integer"){
$__arr[]="digits:true";
$__arr_message["digits"]=langx($v,langx($field));
}
if($v=="valid_email"){
$__arr[]="email:true";
$__arr_message["email"]=langx($v,langx($field));
}
if($v=="prep_url"){
$__arr[]="url:true";
$__arr_message["url"]=langx($v,langx($field));
}
}
if($__arr){
$form_tmp['rules'][$i][$field]=$__arr;
$form_tmp['messages'][$i][$field]=$__arr_message;
}
}
if(!empty($form_tmp)){
$js_rules=json_encode($form_tmp['rules']);
$js_message=json_encode($form_tmp['messages']);
$js_rules=strtr($js_rules,array(
'":["'=>':{',
'"],"'=>'},',
'","'=>',',
'[{"'=>'{',
'"]}]'=>'}}',
));
$js_message=strtr($js_message,array(
'['=>'',
']'=>'',
'":{"'=>':{',
'":'=>':',
',"'=>',',
'{"'=>'{'
));
$jsform="rules:{$js_rules},\\n messages:{$js_message}";
return $jsform;
}
}
}
建议放到form_helper.php里,方便调用,里面有个langx()的函数是代码如下:
if ( ! function_exists('langx'))
{
function langx($line, $param=false)
{
$CI =& get_instance();
$line=$CI->lang->line($line);
if($param!==false){
if(is_array($param)){
foreach($param as $p){
$line=preg_replace('/%s/',$p,$line,1);
}
}else{
$line = strtr($line,array('%s'=>$param));
}
}
return $line;
}
}
你把它放到lang_helper.php中就可以了
语言定义中要和表单中name相同,这样就能正确显示 XXX犯了XXX错误了
调用代码
$fields['id'] = 'ID';
$fields['tid'] = langx('tid');;
$fields['name'] = langx('name');
$fields['desc'] = langx('desc');
$fields['thumb'] = langx('thumb');
$fields['tel'] = langx('tel');
$fields['mobile'] = langx('mobile');
$fields['linkuser'] = langx('linkuser');
$fields['addr'] = langx('addr');
$this->CI->validation->set_fields($fields);
$rules['id'] = 'numeric';
$rules['tid'] = 'required|numeric';
$rules['name'] = 'trim|required|max_length|spare_name|min_length';
$rules['thumb'] = 'trim|min_length|max_length';
$rules['tel'] = 'trim|required|min_length|max_length';
$rules['mobile'] = 'trim|required|min_length|max_length';
$rules['linkuser'] = 'trim|required|min_length|max_length';
$rules['addr'] = 'trim|required|min_length';
$rules['desc'] = 'trim|max_length';
$this->CI->validation->set_rules($rules);
//在这里进行了转换
$data['jsform']=rules_ci2js($rules);
前台调用,不会jquery框架的就自行研究validate吧,规则都是一样的
<script type="text/javascript" src="***/js/jquery.min.js"></script>
<script type="text/javascript" src="***/js/jquery.validate.js"></script>
<script type="text/javascript">
$(function(){
$("#sight_form").validate({
<?php echo $jsform;?>,
event: "blur",
submitHandler: function() {
$('ol').each(function(i){
if($(this).css('display')=='none'){$(this).remove();}
});
document.getElementById("sight_form").submit();
}
});
});
</script>
生成代码如下:
<script type="text/javascript">
$(function(){
$("#sight_form").validate({
rules:{id:{number:true},tid:{required:true,number:true},name:{required:true,maxlength:32,minlength:4},thumb:{minlength:32,maxlength:100},tel:{required:true,minlength:8,maxlength:50},mobile:{required:true,minlength:11,maxlength:50},linkuser:{required:true,minlength:2,maxlength:4},addr:{required:true,minlength:10},desc:{maxlength:1000},ex_bus_stop:{required:true},ex_bus_line:{required:true},ex_connect:{required:true,minlength:32,maxlength:5000},vcode:{required:true}},
messages:{id:{number:"%s \\u5fc5\\u987b\\u662f\\u4e00\\u4e2a\\u6570\\u5b57\\u3002"},tid:{required:"\\u9910\\u5385\\u7c7b\\u522b \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",number:"\\u9910\\u5385\\u7c7b\\u522b \\u5fc5\\u987b\\u662f\\u4e00\\u4e2a\\u6570\\u5b57\\u3002"},name:{required:"\\u9910\\u5385\\u540d\\u79f0 \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",maxlength:"\\u9910\\u5385\\u540d\\u79f0 \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 32 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002",minlength:"\\u9910\\u5385\\u540d\\u79f0 \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 4 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002"},thumb:{minlength:"\\u9910\\u5385\\u6807\\u5fd7 \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 32 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002",maxlength:"\\u9910\\u5385\\u6807\\u5fd7 \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 100 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},tel:{required:"\\u56fa\\u5b9a\\u7535\\u8bdd \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",minlength:"\\u56fa\\u5b9a\\u7535\\u8bdd \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 8 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002",maxlength:"\\u56fa\\u5b9a\\u7535\\u8bdd \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 50 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},mobile:{required:"\\u79fb\\u52a8\\u7535\\u8bdd \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",minlength:"\\u79fb\\u52a8\\u7535\\u8bdd \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 11 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002",maxlength:"\\u79fb\\u52a8\\u7535\\u8bdd \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 50 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},linkuser:{required:"\\u8054 \\u7cfb \\u4eba \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",minlength:"\\u8054 \\u7cfb \\u4eba \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 2 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002",maxlength:"\\u8054 \\u7cfb \\u4eba \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 4 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},addr:{required:"\\u9910\\u5385\\u5730\\u5740 \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",minlength:"\\u9910\\u5385\\u5730\\u5740 \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 10 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002"},desc:{maxlength:"\\u9910\\u5385\\u63cf\\u8ff0 \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 1000 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},ex_bus_stop:{required:"\\u516c \\u4ea4 \\u7ad9 \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002"},ex_bus_line:{required:"\\u53ef\\u4e58\\u516c\\u4ea4\\u7ebf \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002"},ex_connect:{required:"\\u8be6\\u7ec6\\u63cf\\u8ff0 \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002",minlength:"\\u8be6\\u7ec6\\u63cf\\u8ff0 \\u6700\\u5c0f\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 32 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u4e0a\\u3002",maxlength:"\\u8be6\\u7ec6\\u63cf\\u8ff0 \\u6700\\u5927\\u957f\\u5ea6\\u5e94\\u8be5\\u662f 5000 \\u4e2a\\u5b57\\u7b26\\u4ee5\\u5185\\u3002"},vcode:{required:"\\u9a8c\\u8bc1\\u7801 \\u662f\\u5fc5\\u987b\\u8981\\u586b\\u5199\\u7684\\u3002"}},
event: "blur",
submitHandler: function() {
$('ol').each(function(i){
if($(this).css('display')=='none'){$(this).remove();}
});
document.getElementById("sight_form").submit();
}
});
});
</script> 本帖最后由 myzingy 于 2014-12-4 15:06 编辑
更新函数主体:2014-12-04
if ( ! function_exists('rules_ci2js')){
function rules_ci2js($rules,$fields){
if(!$rules) return "rules:{},\n messages:{}";
$CI =& get_instance();
$CI->lang->load('validation');
$js_arr=array('rules'=>array(),'messages'=>array());
foreach($rules as $field=>$r){
$_arr=explode("|",$r);
foreach($_arr as $v){
$mflag=preg_match("/\[([^\]]+)\]/",$v,$mnum);
$key=$v;
if($mflag){
$key=str_replace($mnum, '', $v);
}
$rulesKey=array(
'min_length'=>array('minlength',$mnum),
'max_length'=>array('maxlength',$mnum),
'min_number'=>array('min',$mnum),
'max_number'=>array('max',$mnum),
'matches'=>array('equalTo','#'.$mnum),
'required'=>array('required',true),
'numeric'=>array('number',true),
'integer'=>array('digits',true),
'valid_email'=>array('email',true),
'prep_url'=>array('url',true),
);
if($ruline=$rulesKey[$key]){
$rulName=$ruline;
$rulValue=$ruline;
$js_arr['rules'][$field][$rulName]=$rulValue;
$js_arr['messages'][$field][$rulName]=langx($key,array($fields[$field],$mnum));
}
}
}
return "rules:".json_encode($js_arr['rules']).",\n"."messages:".json_encode($js_arr['messages']);
}
}
本帖最后由 myzingy 于 2010-5-20 13:39 编辑
加精到100(不200:lol )楼我放出我的汉字验证码,不是图片的哦,是html的,绝无仅有 哎,估计连10楼都到不了喽,吸引太低,大家没啥兴趣 辛苦了{:2_32:} 小顶一个 呵呵,太好了,我正在想自己写一个helper函数转了,幸好在这里看到楼主的作品,是在伟大。非常感谢分享 回复 4# myzingy
呵呵那个点阵汉字是怎么弄的啊,这个机器可以识别吗——我是想问,计算机如何生成随机的汉字,并以点阵的形式展现,这是在伟大
那个转换的helper函数我也写了一个,我用的是datamapper,所以验证函数也还不一样,这个放在My_form_helper.php中
/**
*
* 生成jquery validation rules
* $suitableRules 是ci验证函数与 jv验证函数的转换
* @param $validation array() datamapper 子类的$validation属性
* @param $listLabel array listData中的listLable属性,直接在视图中调用,规定哪些字段显示并且验证
* @example $listLable= array('
* return string json_encode json
*/
function toJsRules($validation,$listLabel)
{
$suitableRules = array(
'required',
'min_length' => 'minlength',
'max_length' => 'maxlength',
'matches' => 'equalTo',
'numeric' => 'number',
'email',
'cn_alpha_dash' => 'cnAlphaDash',
'integer' => 'digits'
);
$rules = array();
if(is_array($validation) && is_array($listLabel))
{
foreach($validation as $validate)
{
if(array_key_exists($validate['field'],$listLabel))
{
$field = $validate['field'];
$rule = $validate['rules'];
foreach($rule as $key => $val)
{
if(is_numeric($key))
{
if(!in_array($val,$suitableRules))
{
continue;
}
else
{
$rules[$field][$val] = true;
}
}
else
{
if(!array_key_exists($key,$suitableRules))
{
continue;
}
else
{
$rulesKey = $suitableRules[$key];
$rules[$field][$rulesKey] = $val;
}
}
}
}
}
}
var_dump($rules);
return json_encode($rules);
}
suitableRules 中有一个函数cn_alpha_dash,这个是自定义的,在Form_validation.php中添加函数,验证汉字数字字幕下划线组成的字符串
function cn_alpha_dash($str)
{
return ( ! preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str)) ? FALSE : TRUE;
}
//测试代码
//controller中调用函数
function strValidateTest()
{
$this->load->library("form_validation");
$this->unit->run($this->form_validation->cn_alpha_dash('策划师长123_afs'),'is_true','汉字数字下划线验证函数测试');
$this->unit->run($this->form_validation->cn_alpha_dash('策划师长123_ca.'),'is_false','汉字数字下划线验证函数测试');
echo $this->unit->report();
}
这帖子真不错,很有创意!支持!!
页:
[1]
2