Skip to content
ajax_test.module 8.36 KiB
Newer Older
 * Helper module for Ajax framework tests.
use Drupal\Core\Ajax\OpenDialogCommand;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Ajax\CloseDialogCommand;
/**
 * Implements hook_system_theme_info().
 */
function ajax_test_system_theme_info() {
  $themes['test_theme'] = drupal_get_path('module', 'system') . '/tests/themes/test_theme/test_theme.info.yml';
 * Menu callback: Returns an element suitable for use by ajax_render().
 *
 * Additionally ensures that ajax_render() incorporates JavaScript settings
 * generated during the page request by invoking drupal_add_js() with a dummy
 * setting.
 *
 * @deprecated \Drupal\ajax_test\Controller\AjaxTestController::render()
 */
function ajax_test_render() {
  $attached = array(
    '#attached' => array(
      'js' => array(
        0 => array(
          'type' => 'setting',
          'data' => array('ajax' => 'test'),
        ),
      ),
    ),
  );
  drupal_render($attached);
  $response = new AjaxResponse();
  return $response;
/**
 * Menu callback: Returns an AjaxResponse; settings command set last.
 *
 * Helps verifying AjaxResponse reorders commands to ensure correct execution.
 *
 * @deprecated \Drupal\ajax_test\Controller\AjaxTestController::order()
 */
function ajax_test_order() {
  $response = new AjaxResponse();
  $path = drupal_get_path('module', 'system');
  // HTML insertion command.
  $response->addCommand(new HtmlCommand('body', 'Hello, world!'));
  $attached = array(
    '#attached' => array(
      'css' => array(
        // Add two CSS files (order should remain the same).
        $path . '/css/system.admin.css' => array(),
        $path . '/css/system.maintenance.css' => array(),
      ),
      'js' => array(
        // Add two JavaScript files (first to the footer, should appear last).
        $path . '/system.modules.js' => array('scope' => 'footer'),
        $path . '/system.js' => array(),
        // Finally, add a JavaScript setting.
        0 => array(
          'type' => 'setting',
          'data' => array('ajax' => 'test'),
        ),
      ),
    ),
  );
  drupal_render($attached);
 * Menu callback: Returns AJAX element with #error property set.
 *
 * @deprecated \Drupal\ajax_test\Controller\AjaxTestController::renderError()
  $query = \Drupal::request()->query;
  if ($query->has('message')) {
    $message = $query->get('message');
  $response = new AjaxResponse();
  $response->addCommand(new AlertCommand($message));
  return $response;
/**
 * Menu callback: Renders a form elements and links with #ajax['dialog'].
 *
 * @deprecated \Drupal\ajax_test\Controller\AjaxTestController::dialog()
 */
function ajax_test_dialog() {
  // Add two wrapper elements for testing non-modal dialogs. Modal dialogs use
  // the global drupal-modal wrapper by default.
  $build['dialog_wrappers'] = array('#markup' => '<div id="ajax-test-dialog-wrapper-1"></div><div id="ajax-test-dialog-wrapper-2"></div>');

  // Dialog behavior applied to a button.
  $build['form'] = drupal_get_form('ajax_test_dialog_form');

  // Dialog behavior applied to a #type => 'link'.
  $build['link'] = array(
    '#type' => 'link',
    '#title' => 'Link 1 (modal)',
    '#href' => 'ajax-test/dialog-contents',
    '#attributes' => array(
      'class' => array('use-ajax'),
      'data-accepts' => 'application/vnd.drupal-modal',
    ),
  );

  // Dialog behavior applied to links rendered by theme_links().
  $build['links'] = array(
    '#theme' => 'links',
    '#links' => array(
      'link2' => array(
        'title' => 'Link 2 (modal)',
        'href' => 'ajax-test/dialog-contents',
        'attributes' => array(
          'class' => array('use-ajax'),
          'data-accepts' => 'application/vnd.drupal-modal',
          'data-dialog-options' => json_encode(array(
            'width' => 400,
          ))
        ),
      ),
      'link3' => array(
        'title' => 'Link 3 (non-modal)',
        'href' => 'ajax-test/dialog-contents',
        'attributes' => array(
          'class' => array('use-ajax'),
          'data-accepts' => 'application/vnd.drupal-dialog',
          'data-dialog-options' => json_encode(array(
            'target' => 'ajax-test-dialog-wrapper-1',
            'width' => 800,
          ))
        ),
      ),
      'link4' => array(
        'title' => 'Link 4 (close non-modal if open)',
        'href' => 'ajax-test/dialog-close',
        'attributes' => array(
          'class' => array('use-ajax'),
        ),
      'link5' => array(
        'title' => 'Link 5 (form)',
        'href' => 'ajax-test/dialog-form',
        'attributes' => array(
          'class' => array('use-ajax'),
          'data-accepts' => 'application/vnd.drupal-modal',
        ),
      ),
      'link6' => array(
        'title' => 'Link 6 (entity form)',
        'href' => 'admin/structure/contact/add',
        'attributes' => array(
          'class' => array('use-ajax'),
          'data-accepts' => 'application/vnd.drupal-modal',
          'data-dialog-options' => json_encode(array(
            'width' => 800,
            'height' => 500,
          ))
        ),
      ),
      'link7' => array(
        'title' => 'Link 7 (non-modal, no target)',
        'href' => 'ajax-test/dialog-contents',
        'attributes' => array(
          'class' => array('use-ajax'),
          'data-accepts' => 'application/vnd.drupal-dialog',
          'data-dialog-options' => json_encode(array(
            'width' => 800,
          ))
        ),
      ),
    ),
  );
  return $build;
}

/**
 * Form builder: Renders buttons with #ajax['dialog'].
 */
function ajax_test_dialog_form($form, &$form_state) {
  // In order to use WebTestBase::drupalPostAjaxForm() to POST from a link, we need
  // to have a dummy field we can set in WebTestBase::drupalPostForm() else it won't
  // submit anything.
  $form['textfield'] = array(
    '#type' => 'hidden'
  );
  $form['button1'] = array(
    '#type' => 'submit',
    '#value' => 'Button 1 (modal)',
    '#ajax' => array(
      'callback' => 'ajax_test_dialog_form_callback_modal',
    ),
  );
  $form['button2'] = array(
    '#type' => 'submit',
    '#value' => 'Button 2 (non-modal)',
    '#ajax' => array(
      'callback' => 'ajax_test_dialog_form_callback_nonmodal',
 * Non-AJAX behavior of the dialog buttons.
 */
function ajax_test_dialog_form_submit($form, &$form_state) {
  $form_state['redirect_route']['route_name'] = 'ajax_test.dialog_contents';
/**
 * AJAX callback handler for ajax_test_dialog_form().
 */
function ajax_test_dialog_form_callback_modal($form, &$form_state) {
}

/**
 * AJAX callback handler for ajax_test_dialog_form().
 */
function ajax_test_dialog_form_callback_nonmodal($form, &$form_state) {
 * Util to render dialog in ajax callback.
 *
 * @param bool $is_modal
 *   (optional) TRUE if modal, FALSE if plain dialog. Defaults to FALSE.
function _ajax_test_dialog($is_modal = FALSE) {
  $content = ajax_test_dialog_contents();
  $response = new AjaxResponse();
  $title = t('AJAX Dialog contents');
  $html = drupal_render($content);
  if ($is_modal) {
    $response->addCommand(new OpenModalDialogCommand($title, $html));
  }
  else {
    $selector = '#ajax-test-dialog-wrapper-1';
    $response->addCommand(new OpenDialogCommand($selector, $title, $html));
  }
  return $response;
}

/**
 * Returns example content for dialog tests.
 */
function ajax_test_dialog_contents() {
  // This is a regular render array; the keys do not have special meaning.
    'content' => array(
      '#markup' => 'Example message',
    ),
      '#type' => 'link',
      '#title' => 'Cancel',
      '#href' => '',
      '#attributes' => array(
        // This is a special class to which JavaScript assigns dialog closing
        // behavior.
        'class' => array('dialog-cancel'),
      ),
    ),
  );
/**
 * Menu callback: Close the ajax dialog.
 *
 * @deprecated \Drupal\ajax_test\Controller\AjaxTestController::dialogClose()
 */
function ajax_test_dialog_close() {
  $response = new AjaxResponse();
  $response->addCommand(new CloseDialogCommand('#ajax-test-dialog-wrapper-1'));
  return $response;
}