web-dev-qa-db-fra.com

Ajout de _blank cible au formulaire ajax en fonction de la réponse

Je m'arrache les cheveux depuis quelques jours et je n'arrive pas à exécuter quelque chose d'aussi simple que cela avec succès lors de la soumission de mon formulaire.

Ce que j'essaie de faire, c'est ceci ... Si je remplis mon formulaire et qu'il passe la validation et que la réponse ajax est vendue au clic, j'aimerais que le formulaire aille à/success et ouvre un nouvel onglet/fenêtre qui va à google.com sinon, allez simplement à la page qui a échoué

C'est simple je sais. Le problème est le suivant: lorsque je clique dessus et qu'une nouvelle fenêtre/un nouvel onglet apparaît, la fenêtre contextuelle le bloque. Cela me dit que cette méthode n'est pas vraiment une méthode valide pour cliquer sur le bouton.

Voici ce que j'ai comme ma forme .module

    function storageform($form, &$form_state){

        $form['first_name'] = array(
            '#type'  => 'textfield',
            '#title' => t('First Name'),
            '#required' => TRUE,
        );

        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => t('Submit'),
            '#ajax' => array(
                'callback' => 'storage_form_ajax_callback',
            ),
            '#attached' => array(
                'js' => array(
                drupal_get_path('module', 'storage_form') . '/storage_redirect.js' => array(
                'scope' => 'footer',
            ),
         ),
      ),
    );

        if(isset($form_state['values'])){
            $form['page_output'] = array(
            '#markup' => storagedb_submit($form, $form_state)
            ); 
        }
        return $form;   
    }




    /**
     ** Form Ajax
     **/
function storage_form_ajax_callback($form, $form_state) {

      $receipt_info = 'sold';

$commands = array();
      $commands[] = ajax_command_remove('div.messages');
      $commands[] = ajax_command_before('#main', theme('status_messages'));

    if(!form_get_errors()){
      $commands[] = array(
        // The command will be used in JavaScript file 
        'command' => 'storage_redirect',
        // JavaScript function:
        'itemstatus' => $receipt_info,
    );    

    }
    return array('#type' => 'ajax', '#commands' => $commands);
}

    function storage_form_ajax_callback_validate($form, $form_state){

        if($form_state['values']['first_name'] == ''){
            form_set_error('first_name', t('First name required.'));
        }
    }

storage_redirect.js

    (function($){
    Drupal.ajax.prototype.commands.payday_redirect = function(ajax, response, status){          
                if(response.leadstatus == 'sold'){
document.location.replace("http://localhost/storageform/thanks");
window.open('http://www.google.com','_blank');
                    }else{
document.location.replace("http://localhost/storageform/failed");
                }
        }
    }(jQuery, Drupal));

S'il vous plaît, quelqu'un m'aide avec ce petit cauchemar d'un problème que j'ai. Je vous remercie.

3
Suzed

Je pense que la réponse est non. Le blocage des fenêtres contextuelles vise à empêcher le navigateur d'ouvrir une nouvelle fenêtre ou un nouvel onglet lorsque l'action n'a pas été lancée par l'utilisateur (il clique sur un lien). Il existe plusieurs façons d'ouvrir une nouvelle fenêtre ou un nouvel onglet; cependant, à moins que vous ne puissiez vraiment tromper le navigateur en lui faisant croire que l'utilisateur a réellement cliqué dessus (non, $(a).click() ne le trompera pas) ou si l'utilisateur a désactivé le blocage des fenêtres contextuelles, vous aurez toujours la fenêtre contextuelle bloqueur faisant son devoir prévu.

Je suis sûr que vous informez l'utilisateur que vous avez l'intention d'ouvrir une autre fenêtre pour lui, pourquoi ne pas simplement fournir le lien lors de la soumission du formulaire? Alternativement, vous pouvez faire une redirection différée comme on le voit souvent sur les écrans de connexion phpBB (ceux qui disent: "Merci de vous connecter. Vous serez redirigé vers XXX dans 5 secondes").

1
Chris Rockwell

Un moyen de contourner le bloqueur de fenêtres contextuelles serait d'ouvrir une nouvelle fenêtre directement sur le clic de l'utilisateur, avec un contenu comme "En attente de validation du formulaire". L'action directe de l'utilisateur peut généralement créer de nouvelles fenêtres. Ensuite, sur ajax complete, mettez à jour cette fenêtre avec l'emplacement approprié ou fermez-la simplement.

0
Mołot