崩盘砖家 2011-05-09 15:15:25 12614次浏览 27条回复 0 0 0

如题!!摆弄了很久找不到一个好办法,要代码少点,不重复写rules http://www.yiiframework.com/forum/index.php?/topic/19215-how-to-reuse-the-rules-defined-in-rules-in-ajax-validation/ 这是官网论坛的讨论 别人说是用CActiveForm::validate 即使是这样,在CActiveForm::validate中也会循环当前场景可用的rules,比如当我只想验证用户名,但却同时验证了密码

  • 回复于 2011-05-09 15:25 举报

    我遇过这种问题,可以在afterValidate()里用clearErrors()
    我给你个代码:

    public function afterValidate()
    {
      if($this->open)
        $this->clearErrors('back_time');
      else
        $this->clearErrors('open_time');
    }
    
  • 回复于 2011-05-09 15:26 举报

    $this->open是做什么用的?

  • 回复于 2011-05-09 15:27 举报

    你不用管这个,这是我数据表的一个字段

  • 回复于 2011-05-09 15:28 举报

    我只是给你个例子,你可以在afterValidate判断,把不需要验证的属性,用$this->clearErrors去掉提示。

  • 回复于 2011-05-09 15:30 举报

    貌似很深奥阿,看得一知半解的,研究下去...

  • 回复于 2011-05-09 15:31 举报

    砖家,解决问题了吗?

  • 回复于 2011-05-09 15:33 举报

    可能我没描述清楚,我重新说下
    以登录为例

    public function rules() {
      return array(
        array('username, password', 'required'),
        array('autoLogin', 'safe'),
        array('password', 'authenticate'),
        array('verifyCode','captcha','captchaAction'=>'public/captcha'),
      );
    }
    //
    这个rules如何以ajax方式进行验证?
    如果以CActiveForm的方式进行ajax验证
    
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
    {
      echo CActiveForm::validate($loginModel);
      Yii::app()->end();
    }
    

    注意,在CActiveForm::validate的过程中,即使js发送的ajax请求只验证username,
    但这种代码方式造成的结果是password,verifyCode同时被验证,虽然最后ajax需要的只是username的验证结果

  • 回复于 2011-05-09 15:36 举报

    可以看看CActiveForm::validate的源代码,在CActiveForm::validate方法中,对当前场景的所有attributes进行了验证

    public static function validate($models, $attributes=null, $loadInput=true)
    {
      $result=array();
      if(!is_array($models))
      $models=array($models);
      foreach($models as $model)
      {
        if($loadInput && isset($_POST[get_class($model)]))
        $model->attributes=$_POST[get_class($model)];
        $model->validate($attributes);
        foreach($model->getErrors() as $attribute=>$errors)
        result[CHtml::activeId($model,$attribute)]=$errors;
      }
      return function_exists('json_encode') ? json_encode($result) : CJSON::encode($result);
    }
    

    现在进行username的ajax验证,
    当调用echo CActiveForm::validate($loginModel);进行ajax验证的时候,会将('username','password','autoLogin','verifyCode')这4个attr进行验证,返回的时候,js只取'username'的验证结果

  • 回复于 2011-05-09 15:37 举报

    不知道问题描述,大家清楚了没有?

  • 回复于 2011-05-09 15:42 举报

    validate($models, $attributes=null)
    第二个参数你可以写上你要验证的属性

  • 回复于 2011-05-09 15:48 举报

    哦哦哦!!!,就是,怎么我这几天都没想到这个

    但是怎么和js端指定一个协议好呢?

    比如规定
    $_POST['ajaxValidate']='要验证的attr,以英文逗号分隔'
    这样php端判断ajax验证的时候对$_POST['ajaxValidate']进行处理,生成attributes(要验证的attr)

  • 回复于 2011-05-09 15:51 举报

    你看一下blog程序的标签管理,就是这个意思。

  • 回复于 2011-05-09 15:52 举报

    太高端....的确看不懂

  • 回复于 2011-05-09 15:55 举报

    晕了几天的问题终于在舰长的指导下解决了

  • 回复于 2011-05-09 15:56 举报

    好邪恶,,好强大啊!

  • 回复于 2011-05-09 16:00 举报

    意思就是php写好后就不管了
    js想怎么ajax验证是js的事
    如果只验证用户名,需要post变量 :

    $_POST['ajaxValidate']='username'
    

    如果只验证captcha,需要post变量 :

    $_POST['ajaxValidate']='captcha'
    

    如果想全部验证,就

    $_POST['ajaxValidate']='captcha,username,password,autoLogin'
    
  • 回复于 2011-05-09 16:02 举报

    楼主威武,理解的很透彻,好邪恶,好强大哦!

  • 回复于 2011-05-10 10:32 举报

    的确,受教阿....多谢多谢

  • 回复于 2011-06-23 15:43 举报

    看懂了,,,

  • 回复于 2011-06-24 17:41 举报

    。。。。。。。。。。。。。。。。。。学习了!

您需要登录后才可以回复。登录 | 立即注册