1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
chat.php
См. документацию.
1<?php
2namespace Bitrix\Im\Model;
3
4use Bitrix\Im\Internals\ChatIndex;
5use Bitrix\Im\V2\Chat;
6use Bitrix\Im\V2\Sync;
7use Bitrix\Main\DB\SqlQueryException;
8use Bitrix\Main\Entity;
9use Bitrix\Main\Loader;
10use Bitrix\Main\ORM\Event;
11use Bitrix\Main\ORM\Fields\Relations\Reference;
12use Bitrix\Main\ORM\Query\Join;
13use Bitrix\Main\ORM\Query\Query;
14use Bitrix\Main\Search\MapBuilder;
15use Bitrix\Im\Text;
16
17
57
58class ChatTable extends Entity\DataManager
59{
60 public static function getFilePath()
61 {
62 return __FILE__;
63 }
64
65 public static function getTableName()
66 {
67 return 'b_im_chat';
68 }
69
70 public static function getMap()
71 {
72 return array(
73 'ID' => array(
74 'data_type' => 'integer',
75 'primary' => true,
76 'autocomplete' => true,
77 //'title' => Loc::getMessage('CHAT_ENTITY_ID_FIELD'),
78 ),
79 'PARENT_ID' => array(
80 'data_type' => 'integer',
81 'default_value' => 0,
82 ),
83 'PARENT_MID' => array(
84 'data_type' => 'integer',
85 'default_value' => 0,
86 ),
87 'TITLE' => array(
88 'data_type' => 'string',
89 'validation' => array(__CLASS__, 'validateTitle'),
90 //'title' => Loc::getMessage('CHAT_ENTITY_TITLE_FIELD'),
91 'save_data_modification' => array('\Bitrix\Main\Text\Emoji', 'getSaveModificator'),
92 'fetch_data_modification' => array('\Bitrix\Main\Text\Emoji', 'getFetchModificator'),
93 ),
94 'DESCRIPTION' => array(
95 'data_type' => 'text',
96 //'title' => Loc::getMessage('CHAT_ENTITY_DESCRIPTION_FIELD'),
97 'save_data_modification' => array(Text::class, 'getSaveModificator'),
98 'fetch_data_modification' => array(Text::class, 'getFetchModificator'),
99 'nullable' => true,
100 ),
101 'COLOR' => array(
102 'data_type' => 'string',
103 'validation' => array(__CLASS__, 'validateColor'),
104 //'title' => Loc::getMessage('CHAT_ENTITY_COLOR_FIELD'),
105 ),
106 'TYPE' => array(
107 'data_type' => 'string',
108 'validation' => array(__CLASS__, 'validateType'),
109 //'title' => Loc::getMessage('CHAT_ENTITY_TYPE_FIELD'),
110 'default_value' => 'C',
111 ),
112 'EXTRANET' => array(
113 'data_type' => 'boolean',
114 'values' => array('N', 'Y'),
115 //'title' => Loc::getMessage('CHAT_ENTITY_EXTRANET_FIELD'),
116 'default_value' => 'N',
117 ),
118 'AUTHOR_ID' => array(
119 'data_type' => 'integer',
120 'required' => true,
121 //'title' => Loc::getMessage('CHAT_ENTITY_AUTHOR_ID_FIELD'),
122 ),
123 'AVATAR' => array(
124 'data_type' => 'integer'
125 ),
126 'CALL_TYPE' => array(
127 'data_type' => 'integer',
128 //'title' => Loc::getMessage('CHAT_ENTITY_CALL_TYPE_FIELD'),
129 ),
130 'CALL_NUMBER' => array(
131 'data_type' => 'string',
132 'validation' => array(__CLASS__, 'validateCallNumber'),
133 //'title' => Loc::getMessage('CHAT_ENTITY_CALL_NUMBER_FIELD'),
134 ),
135 'ENTITY_TYPE' => array(
136 'data_type' => 'string',
137 'validation' => array(__CLASS__, 'validateEntityType'),
138 //'title' => Loc::getMessage('CHAT_ENTITY_ENTITY_TYPE_FIELD'),
139 ),
140 'ENTITY_ID' => array(
141 'data_type' => 'string',
142 'validation' => array(__CLASS__, 'validateEntityId'),
143 //'title' => Loc::getMessage('CHAT_ENTITY_ENTITY_ID_FIELD'),
144 ),
145 'ENTITY_DATA_1' => array(
146 'data_type' => 'string',
147 'validation' => array(__CLASS__, 'validateEntityData'),
148 //'title' => Loc::getMessage('CHAT_ENTITY_ENTITY_DATA_1_FIELD'),
149 ),
150 'ENTITY_DATA_2' => array(
151 'data_type' => 'string',
152 'validation' => array(__CLASS__, 'validateEntityData'),
153 //'title' => Loc::getMessage('CHAT_ENTITY_ENTITY_DATA_2_FIELD'),
154 ),
155 'ENTITY_DATA_3' => array(
156 'data_type' => 'string',
157 'validation' => array(__CLASS__, 'validateEntityData'),
158 //'title' => Loc::getMessage('CHAT_ENTITY_ENTITY_DATA_3_FIELD'),
159 ),
160 'AUTHOR' => array(
161 'data_type' => 'Bitrix\Main\User',
162 'reference' => array('=this.AUTHOR_ID' => 'ref.ID'),
163 ),
164 'DISK_FOLDER_ID' => array(
165 'data_type' => 'integer'
166 ),
167 'PIN_MESSAGE_ID' => array(
168 'data_type' => 'integer',
169 'default_value' => 0
170 ),
171 'MESSAGE_COUNT' => array(
172 'data_type' => 'integer',
173 'default_value' => 0,
174 ),
175 'USER_COUNT' => array(
176 'data_type' => 'integer',
177 'default_value' => 0,
178 ),
179 'PREV_MESSAGE_ID' => array(
180 'data_type' => 'integer',
181 'default_value' => 0
182 ),
183 'LAST_MESSAGE_ID' => array(
184 'data_type' => 'integer',
185 'default_value' => 0
186 ),
187 'LAST_MESSAGE_STATUS' => array(
188 'data_type' => 'string',
189 'default_value' => IM_MESSAGE_STATUS_RECEIVED,
190 'validation' => array(__CLASS__, 'validateMessageStatus'),
191 ),
192 'DATE_CREATE' => array(
193 'data_type' => 'datetime',
194 'required' => false,
195 'default_value' => array(__CLASS__, 'getCurrentDate'),
196 ),
197 'MANAGE_USERS_ADD' => array(
198 'data_type' => 'string',
199 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
200 ),
201 'MANAGE_USERS_DELETE' => array(
202 'data_type' => 'string',
203 'default_value' => Chat::MANAGE_RIGHTS_MANAGERS,
204 ),
205 'MANAGE_UI' => array(
206 'data_type' => 'string',
207 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
208 ),
209 'MANAGE_SETTINGS' => array(
210 'data_type' => 'string',
211 'default_value' => Chat::MANAGE_RIGHTS_OWNER,
212 ),
213 'CAN_POST' => array(
214 'data_type' => 'string',
215 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
216 ),
217 'INDEX' => array(
218 'data_type' => 'Bitrix\Im\Model\ChatIndex',
219 'reference' => array('=this.ID' => 'ref.CHAT_ID'),
220 'join_type' => 'INNER',
221 ),
222 'OL_INDEX' => array(
223 'data_type' => 'Bitrix\ImOpenLines\Model\ChatIndexTable',
224 'reference' => array('=this.ID' => 'ref.CHAT_ID'),
225 'join_type' => 'INNER',
226 ),
227 'ALIAS' => array(
228 'data_type' => 'Bitrix\Im\Model\AliasTable',
229 'reference' => array(
230 '=this.ID' => 'ref.ENTITY_ID',
231 '=this.ENTITY_TYPE' => 'ref.ENTITY_TYPE'
232 ),
233 'join_type' => 'LEFT',
234 ),
235 'DISAPPEARING_TIME' => array(
236 'data_type' => 'integer'
237 ),
238 );
239 }
240
241 public static function withRelation(Query $query, ?int $userId): void
242 {
243 $join = Join::on('this.ID', 'ref.CHAT_ID');
244 if ($userId !== null)
245 {
246 $join->where('ref.USER_ID', $userId);
247 }
248 $query->registerRuntimeField(
249 'RELATION',
250 new Reference(
251 'RELATION',
252 RelationTable::class,
253 $join,
254 ['join_type' => Join::TYPE_LEFT]
255 )
256 );
257 }
258
259 public static function onAfterUpdate(\Bitrix\Main\ORM\Event $event)
260 {
261 $fields = $event->getParameter("fields");
262 if (isset($fields['TITLE']))
263 {
264 $primary = $event->getParameter("id");
265
266 $chatIndex =
267 ChatIndex::create()
268 ->setChatId((int)$primary["ID"])
269 ;
270 static::updateIndexRecord($chatIndex);
271 }
272
273 $chatId = (int)$event->getParameter("id")['ID'];
274 if (static::needCacheInvalidate($fields))
275 {
276 Chat::cleanCache($chatId);
277 }
278 elseif (static::needCacheUpdate($fields))
279 {
280 Chat::updateStateAfterOrmEvent($chatId, $fields);
281 Chat::cleanCache($chatId, false);
282 }
283
285 new Sync\Event(Sync\Event::ADD_EVENT, Sync\Event::CHAT_ENTITY, $chatId),
286 static fn () => Chat::getInstance($chatId)->getRelations()->getUserIds(),
287 Chat::getInstance($chatId)
288 );
289
290 return new Entity\EventResult();
291 }
292
293 public static function onAfterDelete(Event $event)
294 {
295 $id = (int)$event->getParameter('primary')['ID'];
296 Chat::cleanCache($id);
297
298 return new Entity\EventResult();
299 }
300
301 public static function indexRecord(ChatIndex $chatIndex)
302 {
303 if ($chatIndex->getChatId() === 0)
304 {
305 return;
306 }
307
308 $record = static::getRecordChatData($chatIndex->getChatId());
309 if(!is_array($record))
310 {
311 return;
312 }
313
314 $chatIndex->setTitle($record['TITLE']);
315
317 'CHAT_ID' => $chatIndex->getChatId(),
318 'SEARCH_CONTENT' => MapBuilder::create()->addText(self::generateSearchContent($chatIndex))->build(),
319 'SEARCH_TITLE' => MapBuilder::create()->addText(self::generateSearchTitle($chatIndex))->build(),
320 ]);
321 }
322
323 public static function addIndexRecord(ChatIndex $index)
324 {
325 if ($index->getChatId() === 0)
326 {
327 return;
328 }
329 $insertData = self::prepareParamsForIndex($index);
330
331 try
332 {
333 ChatIndexTable::add($insertData);
334 }
335 catch (SqlQueryException)
336 {
338 }
339 }
340
341 public static function updateIndexRecord(ChatIndex $index)
342 {
343 $record = static::getRecordChatData($index->getChatId());
344 if(!is_array($record))
345 {
346 return;
347 }
348
349 if ($record['TYPE'] === Chat::IM_TYPE_OPEN_LINE)
350 {
351 if (Loader::includeModule('imopenlines'))
352 {
353 \Bitrix\ImOpenLines\Model\ChatIndexTable::updateIndex($index->getChatId(), $record['TITLE'] ?? null);
354 }
355
356 return;
357 }
358
359 $index->setTitle($record['TITLE']);
360 $updateData = self::prepareParamsForIndex($index);
361
363 $index->getChatId(),
364 'CHAT_ID',
365 $updateData
366 );
367 }
368
369 protected static function needCacheInvalidate(array $updatedFields): bool
370 {
371 $cacheInvalidatingFields = [
372 'TYPE',
373 'ENTITY_TYPE',
374 ];
375
376 return !empty(array_intersect($cacheInvalidatingFields, array_keys($updatedFields)));
377 }
378
379 protected static function needCacheUpdate(array $updatedFields): bool
380 {
381 $cacheUpdatingFields = [
382 'TITLE',
383 'DESCRIPTION',
384 'COLOR',
385 'EXTRANET',
386 'AUTHOR_ID',
387 'AVATAR',
388 'ENTITY_ID',
389 'ENTITY_DATA_1',
390 'ENTITY_DATA_2',
391 'ENTITY_DATA_3',
392 'DISK_FOLDER_ID',
393 'MANAGE_USERS_ADD',
394 'MANAGE_USERS_DELETE',
395 'MANAGE_UI',
396 'MANAGE_SETTINGS',
397 'CAN_POST',
398 ];
399
400 return !empty(array_intersect($cacheUpdatingFields, array_keys($updatedFields)));
401 }
402
403
408 public static function generateSearchContent(ChatIndex $chatIndex)
409 {
410 $indexTitle = $chatIndex->getClearedTitle();
411 $userNameList = static::getChatUserNameList($chatIndex);
412
413 return $indexTitle . ' ' . implode(' ', $userNameList);
414 }
415
416 public static function generateSearchTitle(ChatIndex $chatIndex): string
417 {
418 return $chatIndex->getClearedTitle();
419 }
420
421 public static function validateTitle()
422 {
423 return array(
424 new Entity\Validator\Length(null, 255),
425 );
426 }
427 public static function validateType()
428 {
429 return array(
430 new Entity\Validator\Length(null, 1),
431 );
432 }
433 public static function validateColor()
434 {
435 return array(
436 new Entity\Validator\Length(null, 255),
437 );
438 }
439 public static function validateEntityType()
440 {
441 return array(
442 new Entity\Validator\Length(null, 50),
443 );
444 }
445 public static function validateEntityId()
446 {
447 return array(
448 new Entity\Validator\Length(null, 255),
449 );
450 }
451 public static function validateCallNumber()
452 {
453 return array(
454 new Entity\Validator\Length(null, 20),
455 );
456 }
457 public static function validateEntityData()
458 {
459 return array(
460 new Entity\Validator\Length(null, 255),
461 );
462 }
463 public static function getCurrentDate()
464 {
465 return new \Bitrix\Main\Type\DateTime();
466 }
467 public static function validateMessageStatus()
468 {
469 return array(
470 new Entity\Validator\Length(null, 50),
471 );
472 }
473
478 private static function getRecordChatData(int $id)
479 {
480 return
481 self::query()
482 ->setSelect(['*'])
483 ->where('ID', $id)
484 ->where(
485 Query::filter()
486 ->logic('or')
487 ->whereNot('ENTITY_TYPE', 'LIVECHAT')
488 ->whereNull('ENTITY_TYPE')
489 )
490 ->whereNotIn('TYPE', [\Bitrix\Im\Chat::TYPE_SYSTEM, \Bitrix\Im\Chat::TYPE_PRIVATE])
491 ->fetch()
492 ;
493 }
494
495 private static function getChatUserNameList(ChatIndex $chatIndex): array
496 {
497 if (!$chatIndex->isEmptyUsers())
498 {
499 return $chatIndex->getClearedUserList();
500 }
501
502 $query =
503 \Bitrix\Im\Model\RelationTable::query()
504 ->addSelect('USER_ID')
505 ->where('CHAT_ID', $chatIndex->getChatId())
506 ->setLimit(100)
507 ;
508
509 $clearedUsers = [];
510 foreach ($query->exec() as $relation)
511 {
512 $rowUserName = \Bitrix\Im\User::getInstance($relation['USER_ID'])->getFullName(false);
513 $clearedUsers[] = ChatIndex::clearText($rowUserName);
514 }
515
516 return $clearedUsers;
517 }
518
523 private static function prepareParamsForIndex(ChatIndex $index): array
524 {
525 return [
526 'CHAT_ID' => $index->getChatId(),
527 'SEARCH_CONTENT' => MapBuilder::create()->addText(self::generateSearchContent($index))->build(),
528 'SEARCH_TITLE' => MapBuilder::create()->addText(self::generateSearchTitle($index))->build(),
529 ];
530 }
531}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
const TYPE_PRIVATE
Определения chat.php:25
const TYPE_SYSTEM
Определения chat.php:24
setTitle(string $title)
Определения chatindex.php:54
static updateIndex($id, $primaryField, array $updateData)
Определения chatindex.php:150
static merge(array $data)
Определения chatindex.php:85
static getCurrentDate()
Определения chat.php:463
static validateMessageStatus()
Определения chat.php:467
static validateCallNumber()
Определения chat.php:451
static validateEntityData()
Определения chat.php:457
static getMap()
Определения chat.php:70
static validateEntityId()
Определения chat.php:445
static validateEntityType()
Определения chat.php:439
static validateType()
Определения chat.php:427
static generateSearchTitle(ChatIndex $chatIndex)
Определения chat.php:416
static getFilePath()
Определения chat.php:60
static needCacheUpdate(array $updatedFields)
Определения chat.php:379
static generateSearchContent(ChatIndex $chatIndex)
Определения chat.php:408
static needCacheInvalidate(array $updatedFields)
Определения chat.php:369
static validateTitle()
Определения chat.php:421
static indexRecord(ChatIndex $chatIndex)
Определения chat.php:301
static onAfterDelete(Event $event)
Определения chat.php:293
static updateIndexRecord(ChatIndex $index)
Определения chat.php:341
static onAfterUpdate(\Bitrix\Main\ORM\Event $event)
Определения chat.php:259
static withRelation(Query $query, ?int $userId)
Определения chat.php:241
static addIndexRecord(ChatIndex $index)
Определения chat.php:323
static getTableName()
Определения chat.php:65
static validateColor()
Определения chat.php:433
static getInstance($userId=null)
Определения user.php:45
static getInstance()
Определения Logger.php:37
static getInstance()
Определения application.php:98
static cleanCache()
Определения datamanager.php:1983
static create()
Определения mapbuilder.php:25
</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
const IM_MESSAGE_STATUS_RECEIVED
Определения include.php:44
Определения ChatsSync.php:3
Определения ufield.php:9
Определения chain.php:3
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$fields
Определения yandex_run.php:501