You are here

function geolocation_address_field_widget_third_party_settings_form in Geolocation Field 8.3

Same name and namespace in other branches
  1. 8.2 modules/geolocation_address/geolocation_address.module \geolocation_address_field_widget_third_party_settings_form()

Implements hook_field_widget_third_party_settings_form().

File

modules/geolocation_address/geolocation_address.module, line 127
Provide address integration where due.

Code

function geolocation_address_field_widget_third_party_settings_form(WidgetInterface $widget, FieldDefinitionInterface $field_definition, $form_mode, $form, FormStateInterface $form_state) {
  if (!$widget instanceof GeolocationMapWidgetBase) {
    return [];
  }

  /** @var \Drupal\geolocation_google_maps\Plugin\Field\FieldWidget\GeolocationGoogleWidget $widget */
  $field_storage_definition = $field_definition
    ->getFieldStorageDefinition();
  $form_parent_name = 'fields[' . $field_definition
    ->getName() . '][settings_edit_form][third_party_settings][geolocation_address]';
  $settings = geolocation_address_get_widget_settings($widget);
  if (!empty($form_state
    ->getTriggeringElement()['#name']) && $form_state
    ->getTriggeringElement()['#name'] == $form_parent_name . '[geocoder]') {
    $settings['geocoder'] = $form_state
      ->getTriggeringElement()['#value'];
  }

  /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $all_field_definitions */
  $all_field_definitions = Drupal::service('entity_field.manager')
    ->getFieldDefinitions($field_definition
    ->getTargetEntityTypeId(), $field_definition
    ->getTargetBundle());
  $address_fields = [];
  foreach ($all_field_definitions as $single_field_definition) {
    if ($single_field_definition
      ->getType() == 'address' && $single_field_definition
      ->getFieldStorageDefinition()
      ->getCardinality() == $field_storage_definition
      ->getCardinality()) {
      $address_fields[$single_field_definition
        ->getName()] = $single_field_definition
        ->getLabel();
    }
  }
  if (empty($address_fields)) {
    return [];
  }

  /** @var \Drupal\geolocation\GeocoderManager $geocoder_manager */
  $geocoder_manager = Drupal::service('plugin.manager.geolocation.geocoder');
  $geocoder_options = [];
  foreach ($geocoder_manager
    ->getDefinitions() as $geocoder_id => $geocoder_definition) {
    if (empty($geocoder_definition['locationCapable'])) {
      continue;
    }
    if ($settings['direction'] == 'duplex' && empty($geocoder_definition['reverseCapable'])) {
      continue;
    }
    $geocoder_options[$geocoder_id] = $geocoder_definition['name'];
  }
  if (empty($geocoder_options)) {
    return [];
  }
  $element = [
    '#type' => 'details',
    '#title' => t('Address integration'),
    '#open' => TRUE,
  ];
  $element['enable'] = [
    '#type' => 'checkbox',
    '#title' => t('Enable address integration'),
    '#default_value' => $settings['enable'],
  ];
  $element['address_field'] = [
    '#type' => 'select',
    '#title' => t('Select address field'),
    '#options' => $address_fields,
    '#default_value' => $settings['address_field'],
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $element['geocoder'] = [
    '#type' => 'select',
    '#options' => $geocoder_options,
    '#title' => t('Geocoder plugin'),
    '#default_value' => $settings['geocoder'],
    '#ajax' => [
      'callback' => [
        get_class($geocoder_manager),
        'addGeocoderSettingsFormAjax',
      ],
      'wrapper' => 'geolocation-address-geocoder-plugin-settings',
      'effect' => 'fade',
    ],
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  if (!empty($settings['geocoder'])) {
    $geocoder_plugin = $geocoder_manager
      ->getGeocoder($settings['geocoder'], $settings['settings']);
  }
  elseif (current(array_keys($geocoder_options))) {
    $geocoder_plugin = $geocoder_manager
      ->getGeocoder(current(array_keys($geocoder_options)));
  }
  if (!empty($geocoder_plugin)) {
    $geocoder_settings_form = $geocoder_plugin
      ->getOptionsForm();
    if ($geocoder_settings_form) {
      $element['settings'] = $geocoder_settings_form;
    }
  }
  if (empty($element['settings'])) {
    $element['settings'] = [
      '#type' => 'html_tag',
      '#tag' => 'span',
      '#value' => t("No settings available."),
    ];
  }
  $element['settings'] = array_replace_recursive($element['settings'], [
    '#type' => 'container',
    '#prefix' => '<div id="geolocation-address-geocoder-plugin-settings">',
    '#suffix' => '</div>',
    '#flatten' => TRUE,
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ]);
  $element['sync_mode'] = [
    '#type' => 'radios',
    '#title' => t('Synchronization'),
    '#default_value' => $settings['sync_mode'],
    '#options' => [
      'auto' => t('Automatically'),
      'manual' => t('Manually by push&pull buttons'),
    ],
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $control_positions = $widget
    ->getMapProvider()::getControlPositions();
  if ($control_positions) {
    $element['button_position'] = [
      '#type' => 'select',
      '#title' => t('Button position'),
      '#options' => $control_positions,
      '#default_value' => $settings['button_position'],
      '#states' => [
        'visible' => [
          ':input[name="' . $form_parent_name . '[enable]"]' => [
            'checked' => TRUE,
          ],
          ':input[name="' . $form_parent_name . '[sync_mode]"]' => [
            'value' => 'manual',
          ],
        ],
      ],
    ];
  }
  $element['direction'] = [
    '#type' => 'radios',
    '#title' => t('Direction'),
    '#default_value' => $settings['direction'],
    '#options' => [
      'duplex' => t('Full Duplex | Address <> Geolocation'),
      'one_way' => t('One Way | Address > Geolocation'),
    ],
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $element['ignore'] = [
    '#type' => 'checkboxes',
    '#title' => t('Ignore address elements'),
    '#default_value' => array_keys(array_filter($settings['ignore'])),
    '#options' => [
      'organization' => 'organization',
      'address-line1' => 'address-line1',
      'address-line2' => 'address-line2',
      'locality' => 'locality',
      'administrative-area' => 'administrative-area',
      'postal-code' => 'postal-code',
    ],
    '#states' => [
      'visible' => [
        ':input[name="' . $form_parent_name . '[enable]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  return $element;
}