1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
VotedCollectorService.php
См. документацию.
1<?php
2
3namespace Bitrix\Vote\Service;
4
5use Bitrix\Vote\Attach;
6use Bitrix\Vote\Integration\Mobile\MobileUserProvider;
7use Bitrix\Vote\Model\Dto\VotedIdPage;
8use Bitrix\Vote\Model\Dto\VotedUserPage;
9use Bitrix\Vote\Service\UserProvider\BaseUserProvider;
10use Bitrix\Vote\Service\UserProvider\UserProviderContract;
11use JsonSerializable;
12
14{
15 private UserProviderContract $provider;
16
17 public function __construct(
18 bool $isMobileUserFormatter = false,
19 ) {
20 $this->provider = $isMobileUserFormatter ? new MobileUserProvider() : new BaseUserProvider();
21 }
22
29 public function getByAttach(Attach $attach, int $pageSize = 50): array
30 {
31 $userIds = [];
32 $byAnswers = [];
33 foreach ($attach['QUESTIONS'] ?? [] as $question)
34 {
35 foreach ($question['ANSWERS'] ?? [] as $answer)
36 {
37 if (isset($answer['COUNTER']) && (int)$answer['COUNTER'] > 0)
38 {
39 $answerId = (int)($answer['ID'] ?? 0);
40 $byAnswers[$answerId] = $this->getAnsweredUserIds($answerId, $pageSize)->userIds;
41 $userIds += $byAnswers[$answerId];
42 }
43 }
44 }
45
46 if (empty($userIds))
47 {
48 return [];
49 }
50
51 $formattedUsers = $this->provider->getByUserIds($userIds)->toArray();
52
53 $formattedByAnswers = [];
54 foreach ($byAnswers as $answerId => $answerUserIds)
55 {
56 $formatedAnswerUsersById = array_intersect_key($formattedUsers, $answerUserIds);
57 $sortedUsers = $this->getUsersInIdOrder($formatedAnswerUsersById, $answerUserIds);
58 $formattedByAnswers[$answerId] = array_values($sortedUsers);
59 }
60
61 return $formattedByAnswers;
62 }
63
71 public function getByAnswerId(int $answerId, int $pageSize = 50, int $page = 1): VotedUserPage
72 {
73 $userIdsPage = $this->getAnsweredUserIds($answerId, $pageSize, $page);
74 $formattedUsers = $this->provider->getByUserIds($userIdsPage->userIds)->toArray();
75 $sortedUsers = $this->getUsersInIdOrder($formattedUsers, $userIdsPage->userIds);
76
77 return new VotedUserPage(
78 pageSize: $pageSize,
79 page: $page,
80 totalCount: $userIdsPage->totalCount,
81 items: array_values($sortedUsers),
82 );
83 }
84
91 private function getUsersInIdOrder(array $usersById, array $sortedUserIds): array
92 {
93 $orderedUsers = [];
94 foreach ($sortedUserIds as $userId)
95 {
96 if (isset($usersById[$userId]))
97 {
98 $orderedUsers[$userId] = $usersById[$userId];
99 }
100 }
101
102 return $orderedUsers;
103 }
104
105 private function getAnsweredUserIds(int $answerId, int $pageSize = 50, int $page = 1): VotedIdPage
106 {
107 $dbRes = \CVoteEvent::getUserAnswerStat([],
108 [
109 'ANSWER_ID' => $answerId,
110 'VALID' => 'Y',
111 'VISIBLE' => 'Y',
112 'bGetVoters' => 'Y',
113 'bGetMemoStat' => 'N',
114 ],
115 [
116 'nPageSize' => max(min($pageSize, 50), 1),
117 'iNumPage' => max($page, 1),
118 ],
119 );
120
121 $userIds = [];
122 while ($res = $dbRes->fetch())
123 {
124 $userId = (int)($res["AUTH_USER_ID"] ?? 0);
125 if ($userId)
126 {
127 $userIds[$userId] = $userId;
128 }
129 }
130
131 return new VotedIdPage(
132 pageSize: $pageSize,
133 page: $page,
134 totalCount: (int)$dbRes->nSelectedCount,
135 userIds: $userIds,
136 );
137 }
138}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения attach.php:180
getByAnswerId(int $answerId, int $pageSize=50, int $page=1)
Определения VotedCollectorService.php:71
getByAttach(Attach $attach, int $pageSize=50)
Определения VotedCollectorService.php:29
__construct(bool $isMobileUserFormatter=false,)
Определения VotedCollectorService.php:17
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$pageSize
Определения csv_new_run.php:34
$page
Определения order_form.php:33
$dbRes
Определения yandex_detail.php:168