Completed
Pull Request — 8.x-1.x (#130)
by
unknown
11:37
created

EntityBrowserForm::buildForm()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 44
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 44
rs 8.8571
cc 3
eloc 30
nc 4
nop 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A EntityBrowserForm::validateForm() 0 7 1
A EntityBrowserForm::save() 0 4 1
1
<?php
2
3
/**
4
 * @file
5
 * Contains \Drupal\entity_browser\Form\EntityBrowserForm.
6
 */
7
8
namespace Drupal\entity_browser\Form;
9
10
use Drupal\Core\Entity\EntityForm;
11
use Drupal\Core\Entity\EntityInterface;
12
use Drupal\Core\Form\FormStateInterface;
13
use Drupal\entity_browser\DisplayAjaxInterface;
14
15
/**
16
 * The entity browser form.
17
 */
18
class EntityBrowserForm extends EntityForm {
19
20
  /**
21
   * The entity browser object.
22
   *
23
   * @var \Drupal\entity_browser\EntityBrowserInterface
24
   */
25
  protected $entity;
26
27
  /**
28
   * {@inheritdoc}
29
   */
30
  public function getFormId() {
31
    return 'entity_browser_' . $this->entity->id() . '_form';
32
  }
33
34
  /**
35
   * {@inheritdoc}
36
   */
37
  protected function init(FormStateInterface $form_state) {
38
    parent::init($form_state);
39
    $form_state->set(['entity_browser', 'instance_uuid'], \Drupal::service('uuid')->generate());
40
    $form_state->set(['entity_browser', 'selected_entities'], []);
41
    $form_state->set(['entity_browser', 'selection_completed'], FALSE);
42
  }
43
44
  /**
45
   * {@inheritdoc}
46
   */
47
  public function form(array $form, FormStateInterface $form_state) {
48
    parent::form($form, $form_state);
49
50
    /** @var \Drupal\entity_browser\EntityBrowserInterface $entity_browser */
51
    $entity_browser = $this->entity;
52
53
    $form['#browser_parts'] = [
54
      'widget_selector' => 'widget_selector',
55
      'widget' => 'widget',
56
      'selection_display' => 'selection_display',
57
    ];
58
    $entity_browser->getWidgetSelector()->setDefaultWidget($this->getCurrentWidget($form_state));
59
    $form[$form['#browser_parts']['widget_selector']] = $entity_browser->getWidgetSelector()->getForm($form, $form_state);
60
    $form[$form['#browser_parts']['widget']] = $entity_browser->getWidgets()->get($this->getCurrentWidget($form_state))->getForm($form, $form_state, $entity_browser->getAdditionalWidgetParameters());
61
62
    $form['actions'] = [
63
      'submit' => [
64
        '#type' => 'submit',
65
        '#value' => t('Select'),
66
        '#attributes' => [
67
          'class' => ['is-entity-browser-submit'],
68
        ],
69
      ],
70
    ];
71
72
    $form[$form['#browser_parts']['selection_display']] = $entity_browser->getSelectionDisplay()->getForm($form, $form_state);
73
74
    if ($entity_browser->getDisplay() instanceOf DisplayAjaxInterface) {
75
      $entity_browser->getDisplay()->addAjax($form);
76
    }
77
78
    return $form;
79
  }
80
81
  /**
82
   * {@inheritdoc}
83
   */
84
  public function validateForm(array &$form, FormStateInterface $form_state) {
85
    /** @var \Drupal\entity_browser\EntityBrowserInterface $entity_browser */
86
    $entity_browser = $this->entity;
87
    $entity_browser->getWidgetSelector()->validate($form, $form_state);
88
    $entity_browser->getWidgets()->get($this->getCurrentWidget($form_state))->validate($form, $form_state);
89
    $entity_browser->getSelectionDisplay()->validate($form, $form_state);
90
  }
91
92
  /**
93
   * {@inheritdoc}
94
   */
95
  public function save(array $form, FormStateInterface $form_state) {
96
    // Override our parent save method and do not touch the Entity Browser entity.
97
    return;
98
  }
99
100
  /**
101
   * {@inheritdoc}
102
   */
103
  public function submitForm(array &$form, FormStateInterface $form_state) {
104
    /** @var \Drupal\entity_browser\EntityBrowserInterface $entity_browser */
105
    $entity_browser = $this->entity;
106
    $original_widget = $this->getCurrentWidget($form_state);
107
    if ($new_widget = $entity_browser->getWidgetSelector()->submit($form, $form_state)) {
108
      $this->setCurrentWidget($new_widget, $form_state);
109
    }
110
111
    // Only call widget submit if we didn't change the widget.
112
    if ($original_widget == $this->getCurrentWidget($form_state)) {
113
      $entity_browser->getWidgets()->get($this->getCurrentWidget($form_state))->submit($form[$form['#browser_parts']['widget']], $form, $form_state);
114
      $entity_browser->getSelectionDisplay()->submit($form, $form_state);
115
    }
116
117
    if (!$this->isSelectionCompleted($form_state)) {
118
      $form_state->setRebuild();
119
    }
120
    else {
121
      $entity_browser->getDisplay()->selectionCompleted($this->getSelectedEntities($form_state));
122
    }
123
  }
124
125
  /**
126
   * Returns the widget that is currently selected.
127
   *
128
   * @param \Drupal\Core\Form\FormStateInterface $form_state
129
   *   The current state of the form.
130
   *
131
   * @return string
132
   *   ID of currently selected widget.
133
   */
134
  protected function getCurrentWidget(FormStateInterface $form_state) {
135
    // Do not use has() as that returns TRUE if the value is NULL.
136
    if (!$form_state->get('entity_browser_current_widget')) {
137
      $form_state->set('entity_browser_current_widget', $this->entity->getFirstWidget());
138
    }
139
140
    return $form_state->get('entity_browser_current_widget');
141
  }
142
143
  /**
144
   * Sets widget that is currently active.
145
   *
146
   * @param string $widget
147
   *   New active widget UUID.
148
   * @param \Drupal\Core\Form\FormStateInterface $form_state
149
   *   Form state.
150
   */
151
  protected function setCurrentWidget($widget, FormStateInterface $form_state) {
152
    $form_state->set('entity_browser_current_widget', $widget);
153
  }
154
155
  /**
156
   * Indicates selection is done.
157
   *
158
   * @return bool
159
   *   Indicates selection is done.
160
   */
161
  protected function isSelectionCompleted(FormStateInterface $form_state) {
162
    return (bool) $form_state->get(['entity_browser', 'selection_completed']);
163
  }
164
165
  /**
166
   * Returns currently selected entities.
167
   *
168
   * @return \Drupal\Core\Entity\EntityInterface
169
   *   Array of currently selected entities.
170
   */
171
  protected function getSelectedEntities(FormStateInterface $form_state) {
172
    return $form_state->get(['entity_browser', 'selected_entities']);
173
  }
174
175
}
176