@@ -60,49 +60,29 @@ protected function addElement($elementName)
60
60
if ($ withoutP && ($ elementName == 'Text ' || $ elementName == 'PreserveText ' )) {
61
61
$ args [3 ] = null ; // Remove paragraph style for texts in textrun
62
62
}
63
+ $ source = '' ;
64
+ if (count ($ args ) > 1 ) {
65
+ $ source = $ args [1 ];
66
+ }
63
67
64
68
// Create element using reflection
65
69
$ reflection = new \ReflectionClass ($ elementClass );
66
70
$ 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
68
72
69
73
/** @var \PhpOffice\PhpWord\Element\AbstractElement $element Type hint */
70
74
$ element = $ reflection ->newInstanceArgs ($ elementArgs );
71
75
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 );
100
79
101
80
// Set other properties and add element into collection
102
81
$ element ->setDocPart ($ this ->getDocPart (), $ this ->getDocPartId ());
103
82
$ element ->setElementIndex ($ this ->countElements () + 1 );
104
83
$ element ->setElementId ();
105
84
$ element ->setPhpWord ($ this ->phpWord );
85
+
106
86
$ this ->elements [] = $ element ;
107
87
108
88
return $ element ;
@@ -128,6 +108,54 @@ public function countElements()
128
108
return count ($ this ->elements );
129
109
}
130
110
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
+
131
159
/**
132
160
* Add text/preservetext element
133
161
*
0 commit comments