22 private array $elementOldFields;
23 private array $elementOldProps;
24 private array $propsMap = [];
25 private array $select = [];
44 protected function init(): void
46 $this->elementOldFields = $this->getElementFieldsData();
47 $this->elementOldProps = $this->getElementPropsData();
117 return $this->values[$fieldsId] ??
null;
129 ->setHasChangedFields(
false)
130 ->setHasChangedProps(
false)
141 $element = array_merge($element, $preparedFields);
146 $element[
'PROPERTY_VALUES'] = $preparedProps;
149 return $result->setElementData($element);
154 $hasChangedFields =
false;
157 foreach (
$fields as $fieldId => $property)
159 if ($fieldId ===
'NAME' && empty($property[
'SETTINGS']))
161 $property[
'SETTINGS'] = [
'SHOW_EDIT_FORM' =>
'Y'];
164 $showEditForm = isset($property[
'SETTINGS'][
'SHOW_EDIT_FORM']) && $property[
'SETTINGS'][
'SHOW_EDIT_FORM'] ===
'Y';
165 $isEditReadOnlyField = in_array($fieldId, [
'DATE_CREATE',
'TIMESTAMP_X',
'CREATED_BY',
'MODIFIED_BY']);
166 if (isset($property[
'SETTINGS'][
'EDIT_READ_ONLY_FIELD']))
168 $isEditReadOnlyField = $property[
'SETTINGS'][
'EDIT_READ_ONLY_FIELD'] ===
'Y';
172 if (!$showEditForm || $isEditReadOnlyField)
174 if (array_key_exists($fieldId, $this->elementOldFields))
176 $prepared[$fieldId] = $this->elementOldFields[$fieldId];
182 if (in_array($fieldId, [
'PREVIEW_TEXT',
'DETAIL_TEXT'],
true))
184 $useEditor = isset($property[
'SETTINGS'][
'USE_EDITOR']) && $property[
'SETTINGS'][
'USE_EDITOR'] ===
'Y';
185 $prepared[$fieldId .
'_TYPE'] = $useEditor ?
'html' :
'text';
189 $prepared[$fieldId] = $value;
191 if ($hasChangedFields ===
false && array_key_exists($fieldId, $this->elementOldFields))
193 $oldValue = $this->elementOldFields[$fieldId];
194 if (!$this->isEqualAsStrings($oldValue, $value))
196 $hasChangedFields =
true;
201 $result->setHasChangedFields($hasChangedFields);
208 $hasChangedProps =
false;
212 $propertyId = $property[
'ID'];
214 $showEditForm = ($property[
'SETTINGS'][
'SHOW_EDIT_FORM'] ??
'Y') ===
'Y';
215 $isEditReadOnlyField = ($property[
'SETTINGS'][
'EDIT_READ_ONLY_FIELD'] ??
'N') ===
'Y';
218 if (!$showEditForm || $isEditReadOnlyField)
220 if (array_key_exists(
$key, $this->elementOldProps))
222 $prepared[$propertyId] = $this->elementOldProps[
$key];
229 if (is_array($requestValues))
233 if ($hasChangedProps ===
false && array_key_exists(
$key, $this->elementOldProps))
235 $oldValue = $this->elementOldProps[
$key];
237 $newValue = array_filter($requestValues);
238 if ($property[
'TYPE'] ===
'S:HTML')
240 $newValue = array_map(
static fn(
$text) => [
'TYPE' =>
'HTML',
'TEXT' =>
$text], $newValue);
241 if (!$this->isEqualAsMultiArrays($newValue, $oldValue))
243 $hasChangedProps =
true;
246 elseif (!$this->isEqualAsArrays($newValue, $oldValue))
248 $hasChangedProps =
true;
254 $result->setHasChangedProps($hasChangedProps);
261 $baseType = $property[
'TYPE'];
262 $type = $property[
'PROPERTY_TYPE'];
263 $isMultiple = $property[
'MULTIPLE'] ===
'Y';
266 foreach ($requestValues as
$key => $value)
268 if (in_array(
$type, [
'L',
'E',
'G'],
true))
287 if (
$type ===
'N' && !empty($value))
289 if (is_string($value))
291 $value = str_replace([
',',
' '], [
'.',
''], $value);
294 if (is_numeric($value))
296 $value = (double)$value;
304 'LISTS_LIB_API_DATA_IBLOCK_SERVICE_VALIDATE_FIELD_ERROR',
305 [
'#FIELD_NAME#' => $property[
'NAME']]
314 if (
$type ===
'S' && $baseType ===
'S:HTML')
316 if (!is_array($value) || !isset($value[
'TYPE'], $value[
'TEXT']))
318 $value = [
'TYPE' =>
'html',
'TEXT' => is_scalar($value) ? (string)$value :
''];
333 private function getElementFieldsData():
array
337 $this->
select = [
'ID',
'IBLOCK_SECTION_ID'];
339 $list = new \CList($this->iBlockId);
340 foreach ($list->GetFields() as $fieldId => $property)
342 if ($list->is_field($fieldId))
344 $this->
select[] = $fieldId;
347 if ($fieldId ===
'CREATED_BY')
349 $this->
select[] =
'CREATED_USER_NAME';
352 if ($fieldId ===
'MODIFIED_BY')
354 $this->
select[] =
'USER_NAME';
362 'CHECK_PERMISSIONS' =>
false,
367 return is_array($element) ? $element : [];
370 private function getElementPropsData():
array
372 $elementProperties = \CIBlockElement::GetProperty(
373 $this->iBlockId, $this->elementId,
'sort',
'asc', [
'ACTIVE' =>
'Y']
377 while ($property = $elementProperties->Fetch())
379 $propertyId = $property[
'ID'];
380 $propertyValueId = $property[
'PROPERTY_VALUE_ID'] ??
null;
383 $key =
'PROPERTY_' . $propertyId;
384 if (!array_key_exists(
$key, $properties))
386 $properties[
$key] = [];
394 $this->propsMap[
$key] = $property[
'CODE'] ?? $property[
'ID'];
402 $oldData = array_merge($this->elementOldFields, $this->elementOldProps);
403 $newData = array_merge($this->getElementFieldsData(), $this->getElementPropsData());
406 unset($valuesToChange[
'ID'], $valuesToChange[
'IBLOCK_ID'], $valuesToChange[
'DATE_CREATE'], $valuesToChange[
'CREATED_BY']);
409 foreach (array_keys($valuesToChange) as
$key)
411 if (!array_key_exists(
$key, $oldData) || !array_key_exists(
$key, $newData))
416 $oldValue = $oldData[
$key];
417 $newValue = $newData[
$key];
418 if (empty($oldValue) && empty($newValue))
423 $modifiedKey = array_key_exists(
$key, $this->propsMap) ?
'PROPERTY_' . $this->propsMap[
$key] :
$key;
425 $isArrayOldValue = is_array($oldValue);
426 $isArrayNewValue = is_array($newValue);
428 if (!$isArrayOldValue && !$isArrayNewValue)
430 if (!$this->isEqualAsStrings($oldValue, $newValue))
432 $changed[] = $modifiedKey;
438 $oldValue = $isArrayOldValue ? $oldValue : [$oldValue];
439 $newValue = $isArrayNewValue ? $newValue : [$newValue];
441 if (is_array(current($newValue)) || is_array(current($oldValue)))
443 if (!$this->isEqualAsMultiArrays($newValue, $oldValue))
445 $changed[] = $modifiedKey;
448 elseif (!$this->isEqualAsArrays($newValue, $oldValue))
450 $changed[] = $modifiedKey;
457 private function isEqualAsStrings($string1, $string2): bool
459 if (!is_string($string1))
462 (is_scalar($string1) || (is_object($string1) && method_exists($string1,
'__toString')))
468 if (!is_string($string2))
471 (is_scalar($string2) || (is_object($string2) && method_exists($string2,
'__toString')))
477 return strcmp($string1, $string2) === 0;
480 private function isEqualAsMultiArrays(
array $value1,
array $value2): bool
482 $oldFieldValues = [];
483 $newFieldValues = [];
485 foreach ($value1 as $singleValue)
487 if (is_array($singleValue))
489 if (isset($singleValue[
'TEXT']))
491 $oldFieldValues[] = $singleValue[
'TEXT'];
497 $oldFieldValues[] = $singleValue;
499 foreach ($value2 as $singleValue)
501 if (is_array($singleValue))
503 if (isset($singleValue[
'TEXT']))
505 $newFieldValues[] = $singleValue[
'TEXT'];
511 $newFieldValues[] = $singleValue;
514 return $this->isEqualAsArrays($newFieldValues, $oldFieldValues);
517 private function isEqualAsArrays(
array $value1,
array $value2): bool
519 $differences = array_diff($value1, $value2);
520 if (!empty($differences))
525 $differences = array_diff($value2, $value1);
527 return empty($differences);
532 if (!$this->isLocalizationLoaded)
534 Loc::loadLanguageFile(
536 . Path::normalize(
'/bitrix/modules/lists/lib/Api/Data/IBlockService/IBlockElementToUpdate')
539 $this->isLocalizationLoaded =
true;
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)