/** @inheritdoc */ public function rules() { return [['email', 'filter', 'filter' => 'trim'], ['email', 'required'], ['email', 'email'], ['email', 'exist', 'targetClass' => $this->module->modelMap['User'], 'message' => \Yii::t('user', 'There is no user with such email.')], ['email', function ($attribute) { $this->user = $this->finder->findUserByEmail($this->email); if ($this->user !== null && $this->module->enableConfirmation && !$this->user->getIsConfirmed()) { $this->addError($attribute, \Yii::t('user', 'You need to confirm your email address')); } }], ['password', 'required'], ['password', 'string', 'min' => 6]]; }
/** * This method attempts changing user email. If user's "unconfirmed_email" field is empty is returns false, else if * somebody already has email that equals user's "unconfirmed_email" it returns false, otherwise returns true and * updates user's password. * * @param string $code * @return bool * @throws \Exception */ public function attemptEmailChange($code) { /** @var Token $token */ $token = $this->finder->findToken(['user_id' => $this->id, 'code' => $code])->andWhere(['in', 'type', [Token::TYPE_CONFIRM_NEW_EMAIL, Token::TYPE_CONFIRM_OLD_EMAIL]])->one(); if (empty($this->unconfirmed_email) || $token === null || $token->isExpired) { \Yii::$app->session->setFlash('danger', \Yii::t('user', 'Your confirmation token is invalid')); } $token->delete(); if (empty($this->unconfirmed_email)) { \Yii::$app->session->setFlash('danger', \Yii::t('user', 'An error occurred during your request')); } else { if (static::find()->where(['email' => $this->unconfirmed_email])->exists() == false) { if ($this->module->emailChangeStrategy == Module::STRATEGY_SECURE) { switch ($token->type) { case Token::TYPE_CONFIRM_NEW_EMAIL: $this->flags |= self::NEW_EMAIL_CONFIRMED; \Yii::$app->session->setFlash('success', \Yii::t('user', 'Awesome, almost there. Now you need to click confirmation link sent to your old email address')); break; case Token::TYPE_CONFIRM_OLD_EMAIL: $this->flags |= self::OLD_EMAIL_CONFIRMED; \Yii::$app->session->setFlash('success', \Yii::t('user', 'Awesome, almost there. Now you need to click confirmation link sent to your new email address')); break; } } if ($this->module->emailChangeStrategy == Module::STRATEGY_DEFAULT || $this->flags & self::NEW_EMAIL_CONFIRMED && $this->flags & self::OLD_EMAIL_CONFIRMED) { $this->email = $this->unconfirmed_email; $this->unconfirmed_email = null; \Yii::$app->session->setFlash('success', \Yii::t('user', 'Your email has been successfully changed')); } $this->save(false); } } }