web-dev-qa-db-fra.com

Rediriger le formulaire hors de la fenêtre modale après l'envoi

J'ai un formulaire dans une fenêtre Colorbox Modal qui se soumet avec succès à l'aide du gestionnaire _submit. J'ai ensuite réussi à rediriger le formulaire vers une autre page (qui précharge quelques champs sur un autre formulaire) en utilisant drupal_goto(). Le problème que je rencontre est que la redirection reste dans la fenêtre Colorbox Modal. Je dois en quelque sorte fermer la fenêtre modale et transférer l'url du nouveau formulaire dans la fenêtre parente. Je peux faire fonctionner cela avec une fonction jquery de

$(#my_form_id).submit(function (){
   parent.window.location="/user/register";
});

Le problème avec ce problème est que la fonction appelle lorsque mon formulaire est soumis tout en ignorant tout ce qui se passe dans le gestionnaire de soumission. Donc, ce qui finit par arriver, c'est que j'obtiens la nouvelle page/le nouveau formulaire sans les valeurs préchargées jusqu'à ce que je rafraîchisse la page.

Avez-vous une idée ou une pensée?

2
user975044

Je suggère d'utiliser #ajax pour soumettre le formulaire, puis de laisser la réponse fermer le modal et aller ailleurs. Par exemple, voici un bouton d'envoi qui exécute une fonction au clic au lieu de soumettre le formulaire et de recharger la page:

$form['submit'] = array(
  '#prefix' => '<div id="super-cool-wrapper"></div>',
  '#type' => 'button',
  '#value' => 'Submit',
  '#ajax' => array(
    'callback' => 'my_super_cool_ajax_callback',
    'wrapper' => 'super-cool-wrapper',
    'method' => 'replace',
  ),
);

Et puis dans votre fonction de rappel:

function my_super_cool_ajax_callback($form, $form_state) {
  // Do what you normally would with the form submission.
  return '<script type="text/javascript">
    parent.window.location="some/where";
  </script>';
}

Vous pouvez maintenant traiter le formulaire selon vos besoins et renvoyer une réponse qui redirige simplement l'utilisateur.

1
Charlie Schliesser

J'ai également un problème similaire avec la forme modale drual. Après l'enregistrement de l'utilisateur et le mot de passe oublié, je dois l'envoyer sur la page de remerciements. Créez un fichier tpl et créez un lien d'enregistrement en utilisant le code ci-dessous.

<?php
echo l('Sign up here', 'user/register', array('query'=>array('destination'=>'thanks')));
?>

Créez un fichier tpl et créez un lien de mot de passe oublié en utilisant le code ci-dessous.

<?php
print l('Forgot Your Password?', 'user/password', array('query'=>array('destination'=>'thanks')));
?>
0
Rajesh Vishwakarma

Je viens d'avoir le même problème, voici comment je l'ai surmonté.

J'ajoute d'abord un déclencheur dans le tableau $ GLOBAL comme ceci:

function my_module_node_presave($node){
  if ($node->type == 'product'){
    $GLOBALS['redirect_parent'] = 'product_list';
  }
}

Ensuite, j'ajoute cet événement Nice qui se déclenche après que le nœud a été enregistré

function my_module_drupal_goto_alter(){
  if (@$GLOBALS['redirect_parent']!=''){
    die('<script type="text/javascript">parent.window.location="/'.$GLOBALS['redirect_parent'].'";</script>');
    $GLOBALS['redirect_parent']='';
  }
}

Ce n'est pas la solution la plus élégante, mais ça marche ...

0
Coomie

Ctools ont de bons outils pour de telles réflexions, lorsque vous lisez le fichier d'aide (après l'installation Aide avancée , vous pouvez y parvenir (et plus :) hors de la boîte.

exemple de code très simple pour le rappel de menu qui imprime le modal:

function mymodule_showmodal($js) {
ctools_include('modal');
ctools_include('ajax');

$form_state = array(
    'ajax' => true,
  );
$commands = ctools_modal_form_wrapper('modform',$form_state);
if ($form_state['executed']) {
  $commands = array(ctools_modal_command_dismiss());
}
print ajax_render($commands);
exit();
}

n'oubliez pas de mettre ['rebuild'] = true quelque part ...

0
mojzis