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?
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?
Respuestas:
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);
/my-form?destination=node/123
.
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 FALSE
evitará 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.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
Para redirigir a una URL externa en Drupal 8, use la TrustedRedirectResponse
clase, como en el siguiente código.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
palabra clave y su espacio de nombres:use Drupal\Core\Routing\TrustedRedirectResponse;
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