diff --git a/samples/Sample_20_TemplateBlockClone.php b/samples/Sample_20_TemplateBlockClone.php new file mode 100644 index 00000000..781e1eea --- /dev/null +++ b/samples/Sample_20_TemplateBlockClone.php @@ -0,0 +1,18 @@ +loadTemplate('resources/Sample_20_TemplateBlockClone.docx'); + +// Will clone everything between ${tag} and ${/tag}, the number of times. By default, 1. +$document->cloneBlock('CLONEME', 3); + +$name = 'Sample_20_TemplateBlockClone.docx'; +echo date('H:i:s'), " Write to Word2007 format", EOL; +$document->saveAs($name); +rename($name, "results/{$name}"); + +include_once 'Sample_Footer.php'; diff --git a/samples/Sample_21_TemplateBlockDelete.php b/samples/Sample_21_TemplateBlockDelete.php new file mode 100644 index 00000000..6e6ddd28 --- /dev/null +++ b/samples/Sample_21_TemplateBlockDelete.php @@ -0,0 +1,18 @@ +loadTemplate('resources/Sample_21_TemplateBlockDelete.docx'); + +// Everything between ${tag} and ${/tag}, will be deleted/erased. +$document->deleteTemplateBlock('DELETEME'); + +$name = 'Sample_21_TemplateBlockDelete.docx'; +echo date('H:i:s'), " Write to Word2007 format", EOL; +$document->saveAs($name); +rename($name, "results/{$name}"); + +include_once 'Sample_Footer.php'; diff --git a/samples/resources/Sample_20_TemplateBlockClone.docx b/samples/resources/Sample_20_TemplateBlockClone.docx new file mode 100644 index 00000000..16811744 Binary files /dev/null and b/samples/resources/Sample_20_TemplateBlockClone.docx differ diff --git a/samples/resources/Sample_21_TemplateBlockDelete.docx b/samples/resources/Sample_21_TemplateBlockDelete.docx new file mode 100644 index 00000000..58427185 Binary files /dev/null and b/samples/resources/Sample_21_TemplateBlockDelete.docx differ diff --git a/src/PhpWord/Template.php b/src/PhpWord/Template.php index 9d9cc604..537e0343 100644 --- a/src/PhpWord/Template.php +++ b/src/PhpWord/Template.php @@ -257,6 +257,70 @@ class Template $this->_documentXML = $result; } + /** + * Clone a block + * + * @param mixed $blockname + * @param int $clones + * @param bool $replace + * @return null + */ + public function cloneBlock($blockname, $clones = 1, $replace = true) + { + $xmlBlock = null; + preg_match('/(<\?xml.*)(\${'.$blockname.'}<\/w:.*?p>)(.*)()/is', $this->_documentXML, $matchs); + + if (isset($matchs[3])) { + $xmlBlock = $matchs[3]; + $cloned = array(); + for($i = 1; $i <= $clones; $i++) { + $cloned[] = $xmlBlock; + } + + if ($replace) { + $this->_documentXML = str_replace($matchs[2].$matchs[3].$matchs[4], implode('', $cloned), $this->_documentXML); + } + } + return $xmlBlock; + } + + /** + * Replace a block + * + * @param mixed $blockname + * @param $replacement + */ + public function replaceBlock($blockname, $replacement) + { + $this->deleteTemplateBlock($blockname, $replacement); + } + + public function xmlpretty($xml) + { + $domxml = new DOMDocument('1.0'); + $domxml->preserveWhiteSpace = false; + $domxml->formatOutput = true; + $domxml->loadXML($xml); + $xml_string = $domxml->saveXML(); + return $xml_string; + } + + /** + * Delete a block of text + * + * @param mixed $blockname + * @param string $replacement + */ + public function deleteTemplateBlock($blockname, $replacement = '') + { + $xmlBlock = null; + preg_match('/(<\?xml.*)(\${'.$blockname.'}<\/w:.*?p>)(.*)()/is', $this->_documentXML, $matchs); + + if (isset($matchs[3])) { + $this->_documentXML = str_replace($matchs[2].$matchs[3].$matchs[4], $replacement, $this->_documentXML); + } + } + /** * Save XML to temporary file *