Come reindirizzare a una pagina dopo aver inviato un modulo


24

Ho un modulo personalizzato che visualizza un modulo.

Al momento dell'invio del modulo, desidero reindirizzare l'utente a una pagina diversa.

Come lo posso fare?

Risposte:


31

Nel gestore di invio lo fai

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);

c'è un modo alternativo per farlo? i moduli che devo reindirizzare sono creati con il proprio gestore #submit (i gestori di invio non sono inseriti nel mio modulo personalizzato), quindi non ho accesso al codice.
Carlos Muñiz,

@Charlie usa form_alter per aggiungere il tuo.
googletorp

@Charlie se il vostro è principalmente per raggiungibile da un link, mettere un parametro di destinazione nell'URL: /my-form?destination=node/123.
tostinni,

Non funziona su D7, ma ho trovato qualcosa che fa. Controlla il mio messaggio qui sotto.
Ignacio Segura Postigo,

Voglio solo dire grazie per aver risposto per D7, per poi tornare 5 anni dopo per aggiornare la risposta per D8. <3
formica,

17

Va notato che ci sono diversi trigger che possono impedire un reindirizzamento:

  • $form_state['redirect'] === FALSE: Se impostato, la funzione di creazione del modulo o il gestore di convalida / invio del modulo non desidera che un utente venga reindirizzato, il che significa che drupal_goto()non viene invocato. Per la maggior parte dei moduli, la logica di reindirizzamento sarà la stessa indipendentemente dal fatto che $form_state['redirect']non sia definita o FALSE. Tuttavia, nel caso in cui non sia stato definito e la richiesta corrente contenga una stringa di query "destinazione", drupal_goto()verrà invece reindirizzata a quella destinazione specificata. Solo l'impostazione $form_state['redirect']su FALSEimpedisce qualsiasi reindirizzamento.
  • $form_state['no_redirect'] === TRUE: Se impostato, il callback che ha originariamente creato il modulo non consente esplicitamente alcun reindirizzamento, indipendentemente dal valore di reindirizzamento in $form_state['redirect']. Ad esempio, ajax_get_form()definisce $form_state['no_redirect']quando si crea un modulo in un callback AJAX per impedire il reindirizzamento. $form_state['no_redirect']NON deve essere modificato dalle funzioni del generatore di moduli o dai gestori di convalida / invio dei moduli.
  • $form_state['programmed'] === TRUE: significa che l'invio del modulo è stato solitamente invocato tramite drupal_form_submit(), quindi qualsiasi reindirizzamento interromperebbe lo script che ha invocato drupal_form_submit().
  • $form_state['rebuild'] === TRUE: significa che il modulo deve essere ricostruito senza reindirizzamento.

7

Per Drupal 7, l'ho provato su un modulo personalizzato e funziona. Può anche essere usato in un tema:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}

function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}

A proposito, ho trovato questo frammento qui: https://gist.github.com/postrational/5768796


4

Per reindirizzare a un URL esterno in Drupal 8, usa la TrustedRedirectResponseclasse, come nel seguente codice.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);

Nel caso in cui potesse aiutare, dobbiamo includere questa classe con la useparola chiave e il suo spazio dei nomi:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel,

2

Su D8 mi è piaciuto questo (ma questo non funzionerà ... vedi sotto):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

Modificare/

Mi mancava che setRedirect / setRedirectUrl funzioni DOPO che il modulo è stato inviato, quindi questa è la mia soluzione di lavoro su D8:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

Spero che questo possa aiutare


1

Per drupal 7 se vuoi reindirizzare per url con parametri comesomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.