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