private function getElementsInternal(array $settings)
{
global $CACHE_MANAGER, $USER_FIELD_MANAGER;
$result = [];
$pathToSmile = MainConfigOption::get("socialnetwork", "smile_page", false, SITE_ID);
$pathToSmile = ($pathToSmile ? $pathToSmile : "/bitrix/images/socialnetwork/smile/");
$parserParams = Array(
"imageWidth" => 500,
"imageHeight" => 500,
);
$allow = [
"HTML" => "N",
"ANCHOR" => "Y",
"BIU" => "Y",
"IMG" => "Y",
"QUOTE" => "Y",
"CODE" => "Y",
"FONT" => "Y",
"LIST" => "Y",
"SMILES" => "Y",
"NL2BR" => "N",
"VIDEO" => "Y",
"USER" => "N",
"TAG" => "Y",
"SHORT_ANCHOR" => "Y"
];
if(MainConfigOption::get("blog","allow_video", "Y") != "Y")
{
$allow["VIDEO"] = "N";
}
$iterator = CSocNetLog::getList(
$settings['order'],
$settings['filter'],
false,
$settings['limit'],
[ 'SOURCE_ID' ],
[
'CHECK_RIGHTS' => 'N',
'USE_FOLLOW' => 'N',
'USE_SUBSCRIBE' => 'N',
'USE_FAVORITES' => 'N',
]
);
$blogPostIdList = [];
while ($row = $iterator->fetch())
{
$blogPostIdList[] = $row['SOURCE_ID'];
}
$diskInstalled = MainLoader::includeModule('disk');
if (
!empty($blogPostIdList)
&& MainLoader::includeModule('blog')
)
{
if ($diskInstalled)
{
$driver = BitrixDiskDriver::getInstance();
$urlManager = $driver->getUrlManager();
}
$query = new BitrixMainEntityQuery(PostTable::getEntity());
$query->addOrder('DATE_PUBLISH', 'DESC');
$query->addFilter('@ID', $blogPostIdList);
$query->addSelect('ID');
$query->addSelect('MICRO');
$query->addSelect('TITLE');
$query->addSelect('DETAIL_TEXT');
$query->addSelect('AUTHOR_ID');
$query->addSelect('DATE_PUBLISH');
$query->registerRuntimeField(
'',
new BitrixMainEntityReferenceField('U',
UserTable::getEntity(),
array(
'=ref.ID' => 'this.AUTHOR_ID'
),
array('join_type' => 'INNER')
)
);
$query->addSelect('U.PERSONAL_PHOTO', 'AUTHOR_AVATAR');
$query->addSelect('U.NAME', 'AUTHOR_NAME');
$query->addSelect('U.LAST_NAME', 'AUTHOR_LAST_NAME');
$query->addSelect('U.SECOND_NAME', 'AUTHOR_SECOND_NAME');
$query->addSelect('U.LOGIN', 'AUTHOR_LOGIN');
$iterator = $query->exec();
while ($row = $iterator->fetch())
{
if (defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->registerTag("blog_post_".$row['ID']);
}
$attachedFilesList = [];
if ($diskInstalled)
{
$res = BitrixDiskAttachedObject::getList(array(
'filter' => array(
'=ENTITY_TYPE' => BitrixDiskUfBlogPostConnector::className(),
'ENTITY_ID' => $row
),
'select' => array('ID', 'OBJECT_ID', 'FILENAME' => 'OBJECT.NAME')
));
foreach ($res as $attachedObjectFields)
{
$attachedObjectFields['URL'] = (BitrixDiskTypeFile::isImage($attachedObjectFields['FILENAME'])
? $urlManager->getUrlUfController('show', array('attachedId' => $attachedObjectFields['ID']))
: ''
);
$attachedFilesList[] = $attachedObjectFields;
}
}
$detailTextInOneString = str_replace("rn", "", $row["DETAIL_TEXT"]);
$inlineAttachmentsList = [];
if (preg_match_all('/[DISKsFILEsID=([n]*)(d+)]/', $row["DETAIL_TEXT"], $matches))
{
foreach($matches[2] as $key => $value)
{
$inlineAttachmentsList[] = [
'ID' => $value,
'KEY' => ($matches[1][$key] === 'n' ? 'OBJECT_ID' : 'ID'),
'POSITION' => mb_strpos($detailTextInOneString, $matches[0][$key])
];
}
}
$picture = '';
$diskPicturePosition = false;
foreach($inlineAttachmentsList as $inlineAttachment)
{
foreach($attachedFilesList as $attachedFile)
{
if(
$attachedFile[$inlineAttachment['KEY']] == $inlineAttachment['ID']
&& !empty($attachedFile['URL'])
)
{
$picture = [
'alt' => (!empty($attachedFile['FILENAME']) ? $attachedFile['FILENAME'] : ''),
'src' => $attachedFile['URL']
];
$diskPicturePosition = $inlineAttachment['POSITION'];
break;
}
}
if(!empty($picture))
{
break;
}
}
$imgPattern = '/[IMGs+WIDTHs*=s*d+s+HEIGHTs*=s*d+s*](.+?)[/IMG]/is'.BX_UTF_PCRE_MODIFIER;
$videoPattern = '/[VIDEO[^]]*](.+?)[/VIDEO]/is'.BX_UTF_PCRE_MODIFIER;
$detailText = BitrixSocialnetworkHelperMention::clear($row['DETAIL_TEXT']);
if (
preg_match_all($imgPattern, $detailText, $matches)
&& !empty($matches[0])
&& !empty($matches[0][0])
)
{
if (
$diskPicturePosition === false
|| mb_strpos($detailTextInOneString, $matches[0][0]) < $diskPicturePosition
)
{
$picture = [
'alt' => '',
'src' => $matches[1][0]
];
}
}
$parser = new blogTextParser(false, $pathToSmile, []);
$parser->LAZYLOAD = "N";
$postFields = $USER_FIELD_MANAGER->getUserFields("BLOG_POST", $row['ID'], LANGUAGE_ID);
if (!empty($postFields["UF_BLOG_POST_FILE"]))
{
$parser->arUserfields = array("UF_BLOG_POST_FILE" => array_merge($postFields["UF_BLOG_POST_FILE"], ["TAG" => "DOCUMENT ID"]));
}
$clearedText = $detailText;
$clearedText = preg_replace(
[ $imgPattern, $videoPattern ],
'',
$clearedText
);
$clearedText = preg_replace(
'/[URL(.*?)]([^]s]{20,})[/URL]/is'.BX_UTF_PCRE_MODIFIER,
'',
$clearedText
);
$clearedText = preg_replace(
'/[URL(.*?)]((?:[^]s]{1,19}s+)+)[/URL]/is'.BX_UTF_PCRE_MODIFIER,
'\2',
$clearedText
);
$clearedText = preg_replace(
'/[URL(.*?)]((?:[^]s]{1,19}s+)+)[/URL]/is'.BX_UTF_PCRE_MODIFIER,
'\2',
$clearedText
);
$clearedText = blogTextParser::killAllTags($clearedText);
$title = (
$row["MICRO"] == "Y"
? truncateText($clearedText, 100)
: htmlspecialcharsEx($row["TITLE"])
);
$authorAvatar = '';
$authorName = '';
if (intval($row['AUTHOR_AVATAR']) > 0)
{
$fileRes = FileTable::getById(intval($row['AUTHOR_AVATAR']));
if ($fileFields = $fileRes->fetch())
{
$authorAvatar = [
'alt' => '',
'src' => CFile::getFileSrc($fileFields)
];
}
}
if (intval($row['AUTHOR_ID']) > 0)
{
$authorName = CUser::formatName(CSite::getNameFormat(), [
"NAME" => $row["AUTHOR_NAME"],
"LAST_NAME" => $row["AUTHOR_LAST_NAME"],
"SECOND_NAME" => $row["AUTHOR_SECOND_NAME"],
"LOGIN" => $row["AUTHOR_LOGIN"],
"NAME_LIST_FORMATTED" => "",
]);
}
if ($row['DATE_PUBLISH'] instanceof BitrixMainTypeDateTime)
{
$logDate = $row['DATE_PUBLISH']->format(BitrixMainTypeDate::getFormat());
}
$result[] = [
'ID' => $row['ID'],
'TITLE' => $title,
'PREVIEW_TEXT' => truncateText($clearedText, 255),
'DETAIL_TEXT' => $parser->convert($detailText, false, [], $allow, $parserParams),
'PICTURE' => $picture,
'AUTHOR_AVATAR' => $authorAvatar,
'AUTHOR_NAME_FORMATTED' => $authorName,
'LOG_DATE' => $logDate,
];
}
if (!empty($result))
{
usort($result, function($a, $b) use ($blogPostIdList) {
$keyA = array_search($a['ID'], $blogPostIdList);
$keyB = array_search($b['ID'], $blogPostIdList);
return ($keyA > $keyB) ? +1 : -1;
});
}
}
return $result;
}