You are here

public static function YamlFormLocation::processYamlFormComposite in YAML Form 8

Processes a composite form element.

Overrides YamlFormCompositeBase::processYamlFormComposite

1 call to YamlFormLocation::processYamlFormComposite()
YamlFormLocation::getInitializedCompositeElement in src/Plugin/YamlFormElement/YamlFormLocation.php
Get initialized composite element.

File

src/Element/YamlFormLocation.php, line 105

Class

YamlFormLocation
Provides a form element for a location element.

Namespace

Drupal\yamlform\Element

Code

public static function processYamlFormComposite(&$element, FormStateInterface $form_state, &$complete_form) {
  $element = parent::processYamlFormComposite($element, $form_state, $complete_form);

  // Composite elements should always be displayed and rendered so that
  // location data can be populated, so #access is really just converting the
  // readonly elements to hidden elements.
  $composite_elements = static::getCompositeElements();
  foreach ($composite_elements as $composite_key => $composite_element) {
    if ($composite_key != 'value') {
      if (isset($element[$composite_key]['#access']) && $element[$composite_key]['#access'] === FALSE) {
        unset($element[$composite_key]['#access']);
        $element[$composite_key]['#type'] = 'hidden';
      }
      elseif (!empty($element['#hidden']) && !empty($element['#geolocation'])) {
        $element[$composite_key]['#type'] = 'hidden';
      }
      else {
        $element[$composite_key]['#attributes']['class'][] = 'yamlform-readonly';
        $element[$composite_key]['#readonly'] = 'readonly';
      }
    }
  }

  // Set required.
  if (isset($element['#required'])) {
    $element['value']['#required'] = $element['#required'];
  }

  // Set Geolocation detection attribute.
  if (!empty($element['#geolocation'])) {
    $element['value']['#attributes']['data-yamlform-location-geolocation'] = 'data-yamlform-location-geolocation';
  }

  // Writing script tags (only once) directly into the page's output to ensure
  // that Google Maps APi script is loaded using the proper API key.
  static $google_api;
  if (empty($google_api)) {
    $api_key = !empty($element['#api_key']) ? $element['#api_key'] : \Drupal::config('yamlform.settings')
      ->get('elements.default_google_maps_api_key');
    $element['script'] = [
      '#markup' => '<script src="https://maps.googleapis.com/maps/api/js?key=' . $api_key . '&libraries=places"></script>',
      '#allowed_tags' => [
        'script',
      ],
    ];
    $google_api = TRUE;
  }
  $element['#attached']['library'][] = 'yamlform/yamlform.element.location';
  $element['#element_validate'] = [
    [
      get_called_class(),
      'validateYamlFormLocation',
    ],
  ];
  return $element;
}