• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/checklist/internals/checklist.php
  • Класс: BitrixTasksCheckListInternalsCheckList
  • Вызов: CheckList::updateMembers
private function updateMembers($oldMembers, $newMembers)
{
	$id = $this->fields->getId();
	$oldTableMembers = [];
	/** @var DataManager $memberDataController */
	$memberDataController = $this->checkListMemberDataController;

	foreach ($oldMembers as $userId => $data)
	{
		$oldMembers[$userId] = $data['TYPE'];
	}

	foreach ($newMembers as $userId => $data)
	{
		$newMembers[$userId] = $data['TYPE'];
	}

	$toDelete = array_diff_assoc($oldMembers, $newMembers);
	$toCreate = array_diff_assoc($newMembers, $oldMembers);
	$toChange = array_intersect_key($toCreate, $toDelete);

	foreach (array_keys($toChange) as $userId)
	{
		unset($toDelete[$userId], $toCreate[$userId]);
	}

	if (!empty($toDelete) || !empty($toChange))
	{
		$oldTableMembers = $memberDataController::getList([
			'select' => ['ID', 'USER_ID', 'TYPE'],
			'filter' => ['ITEM_ID' => $id],
		])->fetchAll();
	}

	foreach ($toDelete as $userId => $type)
	{
		foreach ($oldTableMembers as $key => $member)
		{
			if ($member['USER_ID'] == $userId && $member['TYPE'] === $type)
			{
				$memberDataController::delete($member['ID']);
				unset($oldTableMembers[$key]);
				break;
			}
		}
	}

	foreach ($toCreate as $userId => $type)
	{
		$memberDataController::add(['ITEM_ID' => $id, 'USER_ID' => $userId, 'TYPE' => $type]);
	}

	foreach ($toChange as $userId => $type)
	{
		foreach ($oldTableMembers as $key => $member)
		{
			if ($member['USER_ID'] == $userId && $member['TYPE'] === $oldMembers[$userId])
			{
				$memberDataController::update($member['ID'], ['TYPE' => $type]);
				unset($oldTableMembers[$key]);
				break;
			}
		}
	}
}