You are here

public function ChangeLayoutForm::buildForm in Display Suite 8.2

Same name and namespace in other branches
  1. 8.4 src/Form/ChangeLayoutForm.php \Drupal\ds\Form\ChangeLayoutForm::buildForm()
  2. 8.3 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 24

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)) {
    $display = entity_get_display($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'] = array(
      '#markup' => $this
        ->t('You are changing from @old to @new layout for @bundle in @view_mode view mode.', array(
        '@old' => $old_layout_info['label'],
        '@new' => $new_layout['label'],
        '@bundle' => $bundle,
        '@view_mode' => $display_mode,
      )),
      '#prefix' => "<div class='change-ds-layout-info'>",
      '#suffix' => "</div>",
    );

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

    // Let other modules alter the regions.
    // For old regions.
    $context = array(
      'entity_type' => $entity_type,
      'bundle' => $bundle,
      'view_mode' => $display_mode,
    );
    $region_info = array(
      'region_options' => $regions,
    );
    \Drupal::moduleHandler()
      ->alter('ds_layout_region', $context, $region_info);
    $regions = $region_info['region_options'];
    $form['#old_layout_info']['layout']['regions'] = $regions;

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

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

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

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