尝试在一个视图中进行登录+恢复密码+注册Yii2

时间:2018-05-16 05:45:36

标签: php yii2

我正在学习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,则一切正常,但我想为每个操作执行操作。我该怎么办? 附:如果您对“最佳实践”有一些建议 - 我会感谢它。

1 个答案:

答案 0 :(得分:1)

您正在使用ActiveForm widget。如果您没有指定action属性,那么它将与呈现当前视图的操作相同(操作加载,我会从您的代码中假设)。

因此,actionLoad将再次执行,并且不会发生任何事情,因为除了渲染视图之外,该操作不会执行任何操作。

您的问题是您使用一个表单进行三种不同的操作。你可以:

  • 拥有与行动一样多的表格。
  • 只有一个表单,并根据用户选择的内容通过javascript更改操作属性。
相关问题