You are here

public function ChangeLayoutForm::buildForm in Display Suite 8.3

Same name and namespace in other branches
  1. 8.4 src/Form/ChangeLayoutForm.php \Drupal\ds\Form\ChangeLayoutForm::buildForm()
  2. 8.2 src/Form/ChangeLayoutForm.php \Drupal\ds\Form\ChangeLayoutForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

File

src/Form/ChangeLayoutForm.php, line 64

Class

ChangeLayoutForm
Provides a configuration form for configurable actions.

Namespace

Drupal\ds\Form

Code

public function buildForm(array $form, FormStateInterface $form_state, $entity_type = '', $bundle = '', $display_mode = '', $new_layout = '') {
  $old_layout = NULL;
  $all_layouts = Ds::getLayouts();
  if (!empty($entity_type) && !empty($bundle) && !empty($display_mode)) {

    /** @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display */
    $display = $this->entityTypeManager
      ->getStorage('entity_view_display')
      ->load($entity_type . '.' . $bundle . '.' . $display_mode);
    $old_layout = $display
      ->getThirdPartySettings('ds');
  }
  if ($old_layout && isset($all_layouts[$new_layout])) {
    $new_layout_key = $new_layout;
    $new_layout = $all_layouts[$new_layout];
    $old_layout_info = $all_layouts[$old_layout['layout']['id']];
    $form['#entity_type'] = $entity_type;
    $form['#entity_bundle'] = $bundle;
    $form['#mode'] = $display_mode;
    $form['#old_layout'] = $old_layout;
    $form['#old_layout_info'] = $old_layout_info;
    $form['#new_layout'] = $new_layout;
    $form['#new_layout_key'] = $new_layout_key;
    $form['info'] = [
      '#markup' => $this
        ->t('You are changing from @old to @new layout for @bundle in @view_mode view mode.', [
        '@old' => $old_layout_info
          ->getLabel(),
        '@new' => $new_layout
          ->getLabel(),
        '@bundle' => $bundle,
        '@view_mode' => $display_mode,
      ]),
      '#prefix' => "<div class='change-ds-layout-info'>",
      '#suffix' => "</div>",
    ];

    // Old region options.
    $regions = [];
    foreach ($old_layout_info
      ->getRegions() as $key => $info) {
      $regions[$key] = $info['label'];
    }

    // Let other modules alter the regions.
    // For old regions.
    $context = [
      'entity_type' => $entity_type,
      'bundle' => $bundle,
      'view_mode' => $display_mode,
    ];
    $region_info = [
      'region_options' => $regions,
    ];
    \Drupal::moduleHandler()
      ->alter('ds_layout_region', $context, $region_info);
    $regions = $region_info['region_options'];
    $save_regions = [];
    foreach ($regions as $key => $info) {
      $save_regions[$key] = [
        'label' => $info,
      ];
    }
    $form['#old_layout_info']
      ->setRegions($save_regions);

    // For new regions.
    $new_regions = [];
    foreach ($new_layout
      ->getRegions() as $key => $info) {
      $new_regions[$key] = $info['label'];
    }
    $region_info = [
      'region_options' => $new_regions,
    ];
    \Drupal::moduleHandler()
      ->alter('ds_layout_region', $context, $region_info);
    $new_layout
      ->setRegions($region_info['region_options']);

    // Display the region options.
    $selectable_regions = [
      '' => $this
        ->t('- None -'),
    ] + $new_layout
      ->getRegions();
    $form['regions_pre']['#markup'] = '<div class="ds-layout-regions">';
    foreach ($regions as $region => $region_title) {
      $form['region_' . $region] = [
        '#type' => 'container',
      ];
      $form['region_' . $region]['ds_label_' . $region] = [
        '#markup' => 'Fields in <span class="change-ds-layout-old-region"> ' . $region_title . '</span> go into',
      ];
      $form['region_' . $region]['ds_' . $region] = [
        '#type' => 'select',
        '#options' => $layout_options = $selectable_regions,
        '#default_value' => $region,
      ];
    }
    $form['regions_post']['#markup'] = '</div>';

    // Show previews from old and new layouts.
    $form['preview'] = [
      '#type' => 'container',
      '#prefix' => '<div class="ds-layout-preview">',
      '#suffix' => '</div>',
    ];
    $fallback_image = drupal_get_path('module', 'ds') . '/images/preview.png';
    $old_image = $old_layout_info
      ->getIconPath() ?: $fallback_image;
    $new_image = $new_layout
      ->getIconPath() ?: $fallback_image;
    $arrow = drupal_get_path('module', 'ds') . '/images/arrow.png';
    $form['preview']['old_layout'] = [
      '#markup' => '<div class="ds-layout-preview-image"><img src="' . base_path() . $old_image . '"/></div>',
    ];
    $form['preview']['arrow'] = [
      '#markup' => '<div class="ds-layout-preview-arrow"><img src="' . base_path() . $arrow . '"/></div>',
    ];
    $form['preview']['new_layout'] = [
      '#markup' => '<div class="ds-layout-preview-image"><img src="' . base_path() . $new_image . '"/></div>',
    ];
    $form['#attached']['library'][] = 'ds/admin';

    // Submit button.
    $form['actions'] = [
      '#type' => 'actions',
    ];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Save'),
      '#prefix' => '<div class="ds-layout-change-save">',
      '#suffix' => '</div>',
    ];
  }
  else {
    $form['nothing'] = [
      '#markup' => $this
        ->t('No valid configuration found.'),
    ];
  }
  return $form;
}