diff --git a/CHANGELOG.md b/CHANGELOG.md index eadf99a6..4f4cd810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This release changed PHPWord license from LGPL 2.1 to LGPL 3. - TextBox: Ability to add table inside textbox - @basjan GH-231 - HTML: Ability to add elements to PHPWord object via html - @basjan GH-231 - ListItemRun: New element that can add a list item with inline formatting like a textrun - @basjan GH-235 +- Table: Ability to add table inside a cell (nested table) - @ivanlanin GH-149 ### Bugfixes diff --git a/samples/Sample_09_Tables.php b/samples/Sample_09_Tables.php index 5b4b1300..5f77f8db 100644 --- a/samples/Sample_09_Tables.php +++ b/samples/Sample_09_Tables.php @@ -84,6 +84,16 @@ $table->addCell(2000, $cellVCentered)->addText('C', null, $cellHCentered); $table->addCell(2000, $cellVCentered)->addText('D', null, $cellHCentered); $table->addCell(null, $cellRowContinue); +// 4. Nested table + +$section->addTextBreak(2); +$section->addText('Nested table', $header); + +$cell = $section->addTable()->addRow()->addCell(); +$cell->addText('This cell contains nested table.'); +$innerCell = $cell->addTable()->addRow()->addCell(); +$innerCell->addText('Inside nested table'); + // Save file echo write($phpWord, basename(__FILE__, '.php'), $writers); if (!CLI) { diff --git a/src/PhpWord/Element/AbstractContainer.php b/src/PhpWord/Element/AbstractContainer.php index 2c14d9a3..86b604f4 100644 --- a/src/PhpWord/Element/AbstractContainer.php +++ b/src/PhpWord/Element/AbstractContainer.php @@ -217,14 +217,14 @@ abstract class AbstractContainer extends AbstractElement public function addListItemRun($depth = 0, $fontStyle = null, $listStyle = null, $paragraphStyle = null) { $this->checkValidity('ListItemRun'); - + $element = new ListItemRun($depth, $fontStyle, $listStyle, $paragraphStyle); $element->setDocPart($this->getDocPart(), $this->getDocPartId()); $this->addElement($element); - + return $element; } - + /** * Add table element * @@ -374,8 +374,8 @@ abstract class AbstractContainer extends AbstractElement 'Object' => $allContainers, 'TextRun' => array('section', 'header', 'footer', 'cell', 'textbox'), 'ListItem' => array('section', 'header', 'footer', 'cell', 'textbox'), - 'ListItemRun' => array('section', 'header', 'footer', 'cell', 'textbox'), - 'Table' => array('section', 'header', 'footer', 'textbox'), + 'ListItemRun' => array('section', 'header', 'footer', 'cell', 'textbox'), + 'Table' => array('section', 'header', 'footer', 'cell', 'textbox'), 'CheckBox' => array('section', 'header', 'footer', 'cell'), 'TextBox' => array('section', 'header', 'footer', 'cell'), 'Footnote' => array('section', 'textrun', 'cell'), diff --git a/src/PhpWord/Writer/Word2007/Element/Container.php b/src/PhpWord/Writer/Word2007/Element/Container.php index bf45e760..150cb324 100644 --- a/src/PhpWord/Writer/Word2007/Element/Container.php +++ b/src/PhpWord/Writer/Word2007/Element/Container.php @@ -43,19 +43,23 @@ class Container extends AbstractElement $containerClass = substr(get_class($container), strrpos(get_class($container), '\\') + 1); $withoutP = in_array($containerClass, array('TextRun', 'Footnote', 'Endnote', 'ListItemRun')) ? true : false; - // Loop through subelements - $subelements = $container->getElements(); - if (count($subelements) > 0) { - foreach ($subelements as $subelement) { - $writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, get_class($subelement)); + // Loop through elements + $elements = $container->getElements(); + $elementClass = ''; + if (count($elements) > 0) { + foreach ($elements as $element) { + $elementClass = get_class($element); + $writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass); if (class_exists($writerClass)) { - $writer = new $writerClass($xmlWriter, $subelement, $withoutP); + $writer = new $writerClass($xmlWriter, $element, $withoutP); $writer->write(); } } - } else { - // Special case for Cell: They have to contain a TextBreak at least - if ($containerClass == 'Cell') { + } + + // Special case for Cell: They have to contain a w:p element at the end + if ($containerClass == 'Cell') { + if ($elementClass == '' || $elementClass == 'PhpOffice\\PhpWord\\Element\\Table') { $writerClass = "{$this->namespace}\\TextBreak"; $writer = new $writerClass($xmlWriter, new TextBreakElement(), $withoutP); $writer->write();