- Модуль: highloadblock
- Путь к файлу: ~/bitrix/modules/highloadblock/lib/datamanager.php
- Класс: BitrixHighloadblockDataManager
- Вызов: DataManager::update
static function update($primary, array $data)
{
global $USER_FIELD_MANAGER, $APPLICATION;
// check primary
static::normalizePrimary(
$primary, isset($data["fields"]) && is_array($data["fields"]) ? $data["fields"] : $data
);
static::validatePrimary($primary);
/** @var EntityObject $object prepare entity object for compatibility with new code */
$object = static::convertArrayToObject($data, false, $primary);
//$oldData = static::getByPrimary($primary)->fetch();
$object->fill(FieldTypeMask::SCALAR);
$oldData = $object->collectValues(Values::ACTUAL, FieldTypeMask::SCALAR);
$hlblock = static::getHighloadBlock();
$entity = static::getEntity();
$result = new UpdateResult();
try
{
static::callOnBeforeUpdateEvent($object, $data, $result);
// actualize old-style fields array from object
$data = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
// check data by uf manager CheckFieldsWithOldData
if (!$USER_FIELD_MANAGER->checkFieldsWithOldData('HLBLOCK_'.$hlblock['ID'], $oldData, $data))
{
if(is_object($APPLICATION) && $APPLICATION->getException())
{
$e = $APPLICATION->getException();
$result->addError(new EntityEntityError($e->getString()));
$APPLICATION->resetException();
}
else
{
$result->addError(new EntityEntityError("Unknown error while checking userfields"));
}
}
// return if any error
if (!$result->isSuccess(true))
{
return $result;
}
static::callOnUpdateEvent($object, $data, []);
// format data before save
$fields = $USER_FIELD_MANAGER->getUserFieldsWithReadyData('HLBLOCK_'.$hlblock['ID'], $oldData, LANGUAGE_ID, false, 'ID');
list($data, $multiValues) = static::convertValuesBeforeSave($data, $fields);
// data could be changed by uf manager
foreach ($data as $k => $v)
{
$object->set($k, $v);
}
// use save modifiers
foreach ($data as $fieldName => $value)
{
$field = static::getEntity()->getField($fieldName);
$data[$fieldName] = $field->modifyValueBeforeSave($value, $data);
}
$connection = MainApplication::getConnection();
if (!empty($data))
{
// save data
$helper = $connection->getSqlHelper();
$tableName = $entity->getDBTableName();
$update = $helper->prepareUpdate($tableName, $data);
$id = array();
foreach ($primary 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($data);
$result->setPrimary($primary);
$result->setObject($object);
// save multi values
if (!empty($multiValues))
{
foreach ($multiValues as $userfieldName => $values)
{
$utmTableName = HighloadBlockTable::getMultipleValueTableName($hlblock, $fields[$userfieldName]);
// first, delete old values
$connection->query(sprintf(
'DELETE FROM %s WHERE %s = %d',
$helper->quote($utmTableName), $helper->quote('ID'), $primary['ID']
));
// insert new values
foreach ($values as $value)
{
$connection->add($utmTableName, array('ID' => $primary['ID'], 'VALUE' => $value));
}
}
}
$entity->cleanCache();
// event after update
static::callOnAfterUpdateEvent($object, $data);
}
catch (Exception $e)
{
// check result to avoid warning
$result->isSuccess();
throw $e;
}
return $result;
}