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