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?
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?
Respostas:
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);
/my-form?destination=node/123
.
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 FALSE
impedirá 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.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
Para redirecionar para uma URL externa no Drupal 8, use a TrustedRedirectResponse
classe, como no código a seguir.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
palavra - chave e seu espaço para nome:use Drupal\Core\Routing\TrustedRedirectResponse;
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