You are here

public function ViewEditForm::getDisplayDetails in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/views_ui/src/ViewEditForm.php \Drupal\views_ui\ViewEditForm::getDisplayDetails()

Helper function to get the display details section of the edit UI.

Parameters

$display:

Return value

array A renderable page build array.

1 call to ViewEditForm::getDisplayDetails()
ViewEditForm::getDisplayTab in core/modules/views_ui/src/ViewEditForm.php
Returns a renderable array representing the edit page for one display.

File

core/modules/views_ui/src/ViewEditForm.php, line 371
Contains \Drupal\views_ui\ViewEditForm.

Class

ViewEditForm
Form controller for the Views edit form.

Namespace

Drupal\views_ui

Code

public function getDisplayDetails($view, $display) {
  $display_title = $this
    ->getDisplayLabel($view, $display['id'], FALSE);
  $build = array(
    '#theme_wrappers' => array(
      'container',
    ),
    '#attributes' => array(
      'id' => 'edit-display-settings-details',
    ),
  );
  $is_display_deleted = !empty($display['deleted']);

  // The master display cannot be duplicated.
  $is_default = $display['id'] == 'default';

  // @todo: Figure out why getOption doesn't work here.
  $is_enabled = $view
    ->getExecutable()->displayHandlers
    ->get($display['id'])
    ->isEnabled();
  if ($display['id'] != 'default') {
    $build['top']['#theme_wrappers'] = array(
      'container',
    );
    $build['top']['#attributes']['id'] = 'edit-display-settings-top';
    $build['top']['#attributes']['class'] = array(
      'views-ui-display-tab-actions',
      'edit-display-settings-top',
      'views-ui-display-tab-bucket',
      'clearfix',
    );

    // The Delete, Duplicate and Undo Delete buttons.
    $build['top']['actions'] = array(
      '#theme_wrappers' => array(
        'dropbutton_wrapper',
      ),
    );

    // Because some of the 'links' are actually submit buttons, we have to
    // manually wrap each item in <li> and the whole list in <ul>.
    $build['top']['actions']['prefix']['#markup'] = '<ul class="dropbutton">';
    if (!$is_display_deleted) {
      if (!$is_enabled) {
        $build['top']['actions']['enable'] = array(
          '#type' => 'submit',
          '#value' => $this
            ->t('Enable @display_title', [
            '@display_title' => $display_title,
          ]),
          '#limit_validation_errors' => array(),
          '#submit' => array(
            '::submitDisplayEnable',
            '::submitDelayDestination',
          ),
          '#prefix' => '<li class="enable">',
          "#suffix" => '</li>',
        );
      }
      elseif ($view
        ->status() && $view
        ->getExecutable()->displayHandlers
        ->get($display['id'])
        ->hasPath()) {
        $path = $view
          ->getExecutable()->displayHandlers
          ->get($display['id'])
          ->getPath();
        if ($path && strpos($path, '%') === FALSE) {
          if (!parse_url($path, PHP_URL_SCHEME)) {

            // @todo Views should expect and store a leading /. See:
            //   https://www.drupal.org/node/2423913
            $url = Url::fromUserInput('/' . ltrim($path, '/'));
          }
          else {
            $url = Url::fromUri("base:{$path}");
          }
          $build['top']['actions']['path'] = array(
            '#type' => 'link',
            '#title' => $this
              ->t('View @display_title', [
              '@display_title' => $display_title,
            ]),
            '#options' => array(
              'alt' => array(
                $this
                  ->t("Go to the real page for this display"),
              ),
            ),
            '#url' => $url,
            '#prefix' => '<li class="view">',
            "#suffix" => '</li>',
          );
        }
      }
      if (!$is_default) {
        $build['top']['actions']['duplicate'] = array(
          '#type' => 'submit',
          '#value' => $this
            ->t('Duplicate @display_title', [
            '@display_title' => $display_title,
          ]),
          '#limit_validation_errors' => array(),
          '#submit' => array(
            '::submitDisplayDuplicate',
            '::submitDelayDestination',
          ),
          '#prefix' => '<li class="duplicate">',
          "#suffix" => '</li>',
        );
      }

      // Always allow a display to be deleted.
      $build['top']['actions']['delete'] = array(
        '#type' => 'submit',
        '#value' => $this
          ->t('Delete @display_title', [
          '@display_title' => $display_title,
        ]),
        '#limit_validation_errors' => array(),
        '#submit' => array(
          '::submitDisplayDelete',
          '::submitDelayDestination',
        ),
        '#prefix' => '<li class="delete">',
        "#suffix" => '</li>',
      );
      foreach (Views::fetchPluginNames('display', NULL, array(
        $view
          ->get('storage')
          ->get('base_table'),
      )) as $type => $label) {
        if ($type == $display['display_plugin']) {
          continue;
        }
        $build['top']['actions']['duplicate_as'][$type] = array(
          '#type' => 'submit',
          '#value' => $this
            ->t('Duplicate as @type', [
            '@type' => $label,
          ]),
          '#limit_validation_errors' => array(),
          '#submit' => array(
            '::submitDuplicateDisplayAsType',
            '::submitDelayDestination',
          ),
          '#prefix' => '<li class="duplicate">',
          '#suffix' => '</li>',
        );
      }
    }
    else {
      $build['top']['actions']['undo_delete'] = array(
        '#type' => 'submit',
        '#value' => $this
          ->t('Undo delete of @display_title', [
          '@display_title' => $display_title,
        ]),
        '#limit_validation_errors' => array(),
        '#submit' => array(
          '::submitDisplayUndoDelete',
          '::submitDelayDestination',
        ),
        '#prefix' => '<li class="undo-delete">',
        "#suffix" => '</li>',
      );
    }
    if ($is_enabled) {
      $build['top']['actions']['disable'] = array(
        '#type' => 'submit',
        '#value' => $this
          ->t('Disable @display_title', [
          '@display_title' => $display_title,
        ]),
        '#limit_validation_errors' => array(),
        '#submit' => array(
          '::submitDisplayDisable',
          '::submitDelayDestination',
        ),
        '#prefix' => '<li class="disable">',
        "#suffix" => '</li>',
      );
    }
    $build['top']['actions']['suffix']['#markup'] = '</ul>';

    // The area above the three columns.
    $build['top']['display_title'] = array(
      '#theme' => 'views_ui_display_tab_setting',
      '#description' => $this
        ->t('Display name'),
      '#link' => $view
        ->getExecutable()->displayHandlers
        ->get($display['id'])
        ->optionLink($display_title, 'display_title'),
    );
  }
  $build['columns'] = array();
  $build['columns']['#theme_wrappers'] = array(
    'container',
  );
  $build['columns']['#attributes'] = array(
    'id' => 'edit-display-settings-main',
    'class' => array(
      'clearfix',
      'views-display-columns',
    ),
  );
  $build['columns']['first']['#theme_wrappers'] = array(
    'container',
  );
  $build['columns']['first']['#attributes'] = array(
    'class' => array(
      'views-display-column',
      'first',
    ),
  );
  $build['columns']['second']['#theme_wrappers'] = array(
    'container',
  );
  $build['columns']['second']['#attributes'] = array(
    'class' => array(
      'views-display-column',
      'second',
    ),
  );
  $build['columns']['second']['settings'] = array();
  $build['columns']['second']['header'] = array();
  $build['columns']['second']['footer'] = array();
  $build['columns']['second']['empty'] = array();
  $build['columns']['second']['pager'] = array();

  // The third column buckets are wrapped in details.
  $build['columns']['third'] = array(
    '#type' => 'details',
    '#title' => $this
      ->t('Advanced'),
    '#theme_wrappers' => array(
      'details',
    ),
    '#attributes' => array(
      'class' => array(
        'views-display-column',
        'third',
      ),
    ),
  );

  // Collapse the details by default.
  $build['columns']['third']['#open'] = \Drupal::config('views.settings')
    ->get('ui.show.advanced_column');

  // Each option (e.g. title, access, display as grid/table/list) fits into one
  // of several "buckets," or boxes (Format, Fields, Sort, and so on).
  $buckets = array();

  // Fetch options from the display plugin, with a list of buckets they go into.
  $options = array();
  $view
    ->getExecutable()->displayHandlers
    ->get($display['id'])
    ->optionsSummary($buckets, $options);

  // Place each option into its bucket.
  foreach ($options as $id => $option) {

    // Each option self-identifies as belonging in a particular bucket.
    $buckets[$option['category']]['build'][$id] = $this
      ->buildOptionForm($view, $id, $option, $display);
  }

  // Place each bucket into the proper column.
  foreach ($buckets as $id => $bucket) {

    // Let buckets identify themselves as belonging in a column.
    if (isset($bucket['column']) && isset($build['columns'][$bucket['column']])) {
      $column = $bucket['column'];
    }
    else {
      $column = 'third';
    }
    if (isset($bucket['build']) && is_array($bucket['build'])) {
      $build['columns'][$column][$id] = $bucket['build'];
      $build['columns'][$column][$id]['#theme_wrappers'][] = 'views_ui_display_tab_bucket';
      $build['columns'][$column][$id]['#title'] = !empty($bucket['title']) ? $bucket['title'] : '';
      $build['columns'][$column][$id]['#name'] = $id;
    }
  }
  $build['columns']['first']['fields'] = $this
    ->getFormBucket($view, 'field', $display);
  $build['columns']['first']['filters'] = $this
    ->getFormBucket($view, 'filter', $display);
  $build['columns']['first']['sorts'] = $this
    ->getFormBucket($view, 'sort', $display);
  $build['columns']['second']['header'] = $this
    ->getFormBucket($view, 'header', $display);
  $build['columns']['second']['footer'] = $this
    ->getFormBucket($view, 'footer', $display);
  $build['columns']['second']['empty'] = $this
    ->getFormBucket($view, 'empty', $display);
  $build['columns']['third']['arguments'] = $this
    ->getFormBucket($view, 'argument', $display);
  $build['columns']['third']['relationships'] = $this
    ->getFormBucket($view, 'relationship', $display);
  return $build;
}