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:
- The name of a class that implements \Drupal\Core\Form\FormInterface.
- An instance of a class that implements \Drupal\Core\Form\FormInterface.
\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:
- A \Drupal\Core\Ajax\AjaxResponse object.
- The rendered form, as a string.
- A render array with the title in #title and the rendered form in the
#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
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; }
Please login to continue.