@@ -60,49 +60,29 @@ protected function addElement($elementName)
6060 if ($ withoutP && ($ elementName == 'Text ' || $ elementName == 'PreserveText ' )) {
6161 $ args [3 ] = null ; // Remove paragraph style for texts in textrun
6262 }
63+ $ source = '' ;
64+ if (count ($ args ) > 1 ) {
65+ $ source = $ args [1 ];
66+ }
6367
6468 // Create element using reflection
6569 $ reflection = new \ReflectionClass ($ elementClass );
6670 $ elementArgs = $ args ;
67- array_shift ($ elementArgs ); // Shift an element off the beginning of array: the $elementName
71+ array_shift ($ elementArgs ); // Shift the $elementName off the beginning of array
6872
6973 /** @var \PhpOffice\PhpWord\Element\AbstractElement $element Type hint */
7074 $ element = $ reflection ->newInstanceArgs ($ elementArgs );
7175
72- // Set nested level
73- if ($ this ->container == 'Cell ' ) {
74- $ element ->setNestedLevel ($ this ->getNestedLevel () + 1 );
75- } else {
76- $ element ->setNestedLevel ($ this ->getNestedLevel ());
77- }
78-
79-
80- // Set relation Id for media collection
81- $ mediaContainer = $ this ->getMediaContainer ();
82- if (in_array ($ elementName , array ('Link ' , 'Image ' , 'Object ' ))) {
83- /** @var \PhpOffice\PhpWord\Element\Image $element Type hint */
84- $ image = ($ elementName == 'Image ' ) ? $ element : null ;
85- $ rId = Media::addElement ($ mediaContainer , strtolower ($ elementName ), $ args [1 ], $ image );
86- $ element ->setRelationId ($ rId );
87- }
88- if ($ elementName == 'Object ' ) {
89- /** @var \PhpOffice\PhpWord\Element\Object $element Type hint */
90- $ rIdIcon = Media::addElement ($ mediaContainer , 'image ' , $ element ->getIcon (), new Image ($ element ->getIcon ()));
91- $ element ->setImageRelationId ($ rIdIcon );
92- }
93-
94- // Set relation Id for other collection
95- if (in_array ($ elementName , array ('Footnote ' , 'Endnote ' , 'Title ' )) && $ this ->phpWord instanceof PhpWord) {
96- $ addMethod = "add {$ elementName }" ;
97- $ rId = $ this ->phpWord ->$ addMethod ($ element );
98- $ element ->setRelationId ($ rId );
99- }
76+ // Set nested level and relation Id
77+ $ this ->setElementNestedLevel ($ element );
78+ $ this ->setElementRelationId ($ element , $ elementName , $ source );
10079
10180 // Set other properties and add element into collection
10281 $ element ->setDocPart ($ this ->getDocPart (), $ this ->getDocPartId ());
10382 $ element ->setElementIndex ($ this ->countElements () + 1 );
10483 $ element ->setElementId ();
10584 $ element ->setPhpWord ($ this ->phpWord );
85+
10686 $ this ->elements [] = $ element ;
10787
10888 return $ element ;
@@ -128,6 +108,54 @@ public function countElements()
128108 return count ($ this ->elements );
129109 }
130110
111+ /**
112+ * Set element nested level based on container; add one when it's inside a cell
113+ */
114+ private function setElementNestedLevel (AbstractElement $ element )
115+ {
116+ if ($ this ->container == 'Cell ' ) {
117+ $ element ->setNestedLevel ($ this ->getNestedLevel () + 1 );
118+ } else {
119+ $ element ->setNestedLevel ($ this ->getNestedLevel ());
120+ }
121+ }
122+
123+ /**
124+ * Set relation Id
125+ *
126+ * @param string $elementName
127+ * @param string $source
128+ */
129+ private function setElementRelationId (AbstractElement $ element , $ elementName , $ source )
130+ {
131+ $ mediaContainer = $ this ->getMediaContainer ();
132+ $ hasMediaRelation = in_array ($ elementName , array ('Link ' , 'Image ' , 'Object ' ));
133+ $ hasOtherRelation = in_array ($ elementName , array ('Footnote ' , 'Endnote ' , 'Title ' ));
134+
135+ // Set relation Id for media elements (link, image, object; legacy of OOXML)
136+ // Only Image that needs to be passed to Media class
137+ if ($ hasMediaRelation ) {
138+ /** @var \PhpOffice\PhpWord\Element\Image $element Type hint */
139+ $ image = ($ elementName == 'Image ' ) ? $ element : null ;
140+ $ rId = Media::addElement ($ mediaContainer , strtolower ($ elementName ), $ source , $ image );
141+ $ element ->setRelationId ($ rId );
142+ }
143+
144+ // Set relation Id for icon of object element
145+ if ($ elementName == 'Object ' ) {
146+ /** @var \PhpOffice\PhpWord\Element\Object $element Type hint */
147+ $ rIdIcon = Media::addElement ($ mediaContainer , 'image ' , $ element ->getIcon (), new Image ($ element ->getIcon ()));
148+ $ element ->setImageRelationId ($ rIdIcon );
149+ }
150+
151+ // Set relation Id for elements that will be registered in the Collection subnamespaces
152+ if ($ hasOtherRelation && $ this ->phpWord instanceof PhpWord) {
153+ $ addMethod = "add {$ elementName }" ;
154+ $ rId = $ this ->phpWord ->$ addMethod ($ element );
155+ $ element ->setRelationId ($ rId );
156+ }
157+ }
158+
131159 /**
132160 * Add text/preservetext element
133161 *
0 commit comments