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