You are here

public function ViewsSelection::buildConfigurationForm in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php \Drupal\views\Plugin\EntityReferenceSelection\ViewsSelection::buildConfigurationForm()
  2. 9 core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php \Drupal\views\Plugin\EntityReferenceSelection\ViewsSelection::buildConfigurationForm()

File

core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php, line 125

Class

ViewsSelection
Plugin implementation of the 'selection' entity_reference.

Namespace

Drupal\views\Plugin\EntityReferenceSelection

Code

public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
  $form = parent::buildConfigurationForm($form, $form_state);
  $view_settings = $this
    ->getConfiguration()['view'];
  $displays = Views::getApplicableViews('entity_reference_display');

  // Filter views that list the entity type we want, and group the separate
  // displays by view.
  $entity_type = $this->entityTypeManager
    ->getDefinition($this->configuration['target_type']);
  $view_storage = $this->entityTypeManager
    ->getStorage('view');
  $options = [];
  foreach ($displays as $data) {
    [
      $view_id,
      $display_id,
    ] = $data;
    $view = $view_storage
      ->load($view_id);
    if (in_array($view
      ->get('base_table'), [
      $entity_type
        ->getBaseTable(),
      $entity_type
        ->getDataTable(),
    ])) {
      $display = $view
        ->get('display');
      $options[$view_id . ':' . $display_id] = $view_id . ' - ' . $display[$display_id]['display_title'];
    }
  }

  // The value of the 'view_and_display' select below will need to be split
  // into 'view_name' and 'view_display' in the final submitted values, so
  // we massage the data at validate time on the wrapping element (not
  // ideal).
  $form['view']['#element_validate'] = [
    [
      static::class,
      'settingsFormValidate',
    ],
  ];
  if ($options) {
    $default = !empty($view_settings['view_name']) ? $view_settings['view_name'] . ':' . $view_settings['display_name'] : NULL;
    $form['view']['view_and_display'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('View used to select the entities'),
      '#required' => TRUE,
      '#options' => $options,
      '#default_value' => $default,
      '#description' => '<p>' . $this
        ->t('Choose the view and display that select the entities that can be referenced.<br />Only views with a display of type "Entity Reference" are eligible.') . '</p>',
    ];
    $default = !empty($view_settings['arguments']) ? implode(', ', $view_settings['arguments']) : '';
    $form['view']['arguments'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('View arguments'),
      '#default_value' => $default,
      '#required' => FALSE,
      '#description' => $this
        ->t('Provide a comma separated list of arguments to pass to the view.'),
    ];
  }
  else {
    if ($this->currentUser
      ->hasPermission('administer views') && $this->moduleHandler
      ->moduleExists('views_ui')) {
      $form['view']['no_view_help'] = [
        '#markup' => '<p>' . $this
          ->t('No eligible views were found. <a href=":create">Create a view</a> with an <em>Entity Reference</em> display, or add such a display to an <a href=":existing">existing view</a>.', [
          ':create' => Url::fromRoute('views_ui.add')
            ->toString(),
          ':existing' => Url::fromRoute('entity.view.collection')
            ->toString(),
        ]) . '</p>',
      ];
    }
    else {
      $form['view']['no_view_help']['#markup'] = '<p>' . $this
        ->t('No eligible views were found.') . '</p>';
    }
  }
  return $form;
}