%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/lists/classes/general/ |
Current File : //home/bitrix/www/bitrix/modules/lists/classes/general/lists.php |
<? use Bitrix\Main\Localization\Loc; use Bitrix\Main\Loader; use Bitrix\Disk\Uf\FileUserType; use Bitrix\Disk\AttachedObject; use Bitrix\Disk\File; use Bitrix\Main\ArgumentException; use Bitrix\Main\Application; use Bitrix\Main\Config\Option; Loc::loadMessages(__FILE__); class CLists { private static $featuresCache = array(); function SetPermission($iblock_type_id, $arGroups) { global $DB, $CACHE_MANAGER; $grp = array(); foreach($arGroups as $group_id) { $group_id = intval($group_id); if($group_id) $grp[$group_id] = $group_id; } $DB->Query(" delete from b_lists_permission where IBLOCK_TYPE_ID = '".$DB->ForSQL($iblock_type_id)."' ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); if(count($grp)) { $DB->Query(" insert into b_lists_permission select ibt.ID, ug.ID from b_iblock_type ibt ,b_group ug where ibt.ID = '".$DB->ForSQL($iblock_type_id)."' and ug.ID in (".implode(", ", $grp).") ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } if(CACHED_b_lists_permission !== false) $CACHE_MANAGER->Clean("b_lists_permission"); } public static function GetPermission($iblock_type_id = false) { global $DB, $CACHE_MANAGER; $arResult = false; if(CACHED_b_lists_permission !== false) { if($CACHE_MANAGER->Read(CACHED_b_lists_permission, "b_lists_permission")) $arResult = $CACHE_MANAGER->Get("b_lists_permission"); } if($arResult === false) { $arResult = array(); $res = $DB->Query("select IBLOCK_TYPE_ID, GROUP_ID from b_lists_permission", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); while($ar = $res->Fetch()) $arResult[$ar["IBLOCK_TYPE_ID"]][] = $ar["GROUP_ID"]; if(CACHED_b_lists_permission !== false) $CACHE_MANAGER->Set("b_lists_permission", $arResult); } if($iblock_type_id === false) return $arResult; else return $arResult[$iblock_type_id]; } function GetDefaultSocnetPermission() { return array( "A" => "X", //Group owner "E" => "W", //Group moderator "K" => "W", //Group member "L" => "D", //Authorized users "N" => "D", //Everyone "T" => "D", //Banned "Z" => "D", //Request? ); } function SetSocnetPermission($iblock_id, $arRoles) { global $DB, $CACHE_MANAGER; $iblock_id = intval($iblock_id); $arToDB = CLists::GetDefaultSocnetPermission(); foreach($arToDB as $role => $permission) if(isset($arRoles[$role])) $arToDB[$role] = substr($arRoles[$role], 0, 1); $arToDB["A"] = "X"; //Group owner always in charge $arToDB["T"] = "D"; //Banned $arToDB["Z"] = "D"; //and Request never get to list $DB->Query(" delete from b_lists_socnet_group where IBLOCK_ID = ".$iblock_id." ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); foreach($arToDB as $role => $permission) { $DB->Query(" insert into b_lists_socnet_group (IBLOCK_ID, SOCNET_ROLE, PERMISSION) values (".$iblock_id.", '".$role."', '".$permission."') ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } if(CACHED_b_lists_permission !== false) $CACHE_MANAGER->Clean("b_lists_perm".$iblock_id); } public static function GetSocnetPermission($iblock_id) { global $DB, $CACHE_MANAGER; $iblock_id = intval($iblock_id); $arCache = array(); if(!array_key_exists($iblock_id, $arCache)) { $arCache[$iblock_id] = CLists::GetDefaultSocnetPermission(); if(CACHED_b_lists_permission !== false) { $cache_id = "b_lists_perm".$iblock_id; if($CACHE_MANAGER->Read(CACHED_b_lists_permission, $cache_id)) { $arCache[$iblock_id] = $CACHE_MANAGER->Get($cache_id); } else { $res = $DB->Query(" select SOCNET_ROLE, PERMISSION from b_lists_socnet_group where IBLOCK_ID=".$iblock_id." ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); while($ar = $res->Fetch()) $arCache[$iblock_id][$ar["SOCNET_ROLE"]] = $ar["PERMISSION"]; $CACHE_MANAGER->Set($cache_id, $arCache[$iblock_id]); } } else { $res = $DB->Query(" select SOCNET_ROLE, PERMISSION from b_lists_socnet_group where IBLOCK_ID=".$iblock_id." ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); while($ar = $res->Fetch()) $arCache[$iblock_id][$ar["SOCNET_ROLE"]] = $ar["PERMISSION"]; } $arCache[$iblock_id]["A"] = "X"; //Group owner always in charge $arCache[$iblock_id]["T"] = "D"; //Banned $arCache[$iblock_id]["Z"] = "D"; //and Request never get to list } return $arCache[$iblock_id]; } function GetIBlockPermission($iblock_id, $user_id) { global $USER; //IBlock permissions by default $Permission = CIBlock::GetPermission($iblock_id, $user_id); if($Permission < "W") { $arIBlock = CIBlock::GetArrayByID($iblock_id); if($arIBlock) { //Check if iblock is list $arListsPerm = CLists::GetPermission($arIBlock["IBLOCK_TYPE_ID"]); if(count($arListsPerm)) { //User groups if($user_id == $USER->GetID()) $arUserGroups = $USER->GetUserGroupArray(); else $arUserGroups = $USER->GetUserGroup($user_id); //One of lists admins if(count(array_intersect($arListsPerm, $arUserGroups))) $Permission = "X"; } } } if( $Permission < "W" && $arIBlock["SOCNET_GROUP_ID"] && CModule::IncludeModule('socialnetwork') ) { $arSocnetPerm = CLists::GetSocnetPermission($iblock_id); $socnet_role = CSocNetUserToGroup::GetUserRole($USER->GetID(), $arIBlock["SOCNET_GROUP_ID"]); $Permission = $arSocnetPerm[$socnet_role]; } return $Permission; } function GetIBlockTypes($language_id = false) { global $DB; $res = $DB->Query(" SELECT IBLOCK_TYPE_ID, NAME FROM b_iblock_type_lang WHERE LID = '".$DB->ForSQL($language_id===false? LANGUAGE_ID: $language_id)."' AND EXISTS ( SELECT * FROM b_lists_permission WHERE b_lists_permission.IBLOCK_TYPE_ID = b_iblock_type_lang.IBLOCK_TYPE_ID ) ", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); return $res; } function GetIBlocks($iblock_type_id, $check_permissions, $socnet_group_id = false) { $arOrder = array( "SORT" => "ASC", "NAME" => "ASC", ); $arFilter = array( "ACTIVE" => "Y", "SITE_ID" => SITE_ID, "TYPE" => $iblock_type_id, "CHECK_PERMISSIONS" => ($check_permissions? "Y": "N"), //This cancels iblock permissions for trusted users ); if($socnet_group_id > 0) $arFilter["=SOCNET_GROUP_ID"] = $socnet_group_id; $arResult = array(); $rsIBlocks = CIBlock::GetList($arOrder, $arFilter); while($ar = $rsIBlocks->Fetch()) { $arResult[$ar["ID"]] = $ar["NAME"]; } return $arResult; } function OnIBlockDelete($iblock_id) { global $DB, $CACHE_MANAGER; $iblock_id = intval($iblock_id); $DB->Query("delete from b_lists_url where IBLOCK_ID=".$iblock_id, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $DB->Query("delete from b_lists_socnet_group where IBLOCK_ID=".$iblock_id, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $CACHE_MANAGER->Clean("b_lists_perm".$iblock_id); CListFieldList::DeleteFields($iblock_id); } function OnAfterIBlockDelete($iblock_id) { if(CModule::includeModule('bizproc') && CBPRuntime::isFeatureEnabled()) BizProcDocument::deleteDataIblock($iblock_id); } function IsEnabledSocnet() { $bActive = false; foreach (GetModuleEvents("socialnetwork", "OnFillSocNetFeaturesList", true) as $arEvent) { if( $arEvent["TO_MODULE_ID"] == "lists" && $arEvent["TO_CLASS"] == "CListsSocnet" ) { $bActive = true; break; } } return $bActive; } function EnableSocnet($bActive = false) { if($bActive) { if(!CLists::IsEnabledSocnet()) { RegisterModuleDependences("socialnetwork", "OnFillSocNetFeaturesList", "lists", "CListsSocnet", "OnFillSocNetFeaturesList"); RegisterModuleDependences("socialnetwork", "OnFillSocNetMenu", "lists", "CListsSocnet", "OnFillSocNetMenu"); RegisterModuleDependences("socialnetwork", "OnParseSocNetComponentPath", "lists", "CListsSocnet", "OnParseSocNetComponentPath"); RegisterModuleDependences("socialnetwork", "OnInitSocNetComponentVariables", "lists", "CListsSocnet", "OnInitSocNetComponentVariables"); } } else { if(CLists::IsEnabledSocnet()) { UnRegisterModuleDependences("socialnetwork", "OnFillSocNetFeaturesList", "lists", "CListsSocnet", "OnFillSocNetFeaturesList"); UnRegisterModuleDependences("socialnetwork", "OnFillSocNetMenu", "lists", "CListsSocnet", "OnFillSocNetMenu"); UnRegisterModuleDependences("socialnetwork", "OnParseSocNetComponentPath", "lists", "CListsSocnet", "OnParseSocNetComponentPath"); UnRegisterModuleDependences("socialnetwork", "OnInitSocNetComponentVariables", "lists", "CListsSocnet", "OnInitSocNetComponentVariables"); } } } function OnSharepointCreateProperty($arInputFields) { global $DB; $iblock_id = intval($arInputFields["IBLOCK_ID"]); if($iblock_id > 0) { //Check if there is at list one field defined for given iblock $rsFields = $DB->Query(" SELECT * FROM b_lists_field WHERE IBLOCK_ID = ".$iblock_id." ORDER BY SORT ASC ", false, "File: ".__FILE__."<br>Line: ".__LINE__); if($rsFields->Fetch()) { $arNewFields = array( "SORT" => 500, "NAME" => $arInputFields["SP_FIELD"], ); if(substr($arInputFields["FIELD_ID"], 0, 9) == "PROPERTY_") { $arNewFields["ID"] = substr($arInputFields["FIELD_ID"], 9); $arNewFields["TYPE"] = "S"; } else $arNewFields["TYPE"] = $arInputFields["FIELD_ID"]; //Publish property on the list $obList = new CList($iblock_id); $obList->AddField($arNewFields); } } } function OnSharepointCheckAccess($iblock_id) { global $USER; $arIBlock = CIBlock::GetArrayByID($iblock_id); if($arIBlock) { //Check if iblock is list $arListsPerm = CLists::GetPermission($arIBlock["IBLOCK_TYPE_ID"]); if(count($arListsPerm)) { //User groups $arUserGroups = $USER->GetUserGroupArray(); //One of lists admins if(count(array_intersect($arListsPerm, $arUserGroups))) return true; else return false; } } } public static function setLiveFeed($checked, $iblockId) { global $DB; $iblockId = intval($iblockId); $checked = intval($checked); $resultQuery = $DB->Query("SELECT LIVE_FEED FROM b_lists_url WHERE IBLOCK_ID = ".$iblockId); $resultData = $resultQuery->fetch(); if($resultData) { if($resultData["LIVE_FEED"] != $checked) $DB->Query("UPDATE b_lists_url SET LIVE_FEED = '".$checked."' WHERE IBLOCK_ID = ".$iblockId); } else { $url = '/'.$iblockId.'/element/#section_id#/#element_id#/'; $DB->Query("INSERT INTO b_lists_url (IBLOCK_ID, URL, LIVE_FEED) values (".$iblockId.", '".$DB->ForSQL($url)."', ".$checked.")"); } } public static function getLiveFeed($iblockId) { global $DB; $iblockId = intval($iblockId); $resultQuery = $DB->Query("SELECT LIVE_FEED FROM b_lists_url WHERE IBLOCK_ID = ".$iblockId); $resultData = $resultQuery->fetch(); if ($resultData) return $resultData["LIVE_FEED"]; else return ""; } public static function getCountProcessesUser($userId, $iblockTypeId) { $userId = intval($userId); return CIBlockElement::getList( array(), array('CREATED_BY' => $userId, 'IBLOCK_TYPE' => $iblockTypeId), true, false, array('ID') ); } public static function generateMnemonicCode($integerCode = 0) { if(!$integerCode) $integerCode = time(); $code = ''; for ($i = 1; $integerCode >= 0 && $i < 10; $i++) { $code = chr(0x41 + ($integerCode % pow(26, $i) / pow(26, $i - 1))) . $code; $integerCode -= pow(26, $i); } return $code; } public function OnAfterIBlockElementDelete($fields) { if(CModule::includeModule('bizproc') && CBPRuntime::isFeatureEnabled()) { $errors = array(); $iblockType = COption::getOptionString("lists", "livefeed_iblock_type_id"); $iblockQuery = CIBlock::getList(array(), array('ID' => $fields['IBLOCK_ID'])); if($iblock = $iblockQuery->fetch()) { $iblockType = $iblock["IBLOCK_TYPE_ID"]; } $states = CBPStateService::getDocumentStates(BizprocDocument::getDocumentComplexId($iblockType, $fields['ID'])); $listWorkflowId = array(); foreach ($states as $workflowId => $state) { $listWorkflowId[] = $workflowId; } self::deleteSocnetLog($listWorkflowId); CBPDocument::onDocumentDelete(BizprocDocument::getDocumentComplexId($iblockType, $fields['ID']), $errors); } $propertyQuery = CIBlockElement::getProperty( $fields['IBLOCK_ID'], $fields['ID'], 'sort', 'asc', array('ACTIVE'=>'Y')); while($property = $propertyQuery->fetch()) { $userType = \CIBlockProperty::getUserType($property['USER_TYPE']); if (array_key_exists('DeleteAllAttachedFiles', $userType)) { call_user_func_array($userType['DeleteAllAttachedFiles'], array($fields['ID'])); } } } /** * @param string $workflowId * @param string $iblockType * @param int $elementId * @param int $iblockId * @param string $action Action stop or delete * @return string error */ public static function completeWorkflow($workflowId, $iblockType, $elementId, $iblockId, $action) { if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled()) { return Loc::getMessage('LISTS_MODULE_BIZPROC_NOT_INSTALLED'); } global $USER; $userId = $USER->getID(); $documentType = BizprocDocument::generateDocumentComplexType($iblockType, $iblockId); $documentId = BizprocDocument::getDocumentComplexId($iblockType, $elementId); $documentStates = CBPDocument::getDocumentStates($documentType, $documentId); $permission = CBPDocument::canUserOperateDocument( ($action == 'stop') ? CBPCanUserOperateOperation::StartWorkflow : CBPCanUserOperateOperation::CreateWorkflow, $userId, $documentId, array("DocumentStates" => $documentStates) ); if(!$permission) { return Loc::getMessage('LISTS_ACCESS_DENIED'); } $stringError = ''; if($action == 'stop') { $errors = array(); CBPDocument::terminateWorkflow( $workflowId, $documentId, $errors ); if (!empty($errors)) { $stringError = ''; foreach ($errors as $error) $stringError .= $error['message']; $listError[] = array('id' => 'stopBizproc', 'text' => $stringError); } } else { $errors = array(); if (isset($documentStates[$workflowId]['WORKFLOW_STATUS']) && $documentStates[$workflowId]['WORKFLOW_STATUS'] !== null) { CBPDocument::terminateWorkflow( $workflowId, $documentId, $errors ); } if (!empty($errors)) { $stringError = ''; foreach ($errors as $error) $stringError .= $error['message']; $listError[] = array('id' => 'stopBizproc', 'text' => $stringError); } else { CBPTaskService::deleteByWorkflow($workflowId); CBPTrackingService::deleteByWorkflow($workflowId); CBPStateService::deleteWorkflow($workflowId); } } if(empty($listError) && Loader::includeModule('socialnetwork') && $iblockType == COption::getOptionString("lists", "livefeed_iblock_type_id")) { $sourceId = CBPStateService::getWorkflowIntegerId($workflowId); $resultQuery = CSocNetLog::getList( array(), array('EVENT_ID' => 'lists_new_element', 'SOURCE_ID' => $sourceId), false, false, array('ID') ); while ($log = $resultQuery->fetch()) { CSocNetLog::delete($log['ID']); } } if (!empty($listError)) { $errorObject = new CAdminException($listError); $stringError = $errorObject->getString(); } return $stringError; } public static function deleteSocnetLog(array $listWorkflowId) { if(CModule::includeModule('socialnetwork')) { foreach ($listWorkflowId as $workflowId) { $sourceId = CBPStateService::getWorkflowIntegerId($workflowId); $resultQuery = CSocNetLog::getList( array(), array('EVENT_ID' => 'lists_new_element', 'SOURCE_ID' => $sourceId), false, false, array('ID') ); while ($log = $resultQuery->fetch()) { CSocNetLog::delete($log['ID']); } } } } /** * @param $iblockId * @param array $errors - an array of errors that occurred array(0 => 'error message') * @return bool or int */ public static function copyIblock($iblockId, array &$errors) { $iblockId = (int)$iblockId; if(!$iblockId) { $errors[] = Loc::getMessage('LISTS_REQUIRED_PARAMETER', array('#parameter#' => 'iblockId')); return false; } /* We obtain data on old iblock and add a new iblock */ $query = CIBlock::getList(array(), array('ID' => $iblockId), true); $iblock = $query->fetch(); if(!$iblock) { $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA'); return false; } $iblockMessage = CIBlock::getMessages($iblockId); $iblock = array_merge($iblock, $iblockMessage); $iblock['NAME'] = $iblock['NAME'].Loc::getMessage('LISTS_COPY_IBLOCK_NAME_TITLE'); if(!empty($iblock['PICTURE'])) { $iblock['PICTURE'] = CFile::makeFileArray($iblock['PICTURE']); } if(!empty($iblock['CODE'])) { $iblock['CODE'] = $iblock['CODE'].'_copy'; } $iblockObject = new CIBlock; if(!$iblockObject) { $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA'); return false; } $copyIblockId = $iblockObject->add($iblock); if($copyIblockId) { global $CACHE_MANAGER; $CACHE_MANAGER->ClearByTag('lists_list_'.$copyIblockId); $CACHE_MANAGER->ClearByTag('lists_list_any'); $CACHE_MANAGER->CleanDir('menu'); } else { $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA'); return false; } /* Set right */ $rights = array(); if($iblock['RIGHTS_MODE'] == 'E') { $rightObject = new CIBlockRights($iblockId); $i = 0; foreach($rightObject->getRights() as $right) { $rights['n'.($i++)] = array( 'GROUP_CODE' => $right['GROUP_CODE'], 'DO_CLEAN' => 'N', 'TASK_ID' => $right['TASK_ID'], ); } } else { $i = 0; if(!empty($iblock['SOCNET_GROUP_ID'])) { $socnetPerm = self::getSocnetPermission($iblockId); foreach($socnetPerm as $role => $permission) { if($permission > "W") $permission = "W"; switch($role) { case "A": case "E": case "K": $rights['n'.($i++)] = array( "GROUP_CODE" => "SG".$iblock['SOCNET_GROUP_ID']."_".$role, "IS_INHERITED" => "N", "TASK_ID" => CIBlockRights::letterToTask($permission), ); break; case "L": $rights['n'.($i++)] = array( "GROUP_CODE" => "AU", "IS_INHERITED" => "N", "TASK_ID" => CIBlockRights::letterToTask($permission), ); break; case "N": $rights['n'.($i++)] = array( "GROUP_CODE" => "G2", "IS_INHERITED" => "N", "TASK_ID" => CIBlockRights::letterToTask($permission), ); break; } } } else { $groupPermissions = CIBlock::getGroupPermissions($iblockId); foreach($groupPermissions as $groupId => $permission) { if($permission > 'W') $rights['n'.($i++)] = array( 'GROUP_CODE' => 'G'.$groupId, 'IS_INHERITED' => 'N', 'TASK_ID' => CIBlockRights::letterToTask($permission), ); } } } $iblock['RIGHTS'] = $rights; $resultIblock = $iblockObject->update($copyIblockId, $iblock); if(!$resultIblock) $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_SET_RIGHT'); /* Add fields */ $listObject = new CList($iblockId); $fields = $listObject->getFields(); $copyListObject = new CList($copyIblockId); foreach($fields as $fieldId => $field) { $copyFields = array( 'NAME' => $field['NAME'], 'SORT' => $field['SORT'], 'MULTIPLE' => $field['MULTIPLE'], 'IS_REQUIRED' => $field['IS_REQUIRED'], 'IBLOCK_ID' => $copyIblockId, 'SETTINGS' => $field['SETTINGS'], 'DEFAULT_VALUE' => $field['DEFAULT_VALUE'], 'TYPE' => $field['TYPE'], 'PROPERTY_TYPE' => $field['PROPERTY_TYPE'], ); if(!$listObject->is_field($fieldId)) { if($field['TYPE'] == 'L') { $enum = CIBlockPropertyEnum::getList(array(), array('PROPERTY_ID' => $field['ID'])); while($listData = $enum->fetch()) { $copyFields['VALUES'][] = array( 'XML_ID' => $listData['XML_ID'], 'VALUE' => $listData['VALUE'], 'DEF' => $listData['DEF'], 'SORT' => $listData['SORT'] ); } } $copyFields['CODE'] = $field['CODE']; $copyFields['LINK_IBLOCK_ID'] = $field['LINK_IBLOCK_ID']; if(!empty($field['PROPERTY_USER_TYPE']['USER_TYPE'])) $copyFields['USER_TYPE'] = $field['PROPERTY_USER_TYPE']['USER_TYPE']; if(!empty($field['ROW_COUNT'])) $copyFields['ROW_COUNT'] = $field['ROW_COUNT']; if(!empty($field['COL_COUNT'])) $copyFields['COL_COUNT'] = $field['COL_COUNT']; if(!empty($field['USER_TYPE_SETTINGS'])) $copyFields['USER_TYPE_SETTINGS'] = $field['USER_TYPE_SETTINGS']; } if($fieldId == 'NAME') { $resultUpdateField = $copyListObject->updateField("NAME", $copyFields); if($resultUpdateField) $copyListObject->save(); else $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_ADD_FIELD', array('#field#' => $field['NAME'])); continue; } $copyFieldId = $copyListObject->addField($copyFields); if($copyFieldId) $copyListObject->save(); else $errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_ADD_FIELD', array('#field#' => $field['NAME'])); } /* Copy Workflow Template */ // Make a copy workflow templates return $copyIblockId; } public static function checkChangedFields($iblockId, $elementId, array $select, array $elementFields, array $elementProperty) { $changedFields = array(); /* We get the new data element. */ $elementNewData = array(); $elementQuery = CIBlockElement::getList( array(), array('IBLOCK_ID' => $iblockId, '=ID' => $elementId), false, false, $select); $elementObject = $elementQuery->getNextElement(); if(is_object($elementObject)) $elementNewData = $elementObject->getFields(); $elementOldData = $elementFields; unset($elementNewData["TIMESTAMP_X"]); unset($elementOldData["TIMESTAMP_X"]); $elementNewData["PROPERTY_VALUES"] = array(); if(is_object($elementObject)) { $propertyQuery = CIBlockElement::getProperty( $iblockId, $elementId, array("sort"=>"asc", "id"=>"asc", "enum_sort"=>"asc", "value_id"=>"asc"), array("ACTIVE"=>"Y", "EMPTY"=>"N") ); while($property = $propertyQuery->fetch()) { $propertyId = $property["ID"]; if(!array_key_exists($propertyId, $elementNewData["PROPERTY_VALUES"])) { $elementNewData["PROPERTY_VALUES"][$propertyId] = $property; unset($elementNewData["PROPERTY_VALUES"][$propertyId]["DESCRIPTION"]); unset($elementNewData["PROPERTY_VALUES"][$propertyId]["VALUE_ENUM_ID"]); unset($elementNewData["PROPERTY_VALUES"][$propertyId]["VALUE_ENUM"]); unset($elementNewData["PROPERTY_VALUES"][$propertyId]["VALUE_XML_ID"]); $elementNewData["PROPERTY_VALUES"][$propertyId]["FULL_VALUES"] = array(); $elementNewData["PROPERTY_VALUES"][$propertyId]["VALUES_LIST"] = array(); } $elementNewData["PROPERTY_VALUES"][$propertyId]["FULL_VALUES"][$property["PROPERTY_VALUE_ID"]] = array( "VALUE" => $property["VALUE"], "DESCRIPTION" => $property["DESCRIPTION"], ); $elementNewData["PROPERTY_VALUES"][$propertyId]["VALUES_LIST"][$property["PROPERTY_VALUE_ID"]] = $property["VALUE"]; } } $elementOldData["PROPERTY_VALUES"] = $elementProperty; /* Check added or deleted fields. */ $listNewFieldIdToDelete = array(); $listOldFieldIdToDelete = array(); $differences = array_diff_key($elementNewData, $elementOldData); foreach(array_keys($differences) as $fieldId) { if($fieldId[0] === '~') continue; $changedFields[] = $fieldId; $listNewFieldIdToDelete["FIELD"][] = $fieldId; } $differences = array_diff_key($elementOldData, $elementNewData); foreach(array_keys($differences) as $fieldId) { if($fieldId[0] === '~') continue; $changedFields[] = $fieldId; $listOldFieldIdToDelete["FIELD"][] = $fieldId; } $differences = array_diff_key( $elementNewData["PROPERTY_VALUES"], $elementOldData["PROPERTY_VALUES"] ); foreach(array_keys($differences) as $fieldId) { $listNewFieldIdToDelete["PROPERTY"][] = $fieldId; if(!empty($elementNewData["PROPERTY_VALUES"][$fieldId]["CODE"])) $fieldId = "PROPERTY_".$elementNewData["PROPERTY_VALUES"][$fieldId]["CODE"]; else $fieldId = "PROPERTY_".$fieldId; $changedFields[] = $fieldId; } $differences = array_diff_key( $elementOldData["PROPERTY_VALUES"], $elementNewData["PROPERTY_VALUES"] ); foreach(array_keys($differences) as $fieldId) { $listOldFieldIdToDelete["PROPERTY"][] = $fieldId; if(!empty($elementOldData["PROPERTY_VALUES"][$fieldId]["CODE"])) $fieldId = "PROPERTY_".$elementOldData["PROPERTY_VALUES"][$fieldId]["CODE"]; else $fieldId = "PROPERTY_".$fieldId; $changedFields[] = $fieldId; } foreach($listNewFieldIdToDelete as $typeField => $listField) { if($typeField == "FIELD") foreach($listField as $fieldId) unset($elementNewData[$fieldId]); elseif($typeField == "PROPERTY") foreach($listField as $fieldId) unset($elementNewData["PROPERTY_VALUES"][$fieldId]); } foreach($listOldFieldIdToDelete as $typeField => $listField) { if($typeField == "FIELD") foreach($listField as $fieldId) unset($elementOldData[$fieldId]); elseif($typeField == "PROPERTY") foreach($listField as $fieldId) unset($elementOldData["PROPERTY_VALUES"][$fieldId]); } /* Preparing arrays to compare */ $listObject = new CList($iblockId); foreach($elementNewData as $fieldId => $fieldValue) { if(!$listObject->is_field($fieldId) && $fieldId != "PROPERTY_VALUES") { unset($elementNewData[$fieldId]); } elseif($fieldId == "PROPERTY_VALUES") { foreach($fieldValue as $propertyId => $propertyData) { if(!empty($propertyData["CODE"])) $elementNewData["PROPERTY_".$propertyData["CODE"]] = $propertyData["VALUES_LIST"]; else $elementNewData["PROPERTY_".$propertyData["ID"]] = $propertyData["VALUES_LIST"]; unset($elementNewData["PROPERTY_VALUES"][$propertyId]); } unset($elementNewData["PROPERTY_VALUES"]); } } foreach($elementOldData as $fieldId => $fieldValue) { if(!$listObject->is_field($fieldId) && $fieldId != "PROPERTY_VALUES") { unset($elementOldData[$fieldId]); } elseif($fieldId == "PROPERTY_VALUES") { foreach($fieldValue as $propertyId => $propertyData) { if(!empty($propertyData["CODE"])) $elementOldData["PROPERTY_".$propertyData["CODE"]] = $propertyData["VALUES_LIST"]; else $elementOldData["PROPERTY_".$propertyData["ID"]] = $propertyData["VALUES_LIST"]; unset($elementOldData["PROPERTY_VALUES"][$propertyId]); } unset($elementOldData["PROPERTY_VALUES"]); } } /* Compares the value */ foreach($elementNewData as $fieldName => $fieldValue) { if(is_array($fieldValue)) { if(is_array(current($fieldValue))) { $firstValues = array(); $secondValues = array(); foreach($fieldValue as $values) $firstValues = $values; foreach($elementOldData[$fieldName] as $values) $secondValues = $values; if(array_key_exists("TEXT", $firstValues)) { $differences = array_diff($firstValues, $secondValues); if(!empty($differences)) $changedFields[] = $fieldName; } else { if(count($firstValues) != count($secondValues)) $changedFields[] = $fieldName; } } else { $differences = array_diff($fieldValue, $elementOldData[$fieldName]); if(!empty($differences)) $changedFields[] = $fieldName; } } else { if(strcmp((string)$fieldValue, (string)$elementOldData[$fieldName]) !== 0) $changedFields[] = $fieldName; } } return $changedFields; } public static function deleteListsUrl($iblockId) { global $DB; $iblockId = intval($iblockId); $DB->Query("delete from b_lists_url where IBLOCK_ID=" .$iblockId, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } /** * Method get iblock attached crm. * * @param string $entityType Type entity. * @return array List iblock data array(iblockId => IblockName). * @throws \Bitrix\Main\ArgumentException */ public static function getIblockAttachedCrm($entityType) { $cacheTime = defined('BX_COMP_MANAGED_CACHE') ? 3153600 : 3600*4; $cacheId = 'lists-crm-attached-'.strtolower($entityType); $cacheDir = '/lists/crm/attached/'.strtolower($entityType).'/'; $cache = new CPHPCache; if($cache->initCache($cacheTime, $cacheId, $cacheDir)) { $listIblock = $cache->getVars(); } else { $cache->startDataCache(); $listIblock = array(); $listProperty = array(); $propertyObject = Bitrix\Iblock\PropertyTable::getList(array( 'select' => array('ID', 'IBLOCK_ID', 'USER_TYPE_SETTINGS'), 'filter' => array( '=ACTIVE' => 'Y', '=USER_TYPE' => 'ECrm', ) )); while($property = $propertyObject->fetch()) { $property['USER_TYPE_SETTINGS'] = unserialize($property['USER_TYPE_SETTINGS']); if(empty($property['USER_TYPE_SETTINGS']['VISIBLE'])) $property['USER_TYPE_SETTINGS']['VISIBLE'] = 'Y'; if($property['USER_TYPE_SETTINGS']['VISIBLE'] == 'Y' && !empty($property['USER_TYPE_SETTINGS'][$entityType])) { if($property['USER_TYPE_SETTINGS'][$entityType] == 'Y') { $listProperty[$property['IBLOCK_ID']][] = $property['ID']; } } } $isFeatureEnabled = self::isFeatureEnabled(); foreach($listProperty as $iblockId => $listPropertyId) { $iblockObject = Bitrix\Iblock\IblockTable::getList(array( 'select' => array('ID', 'NAME', 'IBLOCK_TYPE_ID'), 'filter' => array('=ACTIVE' => 'Y', '=ID' => $iblockId) )); if($iblock = $iblockObject->fetch()) { switch ($iblock['IBLOCK_TYPE_ID']) { case "CRM_PRODUCT_CATALOG": { continue; break; } case "bitrix_processes": { if (!$isFeatureEnabled) { continue; } break; } } $listIblock[$iblockId] = $iblock['NAME']; } } $cache->endDataCache($listIblock); } return $listIblock; } protected static function deleteListsCache($cacheDir) { $cache = new CPHPCache; $cache->cleanDir($cacheDir); } public static function OnAfterIBlockPropertyAdd($fields) { if(!empty($fields['USER_TYPE']) && $fields['USER_TYPE'] == 'ECrm') { if(!empty($fields['USER_TYPE_SETTINGS'])) { if(!is_array($fields['USER_TYPE_SETTINGS'])) $fields['USER_TYPE_SETTINGS'] = unserialize($fields['USER_TYPE_SETTINGS']); if(is_array($fields['USER_TYPE_SETTINGS'])) { foreach($fields['USER_TYPE_SETTINGS'] as $entityType => $marker) { if($marker == 'Y') self::deleteListsCache('/lists/crm/attached/'.strtolower($entityType).'/'); } } } else { self::deleteListsCache('/lists/crm/attached/'); } } } public static function OnAfterIBlockPropertyUpdate($fields) { if(!empty($fields['USER_TYPE']) && $fields['USER_TYPE'] == 'ECrm') { if(!empty($fields['USER_TYPE_SETTINGS'])) { if(!is_array($fields['USER_TYPE_SETTINGS'])) $fields['USER_TYPE_SETTINGS'] = unserialize($fields['USER_TYPE_SETTINGS']); if(is_array($fields['USER_TYPE_SETTINGS'])) { foreach($fields['USER_TYPE_SETTINGS'] as $entityType => $marker) { if($marker == 'Y') self::deleteListsCache('/lists/crm/attached/'.strtolower($entityType).'/'); } } } else { self::deleteListsCache('/lists/crm/attached/'); } } } public static function OnAfterIBlockPropertyDelete($fields) { if(!empty($fields['USER_TYPE']) && $fields['USER_TYPE'] == 'ECrm') { if(!empty($fields['USER_TYPE_SETTINGS'])) { if(!is_array($fields['USER_TYPE_SETTINGS'])) $fields['USER_TYPE_SETTINGS'] = unserialize($fields['USER_TYPE_SETTINGS']); if(is_array($fields['USER_TYPE_SETTINGS'])) { foreach($fields['USER_TYPE_SETTINGS'] as $entityType => $marker) { if($marker == 'Y') self::deleteListsCache('/lists/crm/attached/'.strtolower($entityType).'/'); } } } else { self::deleteListsCache('/lists/crm/attached/'); } } } public static function getChildSection($baseSectionId, array $listSection, array &$listChildSection) { $baseSectionId = intval($baseSectionId); if (!$baseSectionId) return; if(!in_array($baseSectionId, $listChildSection)) $listChildSection[] = $baseSectionId; foreach($listSection as $sectionId => $section) { if($section['PARENT_ID'] == $baseSectionId) { $listChildSection[] = $sectionId; self::getChildSection($sectionId, $listSection, $listChildSection); } } } public static function isAssociativeArray($array) { if (!is_array($array) || empty($array)) return false; return array_keys($array) !== range(0, count($array) - 1); } /** * Handler OnBeforeIBlockElementAdd. * * @param array $fields Current values of the elements. * @return bool */ public static function OnBeforeIBlockElementAdd(&$fields) { $availableIblockTypeId = array("lists", "bitrix_processes", "lists_socnet"); $queryObject = CIBlock::getList(array(), array("ID" => $fields["IBLOCK_ID"])); if($iblock = $queryObject->fetch()) { if(in_array($iblock["IBLOCK_TYPE_ID"], $availableIblockTypeId)) { $fields["SEARCHABLE_CONTENT"] = self::createSeachableContent($fields); } } return true; } /** * Handler OnBeforeIBlockElementUpdate. * * @param array $fields Current values of the elements. * @return bool */ public static function OnBeforeIBlockElementUpdate(&$fields) { $availableIblockTypeId = array("lists", "bitrix_processes", "lists_socnet"); $queryObject = CIBlock::getList(array(), array("ID" => $fields["IBLOCK_ID"])); if($iblock = $queryObject->fetch()) { if(in_array($iblock["IBLOCK_TYPE_ID"], $availableIblockTypeId)) { $fields["SEARCHABLE_CONTENT"] = self::createSeachableContent($fields); } } return true; } /** * Agent function. Run rebuild seachable content. * * @param $iblockId * @return bool */ public static function runRebuildSeachableContent($iblockId) { $rebuildedData = Option::get("lists", "rebuild_seachable_content"); $rebuildedData = unserialize($rebuildedData); if(!is_array($rebuildedData)) $rebuildedData = array(); if(!isset($rebuildedData[$iblockId])) { return ''; } $limit = 50; $offset = $rebuildedData[$iblockId]; $rebuildedElementCount = CLists::rebuildSeachableContent($iblockId, $limit, $offset); if($rebuildedElementCount < $limit) { unset($rebuildedData[$iblockId]); Option::set("lists", "rebuild_seachable_content", serialize($rebuildedData)); return ''; } else { $rebuildedData[$iblockId] = $offset + $rebuildedElementCount; Option::set("lists", "rebuild_seachable_content", serialize($rebuildedData)); return 'CLists::runRebuildSeachableContent('.$iblockId.');'; } } /** * Method rebuild seachable content taking into account the current values of the elements. * * @param int $iblockId Iblock id. * @param int $limit Restricts the number of results. * @param int $offset Specifies the number of rows to skip, before starting to return rows from the query expression. * @return int Number of processed items. * @throws ArgumentException */ public static function rebuildSeachableContent($iblockId, $limit = 100, $offset = 0) { $iblockId = intval($iblockId); if(!$iblockId) throw new ArgumentException(Loc::getMessage("LISTS_REQUIRED_PARAMETER",array("#parameter#" => "iblockId"))); $connection = Application::getInstance()->getConnection(); $iblockId = $connection->getSqlHelper()->forSql($iblockId); $offset = intval($offset); $limit = intval($limit); $sqlString = "SELECT ID FROM b_iblock_element WHERE IBLOCK_ID=".$iblockId." ORDER BY ID ASC LIMIT ".$limit." OFFSET ".$offset; $queryObject = $connection->query($sqlString); $listElement = $queryObject->fetchAll(); $rebuildedElementCount = $queryObject->getSelectedRowsCount(); $listElementId = array(); foreach($listElement as $element) $listElementId[] = $element['ID']; $listElementValue = !empty($listElementId) ? self::getListElementValue($iblockId, $listElementId) : array(); $listSeachableContent = array(); foreach($listElementValue as $elementId => $elementData) { $listSeachableContent[$elementId] = self::createSeachableContent($elementData); } global $DB; foreach($listSeachableContent as $elementId => $seachableContent) { $strUpdate = $DB->prepareUpdate("b_iblock_element", array("SEARCHABLE_CONTENT" => $seachableContent)); $strSql = "UPDATE b_iblock_element SET ".$strUpdate." WHERE ID=".intval($elementId); $DB->query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } return $rebuildedElementCount; } /** * The method rebuild seachable content taking into account the current values of the element. * * @param $iblockId * @param $elementId * @throws ArgumentException */ public static function rebuildSeachableContentForElement($iblockId, $elementId) { $iblockId = intval($iblockId); if(!$iblockId) { throw new ArgumentException(Loc::getMessage("LISTS_REQUIRED_PARAMETER",array("#parameter#" => "iblockId"))); } $elementId = intval($elementId); if(!$elementId) { throw new ArgumentException(Loc::getMessage("LISTS_REQUIRED_PARAMETER",array("#parameter#" => "elementId"))); } $elementValue = self::getListElementValue($iblockId, $elementId); $listSeachableContent = array(); foreach($elementValue as $elementData) { $listSeachableContent[$elementId] = self::createSeachableContent($elementData); } global $DB; foreach($listSeachableContent as $seachableContent) { $strUpdate = $DB->prepareUpdate("b_iblock_element", array("SEARCHABLE_CONTENT" => $seachableContent)); $strSql = "UPDATE b_iblock_element SET ".$strUpdate." WHERE ID=".intval($elementId); $DB->query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } } private static function getListElementValue($iblockId, $listElementId) { $iblockId = intval($iblockId); $listElementValue = array(); $listObject = new CList($iblockId); $queryObject = CIBlockElement::getList(array(), array("IBLOCK_ID" => $iblockId, "=ID" => $listElementId), false, false, array('*')); while($queryResult = $queryObject->getNextElement()) { $element = $queryResult->getFields(); if(is_array($element)) { foreach($element as $fieldId => $fieldValue) { if(!$listObject->is_field($fieldId)) continue; $listElementValue[$element["ID"]][$fieldId] = $element[$fieldId]; } $query = CIblockElement::getPropertyValues($iblockId, array("ID" => $element["ID"])); if($propertyValues = $query->fetch()) { $listElementValue[$element["ID"]]["PROPERTY_VALUES"] = array(); foreach($propertyValues as $id => $values) { if($id == "IBLOCK_ELEMENT_ID") continue; $listElementValue[$element["ID"]]["PROPERTY_VALUES"][$id] = $values; } } } } return $listElementValue; } private static function createSeachableContent(array $fields) { $searchableContent = $fields["NAME"]; if(!empty($fields["DATE_CREATE"])) { $searchableContent .= "\r\n".$fields["DATE_CREATE"]; } if(!empty($fields["TIMESTAMP_X"])) { $searchableContent .= "\r\n".$fields["TIMESTAMP_X"]; } if(!empty($fields["ACTIVE_FROM"])) { $searchableContent .= "\r\n".$fields["ACTIVE_FROM"]; } if(!empty($fields["ACTIVE_TO"])) { $searchableContent .= "\r\n".$fields["ACTIVE_TO"]; } if(!empty($fields["PREVIEW_PICTURE"])) { $fileData = CFile::getFileArray($fields["PREVIEW_PICTURE"]); if($fileData) { $searchableContent .= "\r\n".$fileData["FILE_NAME"]; } } if(!empty($fields["DETAIL_PICTURE"])) { $fileData = CFile::getFileArray($fields["DETAIL_PICTURE"]); if($fileData) { $searchableContent .= "\r\n".$fileData["FILE_NAME"]; } } if(!empty($fields["CREATED_BY"])) { $user = new CUser(); $userDetails = $user->getByID($fields["CREATED_BY"])->fetch(); if(is_array($userDetails)) { $siteNameFormat = CSite::getNameFormat(false); $searchableContent .= "\r\n".CUser::formatName($siteNameFormat, $userDetails, true, false); } } if(!empty($fields["MODIFIED_BY"])) { $user = new CUser(); $userDetails = $user->getByID($fields["MODIFIED_BY"])->fetch(); if(is_array($userDetails)) { $siteNameFormat = CSite::getNameFormat(false); $searchableContent .= "\r\n".CUser::formatName($siteNameFormat, $userDetails, true, false); } } if(!empty($fields["PREVIEW_TEXT"])) { if(isset($fields["PREVIEW_TEXT_TYPE"]) && $fields["PREVIEW_TEXT_TYPE"] == "html") $searchableContent .= "\r\n".HTMLToTxt($fields["PREVIEW_TEXT"]); else $searchableContent .= "\r\n".$fields["PREVIEW_TEXT"]; } if(!empty($fields["DETAIL_TEXT"])) { if(isset($fields["DETAIL_TEXT_TYPE"]) && $fields["DETAIL_TEXT_TYPE"] == "html") $searchableContent .= "\r\n".HTMLToTxt($fields["DETAIL_TEXT"]); else $searchableContent .= "\r\n".$fields["DETAIL_TEXT"]; } if(!empty($fields["PROPERTY_VALUES"]) && is_array($fields["PROPERTY_VALUES"])) { $searchableContent .= self::createSeachableContentForProperty($fields); } $searchableContent = ToUpper($searchableContent); return $searchableContent; } private static function createSeachableContentForProperty($fields) { $searchableContent = ''; global $DB; $properties = array(); foreach($fields["PROPERTY_VALUES"] as $propertyId => $valueData) { if(!$valueData) continue; $properties[$propertyId] = array(); if(is_array($valueData)) { foreach($valueData as $valueId => $value) { if(is_object($value)) continue; if(isset($value["VALUE"])) { if(is_array($value["VALUE"])) { if(!empty($value["VALUE"])) $properties[$propertyId][] = $value["VALUE"]; } else { if(strlen($value["VALUE"]) > 0) $properties[$propertyId][] = $value["VALUE"]; } } else { if(is_array($value)) { foreach($value as $v) { if(strlen($v) > 0) $properties[$propertyId][] = $v; } } else { if(strlen($value) > 0) $properties[$propertyId][] = $value; } } } } else { $properties[$propertyId][] = $valueData; } $queryObject = CIBlockProperty::getById($propertyId); if($property = $queryObject->fetch()) { $propertyValues = array(); if(!empty($property["USER_TYPE"])) { switch($property["USER_TYPE"]) { case "Date": case "DateTime": { $format = "FULL"; if($property["USER_TYPE"] == "Date") $format = "SHORT"; foreach($properties[$propertyId] as $value) { try { $date = new Bitrix\Main\Type\DateTime($value); $propertyValues[] = $date->format($DB->dateFormatToPHP(CSite::getDateFormat($format))); } catch (Exception $ex) { $propertyValues[] = $value; } } break; } case "HTML": { foreach($properties[$propertyId] as $value) { if(is_string($value)) { $unserialize = unserialize($value); if($unserialize) $value = $unserialize; } if(strlen(trim($value["TEXT"])) <= 0) continue; if(isset($value["TYPE"])) { $value["TYPE"] = strtoupper($value["TYPE"]); if($value["TYPE"] == "HTML") $propertyValues[] = HTMLToTxt($value["TEXT"]); } } break; } case "EList": { if(!empty($properties[$propertyId])) { $queryObject = CIBlockElement::getList(array(), array("ID" => $properties[$propertyId]), false, false, array('NAME')); while($element = $queryObject->getNext()) $propertyValues[] = $element["~NAME"]; } break; } case "Money": case "map_yandex": { $propertyValues = $properties[$propertyId]; break; } case "Sequence": { foreach($properties[$propertyId] as $value) $propertyValues[] = intval($value); break; } case "ECrm": { if(Loader::includeModule("crm")) { foreach($properties[$propertyId] as $value) { $explode = explode('_', $value); $type = $explode[0]; $typeId = CCrmOwnerType::resolveID(CCrmOwnerTypeAbbr::resolveName($type)); $propertyValues[] = CCrmOwnerType::getCaption($typeId, $explode[1], false); } } break; } case "employee": { $siteNameFormat = CSite::getNameFormat(false); foreach($properties[$propertyId] as $value) { $user = new CUser(); $userDetails = $user->getByID($value)->fetch(); if(is_array($userDetails)) $propertyValues[] = CUser::formatName($siteNameFormat, $userDetails,true,false); } break; } case "DiskFile": { if(Loader::includeModule("disk")) { foreach($properties[$propertyId] as $value) { if(!is_array($value)) $value = array($value); foreach($value as $v) { if(empty($v)) continue; list($type, $realId) = FileUserType::detectType($v); if($type == FileUserType::TYPE_ALREADY_ATTACHED) { $attachedModel = AttachedObject::loadById($realId); if($attachedModel) { $file = $attachedModel->getFile(); if($file) $propertyValues[] = $file->getName(); } } else { $fileModel = File::loadById($realId, array('STORAGE')); if($fileModel) $propertyValues[] = $fileModel->getName(); } } } } break; } } } else { switch($property["PROPERTY_TYPE"]) { case "S": { $propertyValues = $properties[$propertyId]; break; } case "N": { $propertyValues = $properties[$propertyId]; break; } case "L": { $queryObject = CIBlockProperty::getPropertyEnum($propertyId); while($propertyEnum = $queryObject->fetch()) { if(in_array($propertyEnum["ID"], $properties[$propertyId])) $propertyValues[] = $propertyEnum["VALUE"]; } break; } case "F": { $listPropertyIdForGetExtraValue = array(); foreach($properties[$propertyId] as $value) { if(isset($value["name"])) { if(!empty($value["name"])) { $propertyValues[] = $value["name"]; } else { $listPropertyIdForGetExtraValue[] = $propertyId; } } else { $fileData = CFile::getFileArray($value); if($fileData) $propertyValues[] = $fileData["FILE_NAME"]; } } if(!empty($fields["ID"]) && !empty($listPropertyIdForGetExtraValue)) { $query = CIblockElement::getPropertyValues($property["IBLOCK_ID"], array("ID" => $fields["ID"]), false, array("ID" => $listPropertyIdForGetExtraValue)); if($listExtraPropertyValues = $query->fetch()) { foreach($listExtraPropertyValues as $id => $extraPropertyValues) { if($id == "IBLOCK_ELEMENT_ID") continue; if(is_array($extraPropertyValues)) { foreach($extraPropertyValues as $extraPropertyValue) { $fileData = CFile::getFileArray($extraPropertyValue); if($fileData) $propertyValues[] = $fileData["FILE_NAME"]; } } else { $fileData = CFile::getFileArray($extraPropertyValues); if($fileData) $propertyValues[] = $fileData["FILE_NAME"]; } } } } break; } case "G": { if(!empty($properties[$propertyId])) { $queryObject = CIBlockSection::getList(array(), array("=ID" => $properties[$propertyId]), false, array("NAME")); while($section = $queryObject->getNext()) $propertyValues[] = $section["~NAME"]; } break; } case "E": { if(!empty($properties[$propertyId])) { $queryObject = CIBlockElement::getList(array(), array("ID" => $properties[$propertyId]), false, false, array('NAME')); while($element = $queryObject->getNext()) $propertyValues[] = $element["~NAME"]; } break; } } } foreach($propertyValues as $propertyValue) $searchableContent .= "\r\n".$propertyValue; } } return $searchableContent; } /** * The method return number of elements by iblock id. * * @param $iblockId Iblock id. * @return int * @throws ArgumentException * @throws \Bitrix\Main\Db\SqlQueryException * @throws \Bitrix\Main\SystemException */ public static function getNumberOfElements($iblockId) { $iblockId = intval($iblockId); if(!$iblockId) { throw new ArgumentException(Loc::getMessage("LISTS_REQUIRED_PARAMETER",array("#parameter#" => "iblockId"))); } $connection = Application::getInstance()->getConnection(); $sqlString = "SELECT COUNT(ID) as COUNT FROM b_iblock_element WHERE IBLOCK_ID=".$iblockId; $queryObject = $connection->query($sqlString); $result = $queryObject->fetch(); return intval($result["COUNT"]); } public static function isFeatureEnabled($featureName = '') { if (!IsModuleInstalled("bizproc")) return false; if (!CModule::IncludeModule("bitrix24")) return true; $featureName = (string)$featureName; if ($featureName === "") $featureName = "lists_processes"; if (!isset(static::$featuresCache[$featureName])) static::$featuresCache[$featureName] = \Bitrix\Bitrix24\Feature::isFeatureEnabled($featureName); return static::$featuresCache[$featureName]; } public static function isWorkflowParticipant($workflowId) { global $USER; if ($USER->isAdmin() || $USER->canDoOperation("bitrix24_config")) { return true; } $userId = (int) $USER->getID(); $participants = \CBPTaskService::getWorkflowParticipants($workflowId); if (in_array($userId, $participants)) { return true; } else { $state = \CBPStateService::getWorkflowStateInfo($workflowId); if ($state && $userId === (int) $state['STARTED_BY']) { return true; } } return false; } } ?>