function geolocation_address_field_widget_third_party_settings_form in Geolocation Field 8.3
Same name and namespace in other branches
- 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;
}