it-swarm.it

Il reindirizzamento del modulo non funziona se "destinazione" è nell'URL

In uno dei miei moduli, sto cercando di impostare un $form_state['redirect'] In modo che il modulo vada a quella destinazione dopo che l'utente ha fatto clic su uno dei pulsanti di azione.

Se ispeziono $form_state['redirect'] Sia prima che dopo l'aggiunta del reindirizzamento, è NULL prima e dopo contiene l'array appropriato. Ecco come sto impostando il reindirizzamento:

$form_state['redirect'] = array(
  'my/custom/path/' . $nid,
  array('query' => drupal_get_destination()),
);

Voglio preservare la destinazione dal modulo che l'utente visualizza al percorso successivo (ecco perché sto chiamando drupal_get_destination(), che restituisce un array con 'destination' => 'some/path/here' All'interno.

Sembra che, poiché esiste già una destinazione nel percorso del modulo corrente, il modulo reindirizza a quella destinazione, indipendentemente da ciò che ho inserito nel mio gestore di invio del modulo (vedere il codice sopra). Ho anche provato a usare drupal_goto () e neanche questo ha reindirizzato l'utente.

19
geerlingguy

Quando viene elaborato un modulo, il valore di $form_state['redirect'] Viene inviato a drupal_goto() e drupal_goto() favorisce sempre $_GET['destination'] Rispetto a il suo parametro $path.

Per completezza, in Drupal 6, sei stato un po 'sfortunato senza impostare le tue intestazioni in hook_exit() :

function mymodule_exit($destination = NULL) {
  $my_destination = 'foo/bar';
  header('Location: ' . url($my_destination));
  exit;
}

In Drupal 7, hook_drupal_goto_alter() è stato aggiunto per questo caso d'uso specifico:

function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
  $path = 'foo/bar';
}

Un'altra opzione per Drupal 7, che è più vicina a ciò che si desidera fare, è ripristinare la cache statica per drupal_get_destination() nel gestore di invio usando drupal_static_reset() :

function mymodule_form_submit($form, &$form_state) {
  // See note
  $form_state['redirect'][] = drupal_get_destination();
  $form_state['redirect'][] = 'foo/bar';

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();
}

Dato che chiami drupal_get_destination() subito dopo il reset, Drupal è beato inconsapevolmente del parametro di destinazione per il resto della compilazione della pagina, anche quando chiama drupal_goto().

Nota: Ho cambiato il codice per definire $form_state['redirect'] Perché non vuoi mai sovrascrivere la variabile: altri gestori di invio potrebbero aver definito il proprio reindirizzamenti. Drupal utilizzerà sempre l'elemento last nell'array, quindi se si desidera foo/bar Sovrascrivere il parametro di destinazione (e ogni altro reindirizzamento definito fino a quel momento), deve essere l'ultimo.

27
user7

Grazie per questo, ma per qualche motivo questo non ha funzionato quando l'ho provato. Ho avuto un errore fatale: i dati inviati nella risposta di esempio sopra non soddisfano i requisiti di drupal_goto()

Forse perché questa risposta è piuttosto vecchia, ma sono stato in grado di farlo funzionare con questo invece:

function mymodule_form_submit($form, &$form_state) {


  $form_state['redirect'] = array(
    'foo/bar', array(
      'query' => drupal_get_destination()
    )
  );

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();

}

So che questo viola questa nota:

non si desidera mai sovrascrivere la variabile: altri gestori di invio potrebbero aver definito i propri reindirizzamenti.

Ma, in questo caso, vuoi sicuramente sovrascrivere la variabile. Non imposteresti questo valore se non volessi ignorare i valori impostati di altri moduli. Inoltre, penso che tu debba farlo a causa del modo in cui drupal_goto() funziona con il parametro query. Questo potrebbe anche essere il motivo per cui la risposta originale stava generando errori fatali sul mio sito.

4
tmsimont