Yii2:比较密码验证和重新密码验证
Yii2: compare validation of password and repassword
我是Yii的新手,所以想不通,哪里出了问题。
我使用相同的模型 - Users - 用于登录、注册和版本配置文件。
用户模型:
class Users extends \yii\db\ActiveRecord {
public $password_repeat; //have no this value in DB, that's why write it as property directly. Need only for profile editing
public function rules() {
return [
[['username', 'password', 'authKey', 'accessToken'], 'safe'],
[['username', 'password'], 'required'],
[['username', 'password', 'authKey', 'accessToken'], 'string', 'max' => 255],
[['is_admin'], 'boolean'],
//don't use scenarios() here. Use 'on' instead
['password_repeat', 'required', 'on' => 'update'],
['password_repeat', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match", 'on' => 'update' ],
];
}
}
查看片段:
<?php $form = ActiveForm::begin([
'id' => 'data-form',
'options' => ['class' => 'form-horizontal', 'enctype' => 'multipart/form-data'],
'fieldConfig' => [
'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-6\">{error}</div>",
'labelOptions' => ['class' => 'col-lg-1 control-label'],
],
]); ?>
<?= $form->field($user_data, 'username') ?>
<?= $form->field($logo_data, 'imageFile')->fileInput() ?>
<?= $form->field($user_data, 'password')->passwordInput(['value'=>''])?>
<?= $form->field($user_data, 'password_repeat')->passwordInput(['value'=>''])?>
<?= Html::submitButton('Zapisz', ['class' => 'btn btn-primary btn-block', 'name' => 'data-button']) ?>
<?php ActiveForm::end(); ?>
站点控制器操作:
public function actionProfile(){
//3 model instances to retrieve data from users && company_profiles and logo
$user_data = Users::find()->where(['id'=>Yii::$app->user->id])->one();
$company_profile_data = CompanyProfiles::find()->where(['user_id'=>Yii::$app->user->id])->one();
$logo_data = new UploadLogo();
//here I upload file through $logo_data
if (isset($_POST['Users'])){
$user_data->username = $_POST['Users']['username'];
$company_profile_data->firm_data = $_POST['CompanyProfiles']['firm_data'];
//other assignments
$user_data->scenario = 'update'; //specially for 'profile' page
if (($_POST[Users][password] !== '') && ($_POST[Users][password_repeat]) !== '' && ($_POST[Users][password] == $_POST[Users][password_repeat]))
$user_data->password_repeat = $user_data->password = md5($_POST[Users][password]); //MAYBE, problem is here?
$user_data->update();
$company_profile_data->update();
}
return $this->render('profile', ['user_data' => $user_data, 'company_profile_data' => $company_profile_data, 'logo_data' => $logo_data]);
}
我使用更新 方案来编辑个人资料页面。在这种情况下,password_repeat 是必需的,并且需要与密码相同。但它没有按预期工作。
A: 当我尝试在没有输入密码的情况下提交表单并重新通过时,我看到消息 "can't be blank" 仅用于密码。然后我把值放在 ONLY pass input 中,然后页面重新加载(DB table 没有改变),重新加载后我看到消息 "can't be blank" 这次重新通过场地!但最奇怪的是,在下一页重新加载之前一切正常。重新加载后 goto A; :)
如果我删除场景,验证后一切正常。但是我不能删除它,因为在这种情况下注册失败(repass字段需要填写)。
那么,我需要做什么才能使我的通过-重新通过功能正常工作(在场景 'update' 中)?哪里错了?
知道了!我只需要移动这条代码线:
$user_data->scenario = 'update';
来自 IF stmt。现在我想养成直接在创建模型实例下分配场景 属性 的习惯。
我是Yii的新手,所以想不通,哪里出了问题。 我使用相同的模型 - Users - 用于登录、注册和版本配置文件。
用户模型:
class Users extends \yii\db\ActiveRecord {
public $password_repeat; //have no this value in DB, that's why write it as property directly. Need only for profile editing
public function rules() {
return [
[['username', 'password', 'authKey', 'accessToken'], 'safe'],
[['username', 'password'], 'required'],
[['username', 'password', 'authKey', 'accessToken'], 'string', 'max' => 255],
[['is_admin'], 'boolean'],
//don't use scenarios() here. Use 'on' instead
['password_repeat', 'required', 'on' => 'update'],
['password_repeat', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match", 'on' => 'update' ],
];
}
}
查看片段:
<?php $form = ActiveForm::begin([
'id' => 'data-form',
'options' => ['class' => 'form-horizontal', 'enctype' => 'multipart/form-data'],
'fieldConfig' => [
'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-6\">{error}</div>",
'labelOptions' => ['class' => 'col-lg-1 control-label'],
],
]); ?>
<?= $form->field($user_data, 'username') ?>
<?= $form->field($logo_data, 'imageFile')->fileInput() ?>
<?= $form->field($user_data, 'password')->passwordInput(['value'=>''])?>
<?= $form->field($user_data, 'password_repeat')->passwordInput(['value'=>''])?>
<?= Html::submitButton('Zapisz', ['class' => 'btn btn-primary btn-block', 'name' => 'data-button']) ?>
<?php ActiveForm::end(); ?>
站点控制器操作:
public function actionProfile(){
//3 model instances to retrieve data from users && company_profiles and logo
$user_data = Users::find()->where(['id'=>Yii::$app->user->id])->one();
$company_profile_data = CompanyProfiles::find()->where(['user_id'=>Yii::$app->user->id])->one();
$logo_data = new UploadLogo();
//here I upload file through $logo_data
if (isset($_POST['Users'])){
$user_data->username = $_POST['Users']['username'];
$company_profile_data->firm_data = $_POST['CompanyProfiles']['firm_data'];
//other assignments
$user_data->scenario = 'update'; //specially for 'profile' page
if (($_POST[Users][password] !== '') && ($_POST[Users][password_repeat]) !== '' && ($_POST[Users][password] == $_POST[Users][password_repeat]))
$user_data->password_repeat = $user_data->password = md5($_POST[Users][password]); //MAYBE, problem is here?
$user_data->update();
$company_profile_data->update();
}
return $this->render('profile', ['user_data' => $user_data, 'company_profile_data' => $company_profile_data, 'logo_data' => $logo_data]);
}
我使用更新 方案来编辑个人资料页面。在这种情况下,password_repeat 是必需的,并且需要与密码相同。但它没有按预期工作。 A: 当我尝试在没有输入密码的情况下提交表单并重新通过时,我看到消息 "can't be blank" 仅用于密码。然后我把值放在 ONLY pass input 中,然后页面重新加载(DB table 没有改变),重新加载后我看到消息 "can't be blank" 这次重新通过场地!但最奇怪的是,在下一页重新加载之前一切正常。重新加载后 goto A; :) 如果我删除场景,验证后一切正常。但是我不能删除它,因为在这种情况下注册失败(repass字段需要填写)。
那么,我需要做什么才能使我的通过-重新通过功能正常工作(在场景 'update' 中)?哪里错了?
知道了!我只需要移动这条代码线:
$user_data->scenario = 'update';
来自 IF stmt。现在我想养成直接在创建模型实例下分配场景 属性 的习惯。