Completed
Push — master ( 4e2cc9...09de0e )
by Alexey
05:45
created

User::attributeLabels()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace modules\users\models;
4
5
use Yii;
6
use yii\helpers\ArrayHelper;
7
use yii\helpers\Html;
8
use modules\users\models\query\UserQuery;
9
use modules\users\traits\ModuleTrait;
10
use modules\users\Module;
11
12
/**
13
 * Class User
14
 * @package modules\users\models
15
 *
16
 * @property array statusesArray Array statuses
17
 * @property string userFullName Full user name
18
 * @property int|string registrationType Type registered
19
 */
20
class User extends BaseUser
21
{
22
    use ModuleTrait;
23
24
    const LENGTH_STRING_PASSWORD_MIN = 6;
25
    const LENGTH_STRING_PASSWORD_MAX = 16;
26
27
    const SCENARIO_ADMIN_CREATE = 'adminCreate';
28
    const SCENARIO_ADMIN_UPDATE = 'adminUpdate';
29
    const SCENARIO_ADMIN_PASSWORD_UPDATE = 'adminPasswordUpdate';
30
    const SCENARIO_PROFILE_UPDATE = 'profileUpdate';
31
    const SCENARIO_PASSWORD_UPDATE = 'passwordUpdate';
32
    const SCENARIO_PROFILE_DELETE = 'profileDelete';
33
34
    /**
35
     * @var string
36
     */
37
    public $currentPassword;
38
39
    /**
40
     * @var string
41
     */
42
    public $newPassword;
43
44
    /**
45
     * @var string
46
     */
47
    public $newPasswordRepeat;
48
49
    /**
50
     * @return array
51
     */
52
    public function rules()
53
    {
54
        return ArrayHelper::merge(parent::rules(), [
55
            ['status', 'integer'],
56
            ['status', 'default', 'value' => self::STATUS_WAIT],
57
            ['status', 'in', 'range' => array_keys(self::getStatusesArray())],
58
59
            [['newPassword', 'newPasswordRepeat'], 'required', 'on' => [self::SCENARIO_ADMIN_CREATE, self::SCENARIO_PASSWORD_UPDATE, self::SCENARIO_ADMIN_PASSWORD_UPDATE]],
60
            ['newPassword', 'string', 'min' => self::LENGTH_STRING_PASSWORD_MIN],
61
            ['newPasswordRepeat', 'compare', 'compareAttribute' => 'newPassword'],
62
            ['currentPassword', 'validateCurrentPassword', 'skipOnEmpty' => false, 'skipOnError' => false],
63
        ]);
64
    }
65
66
    /**
67
     * @param string $attribute
68
     */
69
    public function validateCurrentPassword($attribute)
70
    {
71
        if (!empty($this->newPassword) && !empty($this->newPasswordRepeat) && !$this->hasErrors()) {
72
            $this->processValidatePassword($attribute);
73
        } else {
74
            $this->addError($attribute, Module::t('module', 'Not all fields are filled in correctly.'));
75
        }
76
    }
77
78
    /**
79
     * @param string $attribute
80
     */
81
    protected function processValidatePassword($attribute)
82
    {
83
        if ($attribute) {
84
            if (!$this->validatePassword($this->$attribute))
85
                $this->addError($attribute, Module::t('module', 'Incorrect current password.'));
86
        } else {
87
            $this->addError($attribute, Module::t('module', 'Enter your current password.'));
88
        }
89
    }
90
91
    /**
92
     * @return array
93
     */
94
    public function scenarios()
95
    {
96
        $scenarios = parent::scenarios();
97
        $scenarios[self::SCENARIO_ADMIN_CREATE] = ['avatar', 'username', 'email', 'status', 'newPassword', 'newPasswordRepeat', 'registration_type', 'first_name', 'last_name'];
98
        $scenarios[self::SCENARIO_ADMIN_UPDATE] = ['username', 'email', 'status', 'first_name', 'last_name', 'newPassword', 'newPasswordRepeat'];
99
        $scenarios[self::SCENARIO_ADMIN_PASSWORD_UPDATE] = ['newPassword', 'newPasswordRepeat'];
100
        $scenarios[self::SCENARIO_PASSWORD_UPDATE] = ['currentPassword', 'newPassword', 'newPasswordRepeat'];
101
        $scenarios[self::SCENARIO_PROFILE_UPDATE] = ['username', 'email', 'first_name', 'last_name'];
102
        $scenarios[self::SCENARIO_PROFILE_DELETE] = ['status'];
103
        $scenarios['default'] = ['username', 'email', 'first_name', 'last_name', 'password_hash', 'status', 'auth_key', 'email_confirm_token'];
104
        return $scenarios;
105
    }
106
107
    /**
108
     * @return array
109
     */
110
    public function attributeLabels()
111
    {
112
        return ArrayHelper::merge(parent::attributeLabels(), [
113
            'userRoleName' => Module::t('module', 'Role'),
114
            'currentPassword' => Module::t('module', 'Current Password'),
115
            'newPassword' => Module::t('module', 'New Password'),
116
            'newPasswordRepeat' => Module::t('module', 'Repeat Password'),
117
        ]);
118
    }
119
120
    /**
121
     * Actions before saving
122
     *
123
     * @param bool $insert
124
     * @return bool
125
     * @throws \yii\base\Exception
126
     */
127
    public function beforeSave($insert)
128
    {
129
        if (parent::beforeSave($insert)) {
130
            if (!empty($this->newPassword)) {
131
                $this->setPassword($this->newPassword);
132
            }
133
            return true;
134
        }
135
        return false;
136
    }
137
138
    /**
139
     * @return array
140
     */
141
    public static function getStatusesArray()
142
    {
143
        return [
144
            self::STATUS_BLOCKED => Module::t('module', 'Blocked'),
145
            self::STATUS_ACTIVE => Module::t('module', 'Active'),
146
            self::STATUS_WAIT => Module::t('module', 'Wait'),
147
            self::STATUS_DELETED => Module::t('module', 'Deleted'),
148
        ];
149
    }
150
151
    /**
152
     * Set Status
153
     * @return int|string
154
     */
155
    public function setStatus()
156
    {
157
        switch ($this->status) {
158
            case self::STATUS_ACTIVE:
159
                $this->status = self::STATUS_BLOCKED;
160
                break;
161
            case self::STATUS_DELETED:
162
                $this->status = self::STATUS_WAIT;
163
                break;
164
            default:
165
                $this->status = self::STATUS_ACTIVE;
166
        }
167
        return $this->status;
168
    }
169
170
    /**
171
     * @return string
172
     */
173
    public function getUserFullName()
174
    {
175
        $fullName = Module::t('module', 'Guest');
176
        if (!Yii::$app->user->isGuest) {
177
            $fullName = $this->first_name . ' ' . $this->last_name;
178
            $fullName = ($fullName != ' ') ? $fullName : $this->username;
179
        }
180
        return Html::encode(trim($fullName));
181
    }
182
183
    /**
184
     * @param integer|string $id
185
     * @return bool
186
     */
187
    public function isSuperAdmin($id = '')
188
    {
189
        $id = $id ? $id : $this->id;
190
        $authManager = Yii::$app->authManager;
191
        $roles = $authManager->getRolesByUser($id);
192
        foreach ($roles as $role) {
193
            if ($role->name == \modules\rbac\models\Role::ROLE_SUPER_ADMIN)
194
                return true;
195
        }
196
        return false;
197
    }
198
199
    /**
200
     * @return bool
201
     */
202
    public function isDeleted()
203
    {
204
        return $this->status === self::STATUS_DELETED;
205
    }
206
207
    /**
208
     * @return mixed
209
     */
210
    public function getStatusName()
211
    {
212
        return ArrayHelper::getValue(self::getStatusesArray(), $this->status);
213
    }
214
215
    /**
216
     * Return <span class="label label-success">Active</span>
217
     * @return string
218
     */
219
    public function getStatusLabelName()
220
    {
221
        $name = ArrayHelper::getValue(self::getLabelsArray(), $this->status);
222
        return Html::tag('span', $this->getStatusName(), ['class' => 'label label-' . $name]);
223
    }
224
225
    /**
226
     * @return array
227
     */
228
    public static function getLabelsArray()
229
    {
230
        return [
231
            self::STATUS_BLOCKED => 'default',
232
            self::STATUS_ACTIVE => 'success',
233
            self::STATUS_WAIT => 'warning',
234
            self::STATUS_DELETED => 'danger',
235
        ];
236
    }
237
238
    /**
239
     * @return object|\yii\db\ActiveQuery
240
     * @throws \yii\base\InvalidConfigException
241
     */
242
    public static function find()
243
    {
244
        return Yii::createObject(UserQuery::class, [get_called_class()]);
245
    }
246
247
    /**
248
     * @return bool
249
     */
250
    public function beforeDelete()
251
    {
252
        $authManager = Yii::$app->getAuthManager();
253
        if ($authManager->getRolesByUser($this->id)) {
254
            $authManager->revokeAll($this->id);
255
        }
256
        return parent::beforeDelete();
257
    }
258
}
259