echo $arResult["TASK"]["GROUP_ID"]; ?> , this)"></span><?php } else { echo GetMessage("TASKS_GROUP_ADD"); ?> </a><?php } ?> </span></div> <input id="task-detail-selected-group-id" type="hidden" value="<?php echo (int) $arResult["TASK"]["GROUP_ID"]; ?> "> <?php } elseif ($arResult["TASK"]["GROUP_ID"] && CSocNetGroup::CanUserViewGroup($USER->GetID(), $arResult["TASK"]["GROUP_ID"])) { ?> <div class="task-detail-group"><span class="task-detail-group-label"><?php echo GetMessage("TASKS_TASK_GROUP"); ?> :</span><span class="task-detail-group-name"><a href="<?php echo CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_GROUP"], array("group_id" => $arResult["TASK"]["GROUP_ID"])); ?> " class="task-detail-group-link" target="_top"><?php echo $arResult["GROUPS"][$arResult["TASK"]["GROUP_ID"]]['NAME']; ?> </a></span></div> <?php } ?>
} } } if (!empty($arTasksIds)) { $arTasksIds = array_unique(array_filter($arTasksIds)); if (!empty($arTasksIds)) { $rsTasks = CTasks::GetList(array('ID' => 'ASC'), array('ID' => $arTasksIds), array('ID', 'TITLE')); while ($arTask = $rsTasks->getNext()) { $arTask['URL'] = CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_TASKS_TASK'], array('task_id' => $arTask['ID'], 'action' => 'view')); $arResult['TASKS_DATA'][$arTask['ID']] = $arTask; } } } } // check out which sections we need to show $arResult['DISPLAY_BLOCKS'] = array('CONNECTED_ENTITIES' => false, 'PROPERTIES' => false); if (!empty($arResult["TASK"]["TAGS"]) || $arResult["TASK"]["GROUP_ID"] && CSocNetGroup::CanUserViewGroup($USER->GetID(), $arResult["TASK"]["GROUP_ID"]) || intval($arResult["TASK"]["BASE_TEMPLATE_ID"]) || intval($arResult["TASK"]["PARENT_ID"])) { $arResult['DISPLAY_BLOCKS']['CONNECTED_ENTITIES'] = true; } if (is_array($arResult["USER_FIELDS"]) && !empty($arResult["USER_FIELDS"])) { foreach ($arResult["USER_FIELDS"] as $fld) { if (!empty($fld['VALUE'])) { if ($arUserField['FIELD_NAME'] == 'UF_TASK_WEBDAV_FILES') { $arResult['DISPLAY_BLOCKS']['CONNECTED_ENTITIES'] = true; } else { $arResult['DISPLAY_BLOCKS']['PROPERTIES'] = true; } // other user fields at "PROPERTIES" } } }
private static function checkUserCanViewGroup($userId, $groupId) { if (!CModule::IncludeModule('socialnetwork')) { return false; } if (!isset(self::$cache['GROUP_ACCESS'][$groupId][$userId]) || !self::$cacheData) { self::$cache['GROUP_ACCESS'][$groupId][$userId] = CSocNetGroup::CanUserViewGroup($userId, $groupId); } return self::$cache['GROUP_ACCESS'][$groupId][$userId]; }
} break; case 'AUDITORS': case 'ACCOMPLICES': if ($record['FROM_VALUE']) { $arUsersIds = array_merge($arUsersIds, explode(',', $record['FROM_VALUE'])); } if ($record['TO_VALUE']) { $arUsersIds = array_merge($arUsersIds, explode(',', $record['TO_VALUE'])); } break; case 'GROUP_ID': if ($record['FROM_VALUE'] && !isset($arGroupsIds[(int) $record['FROM_VALUE']]) && CSocNetGroup::CanUserViewGroup($loggedInUserId, $record['FROM_VALUE'])) { $arGroupsIds[$record['FROM_VALUE']] = (int) $record['FROM_VALUE']; } if ($record['TO_VALUE'] && !isset($arGroupsIds[(int) $record['TO_VALUE']]) && CSocNetGroup::CanUserViewGroup($loggedInUserId, $record['TO_VALUE'])) { $arGroupsIds[$record['FROM_VALUE']] = (int) $record['TO_VALUE']; } break; case 'PARENT_ID': if ($record['FROM_VALUE']) { $arTasksIds[] = (int) $record['FROM_VALUE']; } if ($record['TO_VALUE']) { $arTasksIds[] = (int) $record['TO_VALUE']; } break; case 'DEPENDS_ON': if ($record['FROM_VALUE']) { $arTasksIds = array_merge($arTasksIds, explode(',', $record['FROM_VALUE'])); }
case "TIME_ESTIMATE": if ($arResult["TASKS"][$i][$field]) { $arResult["TASKS"][$i][$field] = sprintf('%02d:%02d:%02d', floor($arResult["TASKS"][$i][$field] / 3600), floor($arResult["TASKS"][$i][$field] / 60) % 60, $arResult["TASKS"][$i][$field] % 60); } else { $arResult["TASKS"][$i][$field] = ""; } break; case "TIME_SPENT_IN_LOGS": if ($arResult["TASKS"][$i][$field]) { $arResult["TASKS"][$i][$field] = sprintf('%02d:%02d:%02d', floor($arResult["TASKS"][$i][$field] / 3600), floor($arResult["TASKS"][$i][$field] / 60) % 60, $arResult["TASKS"][$i][$field] % 60); } else { $arResult["TASKS"][$i][$field] = ""; } break; case "GROUP_ID": if ($arResult["TASKS"][$i][$field] && CSocNetGroup::CanUserViewGroup($USER->GetID(), $arResult["TASKS"][$i][$field])) { $arGroup = CSocNetGroup::GetByID($arResult["TASKS"][$i][$field]); if ($arGroup) { $arResult["TASKS"][$i][$field] = $arGroup["NAME"]; } } if (!$arResult["TASKS"][$i][$field]) { $arResult["TASKS"][$i][$field] = ""; } default: break; } echo '<td>' . $arResult["TASKS"][$i][$field] . '</td>'; } ?> </tr>
public static function SendUpdateMessage($arFields, $arTask, $bSpawnedByAgent = false) { global $USER; $isBbCodeDescription = true; if (isset($arFields['DESCRIPTION_IN_BBCODE'])) { if ($arFields['DESCRIPTION_IN_BBCODE'] === 'N') { $isBbCodeDescription = false; } } elseif (isset($arTask['DESCRIPTION_IN_BBCODE'])) { if ($arTask['DESCRIPTION_IN_BBCODE'] === 'N') { $isBbCodeDescription = false; } } $taskReassignedTo = null; if (isset($arFields['RESPONSIBLE_ID']) && $arFields['RESPONSIBLE_ID'] > 0 && $arFields['RESPONSIBLE_ID'] != $arTask['RESPONSIBLE_ID']) { $taskReassignedTo = $arFields['RESPONSIBLE_ID']; } foreach (array('CREATED_BY', 'RESPONSIBLE_ID', 'ACCOMPLICES', 'AUDITORS', 'TITLE') as $field) { if (!isset($arFields[$field]) && isset($arTask[$field])) { $arFields[$field] = $arTask[$field]; } } $arChanges = CTaskLog::GetChanges($arTask, $arFields); $arMerged = array('ADDITIONAL_RECIPIENTS' => array()); if (isset($arTask['CREATED_BY'])) { $arMerged['ADDITIONAL_RECIPIENTS'][] = $arTask['CREATED_BY']; } if (isset($arTask['RESPONSIBLE_ID'])) { $arMerged['ADDITIONAL_RECIPIENTS'][] = $arTask['RESPONSIBLE_ID']; } if (isset($arTask['ACCOMPLICES']) && is_array($arTask['ACCOMPLICES'])) { foreach ($arTask['ACCOMPLICES'] as $userId) { $arMerged['ADDITIONAL_RECIPIENTS'][] = $userId; } } if (isset($arTask['AUDITORS']) && is_array($arTask['AUDITORS'])) { foreach ($arTask['AUDITORS'] as $userId) { $arMerged['ADDITIONAL_RECIPIENTS'][] = $userId; } } if (isset($arFields['ADDITIONAL_RECIPIENTS'])) { $arFields['ADDITIONAL_RECIPIENTS'] = array_merge($arFields['ADDITIONAL_RECIPIENTS'], $arMerged['ADDITIONAL_RECIPIENTS']); } else { $arFields['ADDITIONAL_RECIPIENTS'] = $arMerged['ADDITIONAL_RECIPIENTS']; } $arUsers = CTaskNotifications::__GetUsers($arFields); $arRecipientsIDs = array_unique(CTaskNotifications::GetRecipientsIDs($arFields)); if (!empty($arRecipientsIDs) && (is_object($USER) && $USER->GetID() || $arFields["CREATED_BY"])) { $curUserTzOffset = (int) CTasksTools::getTimeZoneOffset(); $arInvariantChangesStrs = array(); $arVolatileDescriptions = array(); $arRecipientsIDsByTimezone = array(); $i = 0; foreach ($arChanges as $key => $value) { ++$i; $actionMessage = GetMessage("TASKS_MESSAGE_" . $key); if (strlen($actionMessage)) { $tmpStr = $actionMessage . ": [COLOR=#000]"; switch ($key) { case 'TIME_ESTIMATE': $tmpStr .= self::formatTimeHHMM($value["FROM_VALUE"], true) . " -> " . self::formatTimeHHMM($value["TO_VALUE"], true); break; case "TITLE": $tmpStr .= $value["FROM_VALUE"] . " -> " . $value["TO_VALUE"]; break; case "RESPONSIBLE_ID": $tmpStr .= CTaskNotifications::__Users2String($value["FROM_VALUE"], $arUsers, $arFields["NAME_TEMPLATE"]) . ' -> ' . CTaskNotifications::__Users2String($value["TO_VALUE"], $arUsers, $arFields["NAME_TEMPLATE"]); break; case "ACCOMPLICES": case "AUDITORS": $tmpStr .= CTaskNotifications::__Users2String(explode(",", $value["FROM_VALUE"]), $arUsers, $arFields["NAME_TEMPLATE"]) . ' -> ' . CTaskNotifications::__Users2String(explode(",", $value["TO_VALUE"]), $arUsers, $arFields["NAME_TEMPLATE"]); break; case "DEADLINE": case "START_DATE_PLAN": case "END_DATE_PLAN": // CTasks::Log() returns bitrix timestamps for dates, so adjust them to correct unix timestamps. $utsFromValue = $value['FROM_VALUE'] - $curUserTzOffset; $utsToValue = $value['TO_VALUE'] - $curUserTzOffset; // It will be replaced below to formatted string with correct dates for different timezones $placeholder = '###PLACEHOLDER###' . $i . '###'; $tmpStr .= $placeholder; // Collect recipients' timezones foreach ($arRecipientsIDs as $userId) { $tzOffset = (int) CTasksTools::getTimeZoneOffset($userId); if (!isset($arVolatileDescriptions[$tzOffset])) { $arVolatileDescriptions[$tzOffset] = array(); } if (!isset($arVolatileDescriptions[$tzOffset][$placeholder])) { // Make bitrix timestamps for given user $bitrixTsFromValue = $utsFromValue + $tzOffset; $bitrixTsToValue = $utsToValue + $tzOffset; $description = ''; if ($utsFromValue > 360000) { $fromValueAsString = FormatDate('^' . CDatabase::DateFormatToPHP(FORMAT_DATETIME), $bitrixTsFromValue); $description .= $fromValueAsString; } $description .= ' --> '; if ($utsToValue > 360000) { $toValueAsString = FormatDate('^' . CDatabase::DateFormatToPHP(FORMAT_DATETIME), $bitrixTsToValue); $description .= $toValueAsString; } $arVolatileDescriptions[$tzOffset][$placeholder] = $description; } $arRecipientsIDsByTimezone[$tzOffset][] = $userId; } break; case "DESCRIPTION": $tmpStr .= HTMLToTxt($arFields["DESCRIPTION"]); break; case "TAGS": $tmpStr .= ($value["FROM_VALUE"] ? str_replace(",", ", ", $value["FROM_VALUE"]) . " -> " : "") . ($value["TO_VALUE"] ? str_replace(",", ", ", $value["TO_VALUE"]) : GetMessage("TASKS_MESSAGE_NO_VALUE")); break; case "PRIORITY": $tmpStr .= GetMessage("TASKS_PRIORITY_" . $value["FROM_VALUE"]) . " -> " . GetMessage("TASKS_PRIORITY_" . $value["TO_VALUE"]); break; case "GROUP_ID": if ($value["FROM_VALUE"] && CSocNetGroup::CanUserViewGroup($USER->GetID(), $value["FROM_VALUE"])) { $arGroupFrom = CSocNetGroup::GetByID($value["FROM_VALUE"]); if ($arGroupFrom) { $tmpStr .= $arGroupFrom["NAME"] . " -> "; } } if ($value["TO_VALUE"] && CSocNetGroup::CanUserViewGroup($USER->GetID(), $value["TO_VALUE"])) { $arGroupTo = CSocNetGroup::GetByID($value["TO_VALUE"]); if ($arGroupTo) { $tmpStr .= $arGroupTo["NAME"]; } } else { $tmpStr .= GetMessage("TASKS_MESSAGE_NO_VALUE"); } break; case "PARENT_ID": if ($value["FROM_VALUE"]) { $rsTaskFrom = CTasks::GetList(array(), array("ID" => $value["FROM_VALUE"]), array('ID', 'TITLE')); if ($arTaskFrom = $rsTaskFrom->GetNext()) { $tmpStr .= $arTaskFrom["TITLE"] . " -> "; } } if ($value["TO_VALUE"]) { $rsTaskTo = CTasks::GetList(array(), array("ID" => $value["TO_VALUE"]), array('ID', 'TITLE')); if ($arTaskTo = $rsTaskTo->GetNext()) { $tmpStr .= $arTaskTo["TITLE"]; } } else { $tmpStr .= GetMessage("TASKS_MESSAGE_NO_VALUE"); } break; case "DEPENDS_ON": $arTasksFromStr = array(); if ($value["FROM_VALUE"]) { $rsTasksFrom = CTasks::GetList(array(), array("ID" => explode(",", $value["FROM_VALUE"])), array('ID', 'TITLE')); while ($arTaskFrom = $rsTasksFrom->GetNext()) { $arTasksFromStr[] = $arTaskFrom["TITLE"]; } } $arTasksToStr = array(); if ($value["TO_VALUE"]) { $rsTasksTo = CTasks::GetList(array(), array("ID" => explode(",", $value["TO_VALUE"])), array('ID', 'TITLE')); while ($arTaskTo = $rsTasksTo->GetNext()) { $arTasksToStr[] = $arTaskTo["TITLE"]; } } $tmpStr .= ($arTasksFromStr ? implode(", ", $arTasksFromStr) . " -> " : "") . ($arTasksToStr ? implode(", ", $arTasksToStr) : GetMessage("TASKS_MESSAGE_NO_VALUE")); break; case "MARK": $tmpStr .= (!$value["FROM_VALUE"] ? GetMessage("TASKS_MARK_NONE") : GetMessage("TASKS_MARK_" . $value["FROM_VALUE"])) . " -> " . (!$value["TO_VALUE"] ? GetMessage("TASKS_MARK_NONE") : GetMessage("TASKS_MARK_" . $value["TO_VALUE"])); break; case "ADD_IN_REPORT": $tmpStr .= ($value["FROM_VALUE"] == "Y" ? GetMessage("TASKS_MESSAGE_IN_REPORT_YES") : GetMessage("TASKS_MESSAGE_IN_REPORT_NO")) . " -> " . ($value["TO_VALUE"] == "Y" ? GetMessage("TASKS_MESSAGE_IN_REPORT_YES") : GetMessage("TASKS_MESSAGE_IN_REPORT_NO")); break; case "DELETED_FILES": $tmpStr .= $value["FROM_VALUE"]; $tmpStr .= $value["TO_VALUE"]; break; case "NEW_FILES": $tmpStr .= $value["TO_VALUE"]; break; } $tmpStr .= "[/COLOR]"; $arInvariantChangesStrs[] = $tmpStr; } } $occurAsUserId = CTasksTools::getOccurAsUserId(); if (!$occurAsUserId) { $occurAsUserId = is_object($USER) && $USER->GetID() ? $USER->GetID() : $arFields["CREATED_BY"]; } $invariantDescription = null; if (!empty($arInvariantChangesStrs)) { $invariantDescription = implode("\r\n", $arInvariantChangesStrs); } if ($invariantDescription !== null && !empty($arRecipientsIDs)) { // If there is no volatile part of descriptions, send to all recipients at once if (empty($arVolatileDescriptions)) { $arVolatileDescriptions['some_timezone'] = array(); $arRecipientsIDsByTimezone['some_timezone'] = $arRecipientsIDs; } foreach ($arVolatileDescriptions as $tzOffset => $arVolatileDescriptionsData) { $strDescription = $invariantDescription; foreach ($arVolatileDescriptionsData as $placeholder => $strReplaceTo) { $strDescription = str_replace($placeholder, $strReplaceTo, $strDescription); } $message = str_replace(array("#TASK_TITLE#", "#TASK_EXTRA#"), array(self::formatTaskName($arTask['ID'], $arTask['TITLE'], $arTask['GROUP_ID'], true), $strDescription), GetMessage("TASKS_TASK_CHANGED_MESSAGE")); if ($isBbCodeDescription) { $parser = new CTextParser(); $htmlDescription = str_replace("\t", ' ', $parser->convertText($strDescription)); } else { $htmlDescription = $strDescription; } $message_email = str_replace(array("#TASK_TITLE#", "#TASK_EXTRA#"), array(self::formatTaskName($arTask['ID'], $arTask['TITLE'], $arTask['GROUP_ID']), $htmlDescription . "\r\n" . GetMessage('TASKS_MESSAGE_LINK') . ': #PATH_TO_TASK#'), GetMessage("TASKS_TASK_CHANGED_MESSAGE")); CTaskNotifications::SendMessage($occurAsUserId, $arRecipientsIDsByTimezone[$tzOffset], $message, $arTask["ID"], $message_email, array('ACTION' => 'TASK_UPDATE', 'arFields' => $arFields, 'arChanges' => $arChanges), $taskReassignedTo); } } } // sonet log self::SendMessageToSocNet($arFields, $bSpawnedByAgent, $arChanges, $arTask); }
/** * @param integer $userId * @param integer $groupId * @return bool true if user can access group, false otherwise */ public static function HasUserReadAccessToGroup($userId, $groupId) { // Roles allowed for extranet user to grant access to read task in group static $arAllowedRoles = array(SONET_ROLES_MODERATOR, SONET_ROLES_USER, SONET_ROLES_OWNER); if (!CModule::IncludeModule('socialnetwork')) { return false; } if (!($userId > 0 && $groupId > 0)) { return false; } if (self::IsIntranetUser($userId)) { /** @noinspection PhpDynamicAsStaticMethodCallInspection */ return CSocNetGroup::CanUserViewGroup($userId, $groupId); } /** @noinspection PhpDynamicAsStaticMethodCallInspection */ $userRole = CSocNetUserToGroup::GetUserRole($userId, $groupId); if (in_array($userRole, $arAllowedRoles)) { return true; } return false; }