SpeedPHP技术交流论坛

 找回密码
 论坛注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 1226|回复: 5

验证规则重复使用方法 [复制链接]

Rank: 4

发表于 2010-8-28 05:41:38 |显示全部楼层
如果规则里面有两个字段需要验证,但是当前只想验证其中一个字段,我做了如下修改(不知道是我自作聪明,还是JACK已有相应的调用方法),做个记号。
规则:

  1.   "rules" => array(
  2.    'id' => array(
  3.     'notnull' => TRUE,
  4.    ),
  5.    'email' => array(
  6.     'notnull' => TRUE,
  7.     'email' => true,
  8.    ),
  9.   ),
复制代码


如我只想验证id,调用方法


  1. spVerifier(array('id'=>$id),null,array('morerow'=>true));
复制代码


修改验证类:
/core/spModel.php

  1.     public function __input(& $obj, $args){
  2.   //添加只验证规测里面的一项
  3.   $morerow=false;
  4.   if(isset($args[2]) && is_array($args[2])){if($args[2]['morerow'])$morerow=true;}  
  5.   
  6.   $this->verifier = (null != $obj->verifier) ? $obj->verifier : array();
  7.   if(isset($args[1]) && is_array($args[1])){
  8.    $this->verifier["rules"] = $this->verifier["rules"] + $args[1]["rules"];
  9.    $this->verifier["messages"] = isset($args[1]["messages"]) ? ( $this->verifier["messages"] + $args[1]["messages"] ) : $this->verifier["messages"];
  10.   }
  11.   if(is_array($obj->addrules) && !empty($obj->addrules) ){foreach($obj->addrules as $addrule => $addveri)$this->addrules($addrule, $addveri);}
  12.   if(empty($this->verifier["rules"]))spError("无对应的验证规则!");
  13.   return is_array($args[0]) ? $this->checkrules($args[0],$morerow) : TRUE; // TRUE为不通过验证
  14. }


  15. /**
  16.   * 按规则验证数据
  17.   *
  18.   * @param values    验证值
  19.   * @param morerow 添加只验证规测里面的一项
  20.   */
  21. private function checkrules($values,$morerow=false){
  22.   $this->checkvalues = $values;
  23.   foreach( $this->verifier["rules"] as $rkey => $rval ){
  24.    if($morerow && !isset($values[$rkey]))continue; //添加只验证规测里面的一项
  25.    $inputval = isset($values[$rkey]) ? $values[$rkey] : '';
  26.    foreach( $rval as $rule => $rightval ){
  27.     if(method_exists($this, $rule)){
  28.      if(TRUE == $this->$rule($inputval, $rightval))continue;
  29.     }elseif(null != $this->add_rules && isset($this->add_rules[$rule])){
  30.      if( function_exists($this->add_rules[$rule]) ){
  31.       if(TRUE == $this->add_rules[$rule]($inputval, $rightval, $values))continue;
  32.      }elseif( is_array($this->add_rules[$rule]) ){
  33.       if(TRUE == spClass($this->add_rules[$rule][0])->{$this->add_rules[$rule][1]}($inputval, $rightval, $values))continue;
  34.      }
  35.     }else{
  36.      spError("未知规则!");
  37.     }
  38.     $this->messages[$rkey][] = (isset($this->verifier["messages"][$rkey][$rule])) ? $this->verifier["messages"][$rkey][$rule] : "{$rule}";
  39.    }
  40.   }
  41.   // 返回FALSE则通过验证,返回数组则未能通过验证,返回的是提示信息。
  42.   return (null == $this->messages) ? FALSE : $this->messages;
复制代码


修改完就可以,仍然可以使用原有参数调用,不影响!
请JACK老大看看,可不可行,谢过!

管理员

@speedphp

Rank: 9Rank: 9Rank: 9

发表于 2010-8-28 09:52:48 |显示全部楼层
先感谢楼主的热心,看得出来楼主很有想法。而且提出不修改原有参数这点也是很好的建议。

为什么验证规则不能重复使用呢?,限制就在notnull(非空)上面,比如说注册规则非空有至少4个,登录非空只有2个,那么注册的规则就不能用在登录的地方。

所以,楼主这里的代码,其实也是围绕在email规则的notnull上面,也就是说,如果email的notnull存在,那么仅验证id是不行的。加个参数的方法可行,不过这里还有更简单的方式,比如说$linker['rules']['email']['notnull'] = false; 然后再验证就行。

正如刚才说的,注册规则非空有4个,如果想用在登录上面,那么就可以通过数组操作,把多出来的两个非空赋值成false,那么就可以验证登录了。

重复使用验证规则,还是建议一个表单对应一个规则,无论是复制粘贴或者是数组凑拼。但是如何能更简便的修整规则,这点我还没想得很清楚,楼主也可以往这个方向来试试。

Rank: 4

发表于 2011-1-8 09:50:43 |显示全部楼层
遇到同样的问题  正在思考怎么弄能简单点

管理员

@speedphp

Rank: 9Rank: 9Rank: 9

发表于 2011-1-8 10:38:35 |显示全部楼层
遇到同样的问题  正在思考怎么弄能简单点
elick 发表于 2011-1-8 09:50

$verifier就是一个PHP数组,没必要想得那么复杂。
http://speedphp.com/post/database-verifier-addrules.html

http://speedphp.com/post/database-verifier-switch.html
提问前注意:请先查手册、搜索本站和搜索论坛来查找答案,大部分问题都在手册和论坛旧贴中能够得到解答!

提问时注意要把问题说清楚,最好包括:代码、错误提示、截图等

Rank: 4

发表于 2011-1-8 15:19:51 |显示全部楼层
喔  原来如北 呵呵 jake是个勤劳的人 赞一个!!!

Rank: 4

发表于 2011-4-20 00:33:11 |显示全部楼层
非常同意JACK的看法,希望能和JACK一样的思路,来发展这个框架!
好久没来,很是怀念
亿华通互联(eok.hk),您身边的网站建设专家!
您需要登录后才可以回帖 登录 | 论坛注册

Archiver|SpeedPHP.com ( 粤ICP备08008671号 )  

GMT+8, 2012-2-7 01:28

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部