• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/body/docx.php
  • Класс: BitrixDocumentGeneratorBodyDocx
  • Вызов: Docx::replaceImages
protected function replaceImages(array $relationshipsData, array $imageData = []): void
{
	$isDocumentChanged = false;
	$relData = $relationshipsData['data'];
	/** @var DOMDocument $document */
	$document = $relationshipsData['document'];
	$relFilesToDelete = $nodesToDelete = [];
	foreach ($imageData as $fieldName => $data)
	{
		$isDeleteImages = true;
		if (!isset($data['innerIDs']))
		{
			continue;
		}
		if (isset($data['values']) && is_array($data['values']))
		{
			$isDeleteImages = false;
			// these are new images created from array values
			// copy original relationship data, fill data
			// delete original node
			$originalImageID = $originalNode = false;
			foreach ($data['values'] as $imageID => $path)
			{
				$originalImageID = $data['originalId'][$imageID];
				if (!isset($relData[static::REL_TYPE_IMAGE][$originalImageID]))
				{
					continue;
				}
				/** @var DOMElement $originalNode */
				$originalNode = $relData[static::REL_TYPE_IMAGE][$originalImageID]['node'];
				$image = $this->getImage($path);
				if($image && $image->isExists() && $image->isReadable() && $originalNode->parentNode)
				{
					$newNode = clone $originalNode;
					$document->importNode($newNode);
					$originalNode->parentNode->insertBefore($newNode, $originalNode);
					$this->importImage($image, $newNode, $imageID);
					$isDocumentChanged = true;
					$this->excludedPlaceholders[] = $fieldName;
				}
			}
			if ($originalImageID)
			{
				$relFilesToDelete[] = 'word/'.$relData[static::REL_TYPE_IMAGE][$originalImageID]['target'];
			}
			if ($originalNode)
			{
				$nodesToDelete[] = $originalNode;
			}
		}
		if (isset($this->values[$fieldName]) && !empty(trim($this->values[$fieldName])))
		{
			$isDeleteImages = false;
			$image = $this->getImage($this->values[$fieldName]);
			if (!$image && $this->isArrayValue($this->values[$fieldName], $fieldName))
			{
				$placeholder = $data['placeholder'] ?? '';
				$modifier = static::getModifierFromPlaceholder($placeholder);
				$modifierData = Value::parseModifier($modifier);
				$index = (int) $modifierData[static::ARRAY_INDEX_MODIFIER];
				$value = $this->values[$fieldName];
				$valueNameParts = explode('.', $value);
				$name = implode('.', array_slice($valueNameParts, 2));
				$arrayProvider = $this->values[$valueNameParts[0]];
				$image = $this->getImage($this->printArrayValueByIndex($arrayProvider, $fieldName, $name, $index, $modifier));
			}
			if ($image && $image->isExists() && $image->isReadable())
			{
				$originalImageID = $originalNode = false;
				foreach($data['innerIDs'] as $imageID)
				{
					$originalImageID = $data['originalId'][$imageID];
					if(!isset($relData[static::REL_TYPE_IMAGE][$originalImageID]))
					{
						continue;
					}
					$originalNode = $relData[static::REL_TYPE_IMAGE][$originalImageID]['node'];
					if(!$originalNode->parentNode)
					{
						continue;
					}
					$newNode = clone $originalNode;
					$document->importNode($newNode);
					$originalNode->parentNode->insertBefore($newNode, $originalNode);
					$this->importImage($image, $newNode, $imageID);
					$isDocumentChanged = true;
					$this->excludedPlaceholders[] = $fieldName;
				}
				if ($originalImageID)
				{
					$relFilesToDelete[] = 'word/'.$relData[static::REL_TYPE_IMAGE][$originalImageID]['target'];
				}
				if ($originalNode)
				{
					$nodesToDelete[] = $originalNode;
				}
			}
		}
		if ($isDeleteImages)
		{
			foreach($data['innerIDs'] as $imageID)
			{
				$relFilesToDelete[] = 'word/'.$data[static::REL_TYPE_IMAGE][$imageID]['target'];
			}
			$originalImageID = $data['originalId'][$imageID];
			if(isset($relData[static::REL_TYPE_IMAGE][$originalImageID]))
			{
				$nodesToDelete[] = $relData[static::REL_TYPE_IMAGE][$originalImageID]['node'];
			}
		}
	}
	$nodesToDelete = $this->getUniqueObjects($nodesToDelete);
	foreach($nodesToDelete as $node)
	{
		$node->parentNode->removeChild($node);
		$isDocumentChanged = true;
	}
	if($isDocumentChanged)
	{
		$this->addContentToZip($document->saveXML(), $relationshipsData['path']);
	}
	foreach($relFilesToDelete as $path)
	{
		$this->zip->deleteName($path);
	}
}