• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/usertypemanager.php
  • Класс: CUserTypeManager
  • Вызов: CUserTypeManager::Update
function Update($entity_id, $ID, $arFields, $user_id = false)
{
	global $DB;

	$entity_id = preg_replace("/[^0-9A-Z_]+/", "", $entity_id);

	$result = $this->updateUserFieldValuesByEvent($entity_id, (int)$ID, $arFields);
	if($result !== null)
	{
		return $result;
	}

	$arUpdate = array();
	$arBinds = array();
	$arInsert = array();
	$arInsertType = array();
	$arDelete = array();
	$arUserFields = $this->GetUserFields($entity_id, $ID, false, $user_id);
	foreach($arUserFields as $FIELD_NAME => $arUserField)
	{
		if(array_key_exists($FIELD_NAME, $arFields))
		{
			$arUserField['VALUE_ID'] = $ID;
			if($arUserField["MULTIPLE"] == "N")
			{
				if(is_callable(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesave")))
					$arFields[$FIELD_NAME] = call_user_func_array(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesave"), array($arUserField, $arFields[$FIELD_NAME], $user_id));

				if((string)$arFields[$FIELD_NAME] !== '')
					$arUpdate[$FIELD_NAME] = $arFields[$FIELD_NAME];
				else
					$arUpdate[$FIELD_NAME] = false;
			}
			elseif(is_array($arFields[$FIELD_NAME]))
			{
				$arInsert[$arUserField["ID"]] = array();
				$arInsertType[$arUserField["ID"]] = $arUserField["USER_TYPE"];
				$arInsertType[$arUserField['ID']]['FIELD_NAME'] = $arUserField['FIELD_NAME'];

				if(is_callable(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesaveall")))
				{
					$arInsert[$arUserField["ID"]] = call_user_func_array(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesaveall"), array($arUserField, $arFields[$FIELD_NAME], $user_id));
				}
				else
				{
					foreach($arFields[$FIELD_NAME] as $value)
					{
						if(is_callable(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesave")))
							$value = call_user_func_array(array($arUserField["USER_TYPE"]["CLASS_NAME"], "onbeforesave"), array($arUserField, $value, $user_id));

						if((string)$value <> '')
						{
							switch($arInsertType[$arUserField["ID"]]["BASE_TYPE"])
							{
								case "int":
								case "file":
								case "enum":
									$value = intval($value);
									break;
								case "double":
									$value = doubleval($value);
									if(!is_finite($value))
									{
										$value = 0;
									}
									break;
								case "string":
									$value = (string) $value;
									break;
							}
							$arInsert[$arUserField["ID"]][] = $value;
						}
					}
				}

				if($arUserField['USER_TYPE_ID'] == 'datetime')
				{
					$serialized = BitrixMainUserFieldTable::serializeMultipleDatetime($arInsert[$arUserField["ID"]]);
				}
				elseif($arUserField['USER_TYPE_ID'] == 'date')
				{
					$serialized = BitrixMainUserFieldTable::serializeMultipleDate($arInsert[$arUserField["ID"]]);
				}
				else
				{
					$serialized = serialize($arInsert[$arUserField["ID"]]);
				}

				$arBinds[$FIELD_NAME] = $arUpdate[$FIELD_NAME] = $serialized;

				$arDelete[$arUserField["ID"]] = true;
			}
		}
	}

	$lower_entity_id = mb_strtolower($entity_id);

	if(!empty($arUpdate))
	{
		$strUpdate = $DB->PrepareUpdate("b_uts_" . $lower_entity_id, $arUpdate);
	}
	else
	{
		return false;
	}

	$DB->StartTransaction();

	$result = false;
	if($strUpdate <> '')
	{
		$result = true;
		$rs = $DB->QueryBind("UPDATE b_uts_" . $lower_entity_id . " SET " . $strUpdate . " WHERE VALUE_ID = " . intval($ID), $arBinds);
		$rows = $rs->AffectedRowsCount();
	}
	else
	{
		$rows = 0;
	}

	if(intval($rows) <= 0)
	{
		$rs = $DB->Query("SELECT 'x' FROM b_uts_" . $lower_entity_id . " WHERE VALUE_ID = " . intval($ID), false, "FILE: " . __FILE__ . "
LINE: " . __LINE__); if($rs->Fetch()) $rows = 1; } if($rows <= 0) { $arUpdate["ID"] = $arUpdate["VALUE_ID"] = $ID; $DB->Add("b_uts_" . $lower_entity_id, $arUpdate, array_keys($arBinds)); } else { foreach($arDelete as $key => $value) { $DB->Query("DELETE from b_utm_" . $lower_entity_id . " WHERE FIELD_ID = " . intval($key) . " AND VALUE_ID = " . intval($ID), false, "FILE: " . __FILE__ . "
LINE: " . __LINE__); } } foreach($arInsert as $FieldId => $arField) { switch($arInsertType[$FieldId]["BASE_TYPE"]) { case "int": case "file": case "enum": $COLUMN = "VALUE_INT"; break; case "double": $COLUMN = "VALUE_DOUBLE"; break; case "datetime": $COLUMN = "VALUE_DATE"; break; default: $COLUMN = "VALUE"; } foreach($arField as $value) { if($value instanceof BitrixMainTypeDate) { // little hack to avoid timezone vs 00:00:00 ambiguity. for utm only $value = new BitrixMainTypeDateTime($value->format('Y-m-d H:i:s'), 'Y-m-d H:i:s'); } switch($arInsertType[$FieldId]["BASE_TYPE"]) { case "int": case "file": case "enum": case "double": break; case "datetime": $userFieldName = $arInsertType[$FieldId]['FIELD_NAME']; $value = DateTimeType::charToDate($arUserFields[$userFieldName], $value); break; default: $value = "'" . $DB->ForSql($value) . "'"; } $DB->Query("INSERT INTO b_utm_" . $lower_entity_id . " (VALUE_ID, FIELD_ID, " . $COLUMN . ") VALUES (" . intval($ID) . ", '" . $FieldId . "', " . $value . ")", false, "FILE: " . __FILE__ . "
LINE: " . __LINE__); } } $DB->Commit(); return $result; }