为什么我的$ messages延迟一页刷新?


10

我有一个带有非常简单的模板的页面:

<!DOCTYPE html>
<html>
<head><title>TEST REGISTRATION PAGE</title></head>
<body>
    <?php 
        print drupal_get_form('user_register');
        print $messages;
        print $closure;
        print $main_content;
    ?>
</body></html>

基本上,它显示注册表格,仅显示其他内容。

  1. 我在表单上输入了一些错误的数据-已经使用的用户名(admin),没有电子邮件地址。
  2. 我点击“创建新帐户”。
  3. 该页面似乎已提交并重新加载,但没有任何反应- 没有显示错误消息
  4. 我刷新页面(F5)。
  5. Firefox显示“要显示此页面,Firefox必须发送将重复先前执行的任何操作的信息”-因此,我知道我的POST以前已经过过。
  6. 我在该对话框窗口中单击“重新发送”。
  7. 出现我的错误消息-“必填电子邮件地址”,“名称admin已被使用”。

到目前为止,这是我测试过的所有表格,而不仅仅是注册表格。

为什么会这样呢?我该怎么做以解决此问题,以便第一次显示错误消息?

我很乐意做我需要调试的所有事情,但是我需要一些指导才能开始寻找。:)

Answers:


4

最有可能的问题是,已经创建了消息后您正在调用表单,这就是为什么它们不出现的原因。您需要在构建页面的早期阶段调用表单,或者使用drupal_get_messages获取消息。

您真正应该做的是在模块和页面主题中创建此功能,而不是在主题中创建。您可能会遇到更多类似这样的问题。


好的,我想我终于可以解决这个问题。我已经编写了一个名为“ my_register_form”的模块,该模块仅drupal_get_form('user_register')在返回中起作用$block['content']。我通过上下文包括该模块,然后在提交后正确显示注册错误消息。似乎过于复杂,但是它起作用了,它使我可以按照自己的意愿包括登录/注册表单。谢谢您的帮助。
乔治,

3

我们解决了表单验证问题,(表单验证发生在呈现消息之后,并在下一个请求中显示)。

在hook_node_view中强制进行表单验证

/**
 * This is a fix for a bug where the validation error messages lag a 
 * full request behind form submissions
 */
function your_module_node_view($node, $view_mode){
  // check that form id is the form you want
  if ( !isset( $_POST['form_id'] ) || $_POST['form_id'] != 'your_form_id' ){
    return;
  }
  // this forces validation of the form 
  drupal_get_form('your_form_id');
}

2

我也遭受这个问题。@googletorp的答案帮助我解决了这个问题。

在页面tpl的开头。获取表单的渲染内容,例如我的情况:

$register_form = drupal_get_form('user_register_form');
$register_form_content = render($register_form);

$form_user_pass = drupal_get_form('user_pass');
$form_user_pass_content = drupal_render($form_user_pass);

$login_form = drupal_get_form('user_login_block');
$login_form_content = render($login_form);

然后在消息打印部分,在tpl页上获取调用drupal_get_messages()的消息。$ messages仍无法在不刷新另一个页面的情况下获取消息。

<?php 
    $messages = drupal_get_messages('error');
    if(is_array($messages['error']) && count($messages['error'])) {
?>
    <div id="messages">
        <div class="section clearfix">
            <div class="messages error">
                <ul>
                    <?php 
                    foreach($messages['error'] as $item) {
                        echo '<li>'.$item.'</li>';
                    }
                    ?>
                </ul>
            </div>
        </div>
    </div>
<?php
    }
?>

然后在适当的部分打印呈现的表单内容,然后解决:)。


1

并非直接解决所提出问题的方法,但是当我遇到同样的问题时,我遇到了这个问题:

如果直接从tpl.php文件中调用表单块(可能是出于布局原因),则将收到延迟的消息。

即我在模板文件中加载了以下代码的块:

$vars['contact_details'] = module_invoke('viewusercontact', 'block_view', 0);

然后将其渲染到我的tpl.php文件中。

<?php print render $contact_details ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.