Manejar varios botones de envío en la API de formulario de Drupal


Tengo 2 botones de envío y quiero realizar diferentes acciones para cada botón de envío . Aquí quiero establecer los campos del formulario que solo se pueden hacer en form_alter (). ¿Puede alguien sugerir cómo comprobar si hay varios botones de envío en la función form_alter ()?

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

 26
Author: user550265, 2010-12-21

3 answers

Lo mejor que puede hacer si tiene dos botones de envío en un formulario y desea que hagan cosas diferentes, es crear una función de envío diferente para cada botón y conectarlos. Una de las cosas buenas de FormAPI es que automáticamente vincula el formulario con el controlador de envío para usted, pero si tiene dos botones de envío, desea ir a un lugar nuevo.

Así que es probable que su código de formulario 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 se lo que quieres decir con form_alter () - no hay razón para usar un alterador de forma de cualquier tipo.

Editar: Como se mencionó en los comentarios: si necesita diferentes funciones de validación 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 matrices de botones respectivas. Pero no es necesario, y si la función de validación de formulario estándar funciona bien, entonces vaya con eso.

 50
Author: John Fiala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 19:15:36

Si desea manejar un botón de envío diferente, haga clic dentro de una función de envío, puede marcar:

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

O puede asignar cierta propiedad al botón primero, luego marque:

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

Estoy usando Drupal 7... Espero que esto ayude

 14
Author: songyy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-08 05:39:39

, Mientras que el aceptado la respuesta es correcta, cabe señalar que debe pasar valores diferentes con cada uno de sus botones de envío, o la función de envío será el último botón de enviar definido.

En otras palabras, si el valor de ambos botones submit es 'Submit', entonces solo se llamará a la segunda función submit, independientemente del botón que se presione.

 2
Author: Jeremy Rimpo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-23 00:17:42