- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/orm/data/datamanager.php
- Класс: Bitrix\Main\ORM\Data\DataManager
- Вызов: DataManager::update
static function update($primary, array $data)
{
global $USER_FIELD_MANAGER;
// check primary
static::normalizePrimary(
$primary, isset($data["fields"]) && is_array($data["fields"]) ? $data["fields"] : $data
);
static::validatePrimary($primary);
// compatibility
$fields = $data;
// prepare entity object for compatibility with new code
$object = static::convertArrayToObject($fields, false, $primary);
$entity = static::getEntity();
$result = new UpdateResult();
try
{
static::callOnBeforeUpdateEvent($object, $fields, $result);
// actualize old-style fields array from object
$fields = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
// uf values
$ufdata = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);
// check data
static::checkFields($result, $primary, $fields);
// check uf data
if (!empty($ufdata))
{
static::checkUfFields($object, $ufdata, $result);
}
// check if there is still some data
if (empty($fields) && empty($ufdata))
{
return $result;
}
// return if any error
if (!$result->isSuccess(true))
{
return $result;
}
static::callOnUpdateEvent($object, $fields, $ufdata);
// use save modifiers
$fieldsToDb = $fields;
foreach ($fieldsToDb as $fieldName => $value)
{
$field = $entity->getField($fieldName);
$fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
}
// save data
if (!empty($fieldsToDb))
{
$connection = $entity->getConnection();
$helper = $connection->getSqlHelper();
$tableName = $entity->getDBTableName();
$dataReplacedColumn = static::replaceFieldName($fieldsToDb);
$update = $helper->prepareUpdate($tableName, $dataReplacedColumn);
$replacedPrimary = static::replaceFieldName($primary);
$id = array();
foreach ($replacedPrimary as $k => $v)
{
$id[] = $helper->prepareAssignment($tableName, $k, $v);
}
$where = implode(' AND ', $id);
$sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
$connection->queryExecute($sql, $update[1]);
$result->setAffectedRowsCount($connection);
}
$result->setData($fields + $ufdata);
$result->setPrimary($primary);
$result->setObject($object);
// save uf data
if (!empty($ufdata))
{
$ufUserId = false;
if ($object->authContext)
{
$ufUserId = $object->authContext->getUserId();
}
$USER_FIELD_MANAGER->update($entity->getUfId(), end($primary), $ufdata, $ufUserId);
}
static::cleanCache();
// event after update
static::callOnAfterUpdateEvent($object, $fields + $ufdata);
}
catch (\Exception $e)
{
// check result to avoid warning
$result->isSuccess();
throw $e;
}
return $result;
}