function DefaultSelection::buildConfigurationForm

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection::buildConfigurationForm()
  2. 8.9.x core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection::buildConfigurationForm()
  3. 11.x core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php \Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection::buildConfigurationForm()

Overrides SelectionPluginBase::buildConfigurationForm

3 calls to DefaultSelection::buildConfigurationForm()
TermSelection::buildConfigurationForm in core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php
Form constructor.
UserSelection::buildConfigurationForm in core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
Form constructor.
WorkspaceSelection::buildConfigurationForm in core/modules/workspaces/src/Plugin/EntityReferenceSelection/WorkspaceSelection.php
Form constructor.
3 methods override DefaultSelection::buildConfigurationForm()
TermSelection::buildConfigurationForm in core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php
Form constructor.
UserSelection::buildConfigurationForm in core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
Form constructor.
WorkspaceSelection::buildConfigurationForm in core/modules/workspaces/src/Plugin/EntityReferenceSelection/WorkspaceSelection.php
Form constructor.

File

core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php, line 160

Class

DefaultSelection
Default plugin implementation of the Entity Reference Selection plugin.

Namespace

Drupal\Core\Entity\Plugin\EntityReferenceSelection

Code

public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
  $form = parent::buildConfigurationForm($form, $form_state);
  $configuration = $this->getConfiguration();
  $entity_type_id = $configuration['target_type'];
  $entity_type = $this->entityTypeManager
    ->getDefinition($entity_type_id);
  $bundles = $this->entityTypeBundleInfo
    ->getBundleInfo($entity_type_id);
  if ($entity_type->hasKey('bundle')) {
    $bundle_options = [];
    foreach ($bundles as $bundle_name => $bundle_info) {
      $bundle_options[$bundle_name] = $bundle_info['label'];
    }
    natsort($bundle_options);
    $selected_bundles = array_intersect_key($bundle_options, array_filter((array) $configuration['target_bundles']));
    $form['target_bundles'] = [
      '#type' => 'checkboxes',
      '#title' => $entity_type->getBundleLabel(),
      '#options' => $bundle_options,
      '#default_value' => (array) $configuration['target_bundles'],
      '#required' => TRUE,
      '#size' => 6,
      '#multiple' => TRUE,
      '#element_validate' => [
        [
          static::class,
          'elementValidateFilter',
        ],
      ],
      // Use a form process callback to build #ajax property properly and also
      // to avoid code duplication.
      // @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::fieldSettingsAjaxProcess()
'#ajax' => TRUE,
      '#limit_validation_errors' => [],
    ];
    $form['target_bundles_update'] = [
      '#type' => 'submit',
      '#value' => $this->t('Update form'),
      '#limit_validation_errors' => [],
      '#attributes' => [
        'class' => [
          'js-hide',
        ],
      ],
      '#submit' => [
        [
          EntityReferenceItem::class,
          'settingsAjaxSubmit',
        ],
      ],
    ];
  }
  else {
    $form['target_bundles'] = [
      '#type' => 'value',
      '#value' => [],
    ];
  }
  if ($entity_type->entityClassImplements(FieldableEntityInterface::class)) {
    $options = $entity_type->hasKey('bundle') ? $selected_bundles : $bundles;
    $fields = [];
    foreach (array_keys($options) as $bundle) {
      $bundle_fields = array_filter($this->entityFieldManager
        ->getFieldDefinitions($entity_type_id, $bundle), function ($field_definition) {
        return !$field_definition->isComputed();
      });
      foreach ($bundle_fields as $field_name => $field_definition) {
        /** @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */
        $columns = $field_definition->getFieldStorageDefinition()
          ->getColumns();
        // If there is more than one column, display them all, otherwise just
        // display the field label.
        // @todo Use property labels instead of the column name.
        if (count($columns) > 1) {
          foreach ($columns as $column_name => $column_info) {
            $fields[$field_name . '.' . $column_name] = $this->t('@label (@column)', [
              '@label' => $field_definition->getLabel(),
              '@column' => $column_name,
            ]);
          }
        }
        else {
          $fields[$field_name] = $this->t('@label', [
            '@label' => $field_definition->getLabel(),
          ]);
        }
      }
    }
    $form['sort']['field'] = [
      '#type' => 'select',
      '#title' => $this->t('Sort by'),
      '#options' => $fields,
      // Use a form process callback to build #ajax property properly and also
      // to avoid code duplication.
      // @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::fieldSettingsAjaxProcess()
'#ajax' => TRUE,
      '#empty_value' => '_none',
      '#sort_options' => TRUE,
      '#limit_validation_errors' => [],
      '#default_value' => $configuration['sort']['field'],
    ];
    if ($entity_type->hasKey('bundle')) {
      $form['sort']['field']['#states'] = [
        'visible' => [
          ':input[name^="settings[handler_settings][target_bundles]["]' => [
            'checked' => TRUE,
          ],
        ],
      ];
    }
    $form['sort']['settings'] = [
      '#type' => 'container',
      '#attributes' => [
        'class' => [
          'entity_reference-settings',
        ],
      ],
      '#process' => [
        [
          EntityReferenceItem::class,
          'formProcessMergeParent',
        ],
      ],
    ];
    $form['sort']['settings']['direction'] = [
      '#type' => 'select',
      '#title' => $this->t('Sort direction'),
      '#required' => TRUE,
      '#options' => [
        'ASC' => $this->t('Ascending'),
        'DESC' => $this->t('Descending'),
      ],
      '#default_value' => $configuration['sort']['direction'],
      '#states' => [
        'visible' => [
          ':input[name="settings[handler_settings][sort][field]"]' => [
            '!value' => '_none',
          ],
        ],
      ],
    ];
    if ($entity_type->hasKey('bundle')) {
      $form['sort']['settings']['direction']['#states']['visible'][] = [
        ':input[name^="settings[handler_settings][target_bundles]["]' => [
          'checked' => TRUE,
        ],
      ];
    }
  }
  $form['auto_create'] = [
    '#type' => 'checkbox',
    '#title' => $this->t("Create referenced entities if they don't already exist"),
    '#default_value' => $configuration['auto_create'],
    '#weight' => -2,
  ];
  if ($entity_type->hasKey('bundle')) {
    $form['auto_create_bundle'] = [
      '#type' => 'select',
      '#title' => $this->t('Store new items in'),
      '#options' => $selected_bundles,
      '#default_value' => $configuration['auto_create_bundle'],
      '#access' => count($selected_bundles) > 1,
      '#states' => [
        'visible' => [
          ':input[name="settings[handler_settings][auto_create]"]' => [
            'checked' => TRUE,
          ],
        ],
      ],
      '#weight' => -1,
    ];
  }
  return $form;
}

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