1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ImVote.php
См. документацию.
1<?php
2
4
17
18class ImVote
19{
20 public const MESSAGE_COMPONENT_ID = 'VoteMessage';
22
23 public static function isAvailable(): bool
24 {
25 return Feature::instance()->isImIntegrationEnabled() && Loader::includeModule('im');
26 }
27
28 public static function getMinAnswersCount(): int
29 {
30 return 2;
31 }
32
33 public static function getMaxQuestionsCount(): int
34 {
35 return 1;
36 }
37
38 public static function getMaxAnswersCount(): int
39 {
40 return 10;
41 }
42
43 public static function sendVote(
44 int $chatId,
45 int $ownerUserId,
46 array $voteFields,
47 ?string $templateId = null,
49 {
50 if (!static::isAvailable())
51 {
52 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_NOT_AVAILABLE')));
53 }
54
56 if ($channelId <= 0)
57 {
58 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_CHANNEL_FAILED')));
59 }
60
61 $voteFields = self::prepareVoteData($channelId, $voteFields, $ownerUserId);
62 $validateResult = self::validateVoteData($voteFields); // check modified $voteFields
63 if (!$validateResult->isSuccess())
64 {
65 return $validateResult;
66 }
67
68 try
69 {
70 $voteId = Vote::saveData(0, $voteFields);
71 }
72 catch (ArgumentException $exception)
73 {
74 return (new Result())->addError(new Error($exception->getMessage()));
75 }
76
77 if ($voteId <= 0)
78 {
79 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_SAVE_ERROR')));
80 }
81
82 $savedVoteData = Vote::getData($voteId);
83 if (empty($savedVoteData))
84 {
85 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_SAVE_ERROR')));
86 }
87
88 $messageId = \CIMMessenger::Add([
89 'MESSAGE_TYPE' => IM_MESSAGE_CHAT,
90 'TO_CHAT_ID' => $chatId,
91 'FROM_USER_ID' => $ownerUserId,
92 'MESSAGE' => self::getFallbackText($savedVoteData),
93 'TEMPLATE_ID' => $templateId,
94 'PARAMS' => [
95 'COMPONENT_ID' => self::MESSAGE_COMPONENT_ID,
96 'COMPONENT_PARAMS' => [
97 self::MESSAGE_COMPONENT_PARAM_VOTE_ID => $voteId,
98 'data' => self::formatVoteData($savedVoteData),
99 ],
100 ],
101 ]);
102
103 if (!$messageId)
104 {
105 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_MESSAGE_FAILED')));
106 }
107
108 (new VoteChangesSender())->addUserWatch($ownerUserId, $voteId);
109
110 return new ImVoteSendResult($messageId, $voteId);
111 }
112
113 public static function getOrCreateImMessageChannel(): int
114 {
115 return UfCompatibleChannelCreator::getOrCreateChannel('IM_MESSAGE_CHANNEL');
116 }
117
118 private static function getFallbackText(array $voteFields): ?string
119 {
120 if (isset($voteFields['QUESTIONS']) && is_array($voteFields['QUESTIONS']))
121 {
122 $firstKey = array_key_first($voteFields['QUESTIONS']);
123
124 return trim($voteFields['QUESTIONS'][$firstKey]['QUESTION'] ?? '');
125 }
126
127 return null;
128 }
129
130 private static function prepareVoteData(int $channelId, array $voteFields, int $ownerId): array
131 {
132 $voteFields['CHANNEL_ID'] = $channelId;
133 $voteFields['DATE_START'] = new DateTime();
134 $voteFields['DATE_END'] = (new DateTime())->add("10Y");
135 $voteFields['UNIQUE_TYPE'] = EventLimits::BY_USER_ID | EventLimits::BY_USER_AUTH;
136 $voteFields['AUTHOR_ID'] = $ownerId;
137 $voteFields['OPTIONS'] = $voteFields['OPTIONS'] ?? 0;
138
139 return $voteFields;
140 }
141
142 private static function validateVoteData(array &$voteFields): Result
143 {
144 try
145 {
146 $check = Vote::checkData($voteFields);
147 }
148 catch (ArgumentException $exception)
149 {
150 return (new Result())->addError(new Error($exception->getMessage()));
151 }
152
153 if (empty($voteFields['QUESTIONS']) || !is_array($voteFields['QUESTIONS']))
154 {
155 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_QUESTIONS_EMPTY')));
156 }
157
158 if (!$check)
159 {
160 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_NOT_VALID')));
161 }
162
163 if (count($voteFields['QUESTIONS']) > self::getMaxQuestionsCount())
164 {
165 return (new Result())->addError(new Error(
166 Loc::getMessage('VOTE_INTEGRATION_IM_TO_MANY_QUESTIONS', [
167 '#COUNT#' => self::getMaxQuestionsCount(),
168 ])
169 ));
170 }
171
172 foreach ($voteFields['QUESTIONS'] as $question)
173 {
174 if (
175 empty($question['ANSWERS'])
176 || !is_array($question)
177 || count($question['ANSWERS']) < self::getMinAnswersCount()
178 )
179 {
180 return (new Result())->addError(new Error(Loc::getMessage('VOTE_INTEGRATION_IM_MIN_ANSWERS', [
181 '#MIN_ANSWERS_COUNT#' => self::getMinAnswersCount(),
182 ])));
183 }
184
185 if (
186 !empty($question['ANSWERS'])
187 && is_array($question['ANSWERS'])
188 && count($question['ANSWERS']) > self::getMaxAnswersCount()
189 )
190 {
191 return (new Result())->addError(new Error(
192 Loc::getMessage('VOTE_INTEGRATION_IM_TO_MANY_ANSWERS', [
193 '#COUNT#' => self::getMaxAnswersCount(),
194 ])
195 ));
196 }
197 }
198
199 return new Result();
200 }
201
202 private static function formatVoteData(array $fields): array
203 {
204 return [
205 'ANONYMITY' => (int)$fields['ANONYMITY'],
206 'OPTIONS' => (int)$fields['OPTIONS'],
207 'QUESTIONS' => array_map(
208 fn(array $question) => self::formatVoteQuestion($question),
209 $fields['QUESTIONS'],
210 ),
211 ];
212 }
213
214 private static function formatVoteQuestion(array $question): array
215 {
216 return [
217 'ID' => (int)$question['ID'],
218 'QUESTION' => $question['QUESTION'],
219 'FIELD_TYPE' => (int)$question['FIELD_TYPE'],
220 'ANSWERS' => array_map(
221 fn(array $answer) => self::formatVoteAnswer($answer),
222 $question['ANSWERS'],
223 ),
224 ];
225 }
226
227 private static function formatVoteAnswer(array $answer): array
228 {
229 return [
230 'ID' => (int)$answer['ID'],
231 'MESSAGE' => $answer['MESSAGE'],
232 'REACTION' => $answer['REACTION'] ?? null,
233 ];
234 }
235}
if(empty( $fields)) foreach($fields as $field) $channelId
Определения push.php:23
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
Определения error.php:15
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
static instance()
Определения Feature.php:11
static getMaxAnswersCount()
Определения ImVote.php:38
const MESSAGE_COMPONENT_PARAM_VOTE_ID
Определения ImVote.php:21
const MESSAGE_COMPONENT_ID
Определения ImVote.php:20
static getOrCreateImMessageChannel()
Определения ImVote.php:113
static isAvailable()
Определения ImVote.php:23
static sendVote(int $chatId, int $ownerUserId, array $voteFields, ?string $templateId=null,)
Определения ImVote.php:43
static getMaxQuestionsCount()
Определения ImVote.php:33
static getMinAnswersCount()
Определения ImVote.php:28
$templateId
Определения component_props2.php:51
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
const IM_MESSAGE_CHAT
Определения include.php:23
trait Error
Определения error.php:11
Определения anonymity.php:8
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$fields
Определения yandex_run.php:501