@@ -96,6 +96,8 @@ protected function _getChildrenElementsHtml(AbstractElement $element)
96
96
. '<td colspan="4"> ' . $ field ->toHtml () . '</td></tr> ' ;
97
97
} else {
98
98
$ elements .= $ field ->toHtml ();
99
+ $ styleTag = $ this ->addVisibilityTag ($ field );
100
+ $ elements .= $ styleTag ;
99
101
}
100
102
}
101
103
@@ -168,11 +170,13 @@ protected function _getFrontendClass($element)
168
170
*/
169
171
protected function _getHeaderTitleHtml ($ element )
170
172
{
173
+ $ styleTag = $ this ->addVisibilityTag ($ element );
171
174
return '<a id=" ' .
172
175
$ element ->getHtmlId () .
173
176
'-head" href="# ' .
174
177
$ element ->getHtmlId () .
175
178
'-link"> ' . $ element ->getLegend () . '</a> ' .
179
+ $ styleTag .
176
180
/* @noEscape */ $ this ->secureRenderer ->renderEventListenerAsTag (
177
181
'onclick ' ,
178
182
'event.preventDefault(); ' .
@@ -270,10 +274,70 @@ protected function _isCollapseState($element)
270
274
return true ;
271
275
}
272
276
277
+ if ($ this ->isCollapseStateByDependentField ($ element )) {
278
+ return false ;
279
+ }
280
+
273
281
$ extra = $ this ->_authSession ->getUser ()->getExtra ();
282
+
274
283
if (isset ($ extra ['configState ' ][$ element ->getId ()])) {
275
284
return $ extra ['configState ' ][$ element ->getId ()];
276
285
}
277
286
return $ this ->isCollapsedDefault ;
278
287
}
288
+
289
+ /**
290
+ * Check if element should be collapsed by dependent field value.
291
+ *
292
+ * @param AbstractElement $element
293
+ * @return bool
294
+ */
295
+ private function isCollapseStateByDependentField (AbstractElement $ element ): bool
296
+ {
297
+ if (!empty ($ element ->getGroup ()['depends ' ]['fields ' ])) {
298
+ foreach ($ element ->getGroup ()['depends ' ]['fields ' ] as $ dependFieldData ) {
299
+ if (is_array ($ dependFieldData ) && isset ($ dependFieldData ['value ' ], $ dependFieldData ['id ' ])) {
300
+ $ fieldSetForm = $ this ->getForm ();
301
+ $ dependentFieldConfigValue = $ this ->_scopeConfig ->getValue (
302
+ $ dependFieldData ['id ' ],
303
+ $ fieldSetForm ->getScope (),
304
+ $ fieldSetForm ->getScopeCode ()
305
+ );
306
+
307
+ if ($ dependFieldData ['value ' ] !== $ dependentFieldConfigValue ) {
308
+ return true ;
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ return false ;
315
+ }
316
+
317
+ /**
318
+ * If element or it's parent depends on other element we hide it during page load.
319
+ *
320
+ * @param AbstractElement $field
321
+ * @return string
322
+ */
323
+ private function addVisibilityTag (AbstractElement $ field ): string
324
+ {
325
+ $ elementId = '' ;
326
+ $ styleTag = '' ;
327
+
328
+ if (!empty ($ field ->getFieldConfig ()['depends ' ]['fields ' ])) {
329
+ $ elementId = '#row_ ' . $ field ->getHtmlId ();
330
+ } elseif (!empty ($ field ->getGroup ()['depends ' ]['fields ' ])) {
331
+ $ elementId = '# ' . $ field ->getHtmlId () . '-head ' ;
332
+ }
333
+
334
+ if (!empty ($ elementId )) {
335
+ $ styleTag .= $ this ->secureRenderer ->renderStyleAsTag (
336
+ 'display: none; ' ,
337
+ $ elementId
338
+ );
339
+ }
340
+
341
+ return $ styleTag ;
342
+ }
279
343
}
0 commit comments