drupal 7 – Cambiar $ form_state en la devolución de llamada AJAX

Pregunta:

Estoy creando un formulario que usa el atributo '#ajax' API '#ajax' , y necesito hacer cambios en $form_state cuando se presiona el botón habilitado para AJAX. Esto es lo que tengo:

Dentro de mi función de constructor 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 hice a $form_state parece $form_state perdido una vez que finalizó la devolución de llamada. ¿Hay alguna forma de realizar un cambio en $form_state en esta función, o hay alguna otra función que deba usar para esto?

EDITAR

Resulta que 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!

Respuesta:

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

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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım