Perché i miei $ messaggi sono in ritardo di un aggiornamento della pagina?


10

Ho una pagina con un modello molto semplice:

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

Fondamentalmente, visualizza il modulo di registrazione e nient'altro.

  1. Nel modulo inserisco alcuni dati errati: un nome utente (admin) già utilizzato e nessun indirizzo e-mail.
  2. Faccio clic su "Crea nuovo account".
  3. La pagina sembra inviare e ricaricare, ma non è successo nulla: non vengono visualizzati messaggi di errore .
  4. Aggiorna la pagina (F5).
  5. Firefox visualizza "per visualizzare questa pagina, Firefox deve inviare informazioni che ripeteranno qualsiasi azione eseguita in precedenza" - quindi so che il mio POST è stato eseguito in precedenza.
  6. Faccio clic su "Rinvia" nella finestra di dialogo.
  7. Vengono visualizzati i miei messaggi di errore: "il campo dell'indirizzo e-mail è obbligatorio", "il nome admin è già utilizzato".

Questo si verifica per tutti i moduli che ho testato finora, non solo per il modulo di registrazione.

Perché sta succedendo? Cosa posso fare per risolverlo in modo che i messaggi di errore vengano visualizzati per la prima volta?

Sono felice di fare tutto ciò di cui ho bisogno per eseguire il debug, ma ho bisogno di una direzione per iniziare a cercare. :)

Risposte:


4

Molto probabilmente il problema è che stai chiamando il modulo quando i messaggi sono già stati creati, motivo per cui non vengono visualizzati. Devi chiamare il modulo, prima nel processo di creazione della pagina o ottenere i messaggi, con drupal_get_messages.

Quello che dovresti davvero fare è creare questa funzionalità in un modulo e temi la pagina invece di farlo nel tuo tema. Potresti potenzialmente imbatterti in molti altri problemi come questo.


OK, penso che finalmente avrei potuto risolvere questo problema. Ho scritto un modulo chiamato 'my_register_form' che non fa altro che tornare drupal_get_form('user_register')in $block['content']. Includo quel modulo tramite il contesto e quindi i messaggi di errore di registrazione vengono visualizzati correttamente dopo l'invio. Sembra eccessivamente complicato ma funziona e mi permette di includere i moduli di login / registro come li voglio. Grazie mille per il tuo aiuto.
George,

3

Abbiamo risolto il problema di convalida del modulo, (la convalida del modulo si verifica dopo che i messaggi sono stati resi e si presenta alla richiesta successiva), da ..

forzando la convalida del modulo in 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

Ho anche sofferto di questo problema. La risposta di @ googletorp mi ha aiutato a risolverlo.

All'inizio della pagina tpl. Ottieni il contenuto renderizzato dei moduli, ad esempio per il mio 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);

Quindi nella sezione di stampa dei messaggi, ottieni i messaggi che chiamano drupal_get_messages () nella pagina tpl. $ message non è ancora in grado di recuperare i messaggi senza un altro aggiornamento della pagina.

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

Quindi stampare il contenuto del modulo renderizzato nella sezione appropriata e risolto :).


1

Non direttamente una soluzione per la domanda posta, ma mi sono imbattuto in questo quando stavo avendo lo stesso problema:

Se il tuo blocco di moduli viene chiamato direttamente dal file tpl.php (forse per motivi di layout), riceverai messaggi in ritardo.

Cioè stavo caricando un blocco con il seguente codice nel mio file modello:

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

E poi renderlo nel mio file tpl.php.

<?php print render $contact_details ?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.