From 9f61972e0ac6d30c64c6ab93f5cfe8029536f51a Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Sat, 7 Apr 2018 08:43:49 +0100 Subject: [PATCH] Issue #2896535 by timmillwood, tedbow: Create a helper trait for Forms in ajax dialogs --- .../Drupal/Core/Ajax}/AjaxFormHelperTrait.php | 7 +-- .../Drupal/Core/Ajax}/AjaxHelperTrait.php | 16 +++--- .../src/Controller/AddSectionController.php | 1 + .../src/Controller/ChooseBlockController.php | 1 + .../Controller/ChooseSectionController.php | 1 + .../src/Form/ConfigureBlockFormBase.php | 1 + .../src/Form/ConfigureSectionForm.php | 1 + .../src/Form/LayoutRebuildConfirmFormBase.php | 1 + .../src/Block/BlockEntitySettingTrayForm.php | 55 ++++++------------- 9 files changed, 32 insertions(+), 52 deletions(-) rename core/{modules/layout_builder/src/Form => lib/Drupal/Core/Ajax}/AjaxFormHelperTrait.php (86%) rename core/{modules/layout_builder/src/Controller => lib/Drupal/Core/Ajax}/AjaxHelperTrait.php (68%) diff --git a/core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php b/core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php similarity index 86% rename from core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php rename to core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php index a5a387020f9d..49932df548ac 100644 --- a/core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php +++ b/core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php @@ -1,18 +1,13 @@ <?php -namespace Drupal\layout_builder\Form; +namespace Drupal\Core\Ajax; -use Drupal\Core\Ajax\AjaxResponse; -use Drupal\Core\Ajax\ReplaceCommand; use Drupal\Core\Form\FormStateInterface; -use Drupal\layout_builder\Controller\AjaxHelperTrait; /** * Provides a helper to for submitting an AJAX form. * * @internal - * - * @todo Move to \Drupal\Core in https://www.drupal.org/node/2896535. */ trait AjaxFormHelperTrait { diff --git a/core/modules/layout_builder/src/Controller/AjaxHelperTrait.php b/core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php similarity index 68% rename from core/modules/layout_builder/src/Controller/AjaxHelperTrait.php rename to core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php index 072eccab352e..287abae3212a 100644 --- a/core/modules/layout_builder/src/Controller/AjaxHelperTrait.php +++ b/core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php @@ -1,6 +1,6 @@ <?php -namespace Drupal\layout_builder\Controller; +namespace Drupal\Core\Ajax; use Drupal\Core\EventSubscriber\MainContentViewSubscriber; @@ -8,8 +8,6 @@ * Provides a helper to determine if the current request is via AJAX. * * @internal - * - * @todo Move to \Drupal\Core in https://www.drupal.org/node/2896535. */ trait AjaxHelperTrait { @@ -20,12 +18,12 @@ trait AjaxHelperTrait { * TRUE if the current request is via AJAX, FALSE otherwise. */ protected function isAjax() { - return in_array($this->getRequestWrapperFormat(), [ - 'drupal_ajax', - 'drupal_dialog', - 'drupal_dialog.off_canvas', - 'drupal_modal', - ]); + foreach (['drupal_ajax', 'drupal_modal', 'drupal_dialog'] as $wrapper) { + if (strpos($this->getRequestWrapperFormat(), $wrapper) !== FALSE) { + return TRUE; + } + } + return FALSE; } /** diff --git a/core/modules/layout_builder/src/Controller/AddSectionController.php b/core/modules/layout_builder/src/Controller/AddSectionController.php index 947895985cf1..0ea42379a6be 100644 --- a/core/modules/layout_builder/src/Controller/AddSectionController.php +++ b/core/modules/layout_builder/src/Controller/AddSectionController.php @@ -2,6 +2,7 @@ namespace Drupal\layout_builder\Controller; +use Drupal\Core\Ajax\AjaxHelperTrait; use Drupal\Core\DependencyInjection\ClassResolverInterface; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\layout_builder\LayoutTempstoreRepositoryInterface; diff --git a/core/modules/layout_builder/src/Controller/ChooseBlockController.php b/core/modules/layout_builder/src/Controller/ChooseBlockController.php index 5287be25fcff..85ea7d83709a 100644 --- a/core/modules/layout_builder/src/Controller/ChooseBlockController.php +++ b/core/modules/layout_builder/src/Controller/ChooseBlockController.php @@ -2,6 +2,7 @@ namespace Drupal\layout_builder\Controller; +use Drupal\Core\Ajax\AjaxHelperTrait; use Drupal\Core\Block\BlockManagerInterface; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Url; diff --git a/core/modules/layout_builder/src/Controller/ChooseSectionController.php b/core/modules/layout_builder/src/Controller/ChooseSectionController.php index a04cdbb1c116..488480883d57 100644 --- a/core/modules/layout_builder/src/Controller/ChooseSectionController.php +++ b/core/modules/layout_builder/src/Controller/ChooseSectionController.php @@ -2,6 +2,7 @@ namespace Drupal\layout_builder\Controller; +use Drupal\Core\Ajax\AjaxHelperTrait; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Layout\LayoutPluginManagerInterface; use Drupal\Core\Plugin\PluginFormInterface; diff --git a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php index e1103e9e44bb..ccef12287db9 100644 --- a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php +++ b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php @@ -3,6 +3,7 @@ namespace Drupal\layout_builder\Form; use Drupal\Component\Uuid\UuidInterface; +use Drupal\Core\Ajax\AjaxFormHelperTrait; use Drupal\Core\Block\BlockManagerInterface; use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\DependencyInjection\ClassResolverInterface; diff --git a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php index 2bfcdca7c2df..94c2a4eb4c2b 100644 --- a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php +++ b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php @@ -2,6 +2,7 @@ namespace Drupal\layout_builder\Form; +use Drupal\Core\Ajax\AjaxFormHelperTrait; use Drupal\Core\DependencyInjection\ClassResolverInterface; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; diff --git a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php index 511a11968e3e..2a44a290d0a5 100644 --- a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php +++ b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php @@ -2,6 +2,7 @@ namespace Drupal\layout_builder\Form; +use Drupal\Core\Ajax\AjaxFormHelperTrait; use Drupal\Core\DependencyInjection\ClassResolverInterface; use Drupal\Core\Form\ConfirmFormBase; use Drupal\Core\Form\FormStateInterface; diff --git a/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php b/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php index fd44b0c86aa8..243e907ccd3f 100644 --- a/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php +++ b/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php @@ -5,9 +5,9 @@ use Drupal\block\BlockForm; use Drupal\block\BlockInterface; use Drupal\Component\Utility\Html; +use Drupal\Core\Ajax\AjaxFormHelperTrait; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\RedirectCommand; -use Drupal\Core\Ajax\ReplaceCommand; use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginWithFormsInterface; @@ -23,6 +23,8 @@ */ class BlockEntitySettingTrayForm extends BlockForm { + use AjaxFormHelperTrait; + /** * Provides a title callback to get the block's admin label. * @@ -122,17 +124,17 @@ protected function getPluginForm(BlockPluginInterface $block) { public function buildForm(array $form, FormStateInterface $form_state) { $form = parent::buildForm($form, $form_state); $form['actions']['submit']['#ajax'] = [ - 'callback' => '::submitFormDialog', + 'callback' => '::ajaxSubmit', ]; $form['#attached']['library'][] = 'core/drupal.dialog.ajax'; - // static::submitFormDialog() requires data-drupal-selector to be the same - // between the various Ajax requests. A bug in - // \Drupal\Core\Form\FormBuilder prevents that from happening unless - // $form['#id'] is also the same. Normally, #id is set to a unique HTML ID - // via Html::getUniqueId(), but here we bypass that in order to work around - // the data-drupal-selector bug. This is okay so long as we assume that this - // form only ever occurs once on a page. + // static::ajaxSubmit() requires data-drupal-selector to be the same between + // the various Ajax requests. A bug in \Drupal\Core\Form\FormBuilder + // prevents that from happening unless $form['#id'] is also the same. + // Normally, #id is set to a unique HTML ID via Html::getUniqueId(), but + // here we bypass that in order to work around the data-drupal-selector bug. + // This is okay so long as we assume that this form only ever occurs once on + // a page. // @todo Remove this workaround once https://www.drupal.org/node/2897377 is // fixed. $form['#id'] = Html::getId($form_state->getBuildInfo()['form_id']); @@ -141,38 +143,17 @@ public function buildForm(array $form, FormStateInterface $form_state) { } /** - * Submit form dialog #ajax callback. - * - * @param array $form - * An associative array containing the structure of the form. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The current state of the form. - * - * @return \Drupal\Core\Ajax\AjaxResponse - * An AJAX response that display validation error messages or redirects - * to a URL - * - * @todo Repalce this callback with generic trait in - * https://www.drupal.org/node/2896535. + * {@inheritdoc} */ - public function submitFormDialog(array &$form, FormStateInterface $form_state) { - $response = new AjaxResponse(); - if ($form_state->hasAnyErrors()) { - $form['status_messages'] = [ - '#type' => 'status_messages', - '#weight' => -1000, - ]; - $command = new ReplaceCommand('[data-drupal-selector="' . $form['#attributes']['data-drupal-selector'] . '"]', $form); + protected function successfulAjaxSubmit(array $form, FormStateInterface $form_state) { + if ($redirect_url = $this->getRedirectUrl()) { + $command = new RedirectCommand($redirect_url->setAbsolute()->toString()); } else { - if ($redirect_url = $this->getRedirectUrl()) { - $command = new RedirectCommand($redirect_url->setAbsolute()->toString()); - } - else { - // Settings Tray always provides a destination. - throw new \Exception("No destination provided by Settings Tray form"); - } + // Settings Tray always provides a destination. + throw new \Exception("No destination provided by Settings Tray form"); } + $response = new AjaxResponse(); return $response->addCommand($command); } -- GitLab