2011-05-06 23 views
9

Tengo un formulario, que es un formulario predeterminado de administración de bloque. Es la forma estándar que las personas usan para editar contenidos de bloques, visibilidad, etc. Cuando el usuario guarda el formulario, drupal redirige al usuario a la página de administración de bloques.Redirección personalizada después de enviar formulario

Ahora, quiero llevar al usuario a otra página, por ej. la página de inicio, después de enviar un formulario de administración en bloque. Hay varias maneras de lograr esto, pero Drupal recomienda utilizar el método hook_alter_form como se describe here

He escrito un archivo llamado .module 'formdest' que contiene lo siguiente:

function formdest_form_alter(&$form, $form_state, $form_id) { 
switch ($form_id) { 
case 'block-admin-configure': 
    $form_state['redirect'] = '/home'; 
    break; 
} 
} 

y el archivo .info para acompañarlo:

; $Id: custom.info,v 1.0 2011/01/01 21:55:00 author Exp $ 
name = formdest 
description = form destination 
package = Other 
core = 6.x 

version = "6.x" 
project = "custom" 
datestamp = "1229018427" 

Mi módulo personalizado aparece en la lista de módulos y puedo habilitarlo, lo que activa la redirección. Pero cuando lo prueba, Drupal todavía me lleva a la página de administración de bloques en lugar de la página ..

No hay mensajes de error en ninguno de Firebug o en el registro, así que estoy un poco idea. ¿Alguno de ustedes codificando dioses tiene alguna idea?

Respuesta

22

Agregue un controlador de envío en hook_form_alter() y establezca la anulación allí.

function mymodule_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'my_form') { 
    $form['#submit'][] = 'my_submit_handler'; 
    } 
} 

function my_submit_handler(&$form, &$form_state) { 
    $form_state['redirect'] = 'home'; 
} 
+0

gracias por la sugerencia Yorirou, acabo de modificar el módulo y agregué el controlador de envío. Pero la redirección todavía no me lleva a casa, y tampoco errores. Estoy empezando a pensar que podría estar usando el identificador de formulario incorrecto o algo así, voy a hacer algo más de depuración –

+1

editar - A la derecha, el fragmento de Yorirou funcionó (mis enfoques anteriores también parecían funcionar), el problema fue que no usé caracteres de subrayado en el forma id. Cuando reemplacé los guiones con guiones bajos, todo funcionó como un amuleto. –

+2

pequeña punta que puede ahorrar algo de tiempo: si la forma de redirección no funciona, asegúrese de que $ form_state [ "reconstruir"] = false; –

1

He estado luchando con hacer una redirección dinámica en Drupal 6 en función de donde vino el usuario y esto es lo que me ocurrió, espero que ayude a alguien más:

function mymodule_form_alter(&$form, &$form_state, $form_id){ 
    if($need_to_redirect){ 
     /*add a form field to the form, you could also add this value to a 
       session or cookie,but if the user is logged in/out based on this 
       action the session will be rebuilt*/ 
     $form['my_redirect']=array(
      '#type' => 'hidden', 
      '#value'=>isset($form_state['post']['my_redirect'])?$form_state['post']['my_redirect']:trim(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH),'/') 
     ); 
    } 
    if(isset($form_state['post']['my_redirect'])){ 
     /*if there is a redirect set for the form add an extra submit handler, 
       this ensures that in cases like a node form our redirect will get 
       set last*/ 
     $form['#submit'][]='my_custom_redirect'; 
     //unset this so it doesn't override our custom redirect 
     if(isset($form['#redirect'])) unset($form['#redirect']); 
    } 
} 
function my_custom_redirect($form,&$form_state){ 
    $router_item = menu_get_item($form_state['values']['my_redirect']); 
    //make sure the user has access to this menu item, if not just ignore it 
    if ($router_item && $router_item['access']) { 
     $form_state['redirect']=$form_state['values']['my_redirect']; 
    } 
}; 

obviamente, el $need_to_redirect debe ser reemplazado con un interruptor o si cheque dependiendo de su preferencia form_alter

+0

Sí solución perfecta como forma alterar no debe afectar los envíos de formularios de la misma forma en otros lugares – killbill

3

Es tan simple como 1 2 3

  1. Cree una página personalizada con solo el título, es decir, gracias por su en contacto con nosotros. Ahora vaya a "Configuración de ruta de URL" de esta página y , desmarque "Alias ​​automático" y escriba la URL de su página personalizada, es decir, gracias.

  2. Eliminar alias URL predeterminados para formularios web, es decir [nodo: título] y guardar configuraciones. Para que la URL de su página sea site.com/thank-you

  3. Edite ese formulario web -> Vaya a la pestaña Configuración de formulario, en la sección "Ubicación de redirección" configure "URL personalizada" a partir de su página recién creada en el paso 1

¡Disfrútalo!

-2

Algo que me volvía loco e incluso me molestó un poco en las respuestas de todos es que usar form_alter para la redirección REEMPLAZÓ la acción de envío y no simplemente AÑADIÓ mi nueva función a la misma. En mi caso (y muchos otros temas que leí), aún necesitaba realizar la acción de formulario. Solo quería redirigirlo a otro lugar después. Mi redirección funcionaba bien, pero mi formulario no se enviaba o se guardaban datos.

Una vez que volví y volví a leer la documentación de form_alter, me di cuenta de que $ form ['actions'] es una matriz y por lo tanto puede aceptar otras acciones en su matriz.Para cualquier otra persona que tenga problemas con esto, no use

$ form ['actions'] ['submit'] ['# submit'] [] = 'myform_redirect_to_myfunction';

lugar Simplemente añada su devolución de llamada a la forma $ array usando array_shift o array_unshift (dependiendo de qué orden desea que las funciones que se ejecutan:

array_shift ($ form [ '# submit'], 'myform_redirect_to_myfunction');

espero que esto ayude a alguien más

+2

Solo para explicar por qué esto se ha votado negativamente: (a) Las respuestas anteriores NO reemplazan las acciones de envío existentes (si eso es lo que te sucedió está mal); (B) lo que está sugiriendo - cambiar/añadir la función #submit en un botón de envío - es diferente a cambiar/añadir a las funciones #submit en el formulario principal; Y (c) obtener todo emocional no es útil (especialmente cuando es incorrecto). – Adaddinsane

Cuestiones relacionadas