关于验证

#1 xd04053045

自己写了的model,用到了验证,于是我这样写了下
class mod_depart extends spModel
{  //类名为 mod_ 加表名构成
        var $pk = "d_id";
        var $table = "depart"; // 数据表名称
        public $addrules = array(
                'notrepeat' => array('mod_depart','is_repeat'),
        );
        public $verifier = array(
                'rules' => array(
                        'd_name' => array(
                                'notnull' => true,
                                'maxlength' => 15,
                                'notrepeat' => true,
                        ),
                ),
                'messages' => array(
                        'd_name' => array(
                                'notnull' => 'Depart name can not be null.',
                                'maxlength' => 'Depart name can not length than 15.',
                                'notrepeat' => 'Depart name exist',
                        ),
                ),
  );
       
        public function is_repeat($val,$right)
        {
                if($this->findAll(array('d_name'=>$val)))
                        return false;
                return true;
        }
}
?>


现在是我在添加数据岛depart时候用到了这个验证规则,在编辑数据的时候打算同样用这个规则,可是编辑数据的时候那个is_repeat函数总是会提醒
Depart name exist,如何让编辑的时候可以不提醒呢?
看教程说是可以给验证函数传递第三个参数,请问如何传递?
打算写成类似的函数:
        public function is_repeat($val,$right,$d_id ==NULL)
        {
                if($this->findAll(array('d_name'=>$val)) && !$d_id)
                        return false;
                return true;
        }


那在控制器里如何$d_id (depart表主键)传递值过去呢?

2010-08-20 14:54:06

#2 jake

1. Depart name exist,如何让编辑的时候可以不提醒呢?
is_repeat($val,$right) 在:notrepeat' => true,的时候,$right=true,所以如果is_repeat($val,$right)返回true(也就是$right值,也就是notrepeat的值)就会触发提示,你可以设置成返回false就不会触发了。
2. 所谓的第三个值传递,并不是说开发者把变量传到验证函数内,而是spVerifier($需要验证的数组),会把“$需要验证的数组”传递到验证函数内,这样就可以做到验证比如说更复杂的多值判断了。
假设你要验证:信用卡有效性,
提交的信息:身份证,信用卡号,信用卡后三位,信用卡有效期等等多个值
在自定义的验证函数中,需要这多个值才能“共同”验证信用卡是否有效(返回true或false),所以在验证函数内,可以通过第三个参数接收到全部的这些值,来“共同”进行验证。

2010-08-20 16:33:29

#3 xd04053045

搞定了
按照老大说的第一个的话还要在写个数组,$verifier_edit,这个麻烦点吧
所以按照第二个方法写了下
public function is_repeat($val,$right,$values)
        {
                $d_id = empty($values['d_id']) ? 0 : (int)$values['d_id'];
                if($d_id)
                {
                        if($this->findAll("d_name= '$val' AND d_id != $d_id"))
                                return false;
                }
                else{
                        if($this->findAll(array('d_name'=>$val)))
                                return false;
                }
                return true;
        }

2010-08-21 10:38:59

#4 okbb

楼上的,我copy走了

2010-08-21 11:02:23