@@ -96,6 +96,8 @@ protected function _getChildrenElementsHtml(AbstractElement $element)
9696 . '<td colspan="4"> ' . $ field ->toHtml () . '</td></tr> ' ;
9797 } else {
9898 $ elements .= $ field ->toHtml ();
99+ $ styleTag = $ this ->addVisibilityTag ($ field );
100+ $ elements .= $ styleTag ;
99101 }
100102 }
101103
@@ -168,11 +170,13 @@ protected function _getFrontendClass($element)
168170 */
169171 protected function _getHeaderTitleHtml ($ element )
170172 {
173+ $ styleTag = $ this ->addVisibilityTag ($ element );
171174 return '<a id=" ' .
172175 $ element ->getHtmlId () .
173176 '-head" href="# ' .
174177 $ element ->getHtmlId () .
175178 '-link"> ' . $ element ->getLegend () . '</a> ' .
179+ $ styleTag .
176180 /* @noEscape */ $ this ->secureRenderer ->renderEventListenerAsTag (
177181 'onclick ' ,
178182 'event.preventDefault(); ' .
@@ -270,10 +274,70 @@ protected function _isCollapseState($element)
270274 return true ;
271275 }
272276
277+ if ($ this ->isCollapseStateByDependentField ($ element )) {
278+ return false ;
279+ }
280+
273281 $ extra = $ this ->_authSession ->getUser ()->getExtra ();
282+
274283 if (isset ($ extra ['configState ' ][$ element ->getId ()])) {
275284 return $ extra ['configState ' ][$ element ->getId ()];
276285 }
277286 return $ this ->isCollapsedDefault ;
278287 }
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+ }
279343}
0 commit comments