我正在学习Yii2,现在我正在尝试创建一个提供登录,恢复密码和注册的页面。查看渲染,但在执行请求页面重新加载后没有任何反应。控制器有一些动作:
public function actionLoad(){
if(!Yii::$app->user->isGuest){
return Yii::$app->response->redirect('/day');
}
$login_model = new LoginForm();
$signup_model = new SignUpForm();
$restore_model = new RestoreForm();
return $this->render('login', compact(['login_model', 'signup_model', 'restore_model']));
}
public function actionLogin(){
if ($login_model->load(Yii::$app->request->post())) {
if($login_model->validateLogin()){
Yii::$app->user->login($login_model->validateLogin(), 3600*24*30);
return $this->refresh();
}
}
}
public function actionSignUp(){
if ($signup_model->load(Yii::$app->request->post())) {
if ($user = $signup_model->validateSignUp()) {
if (Yii::$app->getUser()->login($user, 3600*24*30)) {
return $this->refresh();
}
}
}
}
public function actionRestore(){
if ($restore_model->load(Yii::$app->request->post())) {
$restore_model->validateRestore();
return $this->refresh();
}
}
查看表单如下所示:
<?php $form_signup = ActiveForm::begin([
'options' => ['class'=>'form_signup'],
'fieldConfig' => [
'inputOptions'=>['class'=>'form_input'],
'template'=>'{input}'
]
]); ?>
<input id="form-token" type="hidden" name="<?=Yii::$app->request->csrfParam?>"
value="<?=Yii::$app->request->csrfToken?>"/>
<?= $form_signup->field($signup_model, 'username')->input('text', ['placeholder' => 'Username']) ?>
<?= $form_signup->field($signup_model, 'email')->input('email', ['placeholder' => 'Email']) ?>
<?= $form_signup->field($signup_model, 'password')->input('password', ['placeholder' => 'Password']) ?>
<?= Html::submitButton('Sign Up', ['class' => 'btn']) ?>
<?php ActiveForm::end(); ?>
如果我将所有操作从动作移动到actionLoad,则一切正常,但我想为每个操作执行操作。我该怎么办? 附:如果您对“最佳实践”有一些建议 - 我会感谢它。
答案 0 :(得分:1)
您正在使用ActiveForm widget。如果您没有指定action属性,那么它将与呈现当前视图的操作相同(操作加载,我会从您的代码中假设)。
因此,actionLoad将再次执行,并且不会发生任何事情,因为除了渲染视图之外,该操作不会执行任何操作。
您的问题是您使用一个表单进行三种不同的操作。你可以: