3namespace Bitrix\Socialnetwork\Livefeed;
5use Bitrix\Disk\AttachedObject;
7use Bitrix\Main\Application;
8use Bitrix\Main\EventResult;
10use Bitrix\Main\Localization\Loc;
11use Bitrix\Main\Type\DateTime;
12use Bitrix\Socialnetwork\Internals\LiveFeed\Counter\CounterService;
13use Bitrix\Socialnetwork\Item\Subscription;
14use Bitrix\Socialnetwork\LogTable;
15use Bitrix\Socialnetwork\UserContentViewTable;
16use Bitrix\Socialnetwork\Item\UserContentView;
17use Bitrix\Socialnetwork\Item\Log;
19Loc::loadMessages(__FILE__);
21abstract class Provider
82 private static array $logIdCache = [];
110 $this->options[
$key] = $value;
120 return ($this->options[
$key] ??
null);
140 return $this->ratingTypeId;
145 $this->ratingTypeId = $value;
150 return $this->ratingEntityId;
155 $this->ratingEntityId = $value;
170 $this->parentProvider = $value;
175 return $this->parentProvider;
178 private static function getTypes():
array
192 'onLogProviderGetProvider',
194 'entityType' => $entityType
197 $moduleEvent->send();
199 foreach ($moduleEvent->getResults() as $moduleEventResult)
201 if ($moduleEventResult->getType() === EventResult::SUCCESS)
203 $moduleEventParams = $moduleEventResult->getParameters();
206 is_array($moduleEventParams)
207 && !empty($moduleEventParams[
'provider'])
210 $provider = $moduleEventParams[
'provider'];
220 case self::DATA_ENTITY_TYPE_BLOG_POST:
223 case self::DATA_ENTITY_TYPE_BLOG_COMMENT:
226 case self::DATA_ENTITY_TYPE_TASKS_TASK:
229 case self::DATA_ENTITY_TYPE_FORUM_TOPIC:
232 case self::DATA_ENTITY_TYPE_FORUM_POST:
235 case self::DATA_ENTITY_TYPE_CALENDAR_EVENT:
238 case self::DATA_ENTITY_TYPE_LOG_ENTRY:
241 case self::DATA_ENTITY_TYPE_LOG_COMMENT:
244 case self::DATA_ENTITY_TYPE_RATING_LIST:
247 case self::DATA_ENTITY_TYPE_PHOTOGALLERY_ALBUM:
250 case self::DATA_ENTITY_TYPE_PHOTOGALLERY_PHOTO:
253 case self::DATA_ENTITY_TYPE_LISTS_ITEM:
256 case self::DATA_ENTITY_TYPE_WIKI:
259 case self::DATA_ENTITY_TYPE_TIMEMAN_ENTRY:
262 case self::DATA_ENTITY_TYPE_TIMEMAN_REPORT:
265 case self::DATA_ENTITY_TYPE_INTRANET_NEW_USER:
268 case self::DATA_ENTITY_TYPE_BITRIX24_NEW_USER:
289 isset(
$params[
'CLONE_DISK_OBJECTS'])
290 &&
$params[
'CLONE_DISK_OBJECTS'] ===
true
304 if (isset(
$params[
'RATING_TYPE_ID']))
309 if (isset(
$params[
'RATING_ENTITY_ID']))
315 isset(
$params[
'ADDITIONAL_PARAMS'])
316 && is_array(
$params[
'ADDITIONAL_PARAMS'])
333 return self::PERMISSION_DENY;
340 $cacheKey = $this->generateLogIdCacheKey(
$params);
342 if (isset(self::$logIdCache[$cacheKey]))
344 return self::$logIdCache[$cacheKey];
347 if ($this->logId > 0)
357 || $this->entityId <= 0
366 'EVENT_ID' => $eventId
387 $res = \CSocNetLog::getList(
391 [
'nTopCount' => 1 ],
395 $logEntry =
$res->fetch();
402 $res = \CCrmActivity::getList(
405 'ASSOCIATED_ENTITY_ID' => $this->entityId,
406 'TYPE_ID' => \CCrmActivityType::Task,
407 'CHECK_PERMISSIONS' =>
'N'
413 if ($activityFields =
$res->fetch())
415 $res = \CSocNetLog::getList(
418 'EVENT_ID' => $eventId,
419 '=ENTITY_TYPE' =>
'CRMACTIVITY',
420 '=ENTITY_ID' => $activityFields[
'ID'],
423 [
'nTopCount' => 1 ],
426 $logEntry =
$res->fetch();
432 && ((
int)$logEntry[
'ID'] > 0)
435 $result = $this->logId = (int)$logEntry[
'ID'];
441 'EVENT_ID' => $eventId
453 $res = \CSocNetLogComments::getList(
457 [
'nTopCount' => 1 ],
462 ($logCommentEntry =
$res->fetch())
463 && ((
int)$logCommentEntry[
'LOG_ID'] > 0)
466 $result = $this->logId = (int)$logCommentEntry[
'LOG_ID'];
471 self::$logIdCache[$cacheKey] =
$result;
483 || $this->
getType() !== self::TYPE_COMMENT
490 'EVENT_ID' => $eventId
502 $res = \CSocNetLogComments::getList(
506 [
'nTopCount' => 1 ],
510 if ($logCommentEntry =
$res->fetch())
512 $result = (int)$logCommentEntry[
'ID'];
513 if ((
int)$logCommentEntry[
'LOG_ID'] > 0)
515 $this->logId = (int)$logCommentEntry[
'LOG_ID'];
531 && is_array($logRights)
534 foreach ($logRights as $groupCode)
536 if (preg_match(
'/^SG(\d+)/', $groupCode,
$matches))
549 $activity = \CSocNetFeatures::isActiveFeature(
554 $availability = \CSocNetFeaturesPerms::canPerformOperation(
566 || !isset($availability[$groupId])
567 || !$availability[$groupId]
596 if ($this->logId > 0)
598 $res = \CSocNetLogRights::getList(
601 'LOG_ID' => $this->logId
636 return $this->additionalParams;
646 return $this->sourceFields;
651 return $this->sourceFields;
661 if (empty($this->sourceFields))
666 $result = $this->sourceDescription;
668 if ($this->cloneDiskObjects ===
true)
679 $this->sourceTitle =
$title;
684 if (empty($this->sourceFields))
689 return $this->sourceTitle;
694 if (empty($this->sourceFields))
710 if (empty($this->sourceFields))
723 $this->sourceOriginalText =
$text;
728 if (empty($this->sourceFields))
733 return $this->sourceOriginalText;
738 $this->sourceAuxData = $auxData;
743 if (empty($this->sourceFields))
748 return $this->sourceAuxData;
753 $this->sourceAttachedDiskObjects = $diskAttachedObjects;
758 $this->sourceDiskObjects =
$files;
763 $this->diskObjectsCloned = $values;
768 return $this->diskObjectsCloned;
773 return $this->attachedDiskObjectsCloned;
778 if (empty($this->sourceFields))
783 return $this->sourceAttachedDiskObjects;
788 if (empty($this->sourceFields))
793 return $this->sourceDiskObjects;
803 $this->sourceDateTime = $datetime;
808 return $this->sourceDateTime;
813 $this->sourceAuthorId = (int)$authorId;
818 return $this->sourceAuthorId;
828 $result = \Bitrix\Disk\Driver::getInstance()->getUserFieldManager()->cloneUfValuesFromAttachedObject($values,
$USER->getId());
843 empty($this->diskObjectsCloned)
847 foreach (
$result as $clonedDiskObjectId)
850 in_array($clonedDiskObjectId, $this->attachedDiskObjectsCloned)
851 && ($attachedDiskObjectId = array_search($clonedDiskObjectId, $this->attachedDiskObjectsCloned))
854 $attachedObject = AttachedObject::loadById($attachedDiskObjectId);
857 $this->diskObjectsCloned[\Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX.$attachedObject->getObjectId()] = $this->attachedDiskObjectsCloned[$attachedDiskObjectId];
873 foreach ($diskObjects as $attachedObjectId)
875 $attachedObject = AttachedObject::loadById($attachedObjectId);
878 $result[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $attachedObject->getObjectId();
886 private function processDescription(
$text)
890 $diskObjectsCloned = $this->getDiskObjectsCloned();
891 $attachedDiskObjectsCloned = $this->getAttachedDiskObjectsCloned();
894 !empty($diskObjectsCloned)
895 && is_array($diskObjectsCloned)
898 $result = preg_replace_callback(
899 "#\\[disk file id=(n\\d+)\\]#isu",
900 [ $this,
'parseDiskObjectsCloned' ],
906 !empty($attachedDiskObjectsCloned)
907 && is_array($attachedDiskObjectsCloned)
910 $result = preg_replace_callback(
911 "#\\[disk file id=(\\d+)\\]#isu",
912 [ $this,
'parseAttachedDiskObjectsCloned' ],
920 private function parseDiskObjectsCloned(
$matches)
924 $diskObjectsCloned = $this->getDiskObjectsCloned();
926 if (array_key_exists(
$matches[1], $diskObjectsCloned))
934 private function parseAttachedDiskObjectsCloned(
$matches)
955 return static::CONTENT_TYPE_ID;
967 $contentEntityType =
false;
968 $contentEntityId =
false;
972 'onLogProviderGetContentId',
977 $moduleEvent->send();
979 foreach ($moduleEvent->getResults() as $moduleEventResult)
981 if ($moduleEventResult->getType() === EventResult::SUCCESS)
983 $moduleEventParams = $moduleEventResult->getParameters();
986 is_array($moduleEventParams)
987 && !empty($moduleEventParams[
'contentEntityType'])
988 && !empty($moduleEventParams[
'contentEntityId'])
991 $contentEntityType = $moduleEventParams[
'contentEntityType'];
992 $contentEntityId = $moduleEventParams[
'contentEntityId'];
1000 && $contentEntityId > 0
1004 'ENTITY_TYPE' => $contentEntityType,
1005 'ENTITY_ID' => $contentEntityId
1012 !empty(
$event[
'EVENT_ID'])
1013 &&
$event[
'EVENT_ID'] ===
'photo'
1016 $contentEntityType = self::DATA_ENTITY_TYPE_PHOTOGALLERY_ALBUM;
1017 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1020 !empty(
$event[
'EVENT_ID'])
1021 &&
$event[
'EVENT_ID'] ===
'photo_photo'
1024 $contentEntityType = self::DATA_ENTITY_TYPE_PHOTOGALLERY_PHOTO;
1025 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1028 !empty(
$event[
'EVENT_ID'])
1029 &&
$event[
'EVENT_ID'] ===
'data'
1032 $contentEntityType = self::DATA_ENTITY_TYPE_LOG_ENTRY;
1033 $contentEntityId = (int)
$event[
'ID'];
1036 !empty(
$event[
'RATING_TYPE_ID'])
1037 && !empty(
$event[
'RATING_ENTITY_ID'])
1038 && (
int)
$event[
'RATING_ENTITY_ID'] > 0
1041 $contentEntityType =
$event[
'RATING_TYPE_ID'];
1042 $contentEntityId = (int)
$event[
'RATING_ENTITY_ID'];
1044 if (in_array(
$event[
'RATING_TYPE_ID'], [
'IBLOCK_ELEMENT',
'IBLOCK_SECTION' ]))
1046 $res = self::$logTable::getList([
1048 '=RATING_TYPE_ID' =>
$event[
'RATING_TYPE_ID'],
1049 '=RATING_ENTITY_ID' =>
$event[
'RATING_ENTITY_ID'],
1051 'select' => [
'EVENT_ID' ]
1053 if ($logEntryFields =
$res->fetch())
1055 if (
$event[
'RATING_TYPE_ID'] ===
'IBLOCK_ELEMENT')
1058 $photogalleryPhotoProvider = new \Bitrix\Socialnetwork\Livefeed\PhotogalleryPhoto;
1059 if (in_array($logEntryFields[
'EVENT_ID'], $photogalleryPhotoProvider->getEventId(),
true))
1061 $contentEntityType = self::DATA_ENTITY_TYPE_PHOTOGALLERY_PHOTO;
1062 $contentEntityId = (int)
$event[
'RATING_ENTITY_ID'];
1068 $wikiProvider = new \Bitrix\Socialnetwork\Livefeed\Wiki;
1069 if (in_array($logEntryFields[
'EVENT_ID'], $wikiProvider->getEventId()))
1071 $contentEntityType = self::DATA_ENTITY_TYPE_WIKI;
1072 $contentEntityId = (int)
$event[
'RATING_ENTITY_ID'];
1079 $photogalleryalbumProvider = new \Bitrix\Socialnetwork\Livefeed\PhotogalleryAlbum;
1080 if (in_array($logEntryFields[
'EVENT_ID'], $photogalleryalbumProvider->getEventId(),
true))
1082 $contentEntityType = self::DATA_ENTITY_TYPE_PHOTOGALLERY_ALBUM;
1083 $contentEntityId = (int)
$event[
'RATING_ENTITY_ID'];
1090 $contentEntityType = self::DATA_ENTITY_TYPE_WIKI;
1091 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1096 !empty(
$event[
'EVENT_ID'])
1097 && !empty(
$event[
'SOURCE_ID'])
1098 && (
int)
$event[
'SOURCE_ID'] > 0
1101 switch (
$event[
'EVENT_ID'])
1104 $contentEntityType = self::DATA_ENTITY_TYPE_TASKS_TASK;
1105 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1108 $contentEntityType = self::DATA_ENTITY_TYPE_CALENDAR_EVENT;
1109 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1111 case 'timeman_entry':
1112 $contentEntityType = self::DATA_ENTITY_TYPE_TIMEMAN_ENTRY;
1113 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1116 $contentEntityType = self::DATA_ENTITY_TYPE_TIMEMAN_REPORT;
1117 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1119 case 'lists_new_element':
1120 $contentEntityType = self::DATA_ENTITY_TYPE_LISTS_ITEM;
1121 $contentEntityId = (int)
$event[
'SOURCE_ID'];
1129 && $contentEntityId > 0
1133 'ENTITY_TYPE' => $contentEntityType,
1134 'ENTITY_ID' => $contentEntityId
1153 && \CSocNetUser::isCurrentUserModuleAdmin()
1161 && (int)
$params[
'user_id'] > 0
1178 || !$contentEntityId
1186 'typeId' => $contentTypeId,
1187 'entityId' => $contentEntityId,
1193 $pool->useMasterOnly(
true);
1200 $logItem = Log::getById(
$logId);
1203 $fields = $logItem->getFields();
1204 $contentTypeId =
$fields[
'RATING_TYPE_ID'] ??
null;
1205 $contentEntityId =
$fields[
'RATING_ENTITY_ID'] ??
null;
1206 if ($contentTypeId && $contentEntityId)
1210 'typeId' => $contentTypeId,
1211 'entityId' => $contentEntityId,
1219 $pool->useMasterOnly(
false);
1231 if (UserContentView::getAvailability())
1240 $contentId = $viewParams[
'typeId'] .
'-' . $viewParams[
'entityId'];
1245 \CPullWatch::addToStack(
'CONTENTVIEW' . $viewParams[
'typeId'] .
'-' . $viewParams[
'entityId'],
1247 'module_id' =>
'contentview',
1252 'TYPE_ID' => $viewParams[
'typeId'],
1253 'ENTITY_ID' => $viewParams[
'entityId'],
1255 'TOTAL_VIEWS' => (
int)($views[
$contentId][
'CNT'] ?? 0),
1264 Subscription::onContentViewed([
1272 'SONET_LOG_ID' => (
int)
$logId,
1274 'ENTITY_TYPE_ID' => $contentTypeId,
1275 'ENTITY_ID' => $contentEntityId,
1281 'socialnetwork',
'onContentViewed',
1293 $entityType =
false;
1298 && in_array(
$params[
'TYPE'], self::getTypes())
1303 if (!empty(
$params[
'EVENT_ID']))
1305 $blogPostLivefeedProvider =
new BlogPost;
1307 $type === self::TYPE_POST
1308 && in_array(
$params[
'EVENT_ID'], $blogPostLivefeedProvider->getEventId(),
true)
1311 $entityType = self::DATA_ENTITY_TYPE_BLOG_POST;
1320 'ENTITY_TYPE' => $entityType,
1344 $this->logEventId = $eventId;
1349 private function setLogEntityType($entityType =
''): bool
1351 if ($entityType ==
'')
1356 $this->logEntityType = $entityType;
1361 private function setLogEntityId(
$entityId = 0): bool
1383 $res = self::$logTable::getList([
1387 'select' => [
'EVENT_ID',
'ENTITY_TYPE',
'ENTITY_ID' ]
1389 if ($logFields =
$res->fetch())
1391 $return = $logFields;
1394 $this->setLogEntityType($logFields[
'ENTITY_TYPE']);
1395 $this->setLogEntityId($logFields[
'ENTITY_ID']);
1405 if ($this->logEventId !==
null)
1412 if (!empty($logFields[
'EVENT_ID']))
1414 $result = $logFields[
'EVENT_ID'];
1425 if ($this->logEntityType !==
null)
1427 $result = $this->logEntityType;
1432 if (!empty($logFields[
'ENTITY_TYPE']))
1434 $result = $logFields[
'ENTITY_TYPE'];
1445 if ($this->logEntityId !==
null)
1452 if (!empty($logFields[
'ENTITY_ID']))
1454 $result = $logFields[
'ENTITY_ID'];
1492 return Loc::getMessage(
'SONET_LIVEFEED_BASE_TITLE_UNAVAILABLE');
1501 $userFieldEntity = (string)(
$params[
'userFieldEntity'] ??
'');
1503 $userFieldCode = (string)(
$params[
'userFieldCode'] ??
'');
1504 $clone = (boolean)(
$params[
'clone'] ??
false);
1507 $userFieldEntity ===
''
1508 || $userFieldCode ===
''
1509 || $userFieldEntityId <= 0
1517 $cacheKey = $userFieldEntity . $userFieldEntityId . $clone;
1519 if (isset($cache[$cacheKey]))
1525 $entityUF =
$USER_FIELD_MANAGER->getUserFields($userFieldEntity, $userFieldEntityId, LANGUAGE_ID);
1527 !empty($entityUF[$userFieldCode])
1528 && !empty($entityUF[$userFieldCode][
'VALUE'])
1529 && is_array($entityUF[$userFieldCode][
'VALUE'])
1534 $this->attachedDiskObjectsCloned = self::cloneUfValues($entityUF[$userFieldCode][
'VALUE']);
1535 $result = $cache[$cacheKey] = array_values($this->attachedDiskObjectsCloned);
1539 $result = $cache[$cacheKey] = $entityUF[$userFieldCode][
'VALUE'];
1557 private function isComment(
string $contentTypeId): bool
1564 private function generateLogIdCacheKey(
array $params): string
1566 return md5(serialize(
$params));
if(!Loader::includeModule('messageservice')) $provider
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static includeModule($moduleName)
static addEvent(string $type, array $data)
static getViewData($params=[])
const DATA_ENTITY_TYPE_PHOTOGALLERY_ALBUM
setParentProvider($value)
setDiskObjectsCloned(array $values)
const DATA_ENTITY_TYPE_PHOTOGALLERY_PHOTO
setSourceFields(array $fields)
const DATA_ENTITY_TYPE_LOG_ENTRY
getPermissions(array $entity)
setSourceAuxData($auxData)
const DATA_ENTITY_TYPE_TIMEMAN_ENTRY
const DATA_ENTITY_TYPE_LISTS_ITEM
getAdditionalData($params=[])
const DATA_ENTITY_TYPE_BLOG_POST
const DATA_ENTITY_TYPE_RATING_LIST
setOption(string $key, $value)
$sourceAttachedDiskObjects
checkAdditionalDataParams(&$params)
const DATA_ENTITY_TYPE_TIMEMAN_REPORT
setRatingTypeId(string $value)
getAttachedDiskObjects($clone=false)
const DATA_ENTITY_TYPE_LIVE_FEED_VIEW
setContentView($params=[])
warmUpAuxCommentsStaticCache(array $params=[])
const DATA_ENTITY_TYPE_FORUM_POST
static cloneUfValues(array $values)
static getProvider($entityType)
setSourceDateTime(DateTime $datetime)
const DATA_ENTITY_TYPE_CALENDAR_EVENT
static init(array $params)
setSourceDiskObjects(array $files)
const DATA_RESULT_TYPE_SOURCE
setAdditionalParams(array $additionalParams)
setSourceAttachedDiskObjects(array $diskAttachedObjects)
getEntityAttachedDiskObjects(array $params=[])
const DATA_ENTITY_TYPE_INTRANET_NEW_USER
setRatingEntityId(int $value)
const DATA_ENTITY_TYPE_BLOG_COMMENT
static getContentId($event=[])
static getEntityData(array $params)
setSourceAuthorId($authorId=0)
$attachedDiskObjectsCloned
setSourceOriginalText($text)
setLogEventId($eventId='')
const DATA_ENTITY_TYPE_BITRIX24_NEW_USER
const DATA_ENTITY_TYPE_FORUM_TOPIC
setSourceDescription($description)
getAttachedDiskObjectsCloned()
const DATA_ENTITY_TYPE_WIKI
const DATA_ENTITY_TYPE_TASKS_TASK
const DATA_ENTITY_TYPE_LOG_COMMENT
getSonetGroupsAvailable($feature=false, $operation=false)
getDiskObjects($entityId, $clone=false)
getSourceAttachedDiskObjects()
static clearAllTags($text)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']