Same filename and directory in other branches
- 8.9.x core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php
- 9 core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php
Namespace
Drupal\views_ui\Form\Ajax
File
core/modules/views_ui/src/Form/Ajax/ViewsFormBase.php
View source
<?php
namespace Drupal\views_ui\Form\Ajax;
use Drupal\Component\Utility\Html;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\CloseModalDialogCommand;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Render\RenderContext;
use Drupal\Core\Url;
use Drupal\views\Ajax\HighlightCommand;
use Drupal\views\Ajax\ReplaceTitleCommand;
use Drupal\views\Ajax\ShowButtonsCommand;
use Drupal\views\Ajax\TriggerPreviewCommand;
use Drupal\views\ViewEntityInterface;
use Drupal\views_ui\Ajax\SetFormCommand;
use Symfony\Component\HttpFoundation\RedirectResponse;
abstract class ViewsFormBase extends FormBase implements ViewsFormInterface {
protected $id;
protected $type;
protected function setID($id) {
if ($id) {
$this->id = $id;
}
}
protected function setType($type) {
if ($type) {
$this->type = $type;
}
}
public function getFormState(ViewEntityInterface $view, $display_id, $js) {
$ajax = is_string($js) ? $js === 'ajax' : $js;
return (new FormState())
->set('form_id', $this
->getFormId())
->set('form_key', $this
->getFormKey())
->set('ajax', $ajax)
->set('display_id', $display_id)
->set('view', $view)
->set('type', $this->type)
->set('id', $this->id)
->disableRedirect()
->addBuildInfo('callback_object', $this);
}
public function getForm(ViewEntityInterface $view, $display_id, $js) {
$form_state = $this
->getFormState($view, $display_id, $js);
$view = $form_state
->get('view');
$form_key = $form_state
->get('form_key');
\Drupal::moduleHandler()
->loadInclude('views_ui', 'inc', 'admin');
Html::resetSeenIds();
if (!empty($view->stack)) {
$identifier = implode('-', array_filter([
$form_key,
$view
->id(),
$display_id,
$form_state
->get('type'),
$form_state
->get('id'),
]));
reset($view->stack);
$stack_key = key($view->stack);
$top = current($view->stack);
next($view->stack);
unset($view->stack[$stack_key]);
if (array_shift($top) != $identifier) {
$view->stack = [];
}
}
if (isset($view->form_cache) && $view->form_cache['key'] !== $form_key) {
unset($view->form_cache);
}
$form_class = get_class($form_state
->getFormObject());
$response = $this
->ajaxFormWrapper($form_class, $form_state);
if (!$form_state
->isSubmitted() || $form_state
->get('rerender')) {
return $response;
}
if (!empty($view->stack)) {
$stack = $view->stack;
$top = array_shift($stack);
$reflection = new \ReflectionClass($view::$forms[$top[1]]);
$form_state = $reflection
->newInstanceArgs(array_slice($top, 3, 2))
->getFormState($view, $top[2], $form_state
->get('ajax'));
$form_class = get_class($form_state
->getFormObject());
$form_state
->setUserInput([]);
$form_url = views_ui_build_form_url($form_state);
if (!$form_state
->get('ajax')) {
return new RedirectResponse($form_url
->setAbsolute()
->toString());
}
$form_state
->set('url', $form_url);
$response = $this
->ajaxFormWrapper($form_class, $form_state);
}
elseif (!$form_state
->get('ajax')) {
$display_id = $form_state
->get('display_id');
return new RedirectResponse(Url::fromRoute('entity.view.edit_display_form', [
'view' => $view
->id(),
'display_id' => $display_id,
], [
'absolute' => TRUE,
])
->toString());
}
else {
$response = new AjaxResponse();
$response
->addCommand(new CloseModalDialogCommand());
$response
->addCommand(new ShowButtonsCommand(!empty($view->changed)));
$response
->addCommand(new TriggerPreviewCommand());
if ($page_title = $form_state
->get('page_title')) {
$response
->addCommand(new ReplaceTitleCommand($page_title));
}
}
if ($display_id !== '') {
\Drupal::entityTypeManager()
->getFormObject('view', 'edit')
->rebuildCurrentTab($view, $response, $display_id);
}
return $response;
}
protected function ajaxFormWrapper($form_class, FormStateInterface &$form_state) {
$renderer = \Drupal::service('renderer');
if (!$form_state
->has('rerender')) {
$form_state
->set('rerender', FALSE);
}
$ajax = $form_state
->get('ajax');
if (!$form_state
->isRedirectDisabled()) {
$form_state
->disableRedirect($ajax);
}
$form_state
->disableCache();
$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);
$title = $form_state
->get('title') ?: '';
if ($ajax && (!$form_state
->isExecuted() || $form_state
->get('rerender'))) {
$response = new AjaxResponse();
$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 = [
'classes' => [
'ui-dialog' => 'views-ui-dialog js-views-ui-dialog',
],
'width' => '75%',
];
$response
->addCommand(new OpenModalDialogCommand($title, $display, $options));
$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;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
}
}
Classes