1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
Builder.php
См. документацию.
1<?php
2
3namespace Bitrix\Socialnetwork\Space\List\Query;
4
5use Bitrix\Main\Application;
6use Bitrix\Main\DB\SqlHelper;
7use Bitrix\Main\ORM\Fields\ExpressionField;
8use Bitrix\Main\ORM\Fields\Relations\Reference;
9use Bitrix\Main\ORM\Query\Join;
10use Bitrix\Main\ORM\Query\Query;
11use Bitrix\Socialnetwork\Internals\Space\RecentActivity\SpaceUserLatestActivityTable;
12use Bitrix\Socialnetwork\Internals\Space\RecentActivity\SpaceUserRecentActivityTable;
13use Bitrix\Socialnetwork\Space\List\Dictionary;
14use Bitrix\Socialnetwork\Space\List\Query\Filter\FilterInterface;
15use Bitrix\Socialnetwork\Space\List\Query\Filter;
16use Bitrix\Socialnetwork\UserToGroupTable;
17use Bitrix\Socialnetwork\WorkgroupPinTable;
18use Bitrix\Socialnetwork\WorkgroupTable;
19use Bitrix\Socialnetwork\WorkgroupTagTable;
20
21final class Builder extends AbstractBuilder
22{
23 private const SELECT = [
24 'ID',
25 'NAME',
26 'DATE_ACTIVITY',
27 'DATE_CREATE',
28 'RECENT_ACTIVITY_DATE',
29 'IMAGE_ID',
30 'AVATAR_TYPE',
31 'VISIBLE',
32 'OPENED',
33 'ROLE' => 'MEMBER.ROLE',
34 'ROLE_INIT_BY_TYPE' => 'MEMBER.INITIATED_BY_TYPE',
35 'RECENT_ACTIVITY_ID' => 'RECENT_ACTIVITY.ID',
36 'RECENT_ACTIVITY_ENTITY_ID' => 'RECENT_ACTIVITY.ENTITY_ID',
37 'RECENT_ACTIVITY_TYPE_ID' => 'RECENT_ACTIVITY.TYPE_ID',
38 'RECENT_ACTIVITY_DATETIME' => 'RECENT_ACTIVITY.DATETIME',
39 'RECENT_ACTIVITY_SECONDARY_ENTITY_ID' => 'RECENT_ACTIVITY.SECONDARY_ENTITY_ID',
40 'PIN_ID' => 'PIN.ID',
41 ];
42
43 private SqlHelper $sqlHelper;
44
45 private bool $searchMode = false;
46
47 public function __construct(int $userId)
48 {
49 parent::__construct($userId);
50
51 $this->sqlHelper = Application::getConnection()->getSqlHelper();
52 }
53
54 public function addModeFilter(string $mode): self
55 {
56 if ($mode === Dictionary::FILTER_MODES['all'])
57 {
58 $this->addFilter(new Filter\Mode\AllModeFilter($this->userId));
59 }
60 elseif ($mode === Dictionary::FILTER_MODES['my'])
61 {
62 $this->addFilter(new Filter\Mode\MyModeFilter($this->userId));
63 }
64 elseif ($mode === Dictionary::FILTER_MODES['other'])
65 {
66 $this->addFilter(new Filter\Mode\OtherModeFilter($this->userId));
67 }
68
69 return $this;
70 }
71
72 public function addPaginationFilter(int $offset, int $limit): self
73 {
74 return $this->addFilter(new Filter\Pagination\PaginationFilter($offset, $limit));
75 }
76
77 public function addSpaceIdFilter(int $spaceId): self
78 {
79 return $this->addFilter(new Filter\Id\IdFilter($spaceId));
80 }
81
82 public function addSpaceIdListFilter(array $spaceIds): self
83 {
84 return $this->addFilter(new Filter\Id\IdListFilter($spaceIds));
85 }
86
87 public function addSearchFilter(string $searchString): self
88 {
89 $this->searchMode = true;
90
91 return $this->addFilter(new Filter\Search\SearchFilter($searchString));
92 }
93
94 protected function getBaseQuery(): Query
95 {
96 $groupJoin =
97 Join::on('this.ID', 'ref.GROUP_ID')
98 ->where('ref.USER_ID', $this->userId)
99 ;
100 $spaceJoin =
101 Join::on('this.ID', 'ref.SPACE_ID')
102 ->where('ref.USER_ID', $this->userId)
103 ;
104
105 $query = WorkgroupTable::query();
106 $query
107 ->setSelect(self::SELECT)
108 ->addOrder('RECENT_ACTIVITY_DATE', 'DESC')
109 ->registerRuntimeField(
110 (new Reference(
111 'PIN',
112 WorkgroupPinTable::class,
113 $groupJoin,
114 ))
115 ->configureJoinType(Join::TYPE_LEFT)
116 )
117 ->registerRuntimeField(
118 (new Reference(
119 'LATEST_ACTIVITY',
120 SpaceUserLatestActivityTable::class,
121 $spaceJoin,
122 ))
123 ->configureJoinType(Join::TYPE_LEFT)
124 )
125 ->registerRuntimeField(
126 (new Reference(
127 'RECENT_ACTIVITY',
128 SpaceUserRecentActivityTable::class,
129 Join::on('this.LATEST_ACTIVITY.ACTIVITY_ID','ref.ID'),
130 ))
131 ->configureJoinType(Join::TYPE_LEFT)
132 )
133 ->registerRuntimeField(
134 'RECENT_ACTIVITY_DATE',
135 new ExpressionField(
136 'RECENT_ACTIVITY_DATE',
137 $this->sqlHelper->getIsNullFunction('%s', '%s'),
138 ['RECENT_ACTIVITY.DATETIME', 'DATE_ACTIVITY'],
139 )
140 )
141 ->registerRuntimeField(
142 (new Reference(
143 'MEMBER',
144 UserToGroupTable::class,
145 $groupJoin,
146 ))
147 ->configureJoinType(Join::TYPE_LEFT)
148 )
149 ;
150
151 if ($this->searchMode)
152 {
153 $query->registerRuntimeField(
154 (new Reference(
155 'TAG',
156 WorkgroupTagTable::class,
157 Join::on('this.ID', 'ref.GROUP_ID'),
158 ))
159 ->configureJoinType(Join::TYPE_LEFT)
160 );
161 }
162
163 return $query;
164 }
165}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
addFilter(FilterInterface $filter)
Определения AbstractBuilder.php:18
addSpaceIdFilter(int $spaceId)
Определения Builder.php:77
addModeFilter(string $mode)
Определения Builder.php:54
addSearchFilter(string $searchString)
Определения Builder.php:87
addPaginationFilter(int $offset, int $limit)
Определения Builder.php:72
addSpaceIdListFilter(array $spaceIds)
Определения Builder.php:82
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$query
Определения get_search.php:11
Определения chain.php:3
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393