Skip to content

Instantly share code, notes, and snippets.

@gromdron
Created November 6, 2020 10:41
Show Gist options
  • Select an option

  • Save gromdron/557c1f3c8b4a086f4e6de362568d55c7 to your computer and use it in GitHub Desktop.

Select an option

Save gromdron/557c1f3c8b4a086f4e6de362568d55c7 to your computer and use it in GitHub Desktop.
Bitrix24: Add grat to user
<?php
/**
* This script can help to add grat to user
* @author Andrei Nikolaev <[email protected]>
*/
use \Bitrix\Main;
use \Bitrix\Iblock;
use \Bitrix\Socialnetwork;
use \Bitrix\Blog;
use \Bitrix\Socialnetwork\ComponentHelper;
global $APPLICATION;
global $CACHE_MANAGER;
$arParams = [
/**
* Чем наградить?
* @see iblock enum property GRATITUDE XML_ID
* @var string
*/
'REWARD' => 'cup',
/**
* Текст который нужно писать в сообщении
* @var string
*/
'REWARD_TEXT' => 'Чемпионам!',
/**
* ID пользователя кого награждают
* @var integer
*/
'REWARD_TARGET' => 3,
/**
* ID пользователя кто награждает
*/
'REWARD_FROM_USER_ID' => 1,
/**
* ID группы блогов для соц.сетей
* @var integer
*/
'GROUP_ID' => 1,
/**
* Идентификатор сайта
* @var string
*/
'SITE_ID' => SITE_ID,
/**
* Other bitrix params
*/
/**
* Path to blog
* @var string
*/
"PATH_TO_BLOG" => '/company/personal/user/#user_id#/blog/',
/**
* Path to socnet post
* @var string
*/
'PATH_TO_POST' => '/company/personal/user/#user_id#/blog/#post_id#/',
];
try
{
$requiredModules = [
'socialnetwork',
'blog',
'intranet',
'iblock',
'pull',
];
foreach ($requiredModules as $module)
{
if ( !Main\Loader::IncludeModule($module) )
{
throw new \Exception("Module {$module} not included");
}
}
unset($requiredModules);
unset($module);
/**
* Ищем благодарность которую хотим выдать
*/
$gratIblock = Iblock\IblockTable::getRow([
'select' => ['ID'],
'filter' => [
'=CODE' => 'honour'
]
]);
if ( !$gratIblock )
{
throw new \Exception("Grat iblock not founc");
}
$rsIBlockPropertyEnum = \CIBlockPropertyEnum::GetList(
array(
"SORT" => "ASC",
"XML_ID" => "ASC"
),
[
"CODE" => 'GRATITUDE',
"IBLOCK_ID" => $gratIblock['ID'],
'XML_ID' => $arParams['REWARD'],
]
);
if ( ! ($arGratFromPOST = $rsIBlockPropertyEnum->Fetch()))
{
throw new Exception("Reward with XML ID: {$arParams['REWARD']} not found ");
}
/**
* Проверяем существование блога для пользователя
*/
$arBlog = \Bitrix\Blog\Item\Blog::getByUser([
"SITE_ID" => $arParams["SITE_ID"],
"USER_ID" => $arParams["REWARD_FROM_USER_ID"],
"USE_SOCNET" => "Y",
"GROUP_ID" => $arParams['GROUP_ID'],
]);
/**
* Блога нет (не писал еще сообщений)
* Нужно сделать
*/
if ( empty($arBlog) )
{
$arBlog = ComponentHelper::createUserBlog([
"BLOG_GROUP_ID" => $arParams["GROUP_ID"],
"USER_ID" => $arParams["REWARD_TARGET"],
"SITE_ID" => $arParams["SITE_ID"],
"PATH_TO_BLOG" => $arParams["PATH_TO_BLOG"]
]);
if ( !$arBlog )
{
throw new Exception("Unable to create blog: ".$APPLICATION->LAST_ERROR);
}
}
/**
* Готовим пост в соц. сеть
*/
$arFields = [
'TITLE' => $arParams['REWARD_TEXT'],
"DETAIL_TEXT" => $arParams['REWARD_TEXT'],
"DETAIL_TEXT_TYPE" => "text",
"PUBLISH_STATUS" => BLOG_PUBLISH_STATUS_PUBLISH,
"URL" => $arBlog["URL"],
'MICRO' => 'Y',
"PATH" => CComponentEngine::MakePathFromTemplate(
htmlspecialcharsBack($arParams["PATH_TO_POST"]),
[
"post_id" => "#post_id#",
"user_id" => $arBlog["OWNER_ID"]
]
),
'PERMS_POST' => [],
'PERMS_COMMENT' => [],
'CATEGORY_ID' => [],
'SOCNET_RIGHTS' => [],
];
$resultFields = [
'ERROR_MESSAGE' => false,
'PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH
];
$arFields["SOCNET_RIGHTS"] = ComponentHelper::convertBlogPostPermToDestinationList(
[
'POST_ID' => 0,
'PERM' => [
'UA' => ['UA']
],
'IS_REST' => false,
'IS_EXTRANET_USER' => false,
'AUTHOR_ID' => $arParams['REWARD_FROM_USER_ID']
],
$resultFields
);
if ( mb_strlen($resultFields['ERROR_MESSAGE'])>0 )
{
throw new \Exception("Socnet perm convert error: ".$resultFields['ERROR_MESSAGE']);
}
unset($resultFields);
$arFields["=DATE_CREATE"] = 'NOW()';
$arFields["AUTHOR_ID"] = $arParams['REWARD_FROM_USER_ID'];
$arFields["BLOG_ID"] = $arBlog["ID"];
$newID = \CBlogPost::Add($arFields);
if( intval($newID) < 1 )
{
throw new \Exception("Error when create blog post: ".$APPLICATION->LAST_ERROR);
}
$arFields["ID"] = $newID;
$el = new \CIBlockElement();
$new_grat_element_id = $el->Add(
array(
"IBLOCK_ID" => $gratIblock['ID'],
"DATE_ACTIVE_FROM" => ConvertTimeStamp(false, "FULL"),
"NAME" => $arGratFromPOST["VALUE"]
),
false,
false
);
if ( $new_grat_element_id === false )
{
throw new \Exception("Error when grat add: ".$el->LAST_ERROR);
}
\CIBlockElement::SetPropertyValuesEx(
$new_grat_element_id,
$gratIblock['ID'],
array(
"USERS" => [
$arParams['REWARD_TARGET']
],
"GRATITUDE" => [
"VALUE" => $arGratFromPOST["ID"]
]
)
);
if ( defined("BX_COMP_MANAGED_CACHE") )
{
$CACHE_MANAGER->clearByTag("BLOG_POST_GRATITUDE_TO_USER_".$arParams['REWARD_TARGET']);
}
\CBlogPost::Update($newID, array(
"DETAIL_TEXT_TYPE" => "text",
"UF_GRATITUDE" => $new_grat_element_id
));
$arFieldsHave = array(
"HAS_IMAGES" => 'N',
"HAS_TAGS" => 'N',
"HAS_PROPS" => 'Y',
"HAS_SOCNET_ALL" => 'Y',
);
\CBlogPost::Update($newID, $arFieldsHave, false);
$logId = (int) CBlogPost::Notify(
$arFields,
$arBlog,
[
"bSoNet" => true,
"UserID" => $arParams['REWARD_FROM_USER_ID'],
"user_id" => $arParams["REWARD_TARGET"],
'SITE_ID' => $arParams['SITE_ID'],
]
);
if ( empty($logId) )
{
$blogPostLivefeedProvider = new Socialnetwork\Livefeed\BlogPost;
$logFields = Socialnetwork\LogTable::getRow([
'select' => ['ID'],
'filter' => [
'=EVENT_ID' => $blogPostLivefeedProvider->getEventId(),
'=SOURCE_ID' => $newID
],
]);
if ( $logFields )
{
$logId = $logFields['ID'];
}
}
if ( empty($logId) )
{
throw new \Exception("Error when blog post notify: ".$APPLICATION->LAST_ERROR);
}
$logFields = [
"EVENT_ID" => Blog\Integration\Socialnetwork\Log::EVENT_ID_POST_GRAT
];
if ( $post = Blog\Item\Post::getById($newID) )
{
$logFields["TAG"] = $post->getTags();
}
CSocNetLog::Update($logId, $logFields);
$postUrl = \CComponentEngine::MakePathFromTemplate(
htmlspecialcharsBack($arParams["PATH_TO_POST"]),
[
"post_id" => $newID,
"user_id" => $arBlog["OWNER_ID"]
]
);
BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
'TYPE' => 'posts_last',
'SITE_ID' => $arParams["SITE_ID"]
]));
BXClearCache(true, ComponentHelper::getBlogPostCacheDir([
'TYPE' => 'posts_last_blog',
'SITE_ID' => $arParams["SITE_ID"]
]));
ComponentHelper::notifyBlogPostCreated([
'post' => [
'ID' => $arFields['ID'],
'TITLE' => $arFields["TITLE"],
'AUTHOR_ID' => $arParams["REWARD_TARGET"]
],
'siteId' => $arParams['SITE_ID'],
'postUrl' => $postUrl,
'socnetRights' => $arFields["SOCNET_RIGHTS"],
'socnetRightsOld' => [
"U" => []
],
'mentionListOld' => [],
'mentionList' => [],
'gratData' => [
'TYPE' => $arParams['REWARD'],
'USERS' => [
'U'.$arParams['REWARD_TARGET']
]
]
]);
/**
* Отправляем пуш уведомления о добавлении
* сообщения в живую ленту
*/
\Bitrix\Pull\Event::send();
}
catch( Throwable $e )
{
var_dump( $e->getMessage() );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment