2017-07-18 142 views
0

我使用yii2框架創建網站。我在註冊時遇到問題。我在家有一個模式,它包含註冊表單。現在,當我嘗試註冊時,是的,它保存成功,但它只停留在模式。現在我想要的是註冊後它會自動登錄。Yii2註冊後自動登錄

這是我的註冊form_:

<div class="row"> 
    <div class="col-lg-12"> 
     <?php yii\widgets\Pjax::begin(['id' => 'sign-up']) ?> 
      <?php $form = ActiveForm::begin(['id' => 'form-signup', 'options' => ['data-pjax' => true]]); ?> 
       <div class="row"> 
       <div class="col-sm-6"> 
       <?= $form->field($model, 'role')->dropDownList(['2' => 'User', '1' => 'Encoder', '3' => 'Admin']) ?> 
       <?= $form->field($model, 'username')->textInput(['placeholder' => 'Username....']) ?> 
       <?= $form->field($model, 'email')->textInput(['placeholder' => 'Email....']) ?> 
       <?= $form->field($model, 'password')->passwordInput(['placeholder' => 'Password.....']) ?> 
       </div> 
       <div class="col-sm-6"> 
       <?= $form->field($model, 'confirmPassword')->passwordInput(['placeholder' => 'Confirm Password.....']) ?> 
       <?= $form->field($model, 'first_name')->textInput(['placeholder' => 'First Name....']) ?> 
       <?= $form->field($model, 'middle_name')->textInput(['placeholder' => 'Middle Name....']) ?> 
       <?= $form->field($model, 'last_name')->textInput(['placeholder' => 'Last Name....']) ?> 
       </div> 
       </div> 
       <center> 
       <?= $form->field($model, 'verifyCode')->widget(Captcha::className()) ?>    
       </center> 
       <div class="form-group"> 
        <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button', 'style' => 'width: 100%; padding: 10px;']) ?> 
       </div> 
      <?php ActiveForm::end(); ?> 
     <?php yii\widgets\Pjax::end() ?> 
    </div> 
</div> 

這是我的模型:

class SignupForm extends Model 
{ 
public $role; 
public $username; 
public $email; 
public $password; 
public $first_name; 
public $middle_name; 
public $last_name; 
public $confirmPassword; 
public $verifyCode; 

public function rules() 
{ 
    return [ 
     ['role', 'required'], 
     ['username', 'trim'], 
     ['username', 'required'], 
     ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'], 
     ['username', 'string', 'min' => 2, 'max' => 20], 
     ['email', 'trim'], 
     ['email', 'required'], 
     ['email', 'email'], 
     ['email', 'string', 'max' => 30], 
     ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], 
     ['password', 'required'], 
     ['password', 'string', 'min' => 6], 
     ['first_name', 'trim'], 
     ['first_name', 'required'], 
     ['middle_name', 'trim'], 
     ['middle_name', 'required'], 
     ['last_name', 'trim'], 
     ['last_name', 'required'], 
     ['verifyCode', 'captcha'], 
     ['verifyCode', 'required'], 
     [['confirmPassword'], 'compare', 'compareAttribute' => 'password', 'message' => 'Passwords do not match.'], 

    ]; 
    } 

/** 
* Signs user up. 
* 
* @return User|null the saved model or null if saving fails 
*/ 
public function signup() 
{ 
    if (!$this->validate()) { 
     return null; 
    } 

    $user = new User(); 
    $user->username = $this->username; 
    $user->email = $this->email; 
    $user->setPassword($this->password); 
    $user->generateAuthKey(); 
    $user->role = $this->role; 
    $user->first_name = $this->first_name; 
    $user->middle_name = $this->middle_name; 
    $user->last_name = $this->last_name; 

    return $user->save() ? $user : null; 
} 
} 

這是我的控制器:

public function actionSignup() 
{ 
    $model = new SignupForm(); 
    if ($model->load(Yii::$app->request->post())) { 
     if ($user = $model->signup()) { 
      if (Yii::$app->getUser()->login($user)) { 
       return $this->goHome(); 
      } 
     } 
    } 

    return $this->renderAjax('signup', [ 
     'model' => $model, 
    ]); 
} 

我沒有任何想法,我認爲我的代碼是正確的,但我不知道爲什麼不工作。

修訂

  • 當我點擊該按鈕立即登記它僅停留在模態,當我再次點擊它的按鈕,驗證工作。這意味着它會保存到數據庫,但不會自動登錄。
+0

哥們我不知道,但只是使得它作爲「註冊」給一個嘗試,而不是註冊在形式 –

+0

感謝花花公子提交按鈕,但沒有工作仍在同樣的問題。 –

回答

0

你應該得到登錄

public function actionSignup() 
{ 
    $model = new SignupForm(); 
    if ($model->load(Yii::$app->request->post())) { 

     if ($user = $model->signup()) { 
      $identity = User::findOne(['username' => $model->$username]); 
      if (Yii::$app->user->login($identity)) { 
       return $this->goHome(); 
      } 
     } 
    } 

    return $this->renderAjax('signup', [ 
     'model' => $model, 
    ]); 
} 

用戶身份看到更多http://www.yiiframework.com/doc-2.0/guide-security-authentication.html

http://www.yiiframework.com/doc-2.0/yii-web-user.html

+0

謝謝你,但我仍然有同樣的問題不工作。 –

+0

如果不工作..爲什麼答案被標記爲接受.. ..讓我知道 – scaisEdge

0

我用下面的代碼和它的工作對我來說。它也爲YII2 .Controller行動代碼的標準代碼:

public function actionSignup() 
{ 
    $model = new SignupForm(); 
    if ($model->load(Yii::$app->request->post())) { 
     if ($user = $model->signup()) { 
      $model= \common\models\User::findOne([$user->id]); //you need to get complete model again and pass it to login function 
      if (Yii::$app->user->login($model) { 
       return $this->goHome(); 
      } 
     } 
    } 

    return $this->renderAjax('signup', [ 
     'model' => $model, 
    ]); 
} 
+0

謝謝男人,但它不工作。 –

+0

您可以與我分享您的模型功能「註冊」代碼。您必須返回完整的用戶記錄。 –