/** * * @param array $arData with element "arDataName" * @param string $strRequest, for example: #RC#arDataName#-2#field1#field2#...#fieldN */ function BXTasksParseAndGetDynaParamValue($arData, $strRequest) { CTaskAssert::assert(is_array($arData) && is_string($strRequest) && substr($strRequest, 0, 4) === '#RC#'); $dataCount = count($arData); $strToParse = substr($strRequest, 4); $arrayToParse = explode('#', $strToParse); CTaskAssert::assert(is_array($arrayToParse) && count($arrayToParse) >= 3 && isset($arData[$arrayToParse[0]]) && CTaskAssert::isLaxIntegers($arrayToParse[1]) && $arrayToParse[1] < 0); $arRequestedData = $arData[$arrayToParse[0]]; $curDataIndex = count($arRequestedData) - 1; $deltaIndex = (int) $arrayToParse[1]; $requestedIndex = $curDataIndex + $deltaIndex + 1; // +1 because last data item mustn't be in data array yet if (!isset($arRequestedData[$requestedIndex])) { return null; } // Now, iterate throws given fields $maxIndex = count($arrayToParse) - 1; $arIteratedData = $arRequestedData[$requestedIndex]; for ($i = 2; $i <= $maxIndex; $i++) { $requestedNthFieldName = $arrayToParse[$i]; if (!isset($arIteratedData[$requestedNthFieldName])) { return null; } $arIteratedData = $arIteratedData[$requestedNthFieldName]; } return $arIteratedData; }
public function __construct($oTaskItem, $itemId) { CTaskAssert::assert($oTaskItem instanceof CTaskItemInterface && CTaskAssert::isLaxIntegers($itemId) && $itemId > 0); $this->oTaskItem = $oTaskItem; $this->itemId = (int) $itemId; $this->taskId = (int) $oTaskItem->getId(); $this->executiveUserId = $oTaskItem->getExecutiveUserId(); }
/** * @param CTaskItemInterface $oTaskItem * @param array $arFields with mandatory elements MINUTES, COMMENT_TEXT * @throws TasksException * @return CTaskElapsedItem */ public static function add(CTaskItemInterface $oTaskItem, $arFields) { CTaskAssert::assert(is_array($arFields) && count($arFields) == 2 && isset($arFields['COMMENT_TEXT']) && (isset($arFields['MINUTES']) && CTaskAssert::isLaxIntegers($arFields['MINUTES']) || isset($arFields['SECONDS']) && CTaskAssert::isLaxIntegers($arFields['SECONDS'])) && is_string($arFields['COMMENT_TEXT'])); if (!$oTaskItem->isActionAllowed(CTaskItem::ACTION_ELAPSED_TIME_ADD)) { throw new TasksException('', TasksException::TE_ACTION_NOT_ALLOWED); } $arFields['USER_ID'] = $oTaskItem->getExecutiveUserId(); $arFields['TASK_ID'] = $oTaskItem->getId(); /** @noinspection PhpDeprecationInspection */ $obElapsed = new CTaskElapsedTime(); $logId = $obElapsed->Add($arFields); // Reset tagged system cache by tag 'tasks_user_' . $userId for each task member self::__resetSystemWideTasksCacheByTag($oTaskItem->getData(false)); if ($logId === false) { throw new TasksException('', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } return new self($oTaskItem, (int) $logId); }
private static function convertItemForImport($arItem) { static $arManifest = false; static $arAllowedFields = false; $arResult = array(); if ($arManifest === false) { $arManifest = self::getManifest(); $arAllowedFields = array_keys($arManifest['Fields']); } foreach ($arItem as $itemName => $itemData) { CTaskAssert::assert(strlen($itemName) > 2 || CTaskAssert::isLaxIntegers($itemName)); if ($itemName === '::LOGIC') { $arResult[$itemName] = $itemData; continue; } if (substr($itemName, 0, 12) === '::SUBFILTER-') { $arResult[$itemName] = self::convertItemForImport($itemData); continue; } CTaskAssert::assert(isset($itemData['operation'], $itemData['field']) && array_key_exists('value', $itemData) && CTaskAssert::isLaxIntegers($itemData['operation']) && is_string($itemData['field']) && $itemData['field'] !== ''); if (!in_array($itemData['field'], $arAllowedFields, true)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $arSupportedOperations = $arManifest['Fields'][$itemData['field']]['Supported operations']; $itemType = $arManifest['Fields'][$itemData['field']]['Type']; $operation = (int) $itemData['operation']; if (!in_array($operation, $arSupportedOperations, true)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } // Resolve operation prefix CTaskAssert::assert(isset(self::$arOperationsMap[$operation])); $operationPrefix = self::$arOperationsMap[$operation]; $value = false; switch ($itemType) { case self::TYPE_DATE: if (!(is_string($itemData['value']) || CTaskAssert::isLaxIntegers($itemData['value']))) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $value = self::convertDateStringToTimestamp($operation, $itemData['value']); break; case self::TYPE_TEXT: if (!is_string($itemData['value'])) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $value = (string) $itemData['value']; break; case self::TYPE_PRIORITY: if (!(is_string($itemData['value']) || CTaskAssert::isLaxIntegers($itemData['value']))) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $value = (int) $itemData['value']; if (!in_array($value, array(CTasks::PRIORITY_LOW, CTasks::PRIORITY_AVERAGE, CTasks::PRIORITY_HIGH), true)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } break; case self::TYPE_STATUS: if (is_array($itemData['value'])) { foreach ($itemData['value'] as $statusId) { if (!CTaskAssert::isLaxIntegers($statusId)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } } $value = array_map('intval', $itemData['value']); } else { $statusId = $itemData['value']; if (!CTaskAssert::isLaxIntegers($statusId)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $value = (int) $statusId; } break; case self::TYPE_GROUP_ID: case self::TYPE_USER_ID: $entityId = $itemData['value']; if (!CTaskAssert::isLaxIntegers($entityId)) { throw new TasksException('', TasksException::TE_FILTER_MANIFEST_MISMATCH); } $value = (int) $entityId; break; default: CTaskAssert::assert(false); break; } $arKey = $operationPrefix . $itemData['field']; while (isset($arResult[$arKey])) { $arKey = ' ' . $arKey; } $arResult[$arKey] = $value; } return $arResult; /* data in: array( '::LOGIC' => 'AND', array( 'field' => 'RESPONSIBLE_ID', 'operation' => CTaskFilterCtrlInterface::OP_EQUAL, 'value' => 1 ), '::SUBFILTER-1' => array( '::LOGIC' => 'OR', array( 'field' => 'CREATED_BY', 'operation' => CTaskFilterCtrlInterface::OP_EQUAL, 'value' => 1 ), array( 'field' => 'CREATED_BY', 'operation' => CTaskFilterCtrlInterface::OP_NOT_EQUAL, 'value' => 2 ) ), '::SUBFILTER-2' => array( '::LOGIC' => 'AND', array( 'field' => 'TITLE', 'operation' => CTaskFilterCtrlInterface::OP_SUBSTRING, 'value' => 1 ), array( 'field' => 'TITLE', 'operation' => CTaskFilterCtrlInterface::OP_NOT_SUBSTRING, 'value' => 2 ) ) ) data out: $arFilter = array( '::LOGIC' => 'AND', 'RESPONSIBLE_ID' => 1, '::SUBFILTER-1' => array( '::LOGIC' => 'OR', 'CREATED_BY' => 1, '!=CREATED_BY' => 2 ), '::SUBFILTER-2' => array( '::LOGIC' => 'AND', '%TITLE' => 'some interesting substring', '!%TITLE' => 'some not interesting substring' ) ); */ }
/** * Removes all checklist's items for given task. * WARNING: This function doesn't check rights! * * @param integer $taskId * @throws TasksException */ public static function deleteByTaskId($taskId) { global $DB; CTaskAssert::assert(CTaskAssert::isLaxIntegers($taskId) && $taskId > 0); $rc = $DB->Query("DELETE FROM b_tasks_checklist_items WHERE TASK_ID = {$taskId}", true); if ($rc === false) { throw new TasksException('', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } }
/** * This is not a part of public API. * This function is for internal use only. * * This function WILL send notifications in case of comment add through bitrix:forum.comments component * * @access private */ public static function onAfterCommentAdd($entityType, $entityId, $arData) { global $USER; $MESSAGE_TYPE = 'NEW'; $arFilesIds = array(); // 'TK' is our entity type if ($entityType !== 'TK') { return; } if (!(CTaskAssert::isLaxIntegers($entityId) && (int) $entityId >= 1)) { CTaskAssert::logWarning('[0xc4b31fa6] Expected integer $entityId >= 1'); return; } $loggedInUserId = 1; if (is_object($USER) && method_exists($USER, 'getId')) { $loggedInUserId = (int) $USER->getId(); } $taskId = (int) $entityId; $topicId = $arData['TOPIC_ID']; $messageId = $arData['MESSAGE_ID']; $strMessage = $arData['PARAMS']['POST_MESSAGE']; if (isset($arData['PARAMS']['UF_FORUM_MESSAGE_DOC']) && !empty($arData['PARAMS']['UF_FORUM_MESSAGE_DOC'])) { $arFilesIds = $arData['PARAMS']['UF_FORUM_MESSAGE_DOC']; } if (isset($arData['PARAMS']['UF_FORUM_MES_URL_PRV']) && !empty($arData['PARAMS']['UF_FORUM_MES_URL_PRV'])) { $urlPreviewId = $arData['PARAMS']['UF_FORUM_MES_URL_PRV']; } $parser = new CTextParser(); $messageAuthorId = null; $messageEditDate = null; $messagePostDate = null; if (array_key_exists('AUTHOR_ID', $arData['PARAMS']) && array_key_exists('EDIT_DATE', $arData['PARAMS']) && array_key_exists('POST_DATE', $arData['PARAMS'])) { $messageAuthorId = $arData['PARAMS']['AUTHOR_ID']; $messageEditDate = $arData['PARAMS']['EDIT_DATE']; $messageEditDate = $arData['PARAMS']['POST_DATE']; } else { $arMessage = CForumMessage::GetByID($messageId); $messageAuthorId = $arMessage['AUTHOR_ID']; $messageEditDate = $arMessage['EDIT_DATE']; $messageEditDate = $arMessage['POST_DATE']; } $occurAsUserId = CTasksTools::getOccurAsUserId(); if (!$occurAsUserId) { $occurAsUserId = $messageAuthorId ? $messageAuthorId : 1; } $oTask = CTaskItem::getInstance($taskId, CTasksTools::GetCommanderInChief()); $arTask = $oTask->getData(); $arRecipientsIDs = self::getTaskMembersByTaskId($taskId, $excludeUser = $occurAsUserId); // Instant Messages if (IsModuleInstalled("im") && CModule::IncludeModule("im") && sizeof($arRecipientsIDs)) { CTaskComments::sendAddMessage(array('ID' => $messageId, 'POST_MESSAGE' => $strMessage), $arTask, $occurAsUserId, $arRecipientsIDs, $arData); } $strURL = $GLOBALS['APPLICATION']->GetCurPageParam("", array("IFRAME", "MID", "SEF_APPLICATION_CUR_PAGE_URL", BX_AJAX_PARAM_ID, "result")); $strURL = ForumAddPageParams($strURL, array("MID" => $messageId, "result" => "reply"), false, false); // sonet log if (CModule::IncludeModule("socialnetwork")) { $bCrmTask = isset($arTask["UF_CRM_TASK"]) && (is_array($arTask["UF_CRM_TASK"]) && (isset($arTask["UF_CRM_TASK"][0]) && strlen($arTask["UF_CRM_TASK"][0]) > 0) || !is_array($arTask["UF_CRM_TASK"]) && strlen($arTask["UF_CRM_TASK"]) > 0); if (!$bCrmTask) { $dbRes = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "tasks", "SOURCE_ID" => $taskId), false, false, array("ID", "ENTITY_TYPE", "ENTITY_ID", "TMP_ID")); if ($arRes = $dbRes->Fetch()) { $log_id = $arRes["ID"]; $entity_type = $arRes["ENTITY_TYPE"]; $entity_id = $arRes["ENTITY_ID"]; } else { $entity_type = $arTask["GROUP_ID"] ? SONET_ENTITY_GROUP : SONET_ENTITY_USER; $entity_id = $arTask["GROUP_ID"] ? $arTask["GROUP_ID"] : $arTask["CREATED_BY"]; $rsUser = CUser::GetByID($arTask["CREATED_BY"]); if ($arUser = $rsUser->Fetch()) { $arSoFields = array("ENTITY_TYPE" => $entity_type, "ENTITY_ID" => $entity_id, "EVENT_ID" => "tasks", "LOG_DATE" => $arTask["CREATED_DATE"], "TITLE_TEMPLATE" => "#TITLE#", "TITLE" => $arTask["TITLE"], "MESSAGE" => "", "TEXT_MESSAGE" => $strMsgNewTask, "MODULE_ID" => "tasks", "CALLBACK_FUNC" => false, "SOURCE_ID" => $taskId, "ENABLE_COMMENTS" => "Y", "USER_ID" => $arTask["CREATED_BY"], "URL" => CTaskNotifications::GetNotificationPath($arUser, $taskId), "PARAMS" => serialize(array("TYPE" => "create"))); $log_id = CSocNetLog::Add($arSoFields, false); if (intval($log_id) > 0) { CSocNetLog::Update($log_id, array("TMP_ID" => $log_id)); $arRights = CTaskNotifications::__UserIDs2Rights(self::getTaskMembersByTaskId($taskId)); if ($arTask["GROUP_ID"]) { $arRights[] = "S" . SONET_ENTITY_GROUP . $arTask["GROUP_ID"]; } CSocNetLogRights::Add($log_id, $arRights); } } } } if (intval($log_id) > 0) { $sText = COption::GetOptionString("forum", "FILTER", "Y") == "Y" ? $arMessage["POST_MESSAGE_FILTER"] : $arMessage["POST_MESSAGE"]; CSocNetLog::Update($log_id, array('PARAMS' => serialize(array('TYPE' => 'comment')))); $arFieldsForSocnet = array("ENTITY_TYPE" => $entity_type, "ENTITY_ID" => $entity_id, "EVENT_ID" => "tasks_comment", "MESSAGE" => $sText, "TEXT_MESSAGE" => $parser->convert4mail($sText), "URL" => str_replace("?IFRAME=Y", "", str_replace("&IFRAME=Y", "", str_replace("IFRAME=Y&", "", $strURL))), "MODULE_ID" => "tasks", "SOURCE_ID" => $messageId, "LOG_ID" => $log_id, "RATING_TYPE_ID" => "FORUM_POST", "RATING_ENTITY_ID" => $messageId); if ($MESSAGE_TYPE == "EDIT") { $dbRes = CSocNetLogComments::GetList(array("ID" => "DESC"), array("EVENT_ID" => array("tasks_comment"), "SOURCE_ID" => $messageId), false, false, array("ID")); while ($arRes = $dbRes->Fetch()) { CSocNetLogComments::Update($arRes["ID"], $arFieldsForSocnet); } } else { $arFieldsForSocnet["USER_ID"] = $occurAsUserId; $arFieldsForSocnet["=LOG_DATE"] = $GLOBALS['DB']->CurrentTimeFunction(); $ufFileID = array(); $dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageId)); while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch()) { $ufFileID[] = $arAddedMessageFiles["FILE_ID"]; } if (count($ufFileID) > 0) { $arFieldsForSocnet["UF_SONET_COM_FILE"] = $ufFileID; } $ufDocID = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageId, LANGUAGE_ID); if ($ufDocID) { $arFieldsForSocnet["UF_SONET_COM_DOC"] = $ufDocID; } $ufUrlPreview = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MES_URL_PRV", $messageId, LANGUAGE_ID); if ($ufUrlPreview) { $arFieldsForSocnet["UF_SONET_COM_URL_PRV"] = $ufUrlPreview; } $comment_id = CSocNetLogComments::Add($arFieldsForSocnet, false, false); CSocNetLog::CounterIncrement($comment_id, false, false, "LC"); } } } // Tasks log $arLogFields = array("TASK_ID" => $taskId, "USER_ID" => $occurAsUserId, "CREATED_DATE" => $messageEditDate ? ConvertTimeStamp(MakeTimeStamp($messageEditDate, CSite::GetDateFormat()), "FULL") : $messagePostDate, "FIELD" => "COMMENT", "TO_VALUE" => $messageId); $log = new CTaskLog(); $log->Add($arLogFields); CTaskComments::fireOnAfterCommentAddEvent($messageId, $taskId, $strMessage, $arFilesIds, $urlPreviewId); }
/** * This is not a part of public API. * This function is for internal use only. * * @access private */ public static function onAfterCommentAdd($entityType, $entityId, $arData) { global $USER; $MESSAGE_TYPE = 'NEW'; $arFilesIds = array(); // 'TK' is our entity type if ($entityType !== 'TK') { return; } if (!(CTaskAssert::isLaxIntegers($entityId) && (int) $entityId >= 1)) { CTaskAssert::logWarning('[0xc4b31fa6] Expected integer $entityId >= 1'); return; } $loggedInUserId = 1; if (is_object($USER) && method_exists($USER, 'getId')) { $loggedInUserId = (int) $USER->getId(); } $taskId = (int) $entityId; $topicId = $arData['TOPIC_ID']; $messageId = $arData['MESSAGE_ID']; $strMessage = $arData['PARAMS']['POST_MESSAGE']; if (isset($arData['PARAMS']['UF_FORUM_MESSAGE_DOC']) && !empty($arData['PARAMS']['UF_FORUM_MESSAGE_DOC'])) { $arFilesIds = $arData['PARAMS']['UF_FORUM_MESSAGE_DOC']; } $parser = new CTextParser(); $messageAuthorId = null; $messageEditDate = null; $messagePostDate = null; if (array_key_exists('AUTHOR_ID', $arData['PARAMS']) && array_key_exists('EDIT_DATE', $arData['PARAMS']) && array_key_exists('POST_DATE', $arData['PARAMS'])) { $messageAuthorId = $arData['PARAMS']['AUTHOR_ID']; $messageEditDate = $arData['PARAMS']['EDIT_DATE']; $messageEditDate = $arData['PARAMS']['POST_DATE']; } else { $arMessage = CForumMessage::GetByID($messageId); $messageAuthorId = $arMessage['AUTHOR_ID']; $messageEditDate = $arMessage['EDIT_DATE']; $messageEditDate = $arMessage['POST_DATE']; } $occurAsUserId = CTasksTools::getOccurAsUserId(); if (!$occurAsUserId) { $occurAsUserId = $messageAuthorId ? $messageAuthorId : 1; } $oTask = CTaskItem::getInstance($taskId, 1); $arTask = $oTask->getData(); $arRecipientsIDs = self::getTaskMembersByTaskId($taskId, $excludeUser = $occurAsUserId); // Instant Messages if (IsModuleInstalled("im") && CModule::IncludeModule("im") && sizeof($arRecipientsIDs)) { // There are different links for extranet users $isExtranetEnabled = false; if (CModule::IncludeModule("extranet")) { $isExtranetEnabled = true; } if ($isExtranetEnabled) { $arSites = array(); $dbSite = CSite::GetList($by = "sort", $order = "desc", array("ACTIVE" => "Y")); while ($arSite = $dbSite->Fetch()) { if (strlen(trim($arSite["DIR"])) > 0) { $arSites[$arSite['ID']]['DIR'] = $arSite['DIR']; } else { $arSites[$arSite['ID']]['DIR'] = '/'; } if (strlen(trim($arSite["SERVER_NAME"])) > 0) { $arSites[$arSite['ID']]['SERVER_NAME'] = $arSite["SERVER_NAME"]; } else { $arSites[$arSite['ID']]['SERVER_NAME'] = COption::GetOptionString("main", "server_name", $_SERVER["HTTP_HOST"]); } $arSites[$arSite['ID']]['urlPrefix'] = $arSites[$arSite['ID']]['SERVER_NAME'] . $arSites[$arSite['ID']]['DIR']; // remove last '/' if (strlen($arSites[$arSite['ID']]['urlPrefix']) > 0 && substr($arSites[$arSite['ID']]['urlPrefix'], -1) === '/') { $arSites[$arSite['ID']]['urlPrefix'] = substr($arSites[$arSite['ID']]['urlPrefix'], 0, -1); } } $extranet_site_id = CExtranet::GetExtranetSiteID(); $intranet_site_id = CSite::GetDefSite(); $arIntranetUsers = CExtranet::GetIntranetUsers(); } else { if ($arTask["GROUP_ID"]) { $pathTemplateWoExtranet = str_replace("#group_id#", $arTask["GROUP_ID"], COption::GetOptionString("tasks", "paths_task_group_entry", "/workgroups/group/#group_id#/tasks/task/view/#task_id#/", $arFields["SITE_ID"])); } else { $pathTemplateWoExtranet = COption::GetOptionString("tasks", "paths_task_user_entry", "/company/personal/user/#user_id#/tasks/task/view/#task_id#/", $arFields["SITE_ID"]); } } IncludeModuleLangFile(__FILE__); $rsUser = CUser::GetList($by = 'id', $order = 'asc', array('ID_EQUAL_EXACT' => (int) $occurAsUserId), array('FIELDS' => array('PERSONAL_GENDER'))); $strMsgAddComment = GetMessage("TASKS_COMMENT_MESSAGE_ADD"); $strMsgEditComment = GetMessage("TASKS_COMMENT_MESSAGE_EDIT"); if ($arUser = $rsUser->fetch()) { switch ($arUser['PERSONAL_GENDER']) { case "F": case "M": $strMsgAddComment = GetMessage("TASKS_COMMENT_MESSAGE_ADD" . '_' . $arUser['PERSONAL_GENDER']); $strMsgEditComment = GetMessage("TASKS_COMMENT_MESSAGE_EDIT" . '_' . $arUser['PERSONAL_GENDER']); break; default: break; } } foreach ($arRecipientsIDs as $userID) { $urlPrefixForUser = tasksServerName(); if ($isExtranetEnabled) { if (!in_array($userID, $arIntranetUsers) && $extranet_site_id) { $userSiteId = $extranet_site_id; } else { $userSiteId = $intranet_site_id; } if (isset($arSites[$userSiteId]['SERVER_NAME'])) { $urlPrefixForUser = tasksServerName($arSites[$userSiteId]['SERVER_NAME']); } if ($arTask["GROUP_ID"]) { $pathTemplate = str_replace('#group_id#', $arTask['GROUP_ID'], CTasksTools::GetOptionPathTaskGroupEntry($userSiteId, '')); } else { $pathTemplate = CTasksTools::GetOptionPathTaskUserEntry($userSiteId, ''); } } else { $pathTemplate = $pathTemplateWoExtranet; } $NOTIFY_MESSAGE_TITLE_TEMPLATE = ''; $messageUrl = ''; if (strlen($pathTemplate) > 0) { $groupId = 0; if (isset($arTask['GROUP_ID'])) { $groupId = (int) $arTask['GROUP_ID']; } $messageUrl = $urlPrefixForUser . CComponentEngine::MakePathFromTemplate($pathTemplate, array("user_id" => $userID, "task_id" => $taskId, "action" => "view", "USER_ID" => $userID, "TASK_ID" => $taskId, "ACTION" => "view", 'GROUP_ID' => $groupId, 'group_id' => $groupId)); $messageUrl .= (strpos($messageUrl, "?") === false ? "?" : "&") . "MID=" . $messageId; $NOTIFY_MESSAGE_TITLE_TEMPLATE = '[URL=' . $messageUrl . "#message" . $messageId . ']' . $arTask["TITLE"] . '[/URL]'; } else { $NOTIFY_MESSAGE_TITLE_TEMPLATE = $arTask["TITLE"]; } $MESSAGE_SITE = preg_replace(array('|\\[\\/USER\\]|', '|\\[USER=\\d+\\]|', '|\\[DISK\\sFILE\\sID=[n]*\\d+\\]|', '|\\[DOCUMENT\\sID=\\d+\\]|'), '', $strMessage); $MESSAGE_EMAIL = $MESSAGE_SITE; // full message to email if (strlen($MESSAGE_SITE) >= 100) { $dot = '...'; $MESSAGE_SITE = substr($MESSAGE_SITE, 0, 99); if (substr($MESSAGE_SITE, -1) === '[') { $MESSAGE_SITE = substr($MESSAGE_SITE, 0, 98); } if (($lastLinkPosition = strrpos($MESSAGE_SITE, '[u')) !== false || ($lastLinkPosition = strrpos($MESSAGE_SITE, 'http://')) !== false || ($lastLinkPosition = strrpos($MESSAGE_SITE, 'https://')) !== false || ($lastLinkPosition = strrpos($MESSAGE_SITE, 'ftp://')) !== false || ($lastLinkPosition = strrpos($MESSAGE_SITE, 'ftps://')) !== false) { if (strpos($MESSAGE_SITE, ' ', $lastLinkPosition) === false) { $MESSAGE_SITE = substr($MESSAGE_SITE, 0, $lastLinkPosition); } } $MESSAGE_SITE .= $dot; } $arMessageFields = array("TO_USER_ID" => $userID, "FROM_USER_ID" => $occurAsUserId, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "tasks", "NOTIFY_EVENT" => "comment", "NOTIFY_MESSAGE" => str_replace(array("#TASK_TITLE#", "#TASK_COMMENT_TEXT#"), array($NOTIFY_MESSAGE_TITLE_TEMPLATE, '[COLOR=#000000]' . $MESSAGE_SITE . '[/COLOR]'), $MESSAGE_TYPE != "EDIT" ? $strMsgAddComment : $strMsgEditComment), "NOTIFY_MESSAGE_OUT" => str_replace(array("#TASK_TITLE#", "#TASK_COMMENT_TEXT#"), array($arTask["TITLE"], $MESSAGE_EMAIL . ' #BR# ' . $messageUrl . "#message" . $messageId . ' '), $MESSAGE_TYPE != "EDIT" ? $strMsgAddComment : $strMsgEditComment)); CIMNotify::Add($arMessageFields); } } $strURL = $GLOBALS['APPLICATION']->GetCurPageParam("", array("IFRAME", "MID", "SEF_APPLICATION_CUR_PAGE_URL", BX_AJAX_PARAM_ID, "result")); $strURL = ForumAddPageParams($strURL, array("MID" => $messageId, "result" => "reply"), false, false); // sonet log if (CModule::IncludeModule("socialnetwork")) { $bCrmTask = isset($arTask["UF_CRM_TASK"]) && (is_array($arTask["UF_CRM_TASK"]) && (isset($arTask["UF_CRM_TASK"][0]) && strlen($arTask["UF_CRM_TASK"][0]) > 0) || !is_array($arTask["UF_CRM_TASK"]) && strlen($arTask["UF_CRM_TASK"]) > 0); if (!$bCrmTask) { $dbRes = CSocNetLog::GetList(array("ID" => "DESC"), array("EVENT_ID" => "tasks", "SOURCE_ID" => $taskId), false, false, array("ID", "ENTITY_TYPE", "ENTITY_ID", "TMP_ID")); if ($arRes = $dbRes->Fetch()) { $log_id = $arRes["ID"]; $entity_type = $arRes["ENTITY_TYPE"]; $entity_id = $arRes["ENTITY_ID"]; } else { $entity_type = $arTask["GROUP_ID"] ? SONET_ENTITY_GROUP : SONET_ENTITY_USER; $entity_id = $arTask["GROUP_ID"] ? $arTask["GROUP_ID"] : $arTask["CREATED_BY"]; $rsUser = CUser::GetByID($arTask["CREATED_BY"]); if ($arUser = $rsUser->Fetch()) { $arSoFields = array("ENTITY_TYPE" => $entity_type, "ENTITY_ID" => $entity_id, "EVENT_ID" => "tasks", "LOG_DATE" => $arTask["CREATED_DATE"], "TITLE_TEMPLATE" => "#TITLE#", "TITLE" => $arTask["TITLE"], "MESSAGE" => "", "TEXT_MESSAGE" => $strMsgNewTask, "MODULE_ID" => "tasks", "CALLBACK_FUNC" => false, "SOURCE_ID" => $taskId, "ENABLE_COMMENTS" => "Y", "USER_ID" => $arTask["CREATED_BY"], "URL" => CTaskNotifications::GetNotificationPath($arUser, $taskId), "PARAMS" => serialize(array("TYPE" => "create"))); $log_id = CSocNetLog::Add($arSoFields, false); if (intval($log_id) > 0) { CSocNetLog::Update($log_id, array("TMP_ID" => $log_id)); $arRights = CTaskNotifications::__UserIDs2Rights(self::getTaskMembersByTaskId($taskId)); if ($arTask["GROUP_ID"]) { $arRights[] = "S" . SONET_ENTITY_GROUP . $arTask["GROUP_ID"]; } CSocNetLogRights::Add($log_id, $arRights); } } } } if (intval($log_id) > 0) { $sText = COption::GetOptionString("forum", "FILTER", "Y") == "Y" ? $arMessage["POST_MESSAGE_FILTER"] : $arMessage["POST_MESSAGE"]; CSocNetLog::Update($log_id, array('PARAMS' => serialize(array('TYPE' => 'comment')))); $arFieldsForSocnet = array("ENTITY_TYPE" => $entity_type, "ENTITY_ID" => $entity_id, "EVENT_ID" => "tasks_comment", "MESSAGE" => $sText, "TEXT_MESSAGE" => $parser->convert4mail($sText), "URL" => str_replace("?IFRAME=Y", "", str_replace("&IFRAME=Y", "", str_replace("IFRAME=Y&", "", $strURL))), "MODULE_ID" => "tasks", "SOURCE_ID" => $messageId, "LOG_ID" => $log_id, "RATING_TYPE_ID" => "FORUM_POST", "RATING_ENTITY_ID" => $messageId); if ($MESSAGE_TYPE == "EDIT") { $dbRes = CSocNetLogComments::GetList(array("ID" => "DESC"), array("EVENT_ID" => array("tasks_comment"), "SOURCE_ID" => $messageId), false, false, array("ID")); while ($arRes = $dbRes->Fetch()) { CSocNetLogComments::Update($arRes["ID"], $arFieldsForSocnet); } } else { $arFieldsForSocnet["USER_ID"] = $occurAsUserId; $arFieldsForSocnet["=LOG_DATE"] = $GLOBALS['DB']->CurrentTimeFunction(); $ufFileID = array(); $dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageId)); while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch()) { $ufFileID[] = $arAddedMessageFiles["FILE_ID"]; } if (count($ufFileID) > 0) { $arFieldsForSocnet["UF_SONET_COM_FILE"] = $ufFileID; } $ufDocID = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageId, LANGUAGE_ID); if ($ufDocID) { $arFieldsForSocnet["UF_SONET_COM_DOC"] = $ufDocID; } $comment_id = CSocNetLogComments::Add($arFieldsForSocnet, false, false); CSocNetLog::CounterIncrement($comment_id, false, false, "LC"); } } } // Tasks log $arLogFields = array("TASK_ID" => $taskId, "USER_ID" => $occurAsUserId, "CREATED_DATE" => $messageEditDate ? ConvertTimeStamp(MakeTimeStamp($messageEditDate, CSite::GetDateFormat()), "FULL") : $messagePostDate, "FIELD" => "COMMENT", "TO_VALUE" => $messageId); $log = new CTaskLog(); $log->Add($arLogFields); CTaskComments::fireOnAfterCommentAddEvent($messageId, $taskId, $strMessage, $arFilesIds); }
private function checkColumns($columns) { $arAllowedColumnsIDs = array_keys(CTaskColumnList::get()); CTaskAssert::assert(is_array($columns)); foreach ($columns as &$columnData) { CTaskAssert::assert(isset($columnData['ID'], $columnData['WIDTH']) && count($columnData) == 2 && CTaskAssert::isLaxIntegers($columnData['ID'], $columnData['WIDTH']) && in_array($columnData['ID'], $arAllowedColumnsIDs) && $columnData['WIDTH'] >= 0); } unset($columnData); }
function Update($ID, $arFields, $arParams = array()) { global $DB, $USER, $USER_FIELD_MANAGER; $ID = intval($ID); if ($ID < 1) { return false; } $bCheckFilesPermissions = false; if (isset($arParams['CHECK_RIGHTS_ON_FILES']) && ($arParams['CHECK_RIGHTS_ON_FILES'] === true || $arParams['CHECK_RIGHTS_ON_FILES'] === 'Y')) { CTaskAssert::assert(isset($arParams['USER_ID']) && CTaskAssert::isLaxIntegers($arParams['USER_ID']) && $arParams['USER_ID'] > 0); $bCheckFilesPermissions = true; } $arParamsForCheckFields = array('CHECK_RIGHTS_ON_FILES' => $bCheckFilesPermissions); if (isset($arParams['USER_ID'])) { $arParamsForCheckFields['USER_ID'] = $arParams['USER_ID']; } // We need understand, does REPLICATE_PARAMS changed $rsCurData = self::GetByID($ID); $arCurData = $rsCurData->Fetch(); $this->currentData = $arCurData; if (intval($arCurData['BASE_TEMPLATE_ID']) > 0) { unset($arFields['REPLICATE']); // ... you cannot set replicate params unset($arFields['PARENT_ID']); // ... and base task $isReplicateParamsChanged = false; } else { $isReplicateParamsChanged = isset($arFields['REPLICATE']) && $arCurData['REPLICATE'] !== $arFields['REPLICATE'] || isset($arFields['REPLICATE_PARAMS']) && $arCurData['REPLICATE_PARAMS'] !== $arFields['REPLICATE_PARAMS']; } if ($userID === null) { $userID = is_object($USER) ? intval($USER->GetID()) : 1; } if ($this->CheckFields($arFields, $ID, $arParamsForCheckFields)) { if ($USER_FIELD_MANAGER->CheckFields("TASKS_TASK_TEMPLATE", $ID, $arFields)) { unset($arFields['ID']); $arBinds = array('DESCRIPTION' => $arFields['DESCRIPTION'], 'REPLICATE_PARAMS' => $arFields['REPLICATE_PARAMS'], 'ACCOMPLICES' => $arFields['ACCOMPLICES'], 'AUDITORS' => $arFields['AUDITORS'], 'FILES' => $arFields['FILES'], 'TAGS' => $arFields['TAGS'], 'DEPENDS_ON' => $arFields['DEPENDS_ON']); $strUpdate = $DB->PrepareUpdate('b_tasks_template', $arFields, 'tasks'); if ((string) $strUpdate !== '') { $strSql = "UPDATE b_tasks_template SET " . $strUpdate . " WHERE ID=" . $ID; $DB->QueryBind($strSql, $arBinds, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } if (isset($arFields['FILES'])) { CTaskFiles::removeTemporaryStatusForFiles(unserialize($arFields['FILES']), $arParams['USER_ID']); } $USER_FIELD_MANAGER->Update("TASKS_TASK_TEMPLATE", $ID, $arFields, $userID); // update template tree, if required if (isset($arFields['BASE_TEMPLATE_ID'])) { try { Template\DependencyTable::link($ID, intval($arFields['BASE_TEMPLATE_ID']), array('CREATE_PARENT_NODE_ON_NOTFOUND' => true)); } catch (\Bitrix\Tasks\DB\Tree\LinkExistsException $e) { } } if ($isReplicateParamsChanged) { // Firstly, remove all agents for this template /** @noinspection PhpDynamicAsStaticMethodCallInspection */ CAgent::RemoveAgent('CTasks::RepeatTaskByTemplateId(' . $ID . ');', 'tasks'); /** @noinspection PhpDynamicAsStaticMethodCallInspection */ CAgent::RemoveAgent('CTasks::RepeatTaskByTemplateId(' . $ID . ', 0);', 'tasks'); /** @noinspection PhpDynamicAsStaticMethodCallInspection */ CAgent::RemoveAgent('CTasks::RepeatTaskByTemplateId(' . $ID . ', 1);', 'tasks'); // Set up new agent if ($arFields['REPLICATE'] === 'Y') { $nextTime = CTasks::GetNextTime(unserialize($arFields['REPLICATE_PARAMS'])); if ($nextTime) { CTimeZone::Disable(); /** @noinspection PhpDynamicAsStaticMethodCallInspection */ CAgent::AddAgent('CTasks::RepeatTaskByTemplateId(' . $ID . ', 0);', 'tasks', 'N', 86400, $nextTime, 'Y', $nextTime); CTimeZone::Enable(); } } } return true; } } return false; }
/** * This function is for internal use only, not a part of public API * * @access private */ public static function _parseRestParams($className, $methodName, $inArgs) { CTaskAssert::assert(is_array($inArgs) && isset(self::$arMethodsMetaInfo[$className][$methodName])); $arMethodMetaInfo = self::$arMethodsMetaInfo[$className][$methodName]; $arAllowedParams = $arMethodMetaInfo['params']; $mandatoryParamsCount = $arMethodMetaInfo['mandatoryParamsCount']; $arDateFields = array(); if (isset(self::$arManifests[$className]['REST: date fields'])) { $arDateFields = self::$arManifests[$className]['REST: date fields']; } $outArgs = array(); foreach ($arAllowedParams as $paramIndex => $paramMetaInfo) { // No more params given? if (!array_key_exists($paramIndex, $inArgs)) { // Set default value, if need if (array_key_exists('defaultValue', $paramMetaInfo)) { $inArgs[$paramIndex] = $paramMetaInfo['defaultValue']; } elseif ($paramIndex < $mandatoryParamsCount) { throw new TasksException('Param #' . $paramIndex . ' (' . $paramMetaInfo['description'] . ')' . ' expected by method ' . $className . '::' . $methodName . '(), but not given.', TasksException::TE_WRONG_ARGUMENTS); } else { break; } // no more params to be processed } // for "galvanic isolation" of input/output $paramValue = $inArgs[$paramIndex]; // Check param type /** @noinspection PhpUnusedLocalVariableInspection */ $isCorrectValue = false; switch ($paramMetaInfo['type']) { case 'boolean': if ($paramValue === '0' || $paramValue === 0) { $paramValue = false; } elseif ($paramValue === '1' || $paramValue === 1) { $paramValue = true; } $isCorrectValue = is_bool($paramValue); break; case 'array': $isCorrectValue = is_array($paramValue); break; case 'string': $isCorrectValue = is_string($paramValue); break; case 'integer': $isCorrectValue = CTaskAssert::isLaxIntegers($paramValue); break; default: throw new TasksException('Internal error: unknown param type: ' . $paramMetaInfo['type'], TasksException::TE_UNKNOWN_ERROR); break; } if (!$isCorrectValue) { throw new TasksException('Param #' . $paramIndex . ' (' . $paramMetaInfo['description'] . ')' . ' for method ' . $className . '::' . $methodName . '()' . ' expected to be of type "' . $paramMetaInfo['type'] . '",' . ' but given something else.', TasksException::TE_WRONG_ARGUMENTS); } // add legal aggregated columns in keys & values array if (is_array($paramMetaInfo['allowedAggregations'])) { // for keys if (is_array($paramMetaInfo['allowedKeysInAggregation'])) { $fields = $paramMetaInfo['allowedKeysInAggregation']; } else { $fields = $paramMetaInfo['allowedKeys']; } if (is_array($fields)) { $aggrCombos = static::getAllowedAggregateCombos($paramMetaInfo['allowedAggregations'], $fields); $paramMetaInfo['allowedKeys'] = array_merge($paramMetaInfo['allowedKeys'], $aggrCombos); } // for values if (is_array($paramMetaInfo['allowedValuesInAggregation'])) { $fields = $paramMetaInfo['allowedValuesInAggregation']; } else { $fields = $paramMetaInfo['allowedValues']; } if (is_array($fields)) { $aggrCombos = static::getAllowedAggregateCombos($paramMetaInfo['allowedAggregations'], $fields); $paramMetaInfo['allowedValues'] = array_merge($paramMetaInfo['allowedValues'], $aggrCombos); } } if (isset($paramMetaInfo['allowedKeys'])) { CTaskAssert::assert(is_array($paramValue)); // ensure that $paramValue is array /** @var $paramValue array */ foreach (array_keys($paramValue) as $key) { // a little fix to be able to pass an empty array in order to "skip" argument if ((string) $key == '0' && $paramValue[$key] == '') { unset($paramValue[$key]); continue; } if (isset($paramMetaInfo['allowedKeyPrefixes'])) { $keyWoPrefix = str_replace($paramMetaInfo['allowedKeyPrefixes'], '', $key); } else { $keyWoPrefix = $key; } if (!in_array((string) $keyWoPrefix, $paramMetaInfo['allowedKeys'], true)) { throw new TasksException('Param #' . $paramIndex . ' (' . $paramMetaInfo['description'] . ')' . ' for method ' . $className . '::' . $methodName . '()' . ' must not contain key "' . $key . '".', TasksException::TE_WRONG_ARGUMENTS); } // Additionally convert datetime fields from ISO 8601 if (in_array((string) $keyWoPrefix, $arDateFields, true) && !in_array($paramValue[$key], array('asc', 'desc'))) { $paramValue[$key] = (string) CRestUtil::unConvertDateTime($paramValue[$key]); } } } if (isset($paramMetaInfo['allowedValues'])) { CTaskAssert::assert(is_array($paramValue)); foreach ($paramValue as $value) { if ($value !== null && !is_bool($value)) { $value = (string) $value; } if (!in_array($value, $paramMetaInfo['allowedValues'], true)) { throw new TasksException('Param #' . $paramIndex . ' (' . $paramMetaInfo['description'] . ')' . ' for method ' . $className . '::' . $methodName . '()' . ' must not contain value "' . $value . '".', TasksException::TE_WRONG_ARGUMENTS); } } } // "galvanic isolation" of input/output $outArgs[] = $paramValue; } if (count($inArgs) > count($arAllowedParams)) { throw new TasksException('Too much params(' . count($inArgs) . ') given for method ' . $className . '::' . $methodName . '()' . ', but expected not more than ' . count($arAllowedParams) . '.', TasksException::TE_WRONG_ARGUMENTS); } return $outArgs; }
} else { $status = 'fail'; } } catch (Exception $e) { $status = 'fail'; } break; case 'createPreset': case 'replacePreset': try { CTaskAssert::assert(isset($_POST['presetData']) && is_array($_POST['presetData']) && isset($_POST['presetData']['Name']) && isset($_POST['presetData']['Condition'])); $_POST['presetData']['Parent'] = CTaskFilterCtrl::ROOT_PRESET; $mode = CTaskFilterCtrl::IMPORT_MODE_CREATE; $presetId = null; if ($_POST['action'] === 'replacePreset') { CTaskAssert::assert(isset($_POST['presetId']) && CTaskAssert::isLaxIntegers($_POST['presetId']) && $_POST['presetId'] > 0); $mode = CTaskFilterCtrl::IMPORT_MODE_REPLACE; $presetId = (int) $_POST['presetId']; } $oFilter = CTaskFilterCtrl::getInstance($loggedInUser); $newPresetId = $oFilter->importFilterDataFromJs($_POST['presetData'], $mode, $presetId); $arReply['newPresetId'] = $newPresetId; } catch (Exception $e) { $status = 'fail'; } break; case 'removePreset': try { CTaskAssert::assert(isset($_POST['presetId']) && $_POST['presetId'] > 0); CTaskAssert::assertLaxIntegers($_POST['presetId']); $oFilter = CTaskFilterCtrl::getInstance($loggedInUser);
public static function isIntegerValued($i) { return CTaskAssert::isLaxIntegers($i); }
} $APPLICATION->IncludeComponent("bitrix:socialnetwork.group.selector", ".default", array('BIND_ELEMENT' => $inData['bindElement'], 'ON_SELECT' => $onSelectFuncName, 'JS_OBJECT_NAME' => $inData['jsObjectName'], 'FEATURES_PERMS' => array('tasks', 'create_tasks'), 'SELECTED' => 0), null, array("HIDE_ICONS" => "Y")); break; case 'LHEditor': CTaskAssert::assert(isset($inData['jsObjectName'], $inData['elementId'])); if (!CModule::IncludeModule("fileman")) { ShowError('Cannot include fileman module'); } else { $Editor = new CHTMLEditor(); $res = array_merge(array('minBodyWidth' => 350, 'minBodyHeight' => 200, 'normalBodyWidth' => 555, 'bAllowPhp' => false, 'limitPhpAccess' => false, 'showTaskbars' => false, 'showNodeNavi' => false, 'askBeforeUnloadPage' => true, 'bbCode' => true, 'siteId' => SITE_ID, 'autoResize' => true, 'autoResizeOffset' => 40, 'saveOnBlur' => true, 'setFocusAfterShow' => false, 'controlsMap' => array(array('id' => 'Bold', 'compact' => true, 'sort' => 80), array('id' => 'Italic', 'compact' => true, 'sort' => 90), array('id' => 'Underline', 'compact' => true, 'sort' => 100), array('id' => 'Strikeout', 'compact' => true, 'sort' => 110), array('id' => 'RemoveFormat', 'compact' => true, 'sort' => 120), array('id' => 'Color', 'compact' => true, 'sort' => 130), array('id' => 'FontSelector', 'compact' => false, 'sort' => 135), array('id' => 'FontSize', 'compact' => false, 'sort' => 140), array('separator' => true, 'compact' => false, 'sort' => 145), array('id' => 'OrderedList', 'compact' => true, 'sort' => 150), array('id' => 'UnorderedList', 'compact' => true, 'sort' => 160), array('id' => 'AlignList', 'compact' => false, 'sort' => 190), array('separator' => true, 'compact' => false, 'sort' => 200), array('id' => 'InsertLink', 'compact' => true, 'sort' => 210), array('id' => 'InsertImage', 'compact' => false, 'sort' => 220), array('id' => 'InsertVideo', 'compact' => true, 'sort' => 230), array('id' => 'InsertTable', 'compact' => false, 'sort' => 250), array('id' => 'Code', 'compact' => true, 'sort' => 260), array('id' => 'Quote', 'compact' => true, 'sort' => 270), array('separator' => true, 'compact' => false, 'sort' => 290), array('id' => 'Fullscreen', 'compact' => false, 'sort' => 310), array('id' => 'BbCode', 'compact' => true, 'sort' => 340), array('id' => 'More', 'compact' => true, 'sort' => 400))), array('name' => 'DESCRIPTION', 'id' => $inData['elementId'], 'width' => '100%', 'arSmiles' => array(), 'iframeCss' => 'body{font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 13px;}' . '.bx-spoiler {border:1px solid #C0C0C0;background-color:#fff4ca;padding: 4px 4px 4px 24px;color:#373737;border-radius:2px;min-height:1em;margin: 0;}')); $Editor->Show($res); } break; case 'system.field.edit::WEBDAV': case 'system.field.edit::CRM': CTaskAssert::assert(isset($inData['taskId'], $inData['userFieldName'], $inData['nameContainerId'], $inData['dataContainerId']) && CTaskAssert::isLaxIntegers($inData['taskId']) && is_string($inData['userFieldName']) && $inData['userFieldName'] !== '' && is_string($inData['nameContainerId']) && $inData['nameContainerId'] !== '' && is_string($inData['dataContainerId']) && $inData['dataContainerId'] !== ''); if ($inData['requestedObject'] === 'system.field.edit::CRM' && $inData['taskId'] == 0) { break; } global $USER_FIELD_MANAGER; $arAvailableUserFieldsMeta = $USER_FIELD_MANAGER->GetUserFields('TASKS_TASK', $inData['taskId'], LANGUAGE_ID); // We need only $inData['userFieldName'] if (!isset($arAvailableUserFieldsMeta[$inData['userFieldName']])) { break; } $arUserField = $arAvailableUserFieldsMeta[$inData['userFieldName']]; if ($arUserField['EDIT_IN_LIST'] !== 'Y') { break; } echo '<div id="' . $inData['nameContainerId'] . '">' . htmlspecialcharsbx($arUserField['EDIT_FORM_LABEL']) . '</div>'; echo '<div id="' . $inData['dataContainerId'] . '">';