account = $account; parent::__construct($config); } /** * @return Account */ public function getAccount() { return $this->account; } public function rules() { return array_merge(parent::rules(), [ ['email', 'required', 'message' => 'error.email_required'], ['email', 'validateEmail'], ]); } public function validateEmail() { $account = new Account(); $account->email = $this->email; if (!$account->validate(['email'])) { $this->addErrors($account->getErrors()); } } public function sendNewEmailConfirmation() { if (!$this->validate()) { return false; } $transaction = Yii::$app->db->beginTransaction(); try { $previousActivation = $this->getActivationCodeModel(); $previousActivation->delete(); $activation = $this->createCode(); $this->sendCode($activation); $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); throw $e; } return true; } /** * @return NewEmailConfirmation * @throws ErrorException */ public function createCode() { $emailActivation = new NewEmailConfirmation(); $emailActivation->account_id = $this->getAccount()->id; $emailActivation->newEmail = $this->email; if (!$emailActivation->save()) { throw new ErrorException('Cannot save email activation model'); } return $emailActivation; } public function sendCode(EmailActivation $code) { /** @var \yii\swiftmailer\Mailer $mailer */ $mailer = Yii::$app->mailer; $fromEmail = Yii::$app->params['fromEmail']; if (!$fromEmail) { throw new InvalidConfigException('Please specify fromEmail app in app params'); } $acceptor = $code->account; /** @var \yii\swiftmailer\Message $message */ $message = $mailer->compose([ 'html' => '@app/mails/new-email-confirmation-html', 'text' => '@app/mails/new-email-confirmation-text', ], [ 'key' => $code->key, 'account' => $acceptor, ]) ->setTo([$this->email => $acceptor->username]) ->setFrom([$fromEmail => 'Ely.by Accounts']) ->setSubject('Ely.by Account new E-mail confirmation'); if (!$message->send()) { throw new ErrorException('Unable send email with activation code.'); } } }