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.