Commit 4ed1f78831ce6c4c5916123f79ea391ef4dcbe9e
1 parent
f94a00a6
test
Showing
6 changed files
with
98 additions
and
39 deletions
Show diff stats
common/models/User.php
| 1 | <?php | 1 | <?php |
| 2 | namespace common\models; | 2 | namespace common\models; |
| 3 | 3 | ||
| 4 | + use common\modules\comment\models\Comment; | ||
| 5 | + use common\modules\comment\models\Rating; | ||
| 4 | use Yii; | 6 | use Yii; |
| 7 | + use yii\base\InvalidConfigException; | ||
| 5 | use yii\base\NotSupportedException; | 8 | use yii\base\NotSupportedException; |
| 6 | use yii\behaviors\TimestampBehavior; | 9 | use yii\behaviors\TimestampBehavior; |
| 7 | use yii\db\ActiveQuery; | 10 | use yii\db\ActiveQuery; |
| @@ -13,17 +16,18 @@ | @@ -13,17 +16,18 @@ | ||
| 13 | 16 | ||
| 14 | /** | 17 | /** |
| 15 | * User model | 18 | * User model |
| 16 | - * @property integer $id | ||
| 17 | - * @property string $username | ||
| 18 | - * @property string $password_hash | ||
| 19 | - * @property string $password_reset_token | ||
| 20 | - * @property string $email | ||
| 21 | - * @property string $auth_key | ||
| 22 | - * @property integer $status | ||
| 23 | - * @property integer $created_at | ||
| 24 | - * @property integer $updated_at | ||
| 25 | - * @property string $password write-only password | ||
| 26 | - * @property string $type | 19 | + * @property integer $id |
| 20 | + * @property string $username | ||
| 21 | + * @property string $password_hash | ||
| 22 | + * @property string $password_reset_token | ||
| 23 | + * @property string $email | ||
| 24 | + * @property string $auth_key | ||
| 25 | + * @property integer $status | ||
| 26 | + * @property integer $created_at | ||
| 27 | + * @property integer $updated_at | ||
| 28 | + * @property string $password write-only password | ||
| 29 | + * @property string $type | ||
| 30 | + * @property UserInfo $userInfo | ||
| 27 | */ | 31 | */ |
| 28 | class User extends ActiveRecord implements IdentityInterface, UserRbacInterface | 32 | class User extends ActiveRecord implements IdentityInterface, UserRbacInterface |
| 29 | { | 33 | { |
| @@ -57,9 +61,6 @@ | @@ -57,9 +61,6 @@ | ||
| 57 | ]; | 61 | ]; |
| 58 | } | 62 | } |
| 59 | 63 | ||
| 60 | - | ||
| 61 | - | ||
| 62 | - | ||
| 63 | /** | 64 | /** |
| 64 | * @inheritdoc | 65 | * @inheritdoc |
| 65 | */ | 66 | */ |
| @@ -93,7 +94,7 @@ | @@ -93,7 +94,7 @@ | ||
| 93 | [ | 94 | [ |
| 94 | 'specializationInput', | 95 | 'specializationInput', |
| 95 | 'paymentInput', | 96 | 'paymentInput', |
| 96 | - 'type' | 97 | + 'type', |
| 97 | ], | 98 | ], |
| 98 | 'safe', | 99 | 'safe', |
| 99 | ], | 100 | ], |
| @@ -101,7 +102,7 @@ | @@ -101,7 +102,7 @@ | ||
| 101 | 'type', | 102 | 'type', |
| 102 | 'default', | 103 | 'default', |
| 103 | 'value' => 1, | 104 | 'value' => 1, |
| 104 | - ] | 105 | + ], |
| 105 | ]; | 106 | ]; |
| 106 | } | 107 | } |
| 107 | 108 | ||
| @@ -112,8 +113,8 @@ | @@ -112,8 +113,8 @@ | ||
| 112 | { | 113 | { |
| 113 | return [ | 114 | return [ |
| 114 | 'firstname' => Yii::t('app', 'Имя'), | 115 | 'firstname' => Yii::t('app', 'Имя'), |
| 115 | - 'lastname' => Yii::t('app', 'Фамилия'), | ||
| 116 | - 'email' => Yii::t('app', 'Email'), | 116 | + 'lastname' => Yii::t('app', 'Фамилия'), |
| 117 | + 'email' => Yii::t('app', 'Email'), | ||
| 117 | ]; | 118 | ]; |
| 118 | } | 119 | } |
| 119 | 120 | ||
| @@ -348,7 +349,8 @@ | @@ -348,7 +349,8 @@ | ||
| 348 | */ | 349 | */ |
| 349 | public function getUserInfo() | 350 | public function getUserInfo() |
| 350 | { | 351 | { |
| 351 | - return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ])->inverseOf('user'); | 352 | + return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]) |
| 353 | + ->inverseOf('user'); | ||
| 352 | } | 354 | } |
| 353 | 355 | ||
| 354 | /** | 356 | /** |
| @@ -408,11 +410,11 @@ | @@ -408,11 +410,11 @@ | ||
| 408 | $date1 = new \DateTime(date('Y-m-d H:i:s', $this->created_at)); | 410 | $date1 = new \DateTime(date('Y-m-d H:i:s', $this->created_at)); |
| 409 | $result = explode(',', \Yii::$app->formatter->asDuration($date1->diff($now))); | 411 | $result = explode(',', \Yii::$app->formatter->asDuration($date1->diff($now))); |
| 410 | 412 | ||
| 411 | - if($result >= 4){ | 413 | + if($result >= 4) { |
| 412 | array_splice($result, 2); | 414 | array_splice($result, 2); |
| 413 | } | 415 | } |
| 414 | 416 | ||
| 415 | - return implode(',',$result); | 417 | + return implode(',', $result); |
| 416 | } | 418 | } |
| 417 | 419 | ||
| 418 | /** | 420 | /** |
| @@ -549,7 +551,8 @@ | @@ -549,7 +551,8 @@ | ||
| 549 | */ | 551 | */ |
| 550 | public function getVacancies() | 552 | public function getVacancies() |
| 551 | { | 553 | { |
| 552 | - return $this->hasMany(Vacancy::className(), [ 'user_id' => 'id' ])->inverseOf('user'); | 554 | + return $this->hasMany(Vacancy::className(), [ 'user_id' => 'id' ]) |
| 555 | + ->inverseOf('user'); | ||
| 553 | } | 556 | } |
| 554 | 557 | ||
| 555 | public function getGalleries() | 558 | public function getGalleries() |
| @@ -559,22 +562,44 @@ | @@ -559,22 +562,44 @@ | ||
| 559 | 562 | ||
| 560 | public function getOwner() | 563 | public function getOwner() |
| 561 | { | 564 | { |
| 562 | - if($this->type == 1){ | ||
| 563 | - return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]); | ||
| 564 | - } else if($this->type == 2) { | 565 | + if($this->type == 2) { |
| 565 | return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]); | 566 | return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]); |
| 567 | + } else { | ||
| 568 | + return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]); | ||
| 566 | } | 569 | } |
| 567 | - | ||
| 568 | } | 570 | } |
| 569 | 571 | ||
| 570 | - public function getName(){ | ||
| 571 | - if($this->type == 1){ | ||
| 572 | - return $this->firstname. ' '.$this->lastname; | ||
| 573 | - } else if($this->type == 2){ | 572 | + public function getName() |
| 573 | + { | ||
| 574 | + if($this->type == 2) { | ||
| 574 | return $this->companyInfo->name; | 575 | return $this->companyInfo->name; |
| 576 | + } else { | ||
| 577 | + return $this->firstname . ' ' . $this->lastname; | ||
| 575 | } | 578 | } |
| 579 | + } | ||
| 576 | 580 | ||
| 581 | + public function getComments() | ||
| 582 | + { | ||
| 583 | + $entity = 'user-' . $this->id; | ||
| 584 | + $comments = (new Comment())->getComments($entity); | ||
| 585 | + return $comments; | ||
| 577 | } | 586 | } |
| 578 | 587 | ||
| 588 | + public function getRatingPG() | ||
| 589 | + { | ||
| 590 | + if(\Yii::$app->db->driverName != 'pgsql') { | ||
| 591 | + throw new InvalidConfigException('This method is available only in PostgreSQL'); | ||
| 592 | + } | ||
| 593 | + $entity = 'user-' . $this->id; | ||
| 594 | + $rating = (new Comment())->getComments($entity) | ||
| 595 | + ->select('ROUND(SUM("rating"."value")/COUNT("rating"."rating_id")::float) as rating') | ||
| 596 | + ->leftJoin(Rating::tableName(), "CONCAT('Comment-', \"comment\".\"comment_id\") = \"rating\".\"entity\"") | ||
| 597 | + ->andWhere([ | ||
| 598 | + 'not', | ||
| 599 | + [ 'rating.value' => NULL ], | ||
| 600 | + ]) | ||
| 601 | + ->one(); | ||
| 602 | + return $rating; | ||
| 603 | + } | ||
| 579 | 604 | ||
| 580 | } | 605 | } |
common/modules/comment/models/Comment.php
| 1 | <?php | 1 | <?php |
| 2 | namespace common\modules\comment\models; | 2 | namespace common\modules\comment\models; |
| 3 | 3 | ||
| 4 | + use yii\db\ActiveQuery; | ||
| 5 | + | ||
| 4 | /** | 6 | /** |
| 5 | * Class Comment | 7 | * Class Comment |
| 6 | * @property bool $guestComment | 8 | * @property bool $guestComment |
| @@ -19,6 +21,8 @@ | @@ -19,6 +21,8 @@ | ||
| 19 | const SCENARIO_USER = 'user'; | 21 | const SCENARIO_USER = 'user'; |
| 20 | const SCENARIO_GUEST = 'guest'; | 22 | const SCENARIO_GUEST = 'guest'; |
| 21 | 23 | ||
| 24 | + public $rating; | ||
| 25 | + | ||
| 22 | /** | 26 | /** |
| 23 | * @var bool | 27 | * @var bool |
| 24 | */ | 28 | */ |
| @@ -130,12 +134,17 @@ | @@ -130,12 +134,17 @@ | ||
| 130 | $this->guestComment = $value; | 134 | $this->guestComment = $value; |
| 131 | } | 135 | } |
| 132 | 136 | ||
| 137 | + /** | ||
| 138 | + * @param string $entity | ||
| 139 | + * | ||
| 140 | + * @return ActiveQuery | ||
| 141 | + */ | ||
| 133 | public function getComments($entity) | 142 | public function getComments($entity) |
| 134 | { | 143 | { |
| 135 | return $this->find() | 144 | return $this->find() |
| 136 | ->where([ | 145 | ->where([ |
| 137 | - 'entity' => $this->entity, | ||
| 138 | - 'status' => 1, | 146 | + 'comment.entity' => $entity, |
| 147 | + 'comment.status' => 1, | ||
| 139 | ]); | 148 | ]); |
| 140 | } | 149 | } |
| 141 | 150 |
frontend/controllers/SearchController.php
| @@ -71,6 +71,9 @@ class SearchController extends Controller | @@ -71,6 +71,9 @@ class SearchController extends Controller | ||
| 71 | public function actionCustomer(){ | 71 | public function actionCustomer(){ |
| 72 | $model = new CustomerSearch(); | 72 | $model = new CustomerSearch(); |
| 73 | $dataProvider = $model->search(Yii::$app->request->queryParams); | 73 | $dataProvider = $model->search(Yii::$app->request->queryParams); |
| 74 | + $dataProvider->setPagination([ | ||
| 75 | + 'pageSize' => 5 | ||
| 76 | + ]); | ||
| 74 | $dataProvider->setSort([ | 77 | $dataProvider->setSort([ |
| 75 | 'attributes' => [ | 78 | 'attributes' => [ |
| 76 | 'name' => [ | 79 | 'name' => [ |
frontend/views/search/_customer_list_view.php
| @@ -5,30 +5,37 @@ | @@ -5,30 +5,37 @@ | ||
| 5 | * @var integer $index | 5 | * @var integer $index |
| 6 | * @var ListView $widget | 6 | * @var ListView $widget |
| 7 | */ | 7 | */ |
| 8 | + use common\models\Project; | ||
| 8 | use common\models\User; | 9 | use common\models\User; |
| 9 | use frontend\helpers\TextHelper; | 10 | use frontend\helpers\TextHelper; |
| 10 | use yii\bootstrap\Html; | 11 | use yii\bootstrap\Html; |
| 11 | use yii\helpers\Url; | 12 | use yii\helpers\Url; |
| 12 | use yii\widgets\ListView; | 13 | use yii\widgets\ListView; |
| 13 | - | ||
| 14 | ?> | 14 | ?> |
| 15 | <div class="search_perform_txt-wr"> | 15 | <div class="search_perform_txt-wr"> |
| 16 | <div class="search_perform_title"> | 16 | <div class="search_perform_title"> |
| 17 | <?php | 17 | <?php |
| 18 | if($model->type == 2) { | 18 | if($model->type == 2) { |
| 19 | - echo $model->companyInfo->name; | 19 | + echo Html::a($model->companyInfo->name, ['company/common', 'company_id' => $model->id]); |
| 20 | } else { | 20 | } else { |
| 21 | - echo $model->firstname . $model->lastname; | 21 | + echo Html::a($model->firstname . $model->lastname, ['performer/common', 'performer_id' => $model->id]); |
| 22 | } | 22 | } |
| 23 | ?> | 23 | ?> |
| 24 | </div> | 24 | </div> |
| 25 | <div class="search_perform-stars-wr"> | 25 | <div class="search_perform-stars-wr"> |
| 26 | <div class="rating_search_performer"> | 26 | <div class="rating_search_performer"> |
| 27 | <!--оценка--> | 27 | <!--оценка--> |
| 28 | + <?php | ||
| 29 | + if($rating = $model->getRatingPG()->rating) { | ||
| 30 | + echo "<input type='hidden' class='val' value='{$rating}'/>"; | ||
| 31 | + } else { | ||
| 32 | + echo "<input type='hidden' class='val' value='0'/>"; | ||
| 33 | + } | ||
| 34 | + ?> | ||
| 28 | <input type="hidden" class="val" value="4"/> | 35 | <input type="hidden" class="val" value="4"/> |
| 29 | </div> | 36 | </div> |
| 30 | <div class="search_perform-stars-txt"> | 37 | <div class="search_perform-stars-txt"> |
| 31 | - 30 отзывов | 38 | + <?= $model->getComments()->count() ?> отзывов |
| 32 | <?php | 39 | <?php |
| 33 | if(!empty( $model->userInfo->city )) { | 40 | if(!empty( $model->userInfo->city )) { |
| 34 | echo ", {$model->userInfo->city}"; | 41 | echo ", {$model->userInfo->city}"; |
| @@ -49,12 +56,17 @@ | @@ -49,12 +56,17 @@ | ||
| 49 | <span>Послелний визит:</span> <?= \Yii::$app->formatter->asRelativeTime($model->userInfo->date_visit) ?> | 56 | <span>Послелний визит:</span> <?= \Yii::$app->formatter->asRelativeTime($model->userInfo->date_visit) ?> |
| 50 | </div> | 57 | </div> |
| 51 | <div class="search_perform_projets_nam"> | 58 | <div class="search_perform_projets_nam"> |
| 52 | - <a href="#">Заказано проектов: 21</a></div> | 59 | + <?= Html::a("Заказано проектов {$model->getProjects()->count()}", ['search/project', (new Project())->formName().'[user_id]' => $model->id]) ?> |
| 60 | + </div> | ||
| 53 | </div> | 61 | </div> |
| 54 | 62 | ||
| 55 | <div class="right_search_perform_block-wr"> | 63 | <div class="right_search_perform_block-wr"> |
| 56 | <div class="right_search_perform_foto-wr"> | 64 | <div class="right_search_perform_foto-wr"> |
| 57 | - <div><img src="/images/search_performer_img-1.jpg" alt=""/></div> | 65 | + <div> |
| 66 | + <?php | ||
| 67 | + echo Html::img($model->userInfo->image?:"/images/search_performer_img-1.jpg", ['class' => 'search_customer_image']); | ||
| 68 | + ?> | ||
| 69 | + </div> | ||
| 58 | </div> | 70 | </div> |
| 59 | <a class="get-list" href="#">Добавить в закладки</a> | 71 | <a class="get-list" href="#">Добавить в закладки</a> |
| 60 | </div> | 72 | </div> |
| 61 | \ No newline at end of file | 73 | \ No newline at end of file |
frontend/views/search/customer.php
| @@ -135,6 +135,9 @@ | @@ -135,6 +135,9 @@ | ||
| 135 | 'itemView' => '_customer_list_view', | 135 | 'itemView' => '_customer_list_view', |
| 136 | ]); | 136 | ]); |
| 137 | ?> | 137 | ?> |
| 138 | + <?php | ||
| 139 | + /* == Layout == | ||
| 140 | + ?> | ||
| 138 | <div class="search-worker-blocks-wr style"> | 141 | <div class="search-worker-blocks-wr style"> |
| 139 | 142 | ||
| 140 | <div class="search-worker-blocks"> | 143 | <div class="search-worker-blocks"> |
| @@ -259,6 +262,10 @@ | @@ -259,6 +262,10 @@ | ||
| 259 | </ul> | 262 | </ul> |
| 260 | </div> | 263 | </div> |
| 261 | 264 | ||
| 265 | + <?php | ||
| 266 | + == End of layout == */ | ||
| 267 | + ?> | ||
| 268 | + | ||
| 262 | <script> | 269 | <script> |
| 263 | $('div.rating_search_performer').rating( | 270 | $('div.rating_search_performer').rating( |
| 264 | { | 271 | { |
frontend/web/css/style.css
| @@ -6677,4 +6677,7 @@ input[disabled], select[disabled] { | @@ -6677,4 +6677,7 @@ input[disabled], select[disabled] { | ||
| 6677 | } | 6677 | } |
| 6678 | .form_site_logn-wr input.custom-check + label span {margin-top: 1px; margin-right: 6px} | 6678 | .form_site_logn-wr input.custom-check + label span {margin-top: 1px; margin-right: 6px} |
| 6679 | .callback .input-blocks-wrapper {margin-top: 0} | 6679 | .callback .input-blocks-wrapper {margin-top: 0} |
| 6680 | -.list_item.title {margin-top: 20px} | ||
| 6681 | \ No newline at end of file | 6680 | \ No newline at end of file |
| 6681 | +.list_item.title {margin-top: 20px} | ||
| 6682 | +.search_customer_image { | ||
| 6683 | + height: 100%; | ||
| 6684 | +} | ||
| 6682 | \ No newline at end of file | 6685 | \ No newline at end of file |