'AJAX Dialog & contents', 'content' => [ '#markup' => 'Example message', ], 'cancel' => [ '#type' => 'link', '#title' => 'Cancel', '#url' => Url::fromRoute(''), '#attributes' => [ // This is a special class to which JavaScript assigns dialog closing // behavior. 'class' => ['dialog-cancel'], ], ], ]; return $content; } /** * Example content for testing the wrapper of the response. * * @param string $type * Type of response. * * @return array * Renderable array of AJAX response contents. */ public function renderTypes($type) { return [ '#title' => 'AJAX Dialog & contents', 'content' => [ '#type' => 'inline_template', '#template' => $this->getRenderTypes()[$type]['render'], ], ]; } /** * Returns a render array of links that directly Drupal.ajax(). * * @return array * Renderable array of AJAX response contents. */ public function insertLinksBlockWrapper() { $methods = [ 'html', 'replaceWith', ]; $build['links'] = [ 'ajax_target' => [ '#markup' => '
Target
', ], 'links' => [ '#theme' => 'links', '#attached' => ['library' => ['ajax_test/ajax_insert']], ], ]; foreach ($methods as $method) { foreach ($this->getRenderTypes() as $type => $item) { $class = 'ajax-insert'; $build['links']['links']['#links']["$method-$type"] = [ 'title' => "Link $method $type", 'url' => Url::fromRoute('ajax_test.ajax_render_types', ['type' => $type]), 'attributes' => [ 'class' => [$class], 'data-method' => $method, 'data-effect' => $item['effect'], ], ]; } } return $build; } /** * Returns a render array of links that directly Drupal.ajax(). * * @return array * Renderable array of AJAX response contents. */ public function insertLinksInlineWrapper() { $methods = [ 'html', 'replaceWith', ]; $build['links'] = [ 'ajax_target' => [ '#markup' => '
Target inline
', ], 'links' => [ '#theme' => 'links', '#attached' => ['library' => ['ajax_test/ajax_insert']], ], ]; foreach ($methods as $method) { foreach ($this->getRenderTypes() as $type => $item) { $class = 'ajax-insert-inline'; $build['links']['links']['#links']["$method-$type"] = [ 'title' => "Link $method $type", 'url' => Url::fromRoute('ajax_test.ajax_render_types', ['type' => $type]), 'attributes' => [ 'class' => [$class], 'data-method' => $method, 'data-effect' => $item['effect'], ], ]; } } return $build; } /** * Returns a render array that will be rendered by AjaxRenderer. * * Verifies that the response incorporates JavaScript settings generated * during the page request by adding a dummy setting. */ public function render() { return [ '#attached' => [ 'library' => [ 'core/drupalSettings', ], 'drupalSettings' => [ 'ajax' => 'test', ], ], ]; } /** * Returns the used theme. */ public function theme() { return [ '#markup' => 'Current theme: ' . \Drupal::theme()->getActiveTheme()->getName(), ]; } /** * Returns an AjaxResponse; settings command set last. * * Helps verifying AjaxResponse reorders commands to ensure correct execution. */ public function order() { $response = new AjaxResponse(); // HTML insertion command. $response->addCommand(new HtmlCommand('body', 'Hello, world!')); $build['#attached']['library'][] = 'ajax_test/order'; $response->setAttachments($build['#attached']); return $response; } /** * Returns an AjaxResponse with alert command. * * @param \Symfony\Component\HttpFoundation\Request $request * The current request object. * * @return \Drupal\Core\Ajax\AjaxResponse * The JSON response object. */ public function renderError(Request $request) { $message = ''; $query = $request->query; if ($query->has('message')) { $message = $query->get('message'); } $response = new AjaxResponse(); $response->addCommand(new AlertCommand($message)); return $response; } /** * Returns a render array of form elements and links for dialog. */ public function dialog() { // Add two wrapper elements for testing non-modal dialogs. Modal dialogs use // the global drupal-modal wrapper by default. $build['dialog_wrappers'] = ['#markup' => '
']; // Dialog behavior applied to a button. $build['form'] = \Drupal::formBuilder()->getForm('Drupal\ajax_test\Form\AjaxTestDialogForm'); // Dialog behavior applied to a #type => 'link'. $build['link'] = [ '#type' => 'link', '#title' => 'Link 1 (modal)', '#url' => Url::fromRoute('ajax_test.dialog_contents'), '#attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', ], ]; // Dialog behavior applied to links rendered by links.html.twig. $build['links'] = [ '#theme' => 'links', '#links' => [ 'link2' => [ 'title' => 'Link 2 (modal)', 'url' => Url::fromRoute('ajax_test.dialog_contents'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => json_encode([ 'width' => 400, ]), ], ], 'link3' => [ 'title' => 'Link 3 (non-modal)', 'url' => Url::fromRoute('ajax_test.dialog_contents'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'dialog', 'data-dialog-options' => json_encode([ 'target' => 'ajax-test-dialog-wrapper-1', 'width' => 800, ]), ], ], 'link4' => [ 'title' => 'Link 4 (close non-modal if open)', 'url' => Url::fromRoute('ajax_test.dialog_close'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', ], ], 'link5' => [ 'title' => 'Link 5 (form)', 'url' => Url::fromRoute('ajax_test.dialog_form'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', ], ], 'link6' => [ 'title' => 'Link 6 (entity form)', 'url' => Url::fromRoute('contact.form_add'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => json_encode([ 'width' => 800, 'height' => 500, ]), ], ], 'link7' => [ 'title' => 'Link 7 (non-modal, no target)', 'url' => Url::fromRoute('ajax_test.dialog_contents'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'dialog', 'data-dialog-options' => json_encode([ 'width' => 800, ]), ], ], 'link8' => [ 'title' => 'Link 8 (ajax)', 'url' => Url::fromRoute('ajax_test.admin.theme'), 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => json_encode([ 'width' => 400, ]), ], ], ], ]; return $build; } /** * Returns an AjaxResponse with command to close dialog. * * @return \Drupal\Core\Ajax\AjaxResponse * The JSON response object. */ public function dialogClose() { $response = new AjaxResponse(); $response->addCommand(new CloseDialogCommand('#ajax-test-dialog-wrapper-1')); return $response; } /** * Render types. * * @return array * Render types. */ protected function getRenderTypes() { $render_single_root = [ 'pre-wrapped-div' => '
pre-wrapped
', 'pre-wrapped-span' => 'pre-wrapped', 'pre-wrapped-whitespace' => '
pre-wrapped-whitespace
' . "\r\n", 'not-wrapped' => 'not-wrapped', 'comment-string-not-wrapped' => 'comment-string-not-wrapped', 'comment-not-wrapped' => '
comment-not-wrapped
', 'svg' => '', 'empty' => '', ]; $render_multiple_root = [ 'mixed' => ' foo foo bar

some string

additional not wrapped strings,

final string

', 'top-level-only' => '
element #1
element #2
', 'top-level-only-pre-whitespace' => '
element #1
element #2
', 'top-level-only-middle-whitespace-span' => 'element #1 element #2', 'top-level-only-middle-whitespace-div' => '
element #1
element #2
', ]; $render_info = []; foreach ($render_single_root as $key => $render) { $render_info[$key] = ['render' => $render, 'effect' => 'fade']; } foreach ($render_multiple_root as $key => $render) { $render_info[$key] = ['render' => $render, 'effect' => 'none']; $render_info["$key--effect"] = ['render' => $render, 'effect' => 'fade']; } return $render_info; } }