- Модуль: 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;
}
}
}
}