Estoy creando un formulario que usa el '#ajax'
atributo API de formulario , y necesito hacer cambios $form_state
cuando se presiona el botón habilitado para AJAX. Esto es lo que tengo:
Dentro de mi función de generador de formularios:
...
$form['some_fieldset']['add_more'] = array(
'#type' => 'button',
'#value' => t('Add more rows'),
'#ajax' => array(
'wrapper' => 'some-fieldset',
'callback' => 'my_module_settings_ajax',
'method' => 'replace',
'effect' => 'fade',
),
);
...
Y aquí está la función de devolución de llamada:
function my_module_settings_ajax($form, $form_state) {
// Make a change to $form_state
if ($form_state['some_fieldset']['add_more']) {
$form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
'second_field' => '');
}
return $form['some_fieldset'];
}
El cambio que he hecho $form_state
parece perderse una vez que finaliza la devolución de llamada. ¿Hay alguna forma de hacer un cambio $form_state
en esta función, o hay alguna otra función que debería usar para esto?
EDITAR
Como resultado, la devolución de llamada es el lugar equivocado para hacer esta lógica. En cambio, en la parte superior de la función del generador de formularios, agregué esto:
// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
$form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
'second_field' => '');
}
Por supuesto, tuve que darle al botón el nombre:
$form['some_fieldset']['add_more'] = array(
'#type' => 'button',
'#name' => 'add_more', // <-- Right here
'#value' => t('Add more rows'),
'#ajax' => array(
'wrapper' => 'some-fieldset',
'callback' => 'my_module_settings_ajax',
'method' => 'replace',
'effect' => 'fade',
),
);
¡Y ahora funciona!
No estoy seguro de que sea una respuesta directa a su pregunta, pero puede funcionar para usted: en lugar de cambiar los $ form_state, agregue valores a su $ form. Si no quieres que se muestren, solo úsalo
#hidden
.fuente