Como redirecionar para uma página depois de enviar um formulário

24

Eu tenho um módulo personalizado que exibe um formulário.

Ao enviar o formulário, desejo redirecionar o usuário para uma página diferente.

Como eu posso fazer isso?

Carlos Muñiz
fonte

Respostas:

31

No manipulador de envio que você faz

Drupal 7:

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

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
fonte
existe uma maneira alternativa de fazer isso? os formulários que eu preciso redirecionar são criados com seu próprio manipulador #submit (os manipuladores de envio não são colocados no meu módulo personalizado), portanto, não tenho acesso ao código.
Carlos Muñiz 26/06
@Charlie use form_alter para adicionar o seu próprio.
googletorp
@Charlie se o seu para é principalmente acessível por um link, coloque um parâmetro de destino no URL: /my-form?destination=node/123.
tostinni 4/09/11
Não estou trabalhando no D7, mas encontrei algo que faz. Confira minha mensagem abaixo.
Ignacio Segura Postigo
Eu só quero agradecer por responder ao D7 e depois voltar cinco anos depois para atualizar a resposta para o D8. <3
formiga
17

Deve-se notar que existem vários gatilhos que podem impedir um redirecionamento:

  • $form_state['redirect'] === FALSE: Se definido, a função do construtor de formulários ou o manipulador de validação / envio de formulários não deseja que um usuário seja redirecionado, o que significa que drupal_goto()não é chamado. Para a maioria dos formulários, a lógica de redirecionamento será a mesma, independentemente de $form_state['redirect']estar indefinida ou FALSE. No entanto, caso não tenha sido definida e a solicitação atual contenha uma string de consulta 'destination', drupal_goto()será redirecionada para o destino especificado. Somente a configuração $form_state['redirect']para FALSEimpedirá qualquer redirecionamento.
  • $form_state['no_redirect'] === TRUE: Quando definido, o retorno de chamada que originalmente criou o formulário proíbe explicitamente qualquer redirecionamento, independentemente do valor de redirecionamento $form_state['redirect']. Por exemplo, ajax_get_form()define $form_state['no_redirect']ao criar um formulário em um retorno de chamada AJAX para impedir qualquer redirecionamento. $form_state['no_redirect']NÃO deve ser alterado pelas funções do construtor de formulários ou pelos manipuladores de validação / envio de formulários.
  • $form_state['programmed'] === TRUE: significa que o envio do formulário geralmente era chamado via drupal_form_submit(), portanto, qualquer redirecionamento interromperia o script chamado drupal_form_submit().
  • $form_state['rebuild'] === TRUE: significa que o formulário precisa ser reconstruído sem redirecionamento.
trampjuice
fonte
7

Para o Drupal 7, tentei isso em um módulo personalizado e funciona. Também pode ser usado em um 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';
}

BTW, encontrei este trecho aqui: https://gist.github.com/postrational/5768796

Ignacio Segura Postigo
fonte
4

Para redirecionar para uma URL externa no Drupal 8, use a TrustedRedirectResponseclasse, como no código a seguir.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
fonte
Caso isso possa ajudar, precisamos incluir esta classe com a usepalavra - chave e seu espaço para nome:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

No D8 eu fiz assim (mas isso não vai funcionar ... veja abaixo):

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

}

Editar/

Faltava que setRedirect / setRedirectUrl funcionasse APÓS o módulo ser enviado, portanto, esta é minha solução de trabalho no 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 );
}

Espero que isso possa ajudar

nessunluogo
fonte
1

Para o drupal 7, se você deseja redirecionar para url com parâmetros comosomeurl?param1=1&param2=2

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