From 71fba07700f1a427e33658ba919b508e4528f7f5 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 31 Jan 2014 23:18:07 +0400 Subject: [PATCH 1/8] Moved most of the user-related logic into form models --- .../backend/controllers/SiteController.php | 15 ++- apps/advanced/backend/views/site/login.php | 2 +- apps/advanced/common/models/User.php | 60 +++--------- .../common/models/{ => forms}/LoginForm.php | 10 +- .../models/forms/PasswordResetRequestForm.php | 55 +++++++++++ .../common/models/forms/ResetPasswordForm.php | 69 ++++++++++++++ .../common/models/forms/SignupForm.php | 59 ++++++++++++ .../frontend/controllers/SiteController.php | 93 +++++++------------ apps/advanced/frontend/views/site/login.php | 2 +- .../views/site/requestPasswordResetToken.php | 2 +- .../frontend/views/site/resetPassword.php | 2 +- apps/advanced/frontend/views/site/signup.php | 2 +- 12 files changed, 255 insertions(+), 116 deletions(-) rename apps/advanced/common/models/{ => forms}/LoginForm.php (91%) create mode 100644 apps/advanced/common/models/forms/PasswordResetRequestForm.php create mode 100644 apps/advanced/common/models/forms/ResetPasswordForm.php create mode 100644 apps/advanced/common/models/forms/SignupForm.php diff --git a/apps/advanced/backend/controllers/SiteController.php b/apps/advanced/backend/controllers/SiteController.php index ecf684c93f..6a9ff5c996 100644 --- a/apps/advanced/backend/controllers/SiteController.php +++ b/apps/advanced/backend/controllers/SiteController.php @@ -1,18 +1,24 @@ [ - 'class' => \yii\web\AccessControl::className(), + 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error'], @@ -28,6 +34,9 @@ class SiteController extends Controller ]; } + /** + * @inheritdoc + */ public function actions() { return [ diff --git a/apps/advanced/backend/views/site/login.php b/apps/advanced/backend/views/site/login.php index 132620315c..92d3d79d82 100644 --- a/apps/advanced/backend/views/site/login.php +++ b/apps/advanced/backend/views/site/login.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\LoginForm $model + * @var common\models\forms\LoginForm $model */ $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index af3c99707a..0630c5bc89 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -6,8 +6,7 @@ use yii\helpers\Security; use yii\web\IdentityInterface; /** - * Class User - * @package common\models + * User model * * @property integer $id * @property string $username @@ -22,16 +21,14 @@ use yii\web\IdentityInterface; */ class User extends ActiveRecord implements IdentityInterface { - /** - * @var string the raw password. Used to collect password input and isn't saved in database - */ - public $password; - const STATUS_DELETED = 0; const STATUS_ACTIVE = 10; const ROLE_USER = 10; + /** + * @inheritdoc + */ public function behaviors() { return [ @@ -46,10 +43,7 @@ class User extends ActiveRecord implements IdentityInterface } /** - * Finds an identity by the given ID. - * - * @param string|integer $id the ID to be looked for - * @return IdentityInterface|null the identity object that matches the given ID. + * @inheritdoc */ public static function findIdentity($id) { @@ -68,7 +62,7 @@ class User extends ActiveRecord implements IdentityInterface } /** - * @return int|string|array current user ID + * @inheritdoc */ public function getId() { @@ -76,7 +70,7 @@ class User extends ActiveRecord implements IdentityInterface } /** - * @return string current user auth key + * @inheritdoc */ public function getAuthKey() { @@ -84,8 +78,7 @@ class User extends ActiveRecord implements IdentityInterface } /** - * @param string $authKey - * @return boolean if auth key is valid for current user + * @inheritdoc */ public function validateAuthKey($authKey) { @@ -93,6 +86,8 @@ class User extends ActiveRecord implements IdentityInterface } /** + * Validates password + * * @param string $password password to validate * @return bool if password provided is valid for current user */ @@ -101,13 +96,13 @@ class User extends ActiveRecord implements IdentityInterface return Security::validatePassword($password, $this->password_hash); } + /** + * @inheritdoc + */ public function rules() { return [ - ['status', 'default', 'value' => self::STATUS_ACTIVE], ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], - - ['role', 'default', 'value' => self::ROLE_USER], ['role', 'in', 'range' => [self::ROLE_USER]], ['username', 'filter', 'filter' => 'trim'], @@ -117,34 +112,7 @@ class User extends ActiveRecord implements IdentityInterface ['email', 'filter', 'filter' => 'trim'], ['email', 'required'], ['email', 'email'], - ['email', 'unique', 'message' => 'This email address has already been taken.', 'on' => 'signup'], - ['email', 'exist', 'message' => 'There is no user with such email.', 'on' => 'requestPasswordResetToken'], - - ['password', 'required'], - ['password', 'string', 'min' => 6], + ['email', 'unique'], ]; } - - public function scenarios() - { - return [ - 'signup' => ['username', 'email', 'password', '!status', '!role'], - 'resetPassword' => ['password'], - 'requestPasswordResetToken' => ['email'], - ]; - } - - public function beforeSave($insert) - { - if (parent::beforeSave($insert)) { - if (($this->isNewRecord || $this->getScenario() === 'resetPassword') && !empty($this->password)) { - $this->password_hash = Security::generatePasswordHash($this->password); - } - if ($this->isNewRecord) { - $this->auth_key = Security::generateRandomKey(); - } - return true; - } - return false; - } } diff --git a/apps/advanced/common/models/LoginForm.php b/apps/advanced/common/models/forms/LoginForm.php similarity index 91% rename from apps/advanced/common/models/LoginForm.php rename to apps/advanced/common/models/forms/LoginForm.php index 38888d9d3a..c69050fc3b 100644 --- a/apps/advanced/common/models/LoginForm.php +++ b/apps/advanced/common/models/forms/LoginForm.php @@ -1,12 +1,12 @@ 'trim'], + ['email', 'required'], + ['email', 'email'], + ['email', 'exist', 'targetClass' => 'User', 'message' => 'There is no user with such email.'], + ]; + } + + /** + * + * @return boolean sends an email + */ + public function sendEmail() + { + $user = User::find([ + 'status' => User::STATUS_ACTIVE, + 'email' => $this->email, + ]); + + if (!$user) { + return false; + } + + $user->password_reset_token = Security::generateRandomKey(); + if ($user->save()) { + return \Yii::$app->mail->compose('passwordResetToken', ['user' => $user]) + ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot']) + ->setTo($this->email) + ->setSubject('Password reset for ' . \Yii::$app->name) + ->send(); + } + + return false; + } +} + \ No newline at end of file diff --git a/apps/advanced/common/models/forms/ResetPasswordForm.php b/apps/advanced/common/models/forms/ResetPasswordForm.php new file mode 100644 index 0000000000..b6ad04332d --- /dev/null +++ b/apps/advanced/common/models/forms/ResetPasswordForm.php @@ -0,0 +1,69 @@ +_user = User::find([ + 'password_reset_token' => $token, + 'status' => User::STATUS_ACTIVE, + ]); + if (!$this->_user) { + throw new InvalidParamException('Wrong password reset token.'); + } + } + + /** + * @return array the validation rules. + */ + public function rules() + { + return [ + ['password', 'required'], + ['password', 'string', 'min' => 6], + ]; + } + + /** + * Resets password. + * @return boolean if password was reset. + */ + public function resetPassword() + { + $user = $this->_user; + if ($user->validate()) { + $user->password_hash = Security::generatePasswordHash($this->password); + $user->password_reset_token = ''; + return $user->save(); + } else { + return false; + } + } +} + \ No newline at end of file diff --git a/apps/advanced/common/models/forms/SignupForm.php b/apps/advanced/common/models/forms/SignupForm.php new file mode 100644 index 0000000000..ef3ad797ff --- /dev/null +++ b/apps/advanced/common/models/forms/SignupForm.php @@ -0,0 +1,59 @@ + 'trim'], + ['username', 'required'], + ['username', 'string', 'min' => 2, 'max' => 255], + + ['email', 'filter', 'filter' => 'trim'], + ['email', 'required'], + ['email', 'email'], + ['email', 'unique', 'targetClass' => 'User', 'message' => 'This email address has already been taken.'], + + ['password', 'required'], + ['password', 'string', 'min' => 6], + ]; + } + + /** + * Signs user up. + * @return User saved model + */ + public function signup() + { + if ($this->validate()) { + $user = new User(); + $user->username = $this->username; + $user->email = $this->email; + $user->password_hash = Security::generatePasswordHash($this->password); + $user->auth_key = Security::generateRandomKey(); + $user->role = User::ROLE_USER; + $user->status = USer::STATUS_ACTIVE; + if ($user->save()) { + return $user; + } + } + return null; + } +} + \ No newline at end of file diff --git a/apps/advanced/frontend/controllers/SiteController.php b/apps/advanced/frontend/controllers/SiteController.php index 649d1f399a..2f45db5137 100644 --- a/apps/advanced/frontend/controllers/SiteController.php +++ b/apps/advanced/frontend/controllers/SiteController.php @@ -1,17 +1,24 @@ load($_POST) && $model->login()) { + if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { return $this->render('login', [ @@ -94,11 +104,13 @@ class SiteController extends Controller public function actionSignup() { - $model = new User(); - $model->setScenario('signup'); - if ($model->load($_POST) && $model->save()) { - if (Yii::$app->getUser()->login($model)) { - return $this->goHome(); + $model = new SignupForm(); + if ($model->load(Yii::$app->request->post())) { + $user = $model->signup(); + if ($user) { + if (Yii::$app->getUser()->login($user)) { + return $this->goHome(); + } } } @@ -109,16 +121,14 @@ class SiteController extends Controller public function actionRequestPasswordReset() { - $model = new User(); - $model->scenario = 'requestPasswordResetToken'; - if ($model->load($_POST) && $model->validate()) { - if ($this->sendPasswordResetEmail($model->email)) { - Yii::$app->getSession()->setFlash('success', 'Check your email for further instructions.'); - return $this->goHome(); - } else { - Yii::$app->getSession()->setFlash('error', 'There was an error sending email.'); - } + $model = new PasswordResetRequestForm(); + if ($model->load(Yii::$app->request->post()) && $model->sendEmail()) { + Yii::$app->getSession()->setFlash('success', 'Check your email for further instructions.'); + return $this->goHome(); + } else { + Yii::$app->getSession()->setFlash('error', 'There was an error sending email.'); } + return $this->render('requestPasswordResetToken', [ 'model' => $model, ]); @@ -126,21 +136,13 @@ class SiteController extends Controller public function actionResetPassword($token) { - if (empty($token) || is_array($token)) { - throw new BadRequestHttpException('Invalid password reset token.'); + try { + $model = new ResetPasswordForm($token); + } catch (InvalidParamException $e) { + throw new BadRequestHttpException($e->getMessage()); } - $model = User::find([ - 'password_reset_token' => $token, - 'status' => User::STATUS_ACTIVE, - ]); - - if ($model === null) { - throw new BadRequestHttpException('Wrong password reset token.'); - } - - $model->scenario = 'resetPassword'; - if ($model->load($_POST) && $model->save()) { + if ($model->load($_POST) && $model->resetPassword()) { Yii::$app->getSession()->setFlash('success', 'New password was saved.'); return $this->goHome(); } @@ -149,27 +151,4 @@ class SiteController extends Controller 'model' => $model, ]); } - - private function sendPasswordResetEmail($email) - { - $user = User::find([ - 'status' => User::STATUS_ACTIVE, - 'email' => $email, - ]); - - if (!$user) { - return false; - } - - $user->password_reset_token = Security::generateRandomKey(); - if ($user->save(false)) { - return \Yii::$app->mail->compose('passwordResetToken', ['user' => $user]) - ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot']) - ->setTo($email) - ->setSubject('Password reset for ' . \Yii::$app->name) - ->send(); - } - - return false; - } } diff --git a/apps/advanced/frontend/views/site/login.php b/apps/advanced/frontend/views/site/login.php index 635b9ae945..4892065a14 100644 --- a/apps/advanced/frontend/views/site/login.php +++ b/apps/advanced/frontend/views/site/login.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\LoginForm $model + * @var common\models\forms\LoginForm $model */ $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/requestPasswordResetToken.php b/apps/advanced/frontend/views/site/requestPasswordResetToken.php index bb13a5f02a..9cbddf5379 100644 --- a/apps/advanced/frontend/views/site/requestPasswordResetToken.php +++ b/apps/advanced/frontend/views/site/requestPasswordResetToken.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\User $model + * @var common\models\forms\PasswordResetRequestForm $model */ $this->title = 'Request password reset'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/resetPassword.php b/apps/advanced/frontend/views/site/resetPassword.php index ec9f949d79..b2b8f334eb 100644 --- a/apps/advanced/frontend/views/site/resetPassword.php +++ b/apps/advanced/frontend/views/site/resetPassword.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\User $model + * @var common\models\forms\ResetPasswordForm $model */ $this->title = 'Reset password'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/signup.php b/apps/advanced/frontend/views/site/signup.php index 3bb57fcd40..c45f378eb4 100644 --- a/apps/advanced/frontend/views/site/signup.php +++ b/apps/advanced/frontend/views/site/signup.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\User $model + * @var common\models\forms\SignupForm $model */ $this->title = 'Signup'; $this->params['breadcrumbs'][] = $this->title; From 6ad0d72a486fae3f66d2eae26647e4fbf4931699 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 31 Jan 2014 23:44:26 +0400 Subject: [PATCH 2/8] Extracted password-related code into User model methods --- apps/advanced/common/models/User.php | 26 +++++++++++++++++++ .../models/forms/PasswordResetRequestForm.php | 4 +-- .../common/models/forms/ResetPasswordForm.php | 6 ++--- .../common/models/forms/SignupForm.php | 7 +++-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index 0630c5bc89..96e105422d 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -96,6 +96,32 @@ class User extends ActiveRecord implements IdentityInterface return Security::validatePassword($password, $this->password_hash); } + /** + * Generates password hash from password and sets it to the model + * + * @param string $password + */ + public function setPassword($password) + { + $this->password_hash = Security::generatePasswordHash($password); + } + + /** + * Generates new password reset token + */ + public function generatePasswordResetToken() + { + $this->password_reset_token = Security::generateRandomKey(); + } + + /** + * Removes password reset token + */ + public function removePasswordResetToken() + { + $this->password_reset_token = ''; + } + /** * @inheritdoc */ diff --git a/apps/advanced/common/models/forms/PasswordResetRequestForm.php b/apps/advanced/common/models/forms/PasswordResetRequestForm.php index 552445b7ff..49da4e7968 100644 --- a/apps/advanced/common/models/forms/PasswordResetRequestForm.php +++ b/apps/advanced/common/models/forms/PasswordResetRequestForm.php @@ -3,7 +3,6 @@ namespace common\models\forms; use common\models\User; use yii\base\Model; -use yii\helpers\Security; /** * Password reset request form @@ -31,6 +30,7 @@ class PasswordResetRequestForm extends Model */ public function sendEmail() { + /** @var User $user */ $user = User::find([ 'status' => User::STATUS_ACTIVE, 'email' => $this->email, @@ -40,7 +40,7 @@ class PasswordResetRequestForm extends Model return false; } - $user->password_reset_token = Security::generateRandomKey(); + $user->generatePasswordResetToken(); if ($user->save()) { return \Yii::$app->mail->compose('passwordResetToken', ['user' => $user]) ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot']) diff --git a/apps/advanced/common/models/forms/ResetPasswordForm.php b/apps/advanced/common/models/forms/ResetPasswordForm.php index b6ad04332d..40fb0eb78b 100644 --- a/apps/advanced/common/models/forms/ResetPasswordForm.php +++ b/apps/advanced/common/models/forms/ResetPasswordForm.php @@ -4,7 +4,6 @@ namespace common\models\forms; use common\models\User; use yii\base\InvalidParamException; use yii\base\Model; -use yii\helpers\Security; use Yii; /** @@ -27,6 +26,7 @@ class ResetPasswordForm extends Model */ public function __construct($token) { + parent::__construct(); if (empty($token) || !is_string($token)) { throw new InvalidParamException('Password reset token cannot be blank.'); } @@ -58,8 +58,8 @@ class ResetPasswordForm extends Model { $user = $this->_user; if ($user->validate()) { - $user->password_hash = Security::generatePasswordHash($this->password); - $user->password_reset_token = ''; + $user->setPassword($this->password); + $user->removePasswordResetToken(); return $user->save(); } else { return false; diff --git a/apps/advanced/common/models/forms/SignupForm.php b/apps/advanced/common/models/forms/SignupForm.php index ef3ad797ff..248349a69d 100644 --- a/apps/advanced/common/models/forms/SignupForm.php +++ b/apps/advanced/common/models/forms/SignupForm.php @@ -3,7 +3,6 @@ namespace common\models\forms; use common\models\User; use yii\base\Model; -use yii\helpers\Security; use Yii; /** @@ -45,10 +44,10 @@ class SignupForm extends Model $user = new User(); $user->username = $this->username; $user->email = $this->email; - $user->password_hash = Security::generatePasswordHash($this->password); - $user->auth_key = Security::generateRandomKey(); + $user->setPassword($this->password); + $user->generatePasswordResetToken(); $user->role = User::ROLE_USER; - $user->status = USer::STATUS_ACTIVE; + $user->status = User::STATUS_ACTIVE; if ($user->save()) { return $user; } From e4c98f0fa3ff0e56950e9cea475100907849ba75 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 1 Feb 2014 17:47:18 +0400 Subject: [PATCH 3/8] Fixed constructor overriding to allow array configuration --- apps/advanced/common/models/forms/ResetPasswordForm.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/advanced/common/models/forms/ResetPasswordForm.php b/apps/advanced/common/models/forms/ResetPasswordForm.php index 40fb0eb78b..2de64dc538 100644 --- a/apps/advanced/common/models/forms/ResetPasswordForm.php +++ b/apps/advanced/common/models/forms/ResetPasswordForm.php @@ -22,11 +22,11 @@ class ResetPasswordForm extends Model * Creates a form model given a token * * @param string $token + * @param array $config name-value pairs that will be used to initialize the object properties * @throws \yii\base\InvalidParamException if token is empty or not valid */ - public function __construct($token) + public function __construct($token, $config = []) { - parent::__construct(); if (empty($token) || !is_string($token)) { throw new InvalidParamException('Password reset token cannot be blank.'); } @@ -37,6 +37,7 @@ class ResetPasswordForm extends Model if (!$this->_user) { throw new InvalidParamException('Wrong password reset token.'); } + parent::__construct($config); } /** From d98ec80cd14625a53c3b16a20e409aa106420fb2 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 1 Feb 2014 20:32:07 +0400 Subject: [PATCH 4/8] Used setter as field --- apps/advanced/common/models/User.php | 1 + apps/advanced/common/models/forms/ResetPasswordForm.php | 2 +- apps/advanced/common/models/forms/SignupForm.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index 96e105422d..b388529e16 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -18,6 +18,7 @@ use yii\web\IdentityInterface; * @property integer $status * @property integer $created_at * @property integer $updated_at + * @property string $password write-only password */ class User extends ActiveRecord implements IdentityInterface { diff --git a/apps/advanced/common/models/forms/ResetPasswordForm.php b/apps/advanced/common/models/forms/ResetPasswordForm.php index 2de64dc538..b2d00260a9 100644 --- a/apps/advanced/common/models/forms/ResetPasswordForm.php +++ b/apps/advanced/common/models/forms/ResetPasswordForm.php @@ -59,7 +59,7 @@ class ResetPasswordForm extends Model { $user = $this->_user; if ($user->validate()) { - $user->setPassword($this->password); + $user->password = $this->password; $user->removePasswordResetToken(); return $user->save(); } else { diff --git a/apps/advanced/common/models/forms/SignupForm.php b/apps/advanced/common/models/forms/SignupForm.php index 248349a69d..f4bfa03201 100644 --- a/apps/advanced/common/models/forms/SignupForm.php +++ b/apps/advanced/common/models/forms/SignupForm.php @@ -44,7 +44,7 @@ class SignupForm extends Model $user = new User(); $user->username = $this->username; $user->email = $this->email; - $user->setPassword($this->password); + $user->password = $this->password; $user->generatePasswordResetToken(); $user->role = User::ROLE_USER; $user->status = User::STATUS_ACTIVE; From a43be083e8ffda6defa07b881d2ba55f3ac3151a Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 1 Feb 2014 22:23:29 +0400 Subject: [PATCH 5/8] Moved forms used in frontend only to frontend --- apps/advanced/frontend/controllers/SiteController.php | 8 ++++---- apps/advanced/frontend/models/{ => forms}/ContactForm.php | 2 +- .../models/forms/PasswordResetRequestForm.php | 2 +- .../models/forms/ResetPasswordForm.php | 2 +- .../{common => frontend}/models/forms/SignupForm.php | 2 +- apps/advanced/frontend/views/site/contact.php | 2 +- .../frontend/views/site/requestPasswordResetToken.php | 2 +- apps/advanced/frontend/views/site/resetPassword.php | 2 +- apps/advanced/frontend/views/site/signup.php | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) rename apps/advanced/frontend/models/{ => forms}/ContactForm.php (97%) rename apps/advanced/{common => frontend}/models/forms/PasswordResetRequestForm.php (96%) rename apps/advanced/{common => frontend}/models/forms/ResetPasswordForm.php (97%) rename apps/advanced/{common => frontend}/models/forms/SignupForm.php (96%) diff --git a/apps/advanced/frontend/controllers/SiteController.php b/apps/advanced/frontend/controllers/SiteController.php index 2f45db5137..3680bf9f60 100644 --- a/apps/advanced/frontend/controllers/SiteController.php +++ b/apps/advanced/frontend/controllers/SiteController.php @@ -2,10 +2,10 @@ namespace frontend\controllers; use common\models\forms\LoginForm; -use common\models\forms\PasswordResetRequestForm; -use common\models\forms\ResetPasswordForm; -use common\models\forms\SignupForm; -use frontend\models\ContactForm; +use frontend\models\forms\PasswordResetRequestForm; +use frontend\models\forms\ResetPasswordForm; +use frontend\models\forms\SignupForm; +use frontend\models\forms\ContactForm; use yii\base\InvalidParamException; use yii\web\BadRequestHttpException; use yii\web\Controller; diff --git a/apps/advanced/frontend/models/ContactForm.php b/apps/advanced/frontend/models/forms/ContactForm.php similarity index 97% rename from apps/advanced/frontend/models/ContactForm.php rename to apps/advanced/frontend/models/forms/ContactForm.php index 0a664ad1ca..366789bc45 100644 --- a/apps/advanced/frontend/models/ContactForm.php +++ b/apps/advanced/frontend/models/forms/ContactForm.php @@ -1,6 +1,6 @@ title = 'Contact'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/requestPasswordResetToken.php b/apps/advanced/frontend/views/site/requestPasswordResetToken.php index 9cbddf5379..7c65214be9 100644 --- a/apps/advanced/frontend/views/site/requestPasswordResetToken.php +++ b/apps/advanced/frontend/views/site/requestPasswordResetToken.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\forms\PasswordResetRequestForm $model + * @var \frontend\models\forms\PasswordResetRequestForm $model */ $this->title = 'Request password reset'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/resetPassword.php b/apps/advanced/frontend/views/site/resetPassword.php index b2b8f334eb..223ac7c76e 100644 --- a/apps/advanced/frontend/views/site/resetPassword.php +++ b/apps/advanced/frontend/views/site/resetPassword.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\forms\ResetPasswordForm $model + * @var \frontend\models\forms\ResetPasswordForm $model */ $this->title = 'Reset password'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/signup.php b/apps/advanced/frontend/views/site/signup.php index c45f378eb4..33b8d208b6 100644 --- a/apps/advanced/frontend/views/site/signup.php +++ b/apps/advanced/frontend/views/site/signup.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\forms\SignupForm $model + * @var \frontend\models\forms\SignupForm $model */ $this->title = 'Signup'; $this->params['breadcrumbs'][] = $this->title; From c2e0b5beb5034df564051829ebafcc65fa422754 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 1 Feb 2014 23:08:39 +0400 Subject: [PATCH 6/8] Optimized forms code a bit --- apps/advanced/common/models/User.php | 3 +++ .../frontend/models/forms/ResetPasswordForm.php | 10 +++------- apps/advanced/frontend/models/forms/SignupForm.php | 8 +------- framework/db/BaseActiveRecord.php | 2 -- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index b388529e16..91550a1cbc 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -129,7 +129,10 @@ class User extends ActiveRecord implements IdentityInterface public function rules() { return [ + ['status', 'default', 'value' => self::STATUS_ACTIVE], ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], + + ['role', 'default', 'value' => self::ROLE_USER], ['role', 'in', 'range' => [self::ROLE_USER]], ['username', 'filter', 'filter' => 'trim'], diff --git a/apps/advanced/frontend/models/forms/ResetPasswordForm.php b/apps/advanced/frontend/models/forms/ResetPasswordForm.php index 614cf24fc2..de9852fcae 100644 --- a/apps/advanced/frontend/models/forms/ResetPasswordForm.php +++ b/apps/advanced/frontend/models/forms/ResetPasswordForm.php @@ -58,13 +58,9 @@ class ResetPasswordForm extends Model public function resetPassword() { $user = $this->_user; - if ($user->validate()) { - $user->password = $this->password; - $user->removePasswordResetToken(); - return $user->save(); - } else { - return false; - } + $user->password = $this->password; + $user->removePasswordResetToken(); + return $user->save(); } } \ No newline at end of file diff --git a/apps/advanced/frontend/models/forms/SignupForm.php b/apps/advanced/frontend/models/forms/SignupForm.php index 5c9921495b..e5693d6bf0 100644 --- a/apps/advanced/frontend/models/forms/SignupForm.php +++ b/apps/advanced/frontend/models/forms/SignupForm.php @@ -41,13 +41,7 @@ class SignupForm extends Model public function signup() { if ($this->validate()) { - $user = new User(); - $user->username = $this->username; - $user->email = $this->email; - $user->password = $this->password; - $user->generatePasswordResetToken(); - $user->role = User::ROLE_USER; - $user->status = User::STATUS_ACTIVE; + $user = User::create($this->attributes); if ($user->save()) { return $user; } diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 54d94453e4..d8cb15d599 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -986,8 +986,6 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface /** * Creates an active record object using a row of data from the database/storage. * - * This method is *not* meant to be used to create new records. - * * It is an internal method meant to be called to create active record objects after * fetching data from the database. It is mainly used by [[ActiveQuery]] to populate * the query results into Active Records. From 5d7e7f4d9187b54237379521d35a9065fcc84d8b Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 4 Feb 2014 13:31:26 +0400 Subject: [PATCH 7/8] Moved creating user to static method of the model --- apps/advanced/common/models/User.php | 12 ++++++++++++ apps/advanced/frontend/models/forms/SignupForm.php | 5 +---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index 91550a1cbc..3cc5a77d7c 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -27,6 +27,18 @@ class User extends ActiveRecord implements IdentityInterface const ROLE_USER = 10; + public static function create($attributes) + { + /** @var User $user */ + $user = new static(); + $user->setAttributes($attributes); + if ($user->save()) { + return $user; + } else { + return null; + } + } + /** * @inheritdoc */ diff --git a/apps/advanced/frontend/models/forms/SignupForm.php b/apps/advanced/frontend/models/forms/SignupForm.php index e5693d6bf0..4872e1fb8b 100644 --- a/apps/advanced/frontend/models/forms/SignupForm.php +++ b/apps/advanced/frontend/models/forms/SignupForm.php @@ -41,10 +41,7 @@ class SignupForm extends Model public function signup() { if ($this->validate()) { - $user = User::create($this->attributes); - if ($user->save()) { - return $user; - } + return User::create($this->attributes); } return null; } From a1497ca01cb6a8a1d3baa510c4aa674ffc67e194 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 5 Feb 2014 17:41:47 +0400 Subject: [PATCH 8/8] Removed extra \models\forms namespace, moved all models to just \models --- apps/advanced/backend/controllers/SiteController.php | 2 +- apps/advanced/backend/views/site/login.php | 2 +- apps/advanced/common/models/{forms => }/LoginForm.php | 2 +- apps/advanced/frontend/controllers/SiteController.php | 10 +++++----- .../frontend/models/{forms => }/ContactForm.php | 2 +- .../models/{forms => }/PasswordResetRequestForm.php | 2 +- .../frontend/models/{forms => }/ResetPasswordForm.php | 2 +- .../frontend/models/{forms => }/SignupForm.php | 2 +- apps/advanced/frontend/views/site/contact.php | 2 +- apps/advanced/frontend/views/site/login.php | 2 +- .../frontend/views/site/requestPasswordResetToken.php | 2 +- apps/advanced/frontend/views/site/resetPassword.php | 2 +- apps/advanced/frontend/views/site/signup.php | 2 +- 13 files changed, 17 insertions(+), 17 deletions(-) rename apps/advanced/common/models/{forms => }/LoginForm.php (97%) rename apps/advanced/frontend/models/{forms => }/ContactForm.php (97%) rename apps/advanced/frontend/models/{forms => }/PasswordResetRequestForm.php (96%) rename apps/advanced/frontend/models/{forms => }/ResetPasswordForm.php (97%) rename apps/advanced/frontend/models/{forms => }/SignupForm.php (96%) diff --git a/apps/advanced/backend/controllers/SiteController.php b/apps/advanced/backend/controllers/SiteController.php index 6a9ff5c996..211a31fa67 100644 --- a/apps/advanced/backend/controllers/SiteController.php +++ b/apps/advanced/backend/controllers/SiteController.php @@ -4,7 +4,7 @@ namespace backend\controllers; use Yii; use yii\web\AccessControl; use yii\web\Controller; -use common\models\forms\LoginForm; +use common\models\LoginForm; /** * Site controller diff --git a/apps/advanced/backend/views/site/login.php b/apps/advanced/backend/views/site/login.php index 92d3d79d82..60c438f1c1 100644 --- a/apps/advanced/backend/views/site/login.php +++ b/apps/advanced/backend/views/site/login.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\forms\LoginForm $model + * @var \common\models\LoginForm $model */ $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/common/models/forms/LoginForm.php b/apps/advanced/common/models/LoginForm.php similarity index 97% rename from apps/advanced/common/models/forms/LoginForm.php rename to apps/advanced/common/models/LoginForm.php index c69050fc3b..659f01ca81 100644 --- a/apps/advanced/common/models/forms/LoginForm.php +++ b/apps/advanced/common/models/LoginForm.php @@ -1,5 +1,5 @@ title = 'Contact'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/login.php b/apps/advanced/frontend/views/site/login.php index 4892065a14..60f8ed0234 100644 --- a/apps/advanced/frontend/views/site/login.php +++ b/apps/advanced/frontend/views/site/login.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var common\models\forms\LoginForm $model + * @var \common\models\LoginForm $model */ $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/requestPasswordResetToken.php b/apps/advanced/frontend/views/site/requestPasswordResetToken.php index 7c65214be9..fc22aa1941 100644 --- a/apps/advanced/frontend/views/site/requestPasswordResetToken.php +++ b/apps/advanced/frontend/views/site/requestPasswordResetToken.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var \frontend\models\forms\PasswordResetRequestForm $model + * @var \frontend\models\PasswordResetRequestForm $model */ $this->title = 'Request password reset'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/resetPassword.php b/apps/advanced/frontend/views/site/resetPassword.php index 223ac7c76e..170b703b5f 100644 --- a/apps/advanced/frontend/views/site/resetPassword.php +++ b/apps/advanced/frontend/views/site/resetPassword.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var \frontend\models\forms\ResetPasswordForm $model + * @var \frontend\models\ResetPasswordForm $model */ $this->title = 'Reset password'; $this->params['breadcrumbs'][] = $this->title; diff --git a/apps/advanced/frontend/views/site/signup.php b/apps/advanced/frontend/views/site/signup.php index 33b8d208b6..27bd3dde6c 100644 --- a/apps/advanced/frontend/views/site/signup.php +++ b/apps/advanced/frontend/views/site/signup.php @@ -5,7 +5,7 @@ use yii\widgets\ActiveForm; /** * @var yii\web\View $this * @var yii\widgets\ActiveForm $form - * @var \frontend\models\forms\SignupForm $model + * @var \frontend\models\SignupForm $model */ $this->title = 'Signup'; $this->params['breadcrumbs'][] = $this->title;