getXmlWriter(); $element = $this->getElement(); $titles = $element->getTitles(); $writeFieldMark = true; foreach ($titles as $title) { $this->writeTitle($title, $writeFieldMark); if ($writeFieldMark) { $writeFieldMark = false; } } $xmlWriter->startElement('w:p'); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:fldChar'); $xmlWriter->writeAttribute('w:fldCharType', 'end'); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->endElement(); } /** * Write title * * @param \PhpOffice\PhpWord\Element\Title $title * @param bool $writeFieldMark */ private function writeTitle($title, $writeFieldMark) { $xmlWriter = $this->getXmlWriter(); $element = $this->getElement(); $tocStyle = $element->getStyleTOC(); $fontStyle = $element->getStyleFont(); $isObject = ($fontStyle instanceof Font) ? true : false; $anchor = '_Toc' . ($title->getBookmarkId() + 252634154); $indent = ($title->getDepth() - 1) * $tocStyle->getIndent(); $xmlWriter->startElement('w:p'); // Write style and field mark $this->writeStyle($indent); if ($writeFieldMark) { $this->writeFieldMark(); } // Hyperlink $xmlWriter->startElement('w:hyperlink'); $xmlWriter->writeAttribute('w:anchor', $anchor); $xmlWriter->writeAttribute('w:history', '1'); // Title text $xmlWriter->startElement('w:r'); if ($isObject) { $styleWriter = new FontStyleWriter($xmlWriter, $fontStyle); $styleWriter->write(); } $xmlWriter->startElement('w:t'); $xmlWriter->writeRaw($title->getText()); $xmlWriter->endElement(); $xmlWriter->endElement(); // w:r $xmlWriter->startElement('w:r'); $xmlWriter->writeElement('w:tab', null); $xmlWriter->endElement(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:fldChar'); $xmlWriter->writeAttribute('w:fldCharType', 'begin'); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:instrText'); $xmlWriter->writeAttribute('xml:space', 'preserve'); $xmlWriter->writeRaw('PAGEREF ' . $anchor . ' \h'); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:fldChar'); $xmlWriter->writeAttribute('w:fldCharType', 'end'); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->endElement(); // w:hyperlink $xmlWriter->endElement(); // w:p } /** * Write style * * @param int $indent */ private function writeStyle($indent) { $xmlWriter = $this->getXmlWriter(); $element = $this->getElement(); $tocStyle = $element->getStyleTOC(); $fontStyle = $element->getStyleFont(); $isObject = ($fontStyle instanceof Font) ? true : false; $xmlWriter->startElement('w:pPr'); // Paragraph if ($isObject && !is_null($fontStyle->getParagraphStyle())) { $styleWriter = new ParagraphStyleWriter($xmlWriter, $fontStyle->getParagraphStyle()); $styleWriter->write(); } // Font if (!empty($fontStyle) && !$isObject) { $xmlWriter->startElement('w:rPr'); $xmlWriter->startElement('w:rStyle'); $xmlWriter->writeAttribute('w:val', $fontStyle); $xmlWriter->endElement(); $xmlWriter->endElement(); // w:rPr } // Tab $xmlWriter->startElement('w:tabs'); $styleWriter = new TabStyleWriter($xmlWriter, $tocStyle); $styleWriter->write(); $xmlWriter->endElement(); // Indent if ($indent > 0) { $xmlWriter->startElement('w:ind'); $xmlWriter->writeAttribute('w:left', $indent); $xmlWriter->endElement(); } $xmlWriter->endElement(); // w:pPr } /** * Write TOC Field */ private function writeFieldMark() { $xmlWriter = $this->getXmlWriter(); $element = $this->getElement(); $minDepth = $element->getMinDepth(); $maxDepth = $element->getMaxDepth(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:fldChar'); $xmlWriter->writeAttribute('w:fldCharType', 'begin'); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:instrText'); $xmlWriter->writeAttribute('xml:space', 'preserve'); $xmlWriter->writeRaw("TOC \o {$minDepth}-{$maxDepth} \h \z \u"); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:fldChar'); $xmlWriter->writeAttribute('w:fldCharType', 'separate'); $xmlWriter->endElement(); $xmlWriter->endElement(); } }