it-swarm-eu.dev

Jak přesměrovat na stránku po odeslání formuláře

Mám vlastní modul, který zobrazuje formulář.

Po odeslání formuláře chci uživatele přesměrovat na jinou stránku.

Jak to mohu udělat?

23
Carlos Muñiz

V obslužném programu odevzdání

Drupal 7:

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

Drupal 8:

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

Je třeba poznamenat, že existuje několik spouště, které mohou zabránit přesměrování:

  • $form_state['redirect'] === FALSE: Pokud je nastavena, funkce tvůrce formuláře nebo obsluha validace/odesílání formuláře nechce, aby byl uživatel přesměrován, což znamená, že drupal_goto() nebude vyvoláno. U většiny formulářů bude logika přesměrování stejná bez ohledu na to, zda $form_state['redirect'] Není definována nebo FALSE. Pokud však nebyl definován a aktuální požadavek obsahuje řetězec dotazu „cíl“, _ namísto toho drupal_goto() přesměruje na daný cíl. Přesměrování zabrání pouze nastavení položky $form_state['redirect'] Na FALSE.
  • $form_state['no_redirect'] === TRUE: Když je nastaveno, zpětné volání, které původně vytvořilo formulář, výslovně zakáže jakékoli přesměrování bez ohledu na hodnotu přesměrování v $form_state['redirect']. Například ajax_get_form() definuje $form_state['no_redirect'] Při vytváření formuláře v AJAX zpětné volání, aby se zabránilo přesměrování. $form_state['no_redirect'] By nemělo být změněno pomocí funkce pro tvorbu formulářů nebo obsluhy pro ověřování/odesílání formulářů.
  • $form_state['programmed'] === TRUE: znamená, že odeslání formuláře bylo obvykle vyvoláno pomocí drupal_form_submit(), takže jakékoli přesměrování by přerušilo skript, který vyvolal drupal_form_submit().
  • $form_state['rebuild'] === TRUE: znamená, že formulář musí být znovu vytvořen bez přesměrování.
17
trampjuice

Pro Drupal 7) jsem to vyzkoušel na vlastním modulu a funguje to. Lze jej také použít v motivu:

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';
}

BTW, našel jsem tento fragment zde: https://Gist.github.com/postrational/5768796

Chcete-li přesměrovat na externí URL v Drupal 8, 8), použijte třídu TrustedRedirectResponse , jako v následujícím kódu.

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

Na D8 se mi to líbilo (ale to nebude fungovat ... viz níže):

/**
* 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])
     );    
   }

}

Upravit/

Chybí mi, že setRedirect/setRedirectUrl funguje po odeslání modulu, takže toto je moje pracovní řešení na 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 );
}

Doufám, že by to mohlo pomoci

2
nessunluogo

Pro drupal 7, pokud chcete přesměrovat na URL s parametry jako someurl?param1=1&param2=2

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