Domanda

Problema: Ho una pagina di commento in cui ogni casella di commento ha un pulsante "rispondi".Ora i pulsanti di risposta hanno un collegamento live click jquery su di essi che, una volta attivato, carica il modulo di commento appropriato tramite ajax.Oltre ai soliti campi, ogni modulo contiene anche un input captcha.Dopo che il modulo è stato inviato con successo (o meno), aggiorno il captcha, in questo modo:

// submit triggered and form serialized
$.ajax({
 type: 'POST',
 url: myaction,
 data: serializedForm,
 cache: false,
 success: function(data, status) {
    //checks errors from server
    $servererr = $(data).find('.error_list');
    if($servererr.length === 0)
    {
      //flash success message...
      //refresh captcha
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
    else {
       //flash the server errors and then refresh captcha         
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
});

Ora ho 2 nuovi moduli di commento (f1 e f2) aperti sulla stessa pagina (con 2 azioni diverse, ad esempio /post/f1 e post/f2 rispettivamente).Invio f1 e nessun errore segnalato.Quindi vado al secondo modulo e inserisco tutti i dettagli validi e genera un errore captcha dal server (quindi viene eseguita l'istruzione else ajax sopra).Firebug mostra:

> //for first form
> POST http://mysite.com/post/f1 302 Found 111ms
> GET http://mysite.com/post/f1 200 OK 600ms
> 
> //for 2nd form
> POST http://mysite.com/post/f2 200 OK 800ms

Perché succede questo?Tutto il resto sembra a posto (non ci sono problemi nemmeno nell'invio di moduli con Javascript disattivato).

Modulo HTML:

<form id="comment-form-<unique-number>" class="comment-form-new" action="/post/<separate-action>" method="post" style="">
 <p>Leave a comment:</p>
   <ul>
    <li>
     <textarea rows="10" cols="71" name="myform[text]" id="myform_text"></textarea></li>
    <li>
     <label for="myform_username">Name (required)</label>
     <input type="text" name="myform[username]" value="Anonymous" id="myform_username" /></li>
   <li>
      <label for="myform_email">Email (required)</label>
      <input type="text" name="myform[email]" value="" id="myform_email" />
   </li>

   <li>
    <label for="myform_captcha">Please enter code shown below:</label>
     <input type="text" name="myform[captcha]" id="myform_captcha" />
   </li>
   <li>
     <img id="captcha_img" src="/mysite/captcha/126263" alt="Captcha Image">
     <!-- this refreshes captcha -->
     <a class="captcha_img_refresh" id="captcha_img_refresh"><img src="/images/reload_original.png" /></a>
   </li>
   <input type="hidden" name="myform[comment_id]" value="10" id="myform_comment_id" />
   <li>
     <input type="submit" value="Submit" id="comment-form-submit" />
   </li>
</ul>

Altri dettagli: Dopo il caricamento di ogni modulo di commento, eseguo la normale associazione di invio (non associazione in tempo reale) su di esso.I valori per ciascun modulo vengono serializzati e inviati così come digitati nei campi che è possibile confermare tramite i log della console.Sto usando la libreria Cryptographp (http://www.captcha.fr/) per i captcha.

Una soluzione: Se aggiorno tutti i captcha su tutti i moduli della pagina dopo aver inviato un modulo, alcuni captcha mostrano immagini di errore che possono, ovviamente, essere risolte dall'utente facendo nuovamente clic sul pulsante di aggiornamento.Ma sto cercando qualcosa di diverso da questa soluzione alternativa.

È stato utile?

Soluzione

Ok... ho fatto altri test ed ecco cosa penso stia succedendo (potrei anche sbagliarmi):il collegamento dell'immagine captcha, che è qualcosa del tipo: /miosito/captcha/(un numero casuale), viene probabilmente generato una volta sul server per ciascun modulo.Quando carico f1 e poi f2, un collegamento captcha per f2 viene memorizzato nel backend che sostanzialmente annulla il collegamento captcha di f1.Quindi, se invio f1 (che è ancora aperto), il captcha fallisce.Quindi immagino che potrei provare (sul frontend):

  1. Consentire un solo modulo di risposta alla volta
  2. Memorizza nella cache il collegamento captcha e riutilizzalo per rigenerare l'immagine quando l'utente si concentra sul modulo corrispondente
  3. Utilizzare la soluzione alternativa menzionata sopra

Esiste un modo backend per risolvere questo problema?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top