@@ -29,12 +29,22 @@ class Field extends Text
2929 */
3030 public function write ()
3131 {
32- $ xmlWriter = $ this ->getXmlWriter ();
3332 $ element = $ this ->getElement ();
3433 if (!$ element instanceof \PhpOffice \PhpWord \Element \Field) {
3534 return ;
3635 }
3736
37+ $ methodName = 'write ' . ucfirst (strtolower ($ element ->getType ()));
38+ if (method_exists ($ this , $ methodName )) {
39+ $ this ->$ methodName ($ element );
40+ } else {
41+ $ this ->writeDefault ($ element );
42+ }
43+ }
44+
45+ private function writeDefault (\PhpOffice \PhpWord \Element \Field $ element )
46+ {
47+ $ xmlWriter = $ this ->getXmlWriter ();
3848 $ this ->startElementP ();
3949
4050 $ xmlWriter ->startElement ('w:r ' );
@@ -104,6 +114,51 @@ public function write()
104114 $ this ->endElementP (); // w:p
105115 }
106116
117+ /**
118+ * Writes a macrobutton field
119+ *
120+ * //TODO A lot of code duplication with general method, should maybe be refactored
121+ * @param \PhpOffice\PhpWord\Element\Field $element
122+ */
123+ protected function writeMacrobutton (\PhpOffice \PhpWord \Element \Field $ element )
124+ {
125+ $ xmlWriter = $ this ->getXmlWriter ();
126+ $ this ->startElementP ();
127+
128+ $ xmlWriter ->startElement ('w:r ' );
129+ $ xmlWriter ->startElement ('w:fldChar ' );
130+ $ xmlWriter ->writeAttribute ('w:fldCharType ' , 'begin ' );
131+ $ xmlWriter ->endElement (); // w:fldChar
132+ $ xmlWriter ->endElement (); // w:r
133+
134+ $ instruction = ' ' . $ element ->getType () . ' ' . $ this ->buildPropertiesAndOptions ($ element );
135+ if (is_string ($ element ->getText ())) {
136+ $ instruction .= $ element ->getText () . ' ' ;
137+ }
138+
139+ $ xmlWriter ->startElement ('w:r ' );
140+ $ xmlWriter ->startElement ('w:instrText ' );
141+ $ xmlWriter ->writeAttribute ('xml:space ' , 'preserve ' );
142+ $ xmlWriter ->text ($ instruction );
143+ $ xmlWriter ->endElement (); // w:instrText
144+ $ xmlWriter ->endElement (); // w:r
145+
146+ if ($ element ->getText () != null ) {
147+ if ($ element ->getText () instanceof \PhpOffice \PhpWord \Element \TextRun) {
148+ $ containerWriter = new Container ($ xmlWriter , $ element ->getText (), true );
149+ $ containerWriter ->write ();
150+ }
151+ }
152+
153+ $ xmlWriter ->startElement ('w:r ' );
154+ $ xmlWriter ->startElement ('w:fldChar ' );
155+ $ xmlWriter ->writeAttribute ('w:fldCharType ' , 'end ' );
156+ $ xmlWriter ->endElement (); // w:fldChar
157+ $ xmlWriter ->endElement (); // w:r
158+
159+ $ this ->endElementP (); // w:p
160+ }
161+
107162 private function buildPropertiesAndOptions (\PhpOffice \PhpWord \Element \Field $ element )
108163 {
109164 $ propertiesAndOptions = '' ;
@@ -119,6 +174,9 @@ private function buildPropertiesAndOptions(\PhpOffice\PhpWord\Element\Field $ele
119174 case 'dateformat ' :
120175 $ propertiesAndOptions .= '\@ " ' . $ propval . '" ' ;
121176 break ;
177+ case 'macroname ' :
178+ $ propertiesAndOptions .= $ propval . ' ' ;
179+ break ;
122180 }
123181 }
124182
0 commit comments