2010-11-10 22 views
1

J'ai créé une zone de sélection déroulante "Liens rapides" pour mon application web Drupal. La boîte de sélection est implémentée sous la forme d'un formulaire Drupal standard, qui apparaît sur toutes les pages du site. Lorsque l'utilisateur sélectionne une option et soumet le formulaire, je souhaite rediriger l'utilisateur vers la page appropriée, mais je les invite à revenir à la page d'origine lorsqu'ils ont terminé.Puis-je définir une redirection form_state avec un paramètre de destination dans la soumission de formulaire?

par exemple. l'utilisateur est sur le noeud/5, et sélectionne un lien rapide qui les amène à une autre forme. Quand ils ont rempli ce formulaire, je veux qu'ils soient retournés au nœud/5.

Je l'ai fait dans d'autres parties du système en utilisant drupal_get_destination pour ajouter le paramètre? Destination = node/5 querystring au formulaire de destination, et cela fonctionne bien. Toutefois, dans mon gestionnaire de soumission de formulaire quicklinks, je configure form_state ['redirect'] pour définir la page cible, et si j'ajoute le paramètre? Destination =, il est codé en URL et n'est donc pas détecté lorsque ma cible le formulaire est soumis.

function dh_seo_quick_links_form_submit($form, &$form_state) { 
    $form_state['redirect'] = $form['#link_targets'][$link].'?'.drupal_get_destination(); 
} 

Est-ce que je me suis complètement trompé? Cette redirection est-elle même possible? Pourrais-je faire quelque chose d'intelligent avec les variables $ _REQUEST directement?

+0

Il peut être plus pratique de charger la page dans une superposition. Vous n'aurez donc pas à vous soucier de la variable de rotation. –

Répondre

5

OK - J'ai travaillé dessus. Il semble que si vous définissez une URL relative dans le form_state de $ [ 'redirect'] il obtient URL codé, mais une URL absolue ne sera pas:

$form_state['redirect'] = 'myform?'.drupal_get_destination(); 

réoriente à MYFORM% 3Fdestination% 3Dnode% 252F5

global $base_url; 
$form_state['redirect'] = $base_url.'/myform?'.drupal_get_destination(); 

redirige vers myform? Destination = node/5, ce que je voulais.

+0

la manière correcte de faire ceci est celle indiquée par Ben Smiley. –

0

Vous êtes la réponse a travaillé pour moi Mark. Merci!

Vous pouvez le faire de cette façon aussi:

global $base_url; 
$form['#redirect'] = $base_url .'/'. $form['#redirect'] .'?test=hello'; 
3

Vous pouvez fournir un tableau pour $form_state['redirect'] et mettre la requête de destination en tant que second paramètre. Par exemple:

$form_state['redirect'] = array(
'myform', array('query' => drupal_get_destination()), 
); 
0

Enfin, j'obtenu cette solution:

global $base_url; 
$form_state['redirect'] = $base_url . '/myform?' . drupal_get_destination(); 
+0

global? probablement pas le meilleur moyen. – jeremy

10

Voici une bonne solution pour Drupal 7 qui vous permet d'utiliser des chemins relatifs:

$form_state['redirect'] = array(
    'node/[node number]', 
    array(
    'query' => array(
     'variable_name' => 'value', 
    ), 
    'fragment' => 'hash_fragment' 
),  
); 

Ce code crée les éléments suivants URL:

..?node/[node number]&variable_name=value#hash_fragment 

Cela vous permet beaucoup de flexibilité tout en profitant du framework Drupal.

+0

Solution beaucoup plus propre et complète. –