0

我现在有一个自定义模块,以便使用 Drupal 消息发送 AJAX 功能。该模块具有以下代码(test_error.module):

<?php


function test_error_user_view_alter(&$build) {
    //_assassinations_player_profile($build);
}

function test_error_form_alter(&$form, &$form_state, $form_id) {

    $form['test_error'] = array(
                '#type' => 'button',
                '#name' => 'Error',
                '#value' => t('Error'),
                '#ajax'  => array(
                    'callback' => 'test_error_error',
                    'wrapper'  => 'the-wrapper-div-field',
                ),
            );
    $form['test_warning'] = array(
                '#type' => 'button',
                '#name' => 'Error',
                '#value' => t('Error'),
                '#ajax'  => array(
                    'callback' => 'test_error_warning',
                    'wrapper'  => 'the-wrapper-div-field',
                ),
            );

    return $form;
}

function test_error_error() {
    drupal_set_message("Header error", 'error');
}
function test_error_warning() {
    drupal_set_message("Header warning", 'warning');
}

然后,在 page.tpl.php 中,我有以下输出 $messages:

  <div id="messages-wrap"><?php print $messages; ?></div>

AJAX 功能在单击按钮时发生 - 设置消息 - 而消息仅在页面重新加载后显示。我试图通过返回 AJAX 调用来破解我的方式,如下所示:

jQuery(document).ready( function(){
  jQuery('.ajax-processed').each( function(){
    jQuery(this).unbind();
  });
  jQuery('#edit-test-warning, #edit-test-error').click( function() {
    var the_form = jQuery(this).closest('form');
    var form_action = the_form.attr('action');
    var details = the_form.serialize();
    jQuery.ajax({
      type: "POST",
      url: form_action,
      data: details
    }).done( function(){
      jQuery('#messages-wrap').load("/ #messages-wrap");
    });
  });
});

#edit-test-x 按钮上的单击事件绑定永远不会发生,因为 Drupal 的本机 ajax.js 通过添加其 ajax-x 类来阻止它。

当目标是如此简单的事情时,这个问题是如此持久且如此难以解决,这让我发疯了。我错过了什么?谷歌搜索和 StackOverflow 浏览出人意料地毫无结果。

谢谢!

4

1 回答 1

3

首先,这里有一些解释:
1. 所以你试图渲染drupal 消息作为表单的一部分,你必须手动渲染drupal 消息。
2.使用'#ajax'键,不需要额外的(自定义)JS。
3. 点击按钮,表单被重建,因此,您只需在表单逻辑中放置消息渲染代码。

简单案例的代码示例:

function test_error_form(&$form, &$form_state) {
  $form['test_error'] = array(
    '#type' => 'button',
    '#value' => t('Error'),
    '#ajax'  => array(
      'callback' => 'test_error_error',
      'wrapper'  => 'the-error-container',
    ),
  );
  $form['test_warning'] = array(
    '#type' => 'button',
    '#value' => t('Error'),
    '#ajax'  => array(
      'callback' => 'test_error_warning',
      'wrapper'  => 'the-error-container',
    ),
  );

  return $form;
}

function test_error_error($form) {
  drupal_set_message("Header error", 'error');
  return array(
    '#type' => 'markup',
    '#markup' => theme('status_messages'),
  );
}
function test_error_warning($form) {
  drupal_set_message("Header warning", 'warning');
  return array(
    '#type' => 'markup',
    '#markup' => theme('status_messages'),
  );
}

请注意,您必须在页面上有 id="the-error-container" 的 div。

如果您想在标准位置呈现新的 drupal 消息,请尝试使用 ajax 命令,如下所示:

$commands = array();
$commands[] = ajax_command_replace($selector, theme('status_messages'));
return array(
  '#type' => 'ajax',
  '#commands' => $commands,
);

其中 $selector - 是您的消息区域的 css/jquery 选择器。

有不清楚的请追问。

于 2013-11-14T11:02:22.850 回答