Blame view

common/models/User.php 10.7 KB
b0f143c3   Yarik   first commit
1
  <?php
b95371cf   Yarik   test
2
      namespace common\models;
b0f143c3   Yarik   first commit
3
  
b95371cf   Yarik   test
4
5
6
7
8
9
      use Yii;
      use yii\base\NotSupportedException;
      use yii\behaviors\TimestampBehavior;
      use yii\db\ActiveRecord;
      use yii\web\IdentityInterface;
      use developeruz\db_rbac\interfaces\UserRbacInterface;
b0f143c3   Yarik   first commit
10
11
  
      /**
b95371cf   Yarik   test
12
13
14
15
16
17
18
19
20
21
22
       * User model
       * @property integer $id
       * @property string  $username
       * @property string  $password_hash
       * @property string  $password_reset_token
       * @property string  $email
       * @property string  $auth_key
       * @property integer $status
       * @property integer $created_at
       * @property integer $updated_at
       * @property string  $password write-only password
b0f143c3   Yarik   first commit
23
       */
b95371cf   Yarik   test
24
      class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
b0f143c3   Yarik   first commit
25
      {
b0f143c3   Yarik   first commit
26
  
b95371cf   Yarik   test
27
28
29
          /**
           * @var array EAuth attributes
           */
b0f143c3   Yarik   first commit
30
  
b95371cf   Yarik   test
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
          const STATUS_DELETED = 0;
          const STATUS_ACTIVE = 10;
  
          public $profile;
  
          public $old_password;
  
          public $new_password;
  
          public $password_reply;
  
          /**
           * @inheritdoc
           */
          public static function tableName()
          {
              return '{{%user}}';
          }
  
          /**
           * @inheritdoc
           */
          public function behaviors()
          {
              return [
                  TimestampBehavior::className(),
              ];
          }
  
          /**
           * @inheritdoc
           */
          public function rules()
          {
              return [
                  [
                      'status',
                      'default',
                      'value' => self::STATUS_ACTIVE,
                  ],
                  [
                      'status',
                      'in',
                      'range' => [
                          self::STATUS_ACTIVE,
                          self::STATUS_DELETED,
                      ],
                  ],
                  [
                      [
                          'username',
                          'lastname',
                          'firstname',
                          'middlename',
                      ],
                      'string',
                      'max' => 255,
                  ],
                  [
                      [ 'firstname' ],
                      'required',
                  ],
                  [
                      [ 'type' ],
                      'in',
                      'range' => [
                          1,
                          2,
                      ],
                  ],
                  [
                      [ 'type' ],
                      'default',
                      'value' => '1',
                  ],
                  [
                      [
                          'specializationInput',
                          'paymentInput',
                      ],
                      'safe',
                  ],
              ];
          }
  
          /**
           * @inheritdoc
           */
          public static function findIdentity($id)
          {
              if(Yii::$app->getSession()
                          ->has('user-' . $id)
              ) {
                  if(Yii::$app->getSession()
                              ->has('user-' . $id)
                  ) {
                      return new self(Yii::$app->getSession()
                                               ->get('user-' . $id));
                  } else {
                      return isset( self::$users[ $id ] ) ? new self(self::$users[ $id ]) : NULL;
                  }
              } else {
                  return static::findOne([
                      'id'     => $id,
                      'status' => self::STATUS_ACTIVE,
                  ]);
b0f143c3   Yarik   first commit
137
              }
b95371cf   Yarik   test
138
  
b0f143c3   Yarik   first commit
139
          }
b95371cf   Yarik   test
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  
          /**
           * @param \nodge\eauth\ServiceBase $service
           *
           * @return User
           * @throws ErrorException
           */
          public static function findByEAuth($service)
          {
              if(!$service->getIsAuthenticated()) {
                  throw new ErrorException('EAuth user should be authenticated before creating identity.');
              }
              $id = $service->getServiceName() . '-' . $service->getId();
              $attributes = [
                  'id'       => $id,
                  'username' => $service->getAttribute('name'),
                  'authKey'  => md5($id),
                  'profile'  => $service->getAttributes(),
              ];
              $attributes[ 'profile' ][ 'service' ] = $service->getServiceName();
              Yii::$app->getSession()
                       ->set('user-' . $id, $attributes);
              return new self($attributes);
b0f143c3   Yarik   first commit
163
          }
b0f143c3   Yarik   first commit
164
  
b95371cf   Yarik   test
165
          public $authKey;
b0f143c3   Yarik   first commit
166
  
b95371cf   Yarik   test
167
168
169
170
171
172
173
          /**
           * @inheritdoc
           */
          public static function findIdentityByAccessToken($token, $type = NULL)
          {
              throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
          }
b0f143c3   Yarik   first commit
174
  
b95371cf   Yarik   test
175
176
177
178
179
180
181
182
183
184
185
186
187
188
          /**
           * Finds user by username
           *
           * @param string $username
           *
           * @return static|null
           */
          public static function findByUsername($username)
          {
              return static::findOne([
                  'username' => $username,
                  'status'   => self::STATUS_ACTIVE,
              ]);
          }
b0f143c3   Yarik   first commit
189
  
b95371cf   Yarik   test
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
          /**
           * Finds user by password reset token
           *
           * @param string $token password reset token
           *
           * @return static|null
           */
          public static function findByPasswordResetToken($token)
          {
              if(!static::isPasswordResetTokenValid($token)) {
                  return NULL;
              }
  
              return static::findOne([
                  'password_reset_token' => $token,
                  'status'               => self::STATUS_ACTIVE,
              ]);
b0f143c3   Yarik   first commit
207
208
          }
  
b95371cf   Yarik   test
209
210
211
212
213
214
215
216
217
218
219
220
          /**
           * Finds out if password reset token is valid
           *
           * @param string $token password reset token
           *
           * @return boolean
           */
          public static function isPasswordResetTokenValid($token)
          {
              if(empty( $token )) {
                  return false;
              }
b0f143c3   Yarik   first commit
221
  
b95371cf   Yarik   test
222
223
224
              $timestamp = (int) substr($token, strrpos($token, '_') + 1);
              $expire = Yii::$app->params[ 'user.passwordResetTokenExpire' ];
              return $timestamp + $expire >= time();
b0f143c3   Yarik   first commit
225
226
          }
  
b95371cf   Yarik   test
227
228
229
230
231
232
233
          /**
           * @inheritdoc
           */
          public function getId()
          {
              return $this->getPrimaryKey();
          }
b0f143c3   Yarik   first commit
234
  
b95371cf   Yarik   test
235
236
237
238
239
240
241
          /**
           * @inheritdoc
           */
          public function getAuthKey()
          {
              return $this->auth_key;
          }
b0f143c3   Yarik   first commit
242
  
b95371cf   Yarik   test
243
244
245
246
247
248
249
          /**
           * @inheritdoc
           */
          public function validateAuthKey($authKey)
          {
              return $this->getAuthKey() === $authKey;
          }
b0f143c3   Yarik   first commit
250
  
b95371cf   Yarik   test
251
252
253
254
255
256
257
258
259
260
261
          /**
           * Validates password
           *
           * @param string $password password to validate
           *
           * @return boolean if password provided is valid for current user
           */
          public function validatePassword($password)
          {
              return Yii::$app->security->validatePassword($password, $this->password_hash);
          }
b0f143c3   Yarik   first commit
262
  
b95371cf   Yarik   test
263
264
265
266
267
268
269
270
271
          /**
           * Generates password hash from password and sets it to the model
           *
           * @param string $password
           */
          public function setPassword($password)
          {
              $this->password_hash = Yii::$app->security->generatePasswordHash($password);
          }
b0f143c3   Yarik   first commit
272
  
b95371cf   Yarik   test
273
274
275
276
277
278
279
          /**
           * Generates "remember me" authentication key
           */
          public function generateAuthKey()
          {
              $this->auth_key = Yii::$app->security->generateRandomString();
          }
b0f143c3   Yarik   first commit
280
  
b95371cf   Yarik   test
281
282
283
284
285
286
287
          /**
           * Generates new password reset token
           */
          public function generatePasswordResetToken()
          {
              $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
          }
b0f143c3   Yarik   first commit
288
  
b95371cf   Yarik   test
289
290
291
292
293
294
295
          /**
           * Removes password reset token
           */
          public function removePasswordResetToken()
          {
              $this->password_reset_token = NULL;
          }
b0f143c3   Yarik   first commit
296
  
b95371cf   Yarik   test
297
298
299
300
          public function getUserName()
          {
              return $this->username;
          }
b0f143c3   Yarik   first commit
301
  
b95371cf   Yarik   test
302
303
304
305
306
307
          public function getRoles()
          {
              $auth = \Yii::$app->authManager;
              $roles = $this->getRoleChildrenRecursive($auth->getRolesByUser($this->id), $auth);
              return $roles;
          }
b0f143c3   Yarik   first commit
308
  
b95371cf   Yarik   test
309
          protected function getRoleChildrenRecursive($roles, $auth, $result = [ ])
b0f143c3   Yarik   first commit
310
          {
b95371cf   Yarik   test
311
312
313
314
315
316
317
              if(is_array($roles) && !empty( $roles )) {
                  foreach($roles as $role => $item) {
                      if(!( $item instanceof \yii\rbac\Role )) {
                          continue;
                      }
                      $result[] = $role;
                      $result = self::getRoleChildrenRecursive($auth->getChildren($role), $auth, $result);
b0f143c3   Yarik   first commit
318
                  }
b95371cf   Yarik   test
319
320
321
                  return $result;
              } else {
                  return $result;
b0f143c3   Yarik   first commit
322
              }
b0f143c3   Yarik   first commit
323
          }
cd6bd007   Yarik   test
324
  
b95371cf   Yarik   test
325
326
327
328
329
          //    public function afterSave ($insert, $changedAttributes)
          //    {
          //        parent::afterSave ($insert, $changedAttributes);
          //        \Yii::$app->options->createOptions($this->id);
          //    }
70abf3e7   Administrator   add field v.1
330
  
b95371cf   Yarik   test
331
332
333
334
          public function getUserInfo()
          {
              return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]);
          }
51e0a262   Yarik   test
335
  
b95371cf   Yarik   test
336
337
338
339
          public function getIsPerformer()
          {
              return true;
          }
033f9331   Administrator   09.02.16
340
341
342
343
      public function getCompanyInfo(){
          return $this->hasOne(CompanyInfo::className(), ['user_id' => 'id']);
      }
  
658d13d4   Administrator   09.02.16
344
345
346
347
348
349
      public function getLiveTime(){
  
          $now = new \DateTime('now');
          $date1 = new \DateTime(date ('Y-m-d H:i:s',$this->created_at));
          return  \Yii::$app->formatter->asRelativeTime($date1->diff($now));
      }
033f9331   Administrator   09.02.16
350
  
51e0a262   Yarik   test
351
352
353
354
      public function getIsPerformer()
      {
          return true;
      }
b95371cf   Yarik   test
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
  
          public function getIsCustomer()
          {
              return true;
          }
  
          public function getPayments()
          {
              return $this->hasMany(Payment::className(), [ 'payment_id' => 'payment_id' ])
                          ->viaTable('user_payment', [ 'user_id' => 'id' ]);
          }
  
          public function getPaymentInput()
          {
              return $this->getPayments()
                          ->asArray()
                          ->column();
          }
  
          public function setPaymentInput($value)
          {
              $this->paymentInput = $value;
          }
  
          public function getSpecializations()
          {
              return $this->hasMany(Specialization::className(), [ 'specialization_id' => 'specialization_id' ])
                          ->viaTable('user_specialization', [ 'user_id' => 'id' ]);
          }
  
          public function getSpecializationInput()
          {
              return $this->getSpecializations()
                          ->asArray()
                          ->column();
          }
  
          public function setSpecializationInput($value)
          {
              $this->specializationInput = $value;
          }
51e0a262   Yarik   test
396
  
51e0a262   Yarik   test
397
      }