Cambiar $ form_state en devolución de llamada AJAX


16

Estoy creando un formulario que usa el '#ajax'atributo API de formulario , y necesito hacer cambios $form_statecuando 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_stateparece perderse una vez que finaliza la devolución de llamada. ¿Hay alguna forma de hacer un cambio $form_stateen 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!

Respuestas:


3

Necesita pasar $form_statecomo referencia; la función AJAX debe definirse como en el siguiente ejemplo:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

Para aclarar, necesita el & para pasar por referencia en lugar de por valor. Sin él, solo está modificando una copia de $ form_state.
Malks

Sí, si no hace esto, solo modifica una variable local.
nourcy

1
Por supuesto, no pensé en eso. Desafortunadamente, no tuvo ningún efecto: cualquier cambio realizado en $ form_state se ignora en el generador de formularios, y la próxima vez que se realiza la llamada AJAX, se revierte $ form_state. ¿Podría ser que el formulario ya se haya generado cuando se ejecute la devolución de llamada? ¿Hay alguna forma de ejecutar un controlador de envío personalizado para este botón?
MW.

Intente cambiar el tipo de botón para enviar
nourcy

0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.