--- /dev/null
+<?php
+
+namespace Drupal\field_ui\Form;
+
+use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Field\AllowedTagsXssTrait;
+use Drupal\Core\Field\FieldFilteredMarkup;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\field\FieldConfigInterface;
+use Drupal\field_ui\FieldUI;
+
+/**
+ * Provides a form for the field settings form.
+ */
+class FieldConfigEditForm extends EntityForm {
+
+ use AllowedTagsXssTrait;
+
+ /**
+ * The entity being used by this form.
+ *
+ * @var \Drupal\field\FieldConfigInterface
+ */
+ protected $entity;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function form(array $form, FormStateInterface $form_state) {
+ $form = parent::form($form, $form_state);
+
+ $field_storage = $this->entity->getFieldStorageDefinition();
+ $bundles = $this->entityManager->getBundleInfo($this->entity->getTargetEntityTypeId());
+
+ $form_title = $this->t('%field settings for %bundle', [
+ '%field' => $this->entity->getLabel(),
+ '%bundle' => $bundles[$this->entity->getTargetBundle()]['label'],
+ ]);
+ $form['#title'] = $form_title;
+
+ if ($field_storage->isLocked()) {
+ $form['locked'] = [
+ '#markup' => $this->t('The field %field is locked and cannot be edited.', ['%field' => $this->entity->getLabel()]),
+ ];
+ return $form;
+ }
+
+ // Build the configurable field values.
+ $form['label'] = [
+ '#type' => 'textfield',
+ '#title' => $this->t('Label'),
+ '#default_value' => $this->entity->getLabel() ?: $field_storage->getName(),
+ '#required' => TRUE,
+ '#weight' => -20,
+ ];
+
+ $form['description'] = [
+ '#type' => 'textarea',
+ '#title' => $this->t('Help text'),
+ '#default_value' => $this->entity->getDescription(),
+ '#rows' => 5,
+ '#description' => $this->t('Instructions to present to the user below this field on the editing form.<br />Allowed HTML tags: @tags', ['@tags' => FieldFilteredMarkup::displayAllowedTags()]) . '<br />' . $this->t('This field supports tokens.'),
+ '#weight' => -10,
+ ];
+
+ $form['required'] = [
+ '#type' => 'checkbox',
+ '#title' => $this->t('Required field'),
+ '#default_value' => $this->entity->isRequired(),
+ '#weight' => -5,
+ ];
+
+ // Create an arbitrary entity object (used by the 'default value' widget).
+ $ids = (object) [
+ 'entity_type' => $this->entity->getTargetEntityTypeId(),
+ 'bundle' => $this->entity->getTargetBundle(),
+ 'entity_id' => NULL
+ ];
+ $form['#entity'] = _field_create_entity_from_ids($ids);
+ $items = $form['#entity']->get($this->entity->getName());
+ $item = $items->first() ?: $items->appendItem();
+
+ // Add field settings for the field type and a container for third party
+ // settings that modules can add to via hook_form_FORM_ID_alter().
+ $form['settings'] = [
+ '#tree' => TRUE,
+ '#weight' => 10,
+ ];
+ $form['settings'] += $item->fieldSettingsForm($form, $form_state);
+ $form['third_party_settings'] = [
+ '#tree' => TRUE,
+ '#weight' => 11,
+ ];
+
+ // Add handling for default value.
+ if ($element = $items->defaultValuesForm($form, $form_state)) {
+ $element = array_merge($element, [
+ '#type' => 'details',
+ '#title' => $this->t('Default value'),
+ '#open' => TRUE,
+ '#tree' => TRUE,
+ '#description' => $this->t('The default value for this field, used when creating new content.'),
+ ]);
+
+ $form['default_value'] = $element;
+ }
+
+ return $form;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function actions(array $form, FormStateInterface $form_state) {
+ $actions = parent::actions($form, $form_state);
+ $actions['submit']['#value'] = $this->t('Save settings');
+
+ if (!$this->entity->isNew()) {
+ $target_entity_type = $this->entityManager->getDefinition($this->entity->getTargetEntityTypeId());
+ $route_parameters = [
+ 'field_config' => $this->entity->id(),
+ ] + FieldUI::getRouteBundleParameter($target_entity_type, $this->entity->getTargetBundle());
+ $url = new Url('entity.field_config.' . $target_entity_type->id() . '_field_delete_form', $route_parameters);
+
+ if ($this->getRequest()->query->has('destination')) {
+ $query = $url->getOption('query');
+ $query['destination'] = $this->getRequest()->query->get('destination');
+ $url->setOption('query', $query);
+ }
+ $actions['delete'] = [
+ '#type' => 'link',
+ '#title' => $this->t('Delete'),
+ '#url' => $url,
+ '#access' => $this->entity->access('delete'),
+ '#attributes' => [
+ 'class' => ['button', 'button--danger'],
+ ],
+ ];
+ }
+
+ return $actions;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validateForm(array &$form, FormStateInterface $form_state) {
+ parent::validateForm($form, $form_state);
+
+ if (isset($form['default_value'])) {
+ $item = $form['#entity']->get($this->entity->getName());
+ $item->defaultValuesFormValidate($form['default_value'], $form, $form_state);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, FormStateInterface $form_state) {
+ parent::submitForm($form, $form_state);
+
+ // Handle the default value.
+ $default_value = [];
+ if (isset($form['default_value'])) {
+ $items = $form['#entity']->get($this->entity->getName());
+ $default_value = $items->defaultValuesFormSubmit($form['default_value'], $form, $form_state);
+ }
+ $this->entity->setDefaultValue($default_value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(array $form, FormStateInterface $form_state) {
+ $this->entity->save();
+
+ drupal_set_message($this->t('Saved %label configuration.', ['%label' => $this->entity->getLabel()]));
+
+ $request = $this->getRequest();
+ if (($destinations = $request->query->get('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) {
+ $request->query->remove('destinations');
+ $form_state->setRedirectUrl($next_destination);
+ }
+ else {
+ $form_state->setRedirectUrl(FieldUI::getOverviewRouteInfo($this->entity->getTargetEntityTypeId(), $this->entity->getTargetBundle()));
+ }
+ }
+
+ /**
+ * The _title_callback for the field settings form.
+ *
+ * @param \Drupal\field\FieldConfigInterface $field_config
+ * The field.
+ *
+ * @return string
+ * The label of the field.
+ */
+ public function getTitle(FieldConfigInterface $field_config) {
+ return $field_config->label();
+ }
+
+}