Cómo redirigir a una página después de enviar un formulario

24

Tengo un módulo personalizado que muestra un formulario.

Al enviar el formulario, quiero redirigir al usuario a una página diferente.

¿Cómo puedo hacer eso?

Carlos Muñiz
fuente

Respuestas:

31

En el controlador de envío que haces

Drupal 7:

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

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
fuente
¿Hay alguna forma alternativa de hacer esto? los formularios que necesito redirigir se crean con su propio controlador #submit (los controladores de envío no se encuentran en mi módulo personalizado), por lo que no tengo acceso al código.
Carlos Muñiz
@ Charlie usa form_alter para agregar el tuyo.
googletorp
@Charlie si su es principalmente para el acceso por un enlace, poner un parámetro de destino en la URL: /my-form?destination=node/123.
tostinni
No funciona en D7, pero encontré algo que sí. Mira mi mensaje a continuación.
Ignacio Segura Postigo
Solo quiero decir gracias por responder para D7, luego regresar 5 años después para actualizar la respuesta para D8. <3
hormiga
17

Cabe señalar que hay varios factores desencadenantes que pueden evitar una redirección:

  • $form_state['redirect'] === FALSE: Si se establece, la función de creación de formularios o el controlador de validación / envío de formularios no desea que se redirija a un usuario, lo que significa que drupal_goto()no se invoca. Para la mayoría de las formas, la lógica de redireccionamiento será la misma independientemente de si $form_state['redirect']es indefinida o FALSA. Sin embargo, en caso de que no se haya definido y la solicitud actual contenga una cadena de consulta de "destino", drupal_goto()se redirigirá a ese destino dado. Solo establecer $form_state['redirect']en FALSEevitará cualquier redirección.
  • $form_state['no_redirect'] === TRUE: Cuando se establece, la devolución de llamada que originalmente creó el formulario no permite explícitamente ninguna redirección, independientemente del valor de redirección en $form_state['redirect']. Por ejemplo, ajax_get_form()define $form_state['no_redirect']cuándo compilar un formulario en una devolución de llamada AJAX para evitar cualquier redirección. $form_state['no_redirect']NO debe ser alterado por las funciones del generador de formularios o los controladores de validación / envío de formularios.
  • $form_state['programmed'] === TRUE: significa que el envío del formulario generalmente se invocó a través de drupal_form_submit(), por lo que cualquier redirección rompería el script que invocó drupal_form_submit().
  • $form_state['rebuild'] === TRUE: significa que el formulario debe reconstruirse sin redireccionamiento.
trampjuice
fuente
7

Para Drupal 7, probé esto en un módulo personalizado y funciona. También se puede usar en 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';
}

Por cierto, encontré este fragmento aquí: https://gist.github.com/postrational/5768796

Ignacio Segura Postigo
fuente
4

Para redirigir a una URL externa en Drupal 8, use la TrustedRedirectResponseclase, como en el siguiente código.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
fuente
En caso de que pueda ayudar, debemos incluir esta clase con la usepalabra clave y su espacio de nombres:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

En D8 me gustó esto (pero esto no funcionará ... ver más abajo):

/**
* 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/

Me faltaba que setRedirect / setRedirectUrl funciona DESPUÉS de que se envíe el módulo, por lo que esta es mi solución de trabajo en 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 esto pueda ayudar

nessunluogo
fuente
1

Para drupal 7 si desea redirigir a url con 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
fuente