it-swarm.it

Come reindirizzare a una pagina dopo aver inviato un modulo

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?

24
Carlos Muñiz

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);
31
googletorp

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 richiamato. Per la maggior parte dei moduli, la logica di reindirizzamento sarà la stessa indipendentemente dal fatto che $form_state['redirect'] Sia indefinito o FALSO. Tuttavia, nel caso in cui non sia stato definito e la richiesta corrente contenga una stringa di query "destinazione", invece drupal_goto() reindirizzerà a quella determinata destinazione. Solo l'impostazione di $form_state['redirect'] Su FALSE impedirà 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'] Durante la creazione di un modulo in un AJAX per impedire il reindirizzamento. $form_state['no_redirect'] NON deve essere modificato da funzioni del form builder o gestori di validazione/invio moduli.
  • $form_state['programmed'] === TRUE: indica che l'invio del modulo è stato generalmente 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.
17
trampjuice

Per Drupal 7, ho provato questo 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

Per reindirizzare a un URL esterno in Drupal 8, utilizzare la classe TrustedRedirectResponse , come nel codice seguente.

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

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

2
nessunluogo

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

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
1
berramou