Por que minhas mensagens $ são atrasadas na atualização de uma página?

10

Eu tenho uma página com um modelo muito simples:

<!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>

Basicamente, ele exibe o formulário de registro e nada mais.

  1. Entro alguns dados incorretos no formulário - um nome de usuário já usado (admin) e nenhum endereço de email.
  2. Clico em "criar nova conta".
  3. A página parece enviar e recarregar, mas nada aconteceu - nenhuma mensagem de erro está sendo exibida .
  4. Eu atualizo a página (F5).
  5. O Firefox exibe "para exibir esta página, o Firefox deve enviar informações que repetirão qualquer ação executada anteriormente" - para que eu saiba que meu POST passou anteriormente.
  6. Clico em "reenviar" nessa janela de diálogo.
  7. Minhas mensagens de erro são exibidas - "o campo de endereço de e-mail é obrigatório", "o nome admin já está sendo usado".

Isso ocorre em todos os formulários que testei até agora, não apenas no formulário de registro.

Por que isso está acontecendo? O que posso fazer para corrigi-lo para que as mensagens de erro sejam exibidas pela primeira vez?

Fico feliz em fazer o que for necessário para depurar isso, mas preciso de alguma direção para começar a procurar. :)

George
fonte

Respostas:

4

Provavelmente, o problema é que você está chamando o formulário quando as mensagens já foram criadas, e é por isso que elas não aparecem. Você precisa chamar o formulário, anteriormente no processo de criação da página ou receber as mensagens, com drupal_get_messages.

O que você realmente deve fazer é criar essa funcionalidade em um módulo e colocar o tema na página, em vez de fazê-lo no seu tema. Você pode ter muitos outros problemas como esse.

googletorp
fonte
OK, acho que finalmente posso ter corrigido isso. Eu escrevi um módulo chamado 'my_register_form' que não faz nada além de retornar drupal_get_form('user_register')no $block['content']. Incluo esse módulo via contexto e as mensagens de erro de registro são exibidas corretamente após o envio. Parece muito complicado, mas funciona e me permite incluir os formulários de login / registro como eu os quero. Muito obrigado pela sua ajuda.
George George
3

Resolvemos o problema de validação do formulário (a validação do formulário ocorre após a renderização das mensagens e aparece na próxima solicitação), por ..

forçando a validação do formulário em 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');
}
chim
fonte
2

Eu também sofri desse problema. A resposta do @ googletorp me ajudou a resolvê-lo.

No início da página tpl. Obtenha o conteúdo renderizado dos formulários, ou seja, para o meu caso:

$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);

Em seguida, na seção de impressão de mensagens, obtenha as mensagens chamando drupal_get_messages () na página tpl. $ messages ainda não conseguiu buscar as mensagens sem outra atualização de página.

<?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
    }
?>

Em seguida, imprima o conteúdo do formulário renderizado na seção apropriada e ele resolveu :).

sumanchalki
fonte
1

Não é diretamente uma solução para a pergunta, mas me deparei com isso quando estava tendo o mesmo problema:

Se o seu bloco de formulário for chamado diretamente do arquivo tpl.php (talvez por razões de layout), você receberá mensagens atrasadas.

Ou seja, eu estava carregando um bloco com o seguinte código no meu arquivo de modelo:

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

E depois renderizá-lo no meu arquivo tpl.php.

<?php print render $contact_details ?>
Dominic Woodman
fonte