FieldConfigEditForm.php

Same filename in other branches
  1. 9 core/modules/field_ui/src/Form/FieldConfigEditForm.php
  2. 10 core/modules/field_ui/src/Form/FieldConfigEditForm.php
  3. 11.x core/modules/field_ui/src/Form/FieldConfigEditForm.php

Namespace

Drupal\field_ui\Form

File

core/modules/field_ui/src/Form/FieldConfigEditForm.php

View source
<?php

namespace Drupal\field_ui\Form;

use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
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;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides a form for the field settings form.
 *
 * @internal
 */
class FieldConfigEditForm extends EntityForm {
    use AllowedTagsXssTrait;
    
    /**
     * The entity being used by this form.
     *
     * @var \Drupal\field\FieldConfigInterface
     */
    protected $entity;
    
    /**
     * The entity type bundle info service.
     *
     * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
     */
    protected $entityTypeBundleInfo;
    
    /**
     * Constructs a new FieldConfigDeleteForm object.
     *
     * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
     *   The entity type bundle info service.
     */
    public function __construct(EntityTypeBundleInfoInterface $entity_type_bundle_info) {
        $this->entityTypeBundleInfo = $entity_type_bundle_info;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container) {
        return new static($container->get('entity_type.bundle.info'));
    }
    
    /**
     * {@inheritdoc}
     */
    public function form(array $form, FormStateInterface $form_state) {
        $form = parent::form($form, $form_state);
        $field_storage = $this->entity
            ->getFieldStorageDefinition();
        $bundles = $this->entityTypeBundleInfo
            ->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.'),
                '#weight' => 12,
            ]);
            $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->entityTypeManager
                ->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();
        $this->messenger()
            ->addStatus($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();
    }

}

Classes

Title Deprecated Summary
FieldConfigEditForm Provides a form for the field settings form.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.