Skip to content

Commit 688e3db

Browse files
crystolineProgi1984
authored andcommitted
added support for REF field
1 parent 91cef47 commit 688e3db

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

src/PhpWord/Element/Field.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ class Field extends AbstractElement
9191
],
9292
'options' => ['Path', 'PreserveFormat'],
9393
],
94+
'REF' => array(
95+
'properties' => array('name' => ''),
96+
'options' => array('f', 'h', 'n', 'p', 'r', 't', 'w'),
97+
),
9498
];
9599

96100
/**

src/PhpWord/Writer/Word2007/Element/Field.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,4 +226,98 @@ private function buildPropertiesAndOptions(\PhpOffice\PhpWord\Element\Field $ele
226226

227227
return $propertiesAndOptions;
228228
}
229+
230+
/**
231+
* Writes a REF field
232+
*
233+
* @param \PhpOffice\PhpWord\Element\Field $element
234+
*/
235+
protected function writeRef(\PhpOffice\PhpWord\Element\Field $element)
236+
{
237+
$xmlWriter = $this->getXmlWriter();
238+
$this->startElementP();
239+
240+
$xmlWriter->startElement('w:r');
241+
$xmlWriter->startElement('w:fldChar');
242+
$xmlWriter->writeAttribute('w:fldCharType', 'begin');
243+
$xmlWriter->endElement(); // w:fldChar
244+
$xmlWriter->endElement(); // w:r
245+
246+
$instruction = ' ' . $element->getType() . ' ';
247+
248+
foreach ($element->getProperties() as $property) {
249+
$instruction .= $property . ' ';
250+
}
251+
foreach ($element->getOptions() as $optionKey => $optionValue) {
252+
$instruction .= $this->convertRefOption($optionKey, $optionValue) . ' ';
253+
}
254+
255+
$xmlWriter->startElement('w:r');
256+
$this->writeFontStyle();
257+
$xmlWriter->startElement('w:instrText');
258+
$xmlWriter->writeAttribute('xml:space', 'preserve');
259+
$xmlWriter->text($instruction);
260+
$xmlWriter->endElement(); // w:instrText
261+
$xmlWriter->endElement(); // w:r
262+
263+
if ($element->getText() != null) {
264+
if ($element->getText() instanceof \PhpOffice\PhpWord\Element\TextRun) {
265+
$containerWriter = new Container($xmlWriter, $element->getText(), true);
266+
$containerWriter->write();
267+
268+
$xmlWriter->startElement('w:r');
269+
$xmlWriter->startElement('w:instrText');
270+
$xmlWriter->text('"' . $this->buildPropertiesAndOptions($element));
271+
$xmlWriter->endElement(); // w:instrText
272+
$xmlWriter->endElement(); // w:r
273+
274+
$xmlWriter->startElement('w:r');
275+
$xmlWriter->startElement('w:instrText');
276+
$xmlWriter->writeAttribute('xml:space', 'preserve');
277+
$xmlWriter->text(' ');
278+
$xmlWriter->endElement(); // w:instrText
279+
$xmlWriter->endElement(); // w:r
280+
}
281+
}
282+
283+
$xmlWriter->startElement('w:r');
284+
$xmlWriter->startElement('w:fldChar');
285+
$xmlWriter->writeAttribute('w:fldCharType', 'separate');
286+
$xmlWriter->endElement(); // w:fldChar
287+
$xmlWriter->endElement(); // w:r
288+
289+
$xmlWriter->startElement('w:r');
290+
$xmlWriter->startElement('w:rPr');
291+
$xmlWriter->startElement('w:noProof');
292+
$xmlWriter->endElement(); // w:noProof
293+
$xmlWriter->endElement(); // w:rPr
294+
$xmlWriter->writeElement('w:t', $element->getText() != null && is_string($element->getText()) ? $element->getText() : '1');
295+
$xmlWriter->endElement(); // w:r
296+
297+
$xmlWriter->startElement('w:r');
298+
$xmlWriter->startElement('w:fldChar');
299+
$xmlWriter->writeAttribute('w:fldCharType', 'end');
300+
$xmlWriter->endElement(); // w:fldChar
301+
$xmlWriter->endElement(); // w:r
302+
303+
$this->endElementP(); // w:p
304+
}
305+
306+
private function convertRefOption($optionKey, $optionValue)
307+
{
308+
if ($optionKey === 'NumberSeperatorSequence') {
309+
return '\\d ' . $optionValue;
310+
}
311+
312+
switch ($optionValue) {
313+
case 'IncrementAndInsertText': return '\\f';
314+
case 'CreateHyperLink': return '\\h';
315+
case 'NoTrailingPeriod': return '\\n';
316+
case 'IncludeAboveOrBelow': return '\\p';
317+
case 'InsertParagraphNumberRelativeContext': return '\\r';
318+
case 'SuppressNonDelimeterNonNumericalText': return '\\t';
319+
case 'InsertParagraphNumberFullContext': return '\\w';
320+
default: return '';
321+
}
322+
}
229323
}

0 commit comments

Comments
 (0)