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