drupal 7 – Agregar target _blank al formulario ajax según la respuesta

Pregunta:

Me he estado tirando de los pelos con esto durante unos días, y parece que no puedo ejecutar algo tan simple como esto con éxito al enviar mi formulario.

Lo que estoy tratando de hacer es esto … Si completo mi formulario y pasa la validación y la respuesta ajax se vende al hacer clic, me gustaría que el formulario vaya a / éxito y abra una nueva pestaña / ventana que vaya a google.com, de lo contrario, vaya a la página fallida

Es simple, lo sé. El problema es este, que cuando hago clic en él y aparece una nueva ventana / pestaña, la ventana emergente la bloquea. Esto me dice que este método no es realmente un método válido para hacer clic en el botón.

Esto es lo que tengo como mi formulario .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));

Por favor, que alguien me ayude con esta pequeña pesadilla de un problema que estoy teniendo. Gracias.

Respuesta:

Creo que la respuesta es, no puedes. El bloqueo de ventanas emergentes tiene como objetivo evitar que el navegador abra una nueva ventana o pestaña cuando el usuario no inició la acción (hace clic en un enlace). Hay varias formas de abrir una nueva ventana o pestaña; sin embargo, a menos que realmente pueda engañar al navegador para que piense que el usuario realmente hizo clic en él (no, $(a).click() no lo engañará) o que el usuario haya desactivado el bloqueo de ventanas emergentes, siempre tendrá la ventana emergente bloqueador haciendo su deber previsto.

Estoy seguro de que le está informando al usuario que tiene la intención de abrir otra ventana para ellos, ¿por qué no proporcionar el enlace después de enviar el formulario correctamente? Alternativamente, puede hacer una redirección retrasada como la que se ve a menudo, creo, en las pantallas de inicio de sesión de phpBB (las que dicen, "Gracias por iniciar sesión. Serás redirigido a XXX en 5 segundos").

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım