ViewsFormBase::ajaxFormWrapper

protected ViewsFormBase::ajaxFormWrapper($form_class, FormStateInterface &$form_state)

Wrapper for handling AJAX forms.

Wrapper around \Drupal\Core\Form\FormBuilderInterface::buildForm() to handle some AJAX stuff automatically. This makes some assumptions about the client.

Parameters

\Drupal\Core\Form\FormInterface|string $form_class: The value must be one of the following:

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

Return value

\Drupal\Core\Ajax\AjaxResponse|string|array Returns one of three possible values:

#markup array.

File

core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php, line 193

Class

ViewsFormBase
Provides a base class for Views UI AJAX forms.

Namespace

Drupal\views_ui\Form\Ajax

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
protected function ajaxFormWrapper($form_class, FormStateInterface &$form_state) {
  /** @var \Drupal\Core\Render\RendererInterface $renderer */
  $renderer = \Drupal::service('renderer');
 
  // This won't override settings already in.
  if (!$form_state->has('rerender')) {
    $form_state->set('rerender', FALSE);
  }
  $ajax = $form_state->get('ajax');
  // Do not overwrite if the redirect has been disabled.
  if (!$form_state->isRedirectDisabled()) {
    $form_state->disableRedirect($ajax);
  }
  $form_state->disableCache();
 
  // Builds the form in a render context in order to ensure that cacheable
  // metadata is bubbled up.
  $render_context = new RenderContext();
  $callable = function() use ($form_class, &$form_state) {
    return \Drupal::formBuilder()->buildForm($form_class, $form_state);
  };
  $form = $renderer->executeInRenderContext($render_context, $callable);
 
  if (!$render_context->isEmpty()) {
    BubbleableMetadata::createFromRenderArray($form)
      ->merge($render_context->pop())
      ->applyTo($form);
  }
  $output = $renderer->renderRoot($form);
 
  // These forms have the title built in, so set the title here:
  $title = $form_state->get('title') ? : '';
 
  if ($ajax && (!$form_state->isExecuted() || $form_state->get('rerender'))) {
    // If the form didn't execute and we're using ajax, build up an
    // Ajax command list to execute.
    $response = new AjaxResponse();
 
    // Attach the library necessary for using the OpenModalDialogCommand and
    // set the attachments for this Ajax response.
    $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
    $response->setAttachments($form['#attached']);
 
    $display = '';
    $status_messages = array('#type' => 'status_messages');
    if ($messages = $renderer->renderRoot($status_messages)) {
      $display = '<div class="views-messages">' . $messages . '</div>';
    }
    $display .= $output;
 
    $options = array(
      'dialogClass' => 'views-ui-dialog js-views-ui-dialog',
      'width' => '75%',
    );
 
    $response->addCommand(new OpenModalDialogCommand($title, $display, $options));
 
    // Views provides its own custom handling of AJAX form submissions.
    // Usually this happens at the same path, but custom paths may be
    // specified in $form_state.
    $form_url = $form_state->has('url') ? $form_state->get('url')->toString() : $this->url('<current>');
    $response->addCommand(new SetFormCommand($form_url));
 
    if ($section = $form_state->get('#section')) {
      $response->addCommand(new HighlightCommand('.' . Html::cleanCssIdentifier($section)));
    }
 
    return $response;
  }
 
  return $title ? ['#title' => $title, '#markup' => $output] : $output;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.