model中的rules如何在ajax验证中被重用? [ 新手入门 ]
如题!!摆弄了很久找不到一个好办法,要代码少点,不重复写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,比如当我只想验证用户名,但却同时验证了密码
共 27 条回复
-
可能我没描述清楚,我重新说下
以登录为例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的验证结果 -
可以看看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-02-26
最后登录:1970-01-01
在线时长:0小时0分
最后登录:1970-01-01
在线时长:0小时0分
- 粉丝0
- 金钱375
- 威望0
- 积分375