如何解决Yii验证规则忽略“ on”或“ except”
我面临下一个问题。 我正在尝试以不同的方式验证字段,具体取决于操作:电话在用户创建时应该是唯一的,而不应该在用户编辑时是唯一的,所以:
public function rules()
{
return [
[['owner_id','card_code','name','phone','birthday','language','last_ip'],'required'],[['account_id'],'required','on' => 'update'],'exist','skipOnError' => true,'targetClass' => Accounts::className(),'targetAttribute' => ['account_id' => 'id'],[['owner_id','account_id','active','last_carwash'],'integer'],[['birthday','last_active','last_update','last_sync'],'safe'],[['car_number','role','status'],'string'],[['card_code','car_number','password','auth_key','language'],'string','max' => 255],[['last_ip'],'ip'],[['name'],'min' => 5],['password','min' => 6,'message' => Yii::t('app','The password must contain at least 6 symbols.')/*,'on' => 'create'*/],'match','pattern' => '/[A-z]/','The password must contain at least 1 letter.')/*,'pattern' => '/[0-9]/','The password must contain at least 1 number.')/*,[['password'],'on' => 'create'],[['phone'],'validatePhone','except' => 'update'/*,'skipOnEmpty' => false*/],[['email'],'email'],'validateEmail',];
}
我正在使用AJAX验证:
$form = ActiveForm::begin([
'enableAjaxValidation' => true,'validationUrl' => \yii\helpers\Url::to('/user/validation'),]);
验证动作:
public function validatePhone()
{
$phone = preg_filter( '/[^0-9]*/','',$this->phone );
$u = Users::findOne(['phone' => $phone]);
if($u)
/*if($this->id != $u->id)*/
$this->addError('phone',Yii::t('app','This phone is already taken.'));
}
public function validateEmail()
{
$email = $this->email;
if (!filter_var($email,FILTER_VALIDATE_EMAIL))
$this->addError('email','Please,enter correct email'));
$u = Users::findOne(['email' => $email]);
if($u)
$this->addError('email','This email is already taken.'));
}
在控制器操作中
public function actionCreate()
{
if ( Yii::$app->request->post() != NULL ) {
$data = Yii::$app->request->post('Users');
$model = new Users;
$model->scenario = 'create';
...//lots of a code
if(!$model->validate()){var_dump($model->errors);exit;}
$model->save();
return $this->redirect(['view','id' => $model->id]);
}
public function actionUpdate($id)
{
$model = $this->findModel($id);
$model->scenario = 'update';
$model->setScenario('update');// same as ^,but who knows...
$data = Yii::$app->request->post();
if( $data )
{
...//lots of code
if(!$model->validate()){var_dump($model->errors);exit;}
$model->save();
return $this->redirect(['view','id' => $model->id]);
}
return $this->render('update',[
'model' => $model,]);
}
public function actionValidation()
{
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$model = new \app\models\Users();
if($model->load(Yii::$app->request->post()))
return \yii\widgets\ActiveForm::validate($model);
}
throw new \yii\web\BadRequestHttpException( Yii::t('app','Bad request.') );
}
protected function findModel($id)
{
if (($model = Users::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException(Yii::t('app','The requested page does not exist.'));
}
场景:
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['create'] = ['account_id','email','password'];
$scenarios['update'] = ['account_id','password'];
return $scenarios;
}
但它根本不以任何形式起作用。
如果我删除'on' => 'create'
可以正常工作,但是以所有形式,都是不需要的。
那么,如何仅在创建方案中使用validatePhone和validateEmail?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。