public function GeofieldMapWidget::settingsForm in Geofield Map 8
Same name and namespace in other branches
- 8.2 src/Plugin/Field/FieldWidget/GeofieldMapWidget.php \Drupal\geofield_map\Plugin\Field\FieldWidget\GeofieldMapWidget::settingsForm()
Returns a form to configure settings for the widget.
Invoked from \Drupal\field_ui\Form\EntityDisplayFormBase to allow administrators to configure the widget. The field_ui module takes care of handling submitted form values.
Parameters
array $form: The form where the settings form is being included in.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
Return value
array The form definition for the widget settings.
Overrides GeofieldLatLonWidget::settingsForm
File
- src/
Plugin/ Field/ FieldWidget/ GeofieldMapWidget.php, line 241
Class
- GeofieldMapWidget
- Plugin implementation of the 'geofield_map' widget.
Namespace
Drupal\geofield_map\Plugin\Field\FieldWidgetCode
public function settingsForm(array $form, FormStateInterface $form_state) {
$default_settings = self::defaultSettings();
$elements = [];
// Attach Geofield Map Library.
$elements['#attached']['library'] = [
'geofield_map/geofield_map_general',
'geofield_map/geofield_map_widget',
];
$elements['#tree'] = TRUE;
$elements['default_value'] = [
'lat' => [
'#type' => 'value',
'#value' => $this
->getSetting('default_value')['lat'],
],
'lon' => [
'#type' => 'value',
'#value' => $this
->getSetting('default_value')['lon'],
],
];
$gmap_api_key = $this
->getGmapApiKey();
// Define the Google Maps API Key value message markup.
if (!empty($gmap_api_key)) {
$map_google_api_key_value = $this
->t('<strong>Gmap Api Key:</strong> @gmaps_api_key_link<br><div class="description">A valid Gmap Api Key is needed anyway for the Widget Geocode and ReverseGeocode functionalities (provided by the Google Map Geocoder)</div>', [
'@gmaps_api_key_link' => $this->link
->generate($gmap_api_key, Url::fromRoute('geofield_map.settings', [], [
'query' => [
'destination' => Url::fromRoute('<current>')
->toString(),
],
])),
]);
}
else {
$map_google_api_key_value = t("<span class='geofield-map-warning'>Gmap Api Key missing<br>The Widget Geocode and ReverseGeocode functionalities won't be available.</span> @settings_page_link", [
'@settings_page_link' => $this->link
->generate(t('Set it in the Geofield Map Configuration Page'), Url::fromRoute('geofield_map.settings', [], [
'query' => [
'destination' => Url::fromRoute('<current>')
->toString(),
],
])),
]);
}
$elements['map_google_api_key'] = [
'#type' => 'html_tag',
'#tag' => 'div',
'#value' => $map_google_api_key_value,
];
$elements['map_google_places'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Google Places'),
];
$elements['map_google_places']['places_control'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Enable Address Geocoding via the @google_places_link.', [
'@google_places_link' => $this->link
->generate($this
->t('Google Maps Places Autocomplete Service'), Url::fromUri('https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete', [
'absolute' => TRUE,
'attributes' => [
'target' => 'blank',
],
])),
]),
'#default_value' => $this
->getSetting('map_google_places')['places_control'],
'#return_value' => 1,
];
$elements['map_google_places']['places_additional_options'] = [
'#type' => 'textarea',
'#rows' => 2,
'#title' => $this
->t('Google Maps Places Autocomplete Service Additional Options'),
'#description' => $this
->t('An object literal of additional options, that comply with the @autocomplete_class.<br><b>The placeholder values are the default ones used by the widget.</b><br>The syntax should respect the javascript object notation (json) format.<br>As suggested in the field placeholder, always use double quotes (") both for the indexes and the string values.', [
"@autocomplete_class" => $this->link
->generate($this
->t('google.maps.places.Autocomplete class'), Url::fromUri('https://developers.google.com/maps/documentation/javascript/reference/3/#Autocomplete', [
'absolute' => TRUE,
'attributes' => [
'target' => 'blank',
],
])),
]),
'#default_value' => $this
->getSetting('map_google_places')['places_additional_options'],
'#placeholder' => '{"placeIdOnly": "true", "strictBounds": "false"}',
'#element_validate' => [
[
get_class($this),
'jsonValidate',
],
],
'#states' => [
'visible' => [
':input[name="fields[field_geofield][settings_edit_form][settings][map_google_places][places_control]"]' => [
'checked' => TRUE,
],
],
],
];
$elements['map_library'] = [
'#type' => 'select',
'#title' => $this
->t('Map Library'),
'#default_value' => $this
->getSetting('map_library'),
'#options' => [
'gmap' => $this
->t('Google Maps'),
'leaflet' => $this
->t('Leaflet js'),
],
];
$elements['map_type_google'] = [
'#type' => 'select',
'#title' => $this
->t('Map type'),
'#default_value' => $this
->getSetting('map_type_google'),
'#options' => $this->gMapTypesOptions,
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][map_library]"]' => [
'value' => 'gmap',
],
],
],
];
$elements['map_type_leaflet'] = [
'#type' => 'select',
'#title' => $this
->t('Map type'),
'#default_value' => $this
->getSetting('map_type_leaflet'),
'#options' => $this->leafletTileManager
->getLeafletTilesLayersOptions(),
'#description' => $this->currentUser
->hasPermission('configure geofield_map') ? $this
->t('Choose one among all the Leaflet Tiles Plugins defined for the Geofield Map module (@see LeafletTileLayerPlugin).<br>You can add your one into your custom module as a new LeafletTileLayer Plugin. (Free Leaflet Tile Layers definitions are available from <a href="@free_leaflet_tiles_link" target="_blank">this link.</a>)', [
'@free_leaflet_tiles_link' => 'http://leaflet-extras.github.io/leaflet-providers/preview/index.html',
]) : '',
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][map_library]"]' => [
'value' => 'leaflet',
],
],
],
];
$elements['map_type_selector'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Provide a Map type Selector on the Map'),
'#description' => $this
->t('If checked, the user will be able to change Map Type throughout the selector.'),
'#default_value' => $this
->getSetting('map_type_selector'),
];
$elements['map_dimensions'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Map Dimensions'),
];
$elements['map_dimensions']['width'] = [
'#type' => 'textfield',
'#title' => $this
->t('Map width'),
'#default_value' => $this
->getSetting('map_dimensions')['width'],
'#size' => 25,
'#maxlength' => 25,
'#description' => $this
->t('The default width of a Google map, as a CSS length or percentage. Examples: <em>50px</em>, <em>5em</em>, <em>2.5in</em>, <em>95%</em>'),
'#required' => TRUE,
];
$elements['map_dimensions']['height'] = [
'#type' => 'textfield',
'#title' => $this
->t('Map height'),
'#default_value' => $this
->getSetting('map_dimensions')['height'],
'#size' => 25,
'#maxlength' => 25,
'#description' => $this
->t('The default height of a Google map, as a CSS length or percentage. Examples: <em>50px</em>, <em>5em</em>, <em>2.5in</em>, <em>95%</em>'),
'#required' => TRUE,
];
$elements['zoom'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Zoom Settings'),
];
$elements['zoom']['start'] = [
'#type' => 'number',
'#min' => $this
->getSetting('zoom')['min'],
'#max' => $this
->getSetting('zoom')['max'],
'#title' => $this
->t('Start Zoom level'),
'#description' => $this
->t('The initial Zoom level for an empty Geofield.'),
'#default_value' => $this
->getSetting('zoom')['start'],
'#element_validate' => [
[
get_class($this),
'zoomLevelValidate',
],
],
];
$elements['zoom']['focus'] = [
'#type' => 'number',
'#min' => $this
->getSetting('zoom')['min'],
'#max' => $this
->getSetting('zoom')['max'],
'#title' => $this
->t('Focus Zoom level'),
'#description' => $this
->t('The Zoom level for an assigned Geofield or for Geocoding operations results.'),
'#default_value' => $this
->getSetting('zoom')['focus'],
'#element_validate' => [
[
get_class($this),
'zoomLevelValidate',
],
],
];
$elements['zoom']['min'] = [
'#type' => 'number',
'#min' => $default_settings['zoom']['min'],
'#max' => $default_settings['zoom']['max'],
'#title' => $this
->t('Min Zoom level'),
'#description' => $this
->t('The Minimum Zoom level for the Map.'),
'#default_value' => $this
->getSetting('zoom')['min'],
];
$elements['zoom']['max'] = [
'#type' => 'number',
'#min' => $default_settings['zoom']['min'],
'#max' => $default_settings['zoom']['max'],
'#title' => $this
->t('Max Zoom level'),
'#description' => $this
->t('The Maximum Zoom level for the Map.'),
'#default_value' => $this
->getSetting('zoom')['max'],
'#element_validate' => [
[
get_class($this),
'maxZoomLevelValidate',
],
],
];
$elements['click_to_find_marker'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Click to Find marker'),
'#description' => $this
->t('Provides a button to recenter the map on the marker location.'),
'#default_value' => $this
->getSetting('click_to_find_marker'),
];
$elements['click_to_place_marker'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Click to place marker'),
'#description' => $this
->t('Provides a button to place the marker in the center location.'),
'#default_value' => $this
->getSetting('click_to_place_marker'),
];
$fields_list = array_merge_recursive($this->entityFieldManager
->getFieldMapByFieldType('string_long'), $this->entityFieldManager
->getFieldMapByFieldType('string'));
$string_fields_options = [
'0' => $this
->t('- Any -'),
];
// Filter out the not acceptable values from the options.
foreach ($fields_list[$form['#entity_type']] as $k => $field) {
if (in_array($form['#bundle'], $field['bundles']) && !in_array($k, [
'revision_log',
'behavior_settings',
'parent_id',
'parent_type',
'parent_field_name',
])) {
$string_fields_options[$k] = $k;
}
}
$elements['geoaddress_field'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Geoaddressed Field'),
'#description' => $this
->t('If a not null Google Maps API Key is set, it is possible to choose the Entity Title, or a "string" type field (among the content type ones), to sync and populate with the Search / Reverse Geocoded Address.<br><strong> Note: In case of a multivalue Geofield, this is run just from the first Geofield Map</strong>'),
'#states' => [
'invisible' => [
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][map_google_api_key]"]' => [
'value' => '',
],
],
],
];
$elements['geoaddress_field']['field'] = [
'#type' => 'select',
'#title' => $this
->t('Choose an existing field where to store the Searched / Reverse Geocoded Address'),
'#description' => $this
->t('Choose among the title and the text fields of this entity type, if available'),
'#options' => $string_fields_options,
'#default_value' => $this
->getSetting('geoaddress_field')['field'],
];
$elements['geoaddress_field']['hidden'] = [
'#type' => 'checkbox',
'#title' => $this
->t('<strong>Hide</strong> this field in the Content Edit Form'),
'#description' => $this
->t('If checked, the selected Geoaddress Field will be Hidden to the user in the edit form, </br>and totally managed by the Geofield Reverse Geocode'),
'#default_value' => $this
->getSetting('geoaddress_field')['hidden'],
'#states' => [
'invisible' => [
[
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][geoaddress_field][field]"]' => [
'value' => 'title',
],
],
'or',
[
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][geoaddress_field][field]"]' => [
'value' => '0',
],
],
],
],
];
$elements['geoaddress_field']['disabled'] = [
'#type' => 'checkbox',
'#title' => $this
->t('<strong>Disable</strong> this field in the Content Edit Form'),
'#description' => $this
->t('If checked, the selected Geoaddress Field will be Disabled to the user in the edit form, </br>and totally managed by the Geofield Reverse Geocode'),
'#default_value' => $this
->getSetting('geoaddress_field')['disabled'],
'#states' => [
'invisible' => [
[
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][geoaddress_field][hidden]"]' => [
'checked' => TRUE,
],
],
'or',
[
':input[name="fields[' . $this->fieldDefinition
->getName() . '][settings_edit_form][settings][geoaddress_field][field]"]' => [
'value' => '0',
],
],
],
],
];
return $elements + parent::settingsForm($form, $form_state);
}