Issue #2896535 by timmillwood, tedbow: Create a helper trait for Forms in ajax dialogs
parent
33519ea3c7
commit
9f61972e0a
|
@ -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 {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\layout_builder\Controller;
|
||||
namespace Drupal\Core\Ajax;
|
||||
|
||||
use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
|
||||
|
||||
|
@ -8,8 +8,6 @@ use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
|
|||
* 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;
|
||||
}
|
||||
|
||||
/**
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -5,9 +5,9 @@ namespace Drupal\settings_tray\Block;
|
|||
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 @@ use Drupal\Core\Url;
|
|||
*/
|
||||
class BlockEntitySettingTrayForm extends BlockForm {
|
||||
|
||||
use AjaxFormHelperTrait;
|
||||
|
||||
/**
|
||||
* Provides a title callback to get the block's admin label.
|
||||
*
|
||||
|
@ -122,17 +124,17 @@ class BlockEntitySettingTrayForm extends BlockForm {
|
|||
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 @@ class BlockEntitySettingTrayForm extends BlockForm {
|
|||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue