• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/controller/calendarajax.php
  • Класс: BitrixCalendarControllerCalendarAjax
  • Вызов: CalendarAjax::editCalendarSectionAction
public function editCalendarSectionAction()
{
	if (Loader::includeModule('intranet') && !BitrixIntranetUtil::isIntranetUser())
	{
		return [];
	}

	$request = $this->getRequest();
	$response = [];

	$id = $request->getPost('id');
	$isNew = (!isset($id) || !$id);
	$type = $request->getPost('type');
	$ownerId = (int)$request->getPost('ownerId');
	$name = trim($request->getPost('name'));
	$color = $request->getPost('color');
	$customization = $request->getPost('customization') === 'Y';
	$userId = CCalendar::GetUserId();
	$isPersonal = $type === 'user' && $ownerId === $userId;

	if ($id === 'tasks')
	{
		$id .= $ownerId;
	}

	$fields = [
		'ID' => $id,
		'NAME' => $name,
		'COLOR' => $color,
		'CAL_TYPE' => $type,
		'OWNER_ID' => $ownerId,
		'ACCESS' => $request->getPost('access'),
		'EXTERNAL_TYPE' => $request->getPost('external_type') ?? 'local',
	];

	if ($customization && !$isNew)
	{
		UserSettings::setSectionCustomization($userId, [$id => ['name' => $name, 'color' => $color]]);
	}
	else
	{
		if (Loader::includeModule('extranet') && !CExtranet::IsIntranetUser(SITE_ID, $userId))
		{
			if (
				$type === 'group'
				&& Loader::includeModule('socialnetwork')
			)
			{
				$r = BitrixSocialnetworkUserToGroupTable::getList([
					'filter' => [
						'@ROLE' => BitrixSocialnetworkUserToGroupTable::getRolesMember(),
						'=GROUP_ID' => $ownerId,
						'=USER_ID' => $userId,
					],
				]);

				if (!$group = $r->fetch())
				{
					$this->addError(
						new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'access_denied_extranet_01')
					);
				}
			}
			else
			{
				$this->addError(
					new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'access_denied_extranet_02')
				);
			}
		}

		$accessController = new SectionAccessController($userId);

		if ($isNew) // For new sections
		{
			$sectionModel =
				SectionModel::createNew()
					->setType($type ?? '')
					->setOwnerId($userId ?? 0);
			if (!$accessController->check(ActionDictionary::ACTION_SECTION_ADD, $sectionModel))
			{
				$this->addError(
					new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'access_denied')
				);
			}

			if ($type === 'group' && Loader::includeModule('socialnetwork'))
			{
				$result = BitrixSocialnetworkUserToGroupTable::getList([
					'filter' => [
						'@ROLE' => BitrixSocialnetworkUserToGroupTable::getRolesMember(),
						'=GROUP_ID' => $ownerId,
						'=USER_ID' => $userId,
					],
				]);

				$group = $result->fetch();
				if (!$group)
				{
					$this->addError(
						new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'access_denied_user')
					);
				}
			}

			$fields['IS_EXCHANGE'] = $request->getPost('is_exchange') === 'Y';
		}
		else
		{
			$section = CCalendarSect::GetById($id);
			$sectionModel = SectionModel::createFromArray($section);

			if (
				!$section
				|| !$accessController->check(ActionDictionary::ACTION_SECTION_EDIT, $sectionModel, [])

			)
			{
				$this->addError(
					new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'access_denied_04')
				);
			}

			$fields['CAL_TYPE'] = $section['CAL_TYPE'];
			$fields['OWNER_ID'] = $section['OWNER_ID'];
		}

		if (empty($this->getErrors()))
		{
			$id = CCalendar::SaveSection(['arFields' => $fields]);
			if ((int)$id > 0)
			{
				CCalendarSect::SetClearOperationCache(true);
				$response['section'] = CCalendarSect::GetById($id, true, true);
				if (!$response['section'])
				{
					$this->addError(
						new Error(Loc::getMessage('EC_CALENDAR_SAVE_ERROR'), 'saving_error_05')
					);
				}
				$response['accessNames'] = CCalendar::GetAccessNames();

				$response['sectionList'] = CCalendarSect::prepareSectionListResponse($type, $ownerId);
			}
			else
			{
				$this->addError(
					new Error(Loc::getMessage('EC_CALENDAR_SAVE_ERROR'), 'saving_error_06')
				);
			}
		}
	}

	return $response;
}