%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/components/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/components/PeopleQuery.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2021 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\user\components;
use humhub\modules\user\models\fieldtype\Select;
use humhub\modules\user\models\Group;
use humhub\modules\user\models\ProfileField;
use humhub\modules\user\models\User;
use humhub\modules\user\widgets\PeopleCard;
use humhub\modules\user\widgets\PeopleFilters;
use Yii;
use yii\data\Pagination;
use yii\db\Expression;
/**
* PeopleQuery is used to query User records on the People page.
*
* @author luke
*/
class PeopleQuery extends ActiveQueryUser
{
/**
* @var Group
*/
public $filteredGroup;
/**
* @var Pagination
*/
public $pagination;
/**
* @var int
*/
public $pageSize = 25;
/**
* @inheritdoc
*/
public function __construct($config = [])
{
parent::__construct(User::class, $config);
}
/**
* @inheritdoc
*/
public function init()
{
parent::init();
$this->available();
$this->filterByKeyword();
$this->filterByGroup();
$this->filterByConnection();
$this->filterByProfileFields();
$this->order();
$this->paginate();
}
public function filterByKeyword(): PeopleQuery
{
$keyword = Yii::$app->request->get('keyword', '');
return $this->search($keyword);
}
public function filterByProfileFields(): PeopleQuery
{
$fields = Yii::$app->request->get('fields', []);
// Remove empty filters
$fields = array_filter($fields, function($value) {
return $value !== '';
});
if (empty($fields)) {
return $this;
}
// Skip fields if they are not defined for directory filters
$filteredProfileFields = ProfileField::find()
->where(['directory_filter' => 1])
->andWhere(['IN', 'internal_name', array_keys($fields)])
->all();
$checkedFilteredFields = [];
foreach ($filteredProfileFields as $filteredField) {
/* @var $filteredField ProfileField */
if (!isset($fields[$filteredField->internal_name])) {
// Skip unknown field
continue;
}
$checkedFilteredFields[$filteredField->internal_name] = [
'value' => $fields[$filteredField->internal_name],
'condition' => $filteredField->getFieldType() instanceof Select ? '=' : 'LIKE',
];
}
if (empty($checkedFilteredFields)) {
return $this;
}
$this->joinWith('profile');
foreach ($checkedFilteredFields as $field => $data) {
$this->andWhere([$data['condition'], 'profile.' . $field, $data['value']]);
}
return $this;
}
public function filterByGroup(): PeopleQuery
{
$groupId = Yii::$app->request->get('groupId', 0);
if ($groupId) {
$group = Group::findOne(['id' => $groupId, 'show_at_directory' => 1]);
if ($group) {
$this->filteredGroup = $group;
$this->isGroupMember($group);
}
}
return $this;
}
public function filterByConnection(): PeopleQuery
{
switch (Yii::$app->request->get('connection')) {
case 'followers':
return $this->filterByConnectionFollowers();
case 'following':
return $this->filterByConnectionFollowing();
case 'friends':
return $this->filterByConnectionFriends();
case 'pending_friends':
return $this->filterByConnectionPendingFriends();
}
return $this;
}
public function filterByConnectionFollowers(): PeopleQuery
{
return $this->innerJoin('user_follow', 'user_follow.object_model = :user_class AND user_follow.user_id = user.id', [':user_class' => User::class])
->andWhere(['user_follow.object_id' => Yii::$app->user->id]);
}
public function filterByConnectionFollowing(): PeopleQuery
{
return $this->innerJoin('user_follow', 'user_follow.object_model = :user_class AND user_follow.object_id = user.id', [':user_class' => User::class])
->andWhere(['user_follow.user_id' => Yii::$app->user->id]);
}
public function filterByConnectionFriends(): PeopleQuery
{
if (!Yii::$app->getModule('friendship')->settings->get('enable')) {
return $this;
}
return $this->innerJoin('user_friendship AS uf_current', 'uf_current.friend_user_id = user.id')
->andWhere(['uf_current.user_id' => Yii::$app->user->id])
->innerJoin('user_friendship AS uf_friend', 'uf_friend.user_id = user.id')
->andWhere(['uf_friend.friend_user_id' => Yii::$app->user->id]);
}
public function filterByConnectionPendingFriends(): PeopleQuery
{
if (!Yii::$app->getModule('friendship')->settings->get('enable')) {
return $this;
}
return $this->innerJoin('user_friendship AS uf_current', 'uf_current.friend_user_id = user.id')
->andWhere(['uf_current.user_id' => Yii::$app->user->id])
->leftJoin('user_friendship AS uf_friend', 'uf_friend.user_id = user.id')
->andWhere(['IS', 'uf_friend.friend_user_id', new Expression('NULL')]);
}
public function isFilteredByGroup(): bool
{
return $this->filteredGroup instanceof Group;
}
public function order(): PeopleQuery
{
switch (PeopleFilters::getValue('sort')) {
case 'firstname':
$this->joinWith('profile');
$this->addOrderBy('profile.firstname');
break;
case 'lastname':
$this->joinWith('profile');
$this->addOrderBy('profile.lastname');
break;
case 'lastlogin':
$this->addOrderBy('last_login DESC');
break;
default:
$defaultSortingGroupId = PeopleCard::config('defaultSortingGroup');
if (empty($defaultSortingGroupId)) {
$this->addOrderBy('last_login DESC');
} else {
$this->leftJoin('group_user AS top_group_sorting', 'top_group_sorting.user_id = user.id AND top_group_sorting.group_id = :defaultGroupId', [':defaultGroupId' => $defaultSortingGroupId]);
$this->addOrderBy('top_group_sorting.group_id DESC, last_login DESC');
}
}
return $this;
}
public function paginate(): PeopleQuery
{
$countQuery = clone $this;
$this->pagination = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => $this->pageSize]);
return $this->offset($this->pagination->offset)->limit($this->pagination->limit);
}
public function isLastPage(): bool
{
return $this->pagination->getPage() == $this->pagination->getPageCount() - 1;
}
}