static function SetSettings($settings = [], $clearOptions = false)
{
$arPathes = self::GetPathesList();
$optionNames = [
'work_time_start',
'work_time_end',
'year_holidays',
'year_workdays',
'week_holidays',
'week_start',
'user_name_template',
'sync_by_push',
'user_show_login',
'rm_iblock_type',
'rm_iblock_id',
'denied_superpose_types',
'pathes_for_sites',
'pathes',
'dep_manager_sub',
'forum_id',
'rm_for_sites',
];
$optionNames = array_merge($optionNames, $arPathes);
if (isset($settings['rm_iblock_ids']) && !$settings['rm_for_sites'])
{
foreach($settings['rm_iblock_ids'] as $site => $value)
{
COption::SetOptionString("calendar", 'rm_iblock_id', $value, false, $site);
}
}
foreach($optionNames as $opt)
{
if ($clearOptions)
{
COption::RemoveOption("calendar", $opt);
}
else if (isset($settings[$opt]))
{
if ($opt === 'rm_iblock_id' && !$settings['rm_for_sites'])
{
continue;
}
if ($opt === 'sync_by_push')
{
if (self::isOffice365ApiEnabled() || self::isGoogleApiEnabled())
{
CAgent::RemoveAgent("\Bitrix\Calendar\Sync\Managers\DataExchangeManager::importAgent();", 'calendar');
CAgent::RemoveAgent("\Bitrix\Calendar\Sync\Managers\PushWatchingManager::renewWatchChannels();", 'calendar');
if ($settings[$opt])
{
// legacy
CAgent::RemoveAgent(
"\Bitrix\Calendar\Sync\GoogleApiPush::clearPushChannels();",
"calendar"
);
// actual
CAgent::AddAgent(
"\Bitrix\Calendar\Sync\Managers\PushWatchingManager::renewWatchChannels();",
'calendar',
'N',
3600
);
}
else
{
global $DB;
// legacy
CAgent::RemoveAgent("\Bitrix\Calendar\Sync\GoogleApiPush::processPush();", "calendar");
CAgent::RemoveAgent("\Bitrix\Calendar\Sync\GoogleApiPush::renewWatchChannels();", "calendar");
$DB->Query("DELETE FROM b_agent WHERE `NAME` LIKE '%GoogleApiPush::checkPushChannel%'");
// actual
CAgent::AddAgent(
"\Bitrix\Calendar\Sync\Managers\DataExchangeManager::importAgent();",
'calendar',
'N',
180
);
}
}
}
if ($opt === 'pathes' && is_array($settings[$opt]))
{
$sitesPathes = $settings[$opt];
$ar = [];
$arAffectedSites = [];
foreach($sitesPathes as $s => $pathes)
{
$affect = false;
foreach($arPathes as $path)
{
if ($pathes[$path] != $settings[$path])
{
$ar[$path] = $pathes[$path] ?? $settings[$path];
$affect = true;
}
}
if ($affect && !in_array($s, $arAffectedSites))
{
$arAffectedSites[] = $s;
COption::SetOptionString("calendar", 'pathes_'.$s, serialize($ar));
}
else
{
COption::RemoveOption("calendar", 'pathes_'.$s);
}
}
COption::SetOptionString("calendar", 'pathes_sites', serialize($arAffectedSites));
continue;
}
else if ($opt === 'denied_superpose_types' && is_array($settings[$opt]))
{
$settings[$opt] = serialize($settings[$opt]);
}
else if ($opt === 'week_holidays' && is_array($settings[$opt]))
{
$settings[$opt] = implode(
'|',
array_intersect(array_unique($settings[$opt]), ['SU','MO','TU','WE','TH','FR','SA'])
);
}
COption::SetOptionString("calendar", $opt, $settings[$opt]);
}
}
}