2010-12-21 21 views
25

Tengo 2 botones de envío y deseo realizar diferentes acciones para cada botón de envío. Aquí quiero establecer los campos de formulario que se pueden hacer solo en form_alter(). ¿Alguien puede sugerir cómo verificar los múltiples botones de envío en la función form_alter()?Manejar múltiples botones de envío en la API de formulario de Drupal

he utilizado

function myform_form_submit($formID, &$form_state) { 
if($form_state['clicked_button']['#value'] == $form_state['values']['submit_one']) //if button 1  is clicked 
    $form_state['redirect'] = 'mypath/page_one'; //redirect to whatever page you want 
else if($form_state['clicked_button']['#value'] == $form_state['values']['submit_two']) /if button  2 is clicked 
    $form_state['redirect'] = 'mypath/page_two'; 
} 

pero esto no funciona

+0

¿Tiene un gancho de envío en su formulario? $ form ['# submit'] [] = 'myform_form_submit'; ? – Kevin

+0

sí, pero ¿no se supone que drupal retoma la función de envío incluso sin el enlace anterior? – user550265

Respuesta

49

Lo mejor que puede hacer si tiene dos botones de envío en un formulario y quiere que hagan cosas diferentes, es crear un diferente envíe la función para cada botón, y conéctelos. Una de las cosas buenas de FormAPI es que vincula automáticamente el formulario con el manejador de envío, pero si tiene dos botones de envío, quiere ir a un sitio nuevo.

Así que el código del formulario es probable que contenga:

$form['submit_one'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit One'), 
    '#submit' => array('my_module_form_submit_one'), 
); 
$form['submit_two'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit Two'), 
    '#submit' => array('my_module_form_submit_two'), 
); 

Pero no sé qué quiere decir con form_alter() - no hay razón para usar una forma altera de ninguna clase.

Editar: Como se mencionó en los comentarios, si necesita funciones de validación diferentes para los dos botones, también puede incluir '#validate' => array('my module_form_validate_one') y '#validate' => array('my module_form_validate_two') en las respectivas matrices de botones. Pero no es obligatorio, y si la función de validación de formularios estándar funciona bien, entonces continúe con eso.

+0

Usar dos funciones de envío diferentes suena como una solución bastante buena, pero ¿qué ocurre con la función de validación? ¿Terminas con dos de esos también? – Shawn

+0

Para responder a mi propia pregunta, se solicita la función de validación para ambos botones de envío, no es necesario duplicarlo (aunque es posible que tenga dos funciones de validación diferentes si es necesario, no sé) – Shawn

+0

¿Y si necesita una validación diferente? botones para los dos botones de enviar? Digamos que queremos agregar un botón cancelar en un formulario donde se requieren algunos campos. Al hacer clic en cancelar arrojará un error porque se usa la misma función de validación para verificar si un campo obligatorio se dejó vacío. – jjei

14

Si desea gestionar las diferentes botón de envío clic dentro de una función de envío, puede comprobar:

if($form_state['values']['op'] == BUTTON_ONE_VALUE){ 
} else if($form_state['values']['op'] == BUTTON_TWO_VALUE){ 
} 

O puede asignar ciertas propiedades al botón en primer lugar, a continuación, comprobar:

$form_state['triggering_element']['#attributes'][YOUR_PROPERTY] == VALUE 

Estoy usando Drupal 7 ... Espero que esto ayude

+0

Aunque esto no está bien ... ¿qué pasa si la cadena cambia? ¿Qué pasa si está en un idioma diferente? – pandaPowder

+0

@pandaPowder El cambio de cadena no tiene importancia siempre y cuando tenga 'YOUR_PROPERTY' configurado – songyy

+0

Varios botones de envío tienen #name como 'op'. Deberá sobrescribirlo manualmente y establecer un valor único para cada botón para que $ form_state ['triggering_element'] funcione correctamente – Varshith

2

Si bien la respuesta aceptada es correcta, debe tener en cuenta que debe pasar diferentes valores con cada uno de sus botones de envío, o el sub La función mit utilizada será el último botón de envío definido.

En otras palabras, si el valor de ambos botones de envío es 'Enviar', entonces solo se llamará a la segunda función de envío, independientemente de qué botón se presione.

Cuestiones relacionadas