protected function ViewsFormBase::ajaxFormWrapper in Drupal 10
Same name and namespace in other branches
- 8 core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php \Drupal\views_ui\Form\Ajax\ViewsFormBase::ajaxFormWrapper()
- 9 core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php \Drupal\views_ui\Form\Ajax\ViewsFormBase::ajaxFormWrapper()
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 196
Class
- ViewsFormBase
- Provides a base class for Views UI AJAX forms.
Namespace
Drupal\views_ui\Form\AjaxCode
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 = [
'#type' => 'status_messages',
];
if ($messages = $renderer
->renderRoot($status_messages)) {
$display = '<div class="views-messages">' . $messages . '</div>';
}
$display .= $output;
$options = [
'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() : Url::fromRoute('<current>')
->toString();
$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;
}