2namespace Bitrix\Im\Model;
4use Bitrix\Im\Internals\ChatIndex;
7use Bitrix\Main\DB\SqlQueryException;
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;
74 'data_type' =>
'integer',
76 'autocomplete' =>
true,
80 'data_type' =>
'integer',
83 'PARENT_MID' =>
array(
84 'data_type' =>
'integer',
88 'data_type' =>
'string',
89 'validation' =>
array(__CLASS__,
'validateTitle'),
91 'save_data_modification' =>
array(
'\Bitrix\Main\Text\Emoji',
'getSaveModificator'),
92 'fetch_data_modification' =>
array(
'\Bitrix\Main\Text\Emoji',
'getFetchModificator'),
94 'DESCRIPTION' =>
array(
95 'data_type' =>
'text',
97 'save_data_modification' =>
array(Text::class,
'getSaveModificator'),
98 'fetch_data_modification' =>
array(Text::class,
'getFetchModificator'),
102 'data_type' =>
'string',
103 'validation' =>
array(__CLASS__,
'validateColor'),
107 'data_type' =>
'string',
108 'validation' =>
array(__CLASS__,
'validateType'),
110 'default_value' =>
'C',
113 'data_type' =>
'boolean',
114 'values' =>
array(
'N',
'Y'),
116 'default_value' =>
'N',
118 'AUTHOR_ID' =>
array(
119 'data_type' =>
'integer',
124 'data_type' =>
'integer'
126 'CALL_TYPE' =>
array(
127 'data_type' =>
'integer',
130 'CALL_NUMBER' =>
array(
131 'data_type' =>
'string',
132 'validation' =>
array(__CLASS__,
'validateCallNumber'),
135 'ENTITY_TYPE' =>
array(
136 'data_type' =>
'string',
137 'validation' =>
array(__CLASS__,
'validateEntityType'),
140 'ENTITY_ID' =>
array(
141 'data_type' =>
'string',
142 'validation' =>
array(__CLASS__,
'validateEntityId'),
145 'ENTITY_DATA_1' =>
array(
146 'data_type' =>
'string',
147 'validation' =>
array(__CLASS__,
'validateEntityData'),
150 'ENTITY_DATA_2' =>
array(
151 'data_type' =>
'string',
152 'validation' =>
array(__CLASS__,
'validateEntityData'),
155 'ENTITY_DATA_3' =>
array(
156 'data_type' =>
'string',
157 'validation' =>
array(__CLASS__,
'validateEntityData'),
161 'data_type' =>
'Bitrix\Main\User',
162 'reference' =>
array(
'=this.AUTHOR_ID' =>
'ref.ID'),
164 'DISK_FOLDER_ID' =>
array(
165 'data_type' =>
'integer'
167 'PIN_MESSAGE_ID' =>
array(
168 'data_type' =>
'integer',
171 'MESSAGE_COUNT' =>
array(
172 'data_type' =>
'integer',
173 'default_value' => 0,
175 'USER_COUNT' =>
array(
176 'data_type' =>
'integer',
177 'default_value' => 0,
179 'PREV_MESSAGE_ID' =>
array(
180 'data_type' =>
'integer',
183 'LAST_MESSAGE_ID' =>
array(
184 'data_type' =>
'integer',
187 'LAST_MESSAGE_STATUS' =>
array(
188 'data_type' =>
'string',
190 'validation' =>
array(__CLASS__,
'validateMessageStatus'),
192 'DATE_CREATE' =>
array(
193 'data_type' =>
'datetime',
195 'default_value' =>
array(__CLASS__,
'getCurrentDate'),
197 'MANAGE_USERS_ADD' =>
array(
198 'data_type' =>
'string',
199 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
201 'MANAGE_USERS_DELETE' =>
array(
202 'data_type' =>
'string',
203 'default_value' => Chat::MANAGE_RIGHTS_MANAGERS,
205 'MANAGE_UI' =>
array(
206 'data_type' =>
'string',
207 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
209 'MANAGE_SETTINGS' =>
array(
210 'data_type' =>
'string',
211 'default_value' => Chat::MANAGE_RIGHTS_OWNER,
214 'data_type' =>
'string',
215 'default_value' => Chat::MANAGE_RIGHTS_MEMBER,
218 'data_type' =>
'Bitrix\Im\Model\ChatIndex',
219 'reference' =>
array(
'=this.ID' =>
'ref.CHAT_ID'),
220 'join_type' =>
'INNER',
223 'data_type' =>
'Bitrix\ImOpenLines\Model\ChatIndexTable',
224 'reference' =>
array(
'=this.ID' =>
'ref.CHAT_ID'),
225 'join_type' =>
'INNER',
228 'data_type' =>
'Bitrix\Im\Model\AliasTable',
229 'reference' =>
array(
230 '=this.ID' =>
'ref.ENTITY_ID',
231 '=this.ENTITY_TYPE' =>
'ref.ENTITY_TYPE'
233 'join_type' =>
'LEFT',
235 'DISAPPEARING_TIME' =>
array(
236 'data_type' =>
'integer'
243 $join = Join::on(
'this.ID',
'ref.CHAT_ID');
246 $join->where(
'ref.USER_ID',
$userId);
248 $query->registerRuntimeField(
252 RelationTable::class,
254 [
'join_type' => Join::TYPE_LEFT]
264 $primary =
$event->getParameter(
"id");
268 ->setChatId((
int)$primary[
"ID"])
270 static::updateIndexRecord($chatIndex);
273 $chatId = (int)
$event->getParameter(
"id")[
'ID'];
274 if (static::needCacheInvalidate(
$fields))
280 Chat::updateStateAfterOrmEvent($chatId,
$fields);
290 return new Entity\EventResult();
295 $id = (int)
$event->getParameter(
'primary')[
'ID'];
298 return new Entity\EventResult();
308 $record = static::getRecordChatData($chatIndex->
getChatId());
309 if(!is_array($record))
314 $chatIndex->
setTitle($record[
'TITLE']);
318 'SEARCH_CONTENT' =>
MapBuilder::create()->addText(self::generateSearchContent($chatIndex))->build(),
319 'SEARCH_TITLE' =>
MapBuilder::create()->addText(self::generateSearchTitle($chatIndex))->build(),
329 $insertData = self::prepareParamsForIndex($index);
333 ChatIndexTable::add($insertData);
343 $record = static::getRecordChatData($index->
getChatId());
344 if(!is_array($record))
349 if ($record[
'TYPE'] === Chat::IM_TYPE_OPEN_LINE)
351 if (Loader::includeModule(
'imopenlines'))
353 \Bitrix\ImOpenLines\Model\ChatIndexTable::updateIndex($index->
getChatId(), $record[
'TITLE'] ??
null);
360 $updateData = self::prepareParamsForIndex($index);
371 $cacheInvalidatingFields = [
376 return !empty(array_intersect($cacheInvalidatingFields, array_keys($updatedFields)));
381 $cacheUpdatingFields = [
394 'MANAGE_USERS_DELETE',
400 return !empty(array_intersect($cacheUpdatingFields, array_keys($updatedFields)));
411 $userNameList = static::getChatUserNameList($chatIndex);
413 return $indexTitle .
' ' . implode(
' ', $userNameList);
424 new Entity\Validator\Length(
null, 255),
430 new Entity\Validator\Length(
null, 1),
436 new Entity\Validator\Length(
null, 255),
442 new Entity\Validator\Length(
null, 50),
448 new Entity\Validator\Length(
null, 255),
454 new Entity\Validator\Length(
null, 20),
460 new Entity\Validator\Length(
null, 255),
465 return new \Bitrix\Main\Type\DateTime();
470 new Entity\Validator\Length(
null, 50),
478 private static function getRecordChatData(
int $id)
487 ->whereNot(
'ENTITY_TYPE',
'LIVECHAT')
488 ->whereNull(
'ENTITY_TYPE')
495 private static function getChatUserNameList(ChatIndex $chatIndex):
array
497 if (!$chatIndex->isEmptyUsers())
499 return $chatIndex->getClearedUserList();
503 \Bitrix\Im\Model\RelationTable::query()
504 ->addSelect(
'USER_ID')
505 ->where(
'CHAT_ID', $chatIndex->getChatId())
510 foreach (
$query->exec() as $relation)
513 $clearedUsers[] = ChatIndex::clearText($rowUserName);
516 return $clearedUsers;
523 private static function prepareParamsForIndex(ChatIndex $index):
array
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(),
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static updateIndex($id, $primaryField, array $updateData)
static merge(array $data)
static validateMessageStatus()
static validateCallNumber()
static validateEntityData()
static validateEntityId()
static validateEntityType()
static generateSearchTitle(ChatIndex $chatIndex)
static needCacheUpdate(array $updatedFields)
static generateSearchContent(ChatIndex $chatIndex)
static needCacheInvalidate(array $updatedFields)
static indexRecord(ChatIndex $chatIndex)
static onAfterDelete(Event $event)
static updateIndexRecord(ChatIndex $index)
static onAfterUpdate(\Bitrix\Main\ORM\Event $event)
static withRelation(Query $query, ?int $userId)
static addIndexRecord(ChatIndex $index)
static getInstance($userId=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
const IM_MESSAGE_STATUS_RECEIVED
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)