12 private $enumRatio = [];
13 private $enumTmpMap = [];
15 private array $fieldRatio = [];
24 $this->result =
new Result();
34 return $this->enumRatio;
47 $this->addFields($copiedIblockId,
$fields);
49 $properties = $this->getProperty(
$iblockId);
50 $this->addProperties($copiedIblockId, $properties);
55 private function getFieldsToCopy(
$iblockId)
60 private function addFields($copiedIblockId,
$fields)
62 \CIBlock::setFields($copiedIblockId,
$fields);
64 global $stackCacheManager;
65 if (is_object($stackCacheManager))
67 $stackCacheManager->clear(
"b_iblock");
76 $queryObject = \CIBlock::getProperties(
$iblockId);
77 while ($property = $queryObject->fetch())
85 private function addProperties($copiedIblockId,
array $properties)
87 foreach ($properties as $propertyField)
90 $propertyField[
"IBLOCK_ID"] = $copiedIblockId;
92 $property = new \CIBlockProperty;
93 $propertyId = $property->add($propertyField);
98 && !empty($propertyField[
'LIST'])
99 && is_array($propertyField[
'LIST'])
102 $this->addPropertyList($propertyId, $propertyField[
"LIST"]);
104 $this->fieldRatio[
$iblockId][$propertyField[
'ID']] = $propertyId;
107 $error = $property->getLastError();
110 $this->result->addError(
new Error(
$error, self::FIELD_COPY_ERROR));
115 private function addPropertyList($propertyId, $list)
117 foreach ($list as $id => $enum)
121 $value = trim($enum[
"VALUE"],
" \t\n\r");
124 $enum[
"PROPERTY_ID"] = $propertyId;
125 \CIBlockPropertyEnum::add($enum);
135 $this->enumTmpMap[$fieldId] = [];
137 $propertyId = mb_substr($fieldId, mb_strlen(
"PROPERTY_"));
138 $enum = \CIBlockPropertyEnum::getList([], [
"PROPERTY_ID" => $propertyId]);
139 while ($listData = $enum->fetch())
142 "VALUE" => $listData[
"VALUE"],
143 "DEF" => $listData[
"DEF"],
144 "SORT" => $listData[
"SORT"]
147 $this->enumTmpMap[$fieldId][$listData[
"VALUE"]] = $listData[
"ID"];
155 if (array_key_exists($fieldId, $this->enumTmpMap))
157 $enumTmpMap = $this->enumTmpMap[$fieldId];
159 if (!is_array($this->enumRatio[
$iblockId]))
163 $propertyId = mb_substr($copiedFieldId, mb_strlen(
"PROPERTY_"));
164 $enum = \CIBlockPropertyEnum::getList([], [
"PROPERTY_ID" => $propertyId]);
165 while ($listData = $enum->fetch())
167 if (array_key_exists($listData[
"VALUE"], $enumTmpMap))
169 $this->enumRatio[
$iblockId][$enumTmpMap[$listData[
"VALUE"]]] = $listData[
"ID"];
182 return $this->fieldRatio;
196 $this->fieldRatio[
$iblockId][$fieldId] = $newFieldId;