You are here

public static function WebformCompositeBase::processWebformCompositeElementsRecursive in Webform 8.5

Same name and namespace in other branches
  1. 6.x src/Element/WebformCompositeBase.php \Drupal\webform\Element\WebformCompositeBase::processWebformCompositeElementsRecursive()

Recursively processes a composite's elements.

1 call to WebformCompositeBase::processWebformCompositeElementsRecursive()
WebformCompositeBase::processWebformComposite in src/Element/WebformCompositeBase.php
Processes a composite webform element.

File

src/Element/WebformCompositeBase.php, line 112

Class

WebformCompositeBase
Provides an base composite webform element.

Namespace

Drupal\webform\Element

Code

public static function processWebformCompositeElementsRecursive(&$element, array &$composite_elements, FormStateInterface $form_state, &$complete_form) {

  /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
  $element_manager = \Drupal::service('plugin.manager.webform.element');

  // Get composite element required/options states from visible/hidden states.
  $composite_required_states = WebformElementHelper::getRequiredFromVisibleStates($element);
  foreach ($composite_elements as $composite_key => &$composite_element) {

    // Make sure the composite key is a string.
    $composite_key = (string) $composite_key;
    if (!Element::child($composite_key) || !is_array($composite_element)) {
      continue;
    }

    // Set parents.
    $composite_element['#parents'] = array_merge($element['#parents'], [
      $composite_key,
    ]);

    // If the element's #access is FALSE, apply it to all sub elements.
    if ($element['#access'] === FALSE) {
      $composite_element['#access'] = FALSE;
    }

    // Get element plugin and set inputs #default_value.
    $element_plugin = $element_manager
      ->getElementInstance($composite_element);
    if ($element_plugin
      ->isInput($composite_element)) {

      // Set #default_value for sub elements.
      if (isset($element['#value'][$composite_key])) {
        $composite_element['#default_value'] = $element['#value'][$composite_key];
      }
    }

    // Build the webform element.
    $element_manager
      ->buildElement($composite_element, $complete_form, $form_state);

    // Custom validate required sub-element because they can be hidden
    // via #access or #states.
    // @see \Drupal\webform\Element\WebformCompositeBase::validateWebformComposite
    if ($composite_required_states && !empty($composite_element['#required'])) {
      unset($composite_element['#required']);
      $composite_element['#_required'] = TRUE;
      if (!isset($composite_element['#states'])) {
        $composite_element['#states'] = [];
      }
      $composite_element['#states'] += $composite_required_states;
    }
    static::processWebformCompositeElementsRecursive($element, $composite_element, $form_state, $complete_form);
  }
}