b0f143c3
Yarik
first commit
|
1
|
<?php
|
b95371cf
Yarik
test
|
2
|
namespace common\models;
|
b0f143c3
Yarik
first commit
|
3
|
|
4ed1f788
Yarik
test
|
4
5
|
use common\modules\comment\models\Comment;
use common\modules\comment\models\Rating;
|
b95371cf
Yarik
test
|
6
|
use Yii;
|
4ed1f788
Yarik
test
|
7
|
use yii\base\InvalidConfigException;
|
b95371cf
Yarik
test
|
8
9
|
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
|
e8236f44
Yarik
test
|
10
|
use yii\db\ActiveQuery;
|
b95371cf
Yarik
test
|
11
|
use yii\db\ActiveRecord;
|
e8236f44
Yarik
test
|
12
13
|
use yii\rbac\ManagerInterface;
use yii\rbac\Role;
|
b95371cf
Yarik
test
|
14
15
|
use yii\web\IdentityInterface;
use developeruz\db_rbac\interfaces\UserRbacInterface;
|
b0f143c3
Yarik
first commit
|
16
17
|
/**
|
b95371cf
Yarik
test
|
18
|
* User model
|
4ed1f788
Yarik
test
|
19
20
21
22
23
24
25
26
27
28
29
30
|
* @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
* @property string $type
* @property UserInfo $userInfo
|
b0f143c3
Yarik
first commit
|
31
|
*/
|
b95371cf
Yarik
test
|
32
|
class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
|
b0f143c3
Yarik
first commit
|
33
|
{
|
4c9663e0
Yarik
test
|
34
|
|
b95371cf
Yarik
test
|
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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}}';
}
|
35b03e57
Administrator
add yii jquery
|
54
55
|
|
b95371cf
Yarik
test
|
56
57
58
59
60
61
|
/**
* @inheritdoc
*/
public function behaviors()
{
return [
|
35b03e57
Administrator
add yii jquery
|
62
63
64
|
[
'class' => 'common\behaviors\ShowImage',
],
|
b95371cf
Yarik
test
|
65
66
67
68
|
TimestampBehavior::className(),
];
}
|
b95371cf
Yarik
test
|
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
|
/**
* @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,
],
[
|
b95371cf
Yarik
test
|
99
100
101
|
[
'specializationInput',
'paymentInput',
|
4ed1f788
Yarik
test
|
102
|
'type',
|
b95371cf
Yarik
test
|
103
104
105
|
],
'safe',
],
|
658a5f37
Yarik
test
|
106
107
108
109
|
[
'type',
'default',
'value' => 1,
|
4ed1f788
Yarik
test
|
110
|
],
|
b95371cf
Yarik
test
|
111
112
113
114
115
116
|
];
}
/**
* @inheritdoc
*/
|
3e86d3d1
Yarik
test
|
117
118
119
120
|
public function attributeLabels()
{
return [
'firstname' => Yii::t('app', 'Имя'),
|
4ed1f788
Yarik
test
|
121
122
|
'lastname' => Yii::t('app', 'Фамилия'),
'email' => Yii::t('app', 'Email'),
|
3e86d3d1
Yarik
test
|
123
124
125
126
127
128
|
];
}
/**
* @inheritdoc
*/
|
b95371cf
Yarik
test
|
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
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
|
147
|
}
|
b95371cf
Yarik
test
|
148
|
|
b0f143c3
Yarik
first commit
|
149
|
}
|
b95371cf
Yarik
test
|
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
/**
* @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
|
173
|
}
|
b0f143c3
Yarik
first commit
|
174
|
|
b95371cf
Yarik
test
|
175
|
public $authKey;
|
b0f143c3
Yarik
first commit
|
176
|
|
b95371cf
Yarik
test
|
177
178
179
180
181
182
183
|
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = NULL)
{
throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
}
|
b0f143c3
Yarik
first commit
|
184
|
|
b95371cf
Yarik
test
|
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
/**
* 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
|
199
|
|
b95371cf
Yarik
test
|
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/**
* 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
|
217
218
|
}
|
b95371cf
Yarik
test
|
219
220
221
222
223
224
225
226
227
228
229
230
|
/**
* 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
|
231
|
|
b95371cf
Yarik
test
|
232
233
234
|
$timestamp = (int) substr($token, strrpos($token, '_') + 1);
$expire = Yii::$app->params[ 'user.passwordResetTokenExpire' ];
return $timestamp + $expire >= time();
|
b0f143c3
Yarik
first commit
|
235
236
|
}
|
b95371cf
Yarik
test
|
237
238
239
240
241
242
243
|
/**
* @inheritdoc
*/
public function getId()
{
return $this->getPrimaryKey();
}
|
b0f143c3
Yarik
first commit
|
244
|
|
b95371cf
Yarik
test
|
245
246
247
248
249
250
251
|
/**
* @inheritdoc
*/
public function getAuthKey()
{
return $this->auth_key;
}
|
b0f143c3
Yarik
first commit
|
252
|
|
b95371cf
Yarik
test
|
253
254
255
256
257
258
259
|
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
|
b0f143c3
Yarik
first commit
|
260
|
|
b95371cf
Yarik
test
|
261
262
263
264
265
266
267
268
269
270
271
|
/**
* 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
|
272
|
|
b95371cf
Yarik
test
|
273
274
275
276
277
278
279
280
281
|
/**
* 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
|
282
|
|
b95371cf
Yarik
test
|
283
284
285
286
287
288
289
|
/**
* Generates "remember me" authentication key
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
|
b0f143c3
Yarik
first commit
|
290
|
|
b95371cf
Yarik
test
|
291
292
293
294
295
296
297
|
/**
* Generates new password reset token
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
}
|
b0f143c3
Yarik
first commit
|
298
|
|
b95371cf
Yarik
test
|
299
300
301
302
303
304
305
|
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = NULL;
}
|
b0f143c3
Yarik
first commit
|
306
|
|
e8236f44
Yarik
test
|
307
308
|
/**
* Returns name of the User
|
e8236f44
Yarik
test
|
309
310
|
* @return string
*/
|
b95371cf
Yarik
test
|
311
312
313
314
|
public function getUserName()
{
return $this->username;
}
|
b0f143c3
Yarik
first commit
|
315
|
|
e8236f44
Yarik
test
|
316
317
|
/**
* Return array of all User's roles
|
e8236f44
Yarik
test
|
318
319
|
* @return array
*/
|
b95371cf
Yarik
test
|
320
321
322
323
324
325
|
public function getRoles()
{
$auth = \Yii::$app->authManager;
$roles = $this->getRoleChildrenRecursive($auth->getRolesByUser($this->id), $auth);
return $roles;
}
|
b0f143c3
Yarik
first commit
|
326
|
|
e8236f44
Yarik
test
|
327
|
/**
|
4c9663e0
Yarik
test
|
328
329
330
331
|
* @param Role[] $roles User roles returned by
* [ManagerInterface]->[getRolesByUser($id)]
* @param ManagerInterface $auth Auth manager
* @param array $result
|
e8236f44
Yarik
test
|
332
333
334
|
*
* @return array
*/
|
b95371cf
Yarik
test
|
335
|
protected function getRoleChildrenRecursive($roles, $auth, $result = [ ])
|
b0f143c3
Yarik
first commit
|
336
|
{
|
b95371cf
Yarik
test
|
337
338
339
340
341
342
343
|
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
|
344
|
}
|
b95371cf
Yarik
test
|
345
346
347
|
return $result;
} else {
return $result;
|
b0f143c3
Yarik
first commit
|
348
|
}
|
b0f143c3
Yarik
first commit
|
349
|
}
|
cd6bd007
Yarik
test
|
350
|
|
e8236f44
Yarik
test
|
351
352
|
/**
* Return UserInfo for this User
|
e8236f44
Yarik
test
|
353
354
|
* @return \yii\db\ActiveQuery
*/
|
b95371cf
Yarik
test
|
355
356
|
public function getUserInfo()
{
|
4ed1f788
Yarik
test
|
357
358
|
return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ])
->inverseOf('user');
|
b95371cf
Yarik
test
|
359
|
}
|
51e0a262
Yarik
test
|
360
|
|
e8236f44
Yarik
test
|
361
362
|
/**
* Check if User is Performer
|
e8236f44
Yarik
test
|
363
|
* <i>currently in development mode</i>
|
e8236f44
Yarik
test
|
364
365
|
* @return bool
*/
|
b95371cf
Yarik
test
|
366
367
368
369
|
public function getIsPerformer()
{
return true;
}
|
033f9331
Administrator
09.02.16
|
370
|
|
e8236f44
Yarik
test
|
371
372
|
/**
* Return CompanyInfo for this User
|
e8236f44
Yarik
test
|
373
374
|
* @return \yii\db\ActiveQuery
*/
|
47559a4b
Yarik
test
|
375
376
377
378
|
public function getCompanyInfo()
{
return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]);
}
|
658d13d4
Administrator
09.02.16
|
379
|
|
e8236f44
Yarik
test
|
380
381
|
/**
* Return array of User's phones
|
e8236f44
Yarik
test
|
382
383
|
* @return array
*/
|
a02e2fdb
Yarik
test
|
384
385
386
|
public function getPhones()
{
return Fields::getData($this->id, self::className(), 'phone');
|
f6ea8941
Administrator
09.02.16
|
387
388
|
}
|
e8236f44
Yarik
test
|
389
390
|
/**
* Return array of User's site
|
e8236f44
Yarik
test
|
391
392
|
* @return array
*/
|
a02e2fdb
Yarik
test
|
393
394
395
|
public function getSite()
{
return Fields::getData($this->id, self::className(), 'site');
|
f6ea8941
Administrator
09.02.16
|
396
397
|
}
|
e8236f44
Yarik
test
|
398
399
|
/**
* Return full address of User in view like:
|
e8236f44
Yarik
test
|
400
401
402
|
* <code>{country}, {city}, {street}, {house}</code>
* @return string
*/
|
a02e2fdb
Yarik
test
|
403
404
405
|
public function getAddress()
{
return $this->userInfo->country . ', ' . $this->userInfo->city . ', ' . $this->companyInfo->street . ', ' . $this->companyInfo->house;
|
f6ea8941
Administrator
09.02.16
|
406
407
|
}
|
e8236f44
Yarik
test
|
408
409
|
/**
* Return relative interval of time from User registration date until now.
|
e8236f44
Yarik
test
|
410
411
|
* @return string
*/
|
47559a4b
Yarik
test
|
412
413
|
public function getLiveTime()
{
|
47559a4b
Yarik
test
|
414
415
|
$now = new \DateTime('now');
$date1 = new \DateTime(date('Y-m-d H:i:s', $this->created_at));
|
eb7e82fb
Administrator
29.02.16
|
416
417
|
$result = explode(',', \Yii::$app->formatter->asDuration($date1->diff($now)));
|
4ed1f788
Yarik
test
|
418
|
if($result >= 4) {
|
eb7e82fb
Administrator
29.02.16
|
419
420
421
|
array_splice($result, 2);
}
|
4ed1f788
Yarik
test
|
422
|
return implode(',', $result);
|
47559a4b
Yarik
test
|
423
|
}
|
b95371cf
Yarik
test
|
424
|
|
e8236f44
Yarik
test
|
425
426
|
/**
* Check if User is Customer
|
e8236f44
Yarik
test
|
427
|
* <i>currently in development</i>
|
e8236f44
Yarik
test
|
428
429
|
* @return bool
*/
|
b95371cf
Yarik
test
|
430
431
432
433
434
|
public function getIsCustomer()
{
return true;
}
|
e8236f44
Yarik
test
|
435
436
|
/**
* Return array of payments types accepted by the user.
|
e8236f44
Yarik
test
|
437
438
|
* @return ActiveQuery
*/
|
b95371cf
Yarik
test
|
439
440
441
442
443
444
|
public function getPayments()
{
return $this->hasMany(Payment::className(), [ 'payment_id' => 'payment_id' ])
->viaTable('user_payment', [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
445
446
|
/**
* Return array of Payment IDs, accepted by the user.
|
e8236f44
Yarik
test
|
447
448
|
* @return integer[]
*/
|
b95371cf
Yarik
test
|
449
450
451
452
453
454
455
|
public function getPaymentInput()
{
return $this->getPayments()
->asArray()
->column();
}
|
e8236f44
Yarik
test
|
456
457
458
459
460
|
/**
* Setter which allow to set User's payment ID's for further saving to the DB.
*
* @param integer[] $value
*/
|
b95371cf
Yarik
test
|
461
462
463
464
465
|
public function setPaymentInput($value)
{
$this->paymentInput = $value;
}
|
e8236f44
Yarik
test
|
466
467
|
/**
* Return array of Specializations in which the User works.
|
e8236f44
Yarik
test
|
468
469
|
* @return ActiveQuery
*/
|
b95371cf
Yarik
test
|
470
471
472
473
474
475
|
public function getSpecializations()
{
return $this->hasMany(Specialization::className(), [ 'specialization_id' => 'specialization_id' ])
->viaTable('user_specialization', [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
476
477
|
/**
* Return array of User's blogs
|
e8236f44
Yarik
test
|
478
479
|
* @return ActiveQuery
*/
|
376a557b
Administrator
09.02.16
|
480
481
482
483
484
|
public function getBlog()
{
return $this->hasMany(Blog::className(), [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
485
486
|
/**
* Return array of User's jobs.
|
e8236f44
Yarik
test
|
487
488
|
* @return ActiveQuery
*/
|
f6ea8941
Administrator
09.02.16
|
489
490
491
492
493
|
public function getJobs()
{
return $this->hasMany(Job::className(), [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
494
495
|
/**
* Return ActiveRecord of current User's place of work.
|
e8236f44
Yarik
test
|
496
497
498
499
|
* @return ActiveQuery
*/
public function getCurrentJob()
{
|
4c9663e0
Yarik
test
|
500
501
|
return $this->hasOne(Job::className(), [ 'user_id' => 'id' ])
->where([ 'current' => 1 ]);
|
e8236f44
Yarik
test
|
502
503
504
505
|
}
/**
* Return array of User's specialization IDs
|
e8236f44
Yarik
test
|
506
507
|
* @return integer[]
*/
|
b95371cf
Yarik
test
|
508
509
510
511
|
public function getSpecializationInput()
{
return $this->getSpecializations()
->asArray()
|
4c9663e0
Yarik
test
|
512
|
->indexBy('specialization_id')
|
b95371cf
Yarik
test
|
513
514
515
|
->column();
}
|
e8236f44
Yarik
test
|
516
517
518
519
520
|
/**
* Setter which allow to set User's specializations for further saving to the DB.
*
* @param integer[] $value
*/
|
b95371cf
Yarik
test
|
521
522
523
524
|
public function setSpecializationInput($value)
{
$this->specializationInput = $value;
}
|
51e0a262
Yarik
test
|
525
|
|
e8236f44
Yarik
test
|
526
527
|
/**
* Return array of User's portfolios.
|
e8236f44
Yarik
test
|
528
529
|
* @return ActiveQuery
*/
|
a02e2fdb
Yarik
test
|
530
531
532
533
534
|
public function getPortfolios()
{
return $this->hasMany(Portfolio::className(), [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
535
536
|
/**
* Return array of User's projects.
|
e8236f44
Yarik
test
|
537
538
|
* @return ActiveQuery
*/
|
a02e2fdb
Yarik
test
|
539
540
541
542
543
|
public function getProjects()
{
return $this->hasMany(Project::className(), [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
544
545
|
/**
* Return array of company's Team members.
|
e8236f44
Yarik
test
|
546
547
|
* @return ActiveQuery
*/
|
a02e2fdb
Yarik
test
|
548
549
550
551
552
|
public function getTeams()
{
return $this->hasMany(Team::className(), [ 'user_id' => 'id' ]);
}
|
e8236f44
Yarik
test
|
553
554
|
/**
* Return array of company's Vacancies.
|
e8236f44
Yarik
test
|
555
556
|
* @return ActiveQuery
*/
|
a02e2fdb
Yarik
test
|
557
558
|
public function getVacancies()
{
|
4ed1f788
Yarik
test
|
559
560
|
return $this->hasMany(Vacancy::className(), [ 'user_id' => 'id' ])
->inverseOf('user');
|
a02e2fdb
Yarik
test
|
561
562
|
}
|
2e35d6bd
Yarik
test
|
563
564
565
566
567
|
public function getGalleries()
{
return $this->hasMany(Gallery::className(), [ 'user_id' => 'id' ]);
}
|
3dc20ff7
Administrator
24.02.16
|
568
569
|
public function getOwner()
{
|
4ed1f788
Yarik
test
|
570
|
if($this->type == 2) {
|
3dc20ff7
Administrator
24.02.16
|
571
|
return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]);
|
4ed1f788
Yarik
test
|
572
573
|
} else {
return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]);
|
3dc20ff7
Administrator
24.02.16
|
574
|
}
|
3dc20ff7
Administrator
24.02.16
|
575
576
|
}
|
4ed1f788
Yarik
test
|
577
578
579
|
public function getName()
{
if($this->type == 2) {
|
3ea37908
Administrator
01.03.16
|
580
|
return $this->companyInfo->name;
|
4ed1f788
Yarik
test
|
581
582
|
} else {
return $this->firstname . ' ' . $this->lastname;
|
3ea37908
Administrator
01.03.16
|
583
|
}
|
4ed1f788
Yarik
test
|
584
|
}
|
3ea37908
Administrator
01.03.16
|
585
|
|
2fd40ee7
Yarik
test
|
586
587
588
|
/**
* @return ActiveQuery
*/
|
4ed1f788
Yarik
test
|
589
590
|
public function getComments()
{
|
2fd40ee7
Yarik
test
|
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
|
return $this->hasMany(Comment::className(), [
'model_id' => 'id',
])
->andWhere([
'comment.model' => $this->className(),
]);
}
/**
* @return ActiveQuery
*/
public function getCommentRating()
{
return $this->hasMany(Rating::className(), [ 'model_id' => 'comment_id' ])
->via('comments')
->andWhere([
'rating.model' => Comment::className(),
]);
|
3dc20ff7
Administrator
24.02.16
|
609
610
|
}
|
4ed1f788
Yarik
test
|
611
612
613
614
615
|
public function getRatingPG()
{
if(\Yii::$app->db->driverName != 'pgsql') {
throw new InvalidConfigException('This method is available only in PostgreSQL');
}
|
2fd40ee7
Yarik
test
|
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
|
return $this->getCommentRating()
->select('ROUND(SUM("rating"."value")/COUNT("rating"."rating_id")::float) as rating')
->andWhere([
'not',
[ 'rating.value' => NULL ],
])
->scalar();
}
public function updateRating()
{
if($rating = $this->getRatingPG()) {
$this->userInfo->rating = $rating;
$this->userInfo->save();
}
|
4ed1f788
Yarik
test
|
631
|
}
|
3dc20ff7
Administrator
24.02.16
|
632
|
|
51e0a262
Yarik
test
|
633
|
}
|