Completed
Pull Request — 8.x-1.x (#138)
by
unknown
02:44
created

MultiStepDisplay::getForm()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 43
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 43
rs 8.8571
cc 2
eloc 32
nc 2
nop 2
1
<?php
2
3
/**
4
 * Contains \Drupal\entity_browser\Plugin\EntityBrowser\SelectionDisplay\MultiStepDisplay.
5
 */
6
7
namespace Drupal\entity_browser\Plugin\EntityBrowser\SelectionDisplay;
8
9
use Drupal\Core\Form\FormStateInterface;
10
use Drupal\entity_browser\SelectionDisplayBase;
11
12
/**
13
 * Show current selection and delivers selected entities.
14
 *
15
 * @EntityBrowserSelectionDisplay(
16
 *   id = "multi_step_display",
17
 *   label = @Translation("Multi step selection display"),
18
 *   description = @Translation("Show current selection display and delivers selected entities.")
19
 * )
20
 */
21
class MultiStepDisplay extends SelectionDisplayBase {
22
23
  /**
24
   * {@inheritdoc}
25
   */
26
  public function getForm(array &$original_form, FormStateInterface $form_state) {
27
    $selected_entities = $form_state->get(['entity_browser', 'selected_entities']);
28
29
    $form = [];
30
    $form['#attached']['library'][] = 'entity_browser/multi_step_display';
31
    $form['selected'] = [
32
      '#theme_wrappers' => ['container'],
33
      '#attributes' => ['class' => ['selected-entities-list']],
34
      '#tree' => TRUE
35
    ];
36
    foreach ($selected_entities as $id => $entity) {
37
      $form['selected']['items_'. $entity->id()] = [
38
        '#theme_wrappers' => ['container'],
39
        '#attributes' => [
40
          'class' => ['selected-item-container'],
41
          'data-entity-id' => $entity->id()
42
        ],
43
        'display' => ['#markup' => $entity->label()],
44
        'remove_button' => [
45
          '#type' => 'submit',
46
          '#value' => $this->t('Remove'),
47
          '#submit' => [[get_class($this), 'removeItemSubmit']],
48
          '#name' => 'remove_' . $entity->id(),
49
          '#attributes' => [
50
            'data-row-id' => $id,
51
            'data-remove-entity' => 'items_' . $entity->id(),
52
          ]
53
        ],
54
        'weight' => [
55
          '#type' => 'hidden',
56
          '#default_value' => $id,
57
          '#attributes' => ['class' => ['weight']]
58
        ]
59
      ];
60
    }
61
    $form['use_selected'] = array(
62
      '#type' => 'submit',
63
      '#value' => t('Use selected'),
64
      '#name' => 'use_selected',
65
    );
66
67
    return $form;
68
  }
69
70
  /**
71
   * Submit callback for remove buttons.
72
   *
73
   * @param array $form
74
   * @param \Drupal\Core\Form\FormStateInterface $form_state
75
   */
76
  public static function removeItemSubmit(array &$form, FormStateInterface $form_state) {
77
    $id = $form_state->getTriggeringElement()['#attributes']['data-row-id'];
78
    $entity = $form_state->getTriggeringElement()['#attributes']['data-remove-entity'];
79
    $selected_entities = $form_state->get(['entity_browser', 'selected_entities']);
80
    $selected = $form_state->getValue('selected');
81
    unset($selected_entities[$id]);
82
    unset($selected[$entity]);
83
    $form_state->set(['entity_browser', 'selected_entities'], $selected_entities);
84
    // If selected array is not empty we must keep order.
85
    if (!empty($selected)) {
86
      $weights = array_column($selected, 'weight');
87
      $selected_entities = $form_state->get(['entity_browser', 'selected_entities']);
88
      $ordered = array_combine($weights, $selected_entities);
89
      ksort($ordered);
90
      $form_state->set(['entity_browser', 'selected_entities'], $ordered);
91
    }
92
    $form_state->setRebuild();
93
  }
94
95
  /**
96
   * {@inheritdoc}
97
   */
98
  public function submit(array &$form, FormStateInterface $form_state) {
99
    $selected = $form_state->getValue('selected');
100
    if (!empty($selected)) {
101
      $weights = array_column($selected, 'weight');
102
      $selected_entities = $form_state->get(['entity_browser', 'selected_entities']);
103
104
      // Selected and selected_entities is not the same when we trigering with select.
105
      // and we have two parts of array selected_entities, for first we got the weights.
106
      if ($form_state->getTriggeringElement()['#name'] == 'op') {
107
        $se1 = array_slice($selected_entities, 0, count($weights));
108
        $or1 = array_combine($weights, $se1);
109
        ksort($or1);
110
        $se2 = array_slice($selected_entities, count($weights));
111
        $weights_second = [];
112
        foreach ($se2 as $key => $value) {
113
          $weights_second[] = max($weights) + $key + 1;
114
        }
115
        $or2 = array_combine($weights_second, $se2);
116
        $ordered = array_merge($or1, $or2);
117
      // When triger is use_selected than arrays selected and selected_entities is same.
118
      } else {
119
        $ordered = array_combine($weights, $selected_entities);
120
      }
121
122
      ksort($ordered);
123
      $form_state->set(['entity_browser', 'selected_entities'], $ordered);
124
    }
125
    if ($form_state->getTriggeringElement()['#name'] == 'use_selected') {
126
      $this->selectionDone($form_state);
127
    }
128
  }
129
130
}
131