• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/body/docx.php
  • Класс: BitrixDocumentGeneratorBodyDocx
  • Вызов: Docx::addNumberings
protected function addNumberings(array $numberingIds): void
{
	if(empty($numberingIds))
	{
		return;
	}
	if(!$this->numbering['documentPath'])
	{
		/** @var DOMDocument $relationshipsDocument */
		$relationshipsDocument = $this->innerDocuments[static::PATH_DOCUMENT]['relationships']['document'];
		if(!$relationshipsDocument)
		{
			return;
		}
		$relationshipsNode = $relationshipsDocument->getElementsByTagName('Relationships')->item(0);
		if(!$relationshipsNode)
		{
			return;
		}
		$this->numbering['documentPath'] = static::PATH_NUMBERING;
		$this->addContentToZip($this->getEmptyNumberingXmlContent(), $this->numbering['documentPath']);
		DocxXml::appendXmlToNode(
			'',
			$relationshipsDocument,
			$relationshipsNode
		);
		$this->addContentToZip($relationshipsDocument->saveXML(), $this->innerDocuments[static::PATH_DOCUMENT]['relationships']['path']);
		$this->addRecordToContentTypes([
			'path' => '/word/numbering.xml',
			'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml',
		]);
	}

	if(!$this->numbering['document'])
	{
		$numberingContent = $this->zip->getFromName($this->numbering['documentPath']);
		if (empty($numberingContent))
		{
			return;
		}

		$numberingDocument = new DOMDocument();
		try
		{
			$numberingDocument->loadXML($numberingContent);
		}
		catch (ValueError $emptyArgumentError)
		{
			Application::getInstance()->getExceptionHandler()->writeToLog($emptyArgumentError);
		}
		$this->numbering['document'] = $numberingDocument;
	}

	/** @var DOMDocument $numberingDocument */
	$numberingDocument = $this->numbering['document'];
	$numberingNode = null;
	$numberingNodes = $numberingDocument->getElementsByTagNameNS(DocxXml::getNamespaces()['w'], 'numbering');
	if($numberingNodes)
	{
		$numberingNode = $numberingNodes->item(0);
	}

	if(!$numberingNode)
	{
		return;
	}

	if(!isset($this->numbering['abstractOrderedNumberingId']) || !isset($this->numbering['abstractUnorderedNumberingId']))
	{
		foreach($numberingDocument->getElementsByTagNameNS(DocxXml::getNamespaces()['w'], 'abstractNum') as $abstractNum)
		{
			/** @var DOMElement $abstractNum */
			$abstractNumId = $abstractNum->attributes->getNamedItemNS(DocxXml::getNamespaces()['w'], 'abstractNumId');
			if($abstractNumId === static::ABSTRACT_ORDERED_NUMBERING_ID)
			{
				$this->numbering['abstractOrderedNumberingId'] = $abstractNumId;
			}
			elseif($abstractNumId === static::ABSTRACT_UNORDERED_NUMBERING_ID)
			{
				$this->numbering['abstractUnorderedNumberingId'] = $abstractNumId;
			}
		}
	}

	if(!isset($this->numbering['firstConcreteNumNode']))
	{
		$numNodes = $numberingDocument->getElementsByTagNameNS(DocxXml::getNamespaces()['w'], 'num');
		if($numNodes)
		{
			$this->numbering['firstConcreteNumNode'] = $numNodes->item(0);
		}
	}

	if(!isset($this->numbering['abstractOrderedNumberingId']))
	{
		if($this->numbering['firstConcreteNumNode'] && $this->numbering['firstConcreteNumNode'] instanceof DOMNode)
		{
			DocxXml::insertXmlBeforeNode($this->getAbstractOrderedNumberingDescription(), $numberingDocument, $this->numbering['firstConcreteNumNode']);
		}
		else
		{
			DocxXml::appendXmlToNode($this->getAbstractOrderedNumberingDescription(), $numberingDocument, $numberingNode);
		}
		$this->numbering['abstractOrderedNumberingId'] = static::ABSTRACT_ORDERED_NUMBERING_ID;
	}

	if(!isset($this->numbering['abstractUnorderedNumberingId']))
	{
		if($this->numbering['firstConcreteNumNode'] && $this->numbering['firstConcreteNumNode'] instanceof DOMNode)
		{
			DocxXml::insertXmlBeforeNode($this->getAbstractUnorderedNumberingDescription(), $numberingDocument, $this->numbering['firstConcreteNumNode']);
		}
		else
		{
			DocxXml::appendXmlToNode($this->getAbstractUnorderedNumberingDescription(), $numberingDocument, $numberingNode);
		}
		$this->numbering['abstractUnorderedNumberingId'] = static::ABSTRACT_UNORDERED_NUMBERING_ID;
	}

	foreach($numberingIds as $numbering)
	{
		if($numbering['type'] === DocxXml::NUMBERING_TYPE_ORDERED)
		{
			DocxXml::appendXmlToNode(
				'',
				$numberingDocument,
				$numberingNode
			);
		}
		elseif($numbering['type'] === DocxXml::NUMBERING_TYPE_UNORDERED)
		{
			DocxXml::appendXmlToNode(
				'',
				$numberingDocument,
				$numberingNode
			);
		}
	}

	$this->addContentToZip($numberingDocument->saveXML(), $this->numbering['documentPath']);
}