Сделал следующим образом (может конечно и костыльным, но работает):
1) в init.php добавил js с подпиской на событие открытия SidePanel. Отбираю только страницу создания задачи из CRM. Читаю cookie с заранее положенными туда данными и подменяю url:
Код |
---|
\Bitrix\Main\Page\Asset::getInstance()->addString(
'<sc ript>
BX.ready(function() {
BX.addCustomEvent(
"SidePanel.Slider:onOpen",
function(event) {
var url = event.getSlider().url;
if(url.indexOf("/task/") != -1 && url.indexOf("TITLE=CRM") != -1) {
title=BX.getCookie("BITRIX_SM_CRMDataForTask_Title");
if(title === undefined) {title="";}
crm=BX.getCookie("BITRIX_SM_CRMDataForTask_CRM");
tags=BX.getCookie("BITRIX_SM_CRMDataForTask_Tags");
var pattern = /\?UF_CRM_TASK=.*&TITLE=CRM%3A%20.*/ig;
event.getSlider().url = encodeURI(url.replace(pattern, `?UF_CRM_TASK=${crm}&TITLE=${title}&TAGS=${tags}`));
}
}
);
});
</sc ript>'
);
|
2) там же, в init.php, подписался на событие, где отфильтровываю только страницы с данными сделки. Вытягиваю необходимые данные и кладу в cookie:
Код |
---|
$eventManager = Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('main', 'OnEndBufferContent', 'iff_setDataForTask');
function iff_setDataForTask() {
$engine = new \CComponentEngine();
$page = $engine->guessComponentPath(
'/crm/deal/details/',
['detail' => '#deal_id#/'],
$variables
);
if($page !== 'detail') {
return;
}
$companyId = iff_getCompanyIdByDealId($variables['deal_id']);
$contacts = iff_getContactsIdByCompanyId($companyId);
$crm = 'D_'. $variables['deal_id'] .';CO_' . $companyId .';';
foreach ($contacts as &$contactId) {
$crm .= 'C_'. $contactId .';';
}
iff_setCookie('CRMDataForTask_Title', iff_getCompanyTitleById($companyId), time()+60*60*24);
iff_setCookie('CRMDataForTask_CRM', rtrim($crm, ';'), time()+60*60*24);
iff_setCookie('CRMDataForTask_Tags', 'CRM', time()+60*60*24);
}
function iff_getCompanyIdByDealId($dealId) {
$arFilter = array('ID'=>$dealId, 'CHECK_PERMISSIONS'=>'N');
$arSelect = array('COMPANY_ID');
$res = CCrmDeal::GetList(Array(), $arFilter, $arSelect);
$companyId = null;
if($aRow = $res->Fetch()){
$companyId = $aRow['COMPANY_ID'];
}
return $companyId;
}
function iff_getCompanyTitleById($companyId) {
$arFilter = array('ID'=>$companyId, 'CHECK_PERMISSIONS'=>'N');
$arSelect = array('TITLE');
$res = CCrmCompany::GetList(Array(), $arFilter, $arSelect);
$title = '';
if($aRow = $res->Fetch()){
$title = $aRow['TITLE'];
}
return $title;
}
function iff_getContactsIdByCompanyId($companyId) {
$res = CCrmContact::GetContactByCompanyId($companyId);
$contacts = array();
while($aRow = $res->Fetch()) {
$contacts[] = $aRow['ID'];
}
return $contacts;
}
function iff_setCookie($name, $value, $expires) {
$cookie = new \Bitrix\Main\Web\Cookie($name, $value, $expires);
$cookie->setDomain('site.com');
$cookie->setPath('/');
$cookie->setSecure(true);
$cookie->setHttpOnly(false);
\Bitrix\Main\Application::getInstance()->getContext()->getResponse()->addCookie($cookie);
} |
Если бросается в глаза что-то, что может "сделать нехорошо", то сообщите, ибо достаточно далек я от web-разработки))