Changer $ form_state dans le rappel AJAX

16

Je crée un formulaire qui utilise l' '#ajax'attribut API de formulaire , et je dois apporter des modifications $form_statelorsque vous appuyez sur le bouton compatible AJAX. Voici ce que j'ai:

Dans ma fonction de création de formulaire:

...
$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',
      ),
    );

...

Et voici la fonction de rappel:

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'];
}

Le changement que j'ai effectué $form_statesemble être perdu une fois le rappel terminé. Existe-t-il un moyen de modifier $form_statecette fonction ou existe-t-il une autre fonction à utiliser à la place?

ÉDITER

Il s'avère que le rappel n'est pas le bon endroit pour faire cette logique. Au lieu de cela, en haut de la fonction de création de formulaire, j'ai ajouté ceci:

// 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' => '');
}

Bien sûr, j'ai dû donner le nom du bouton:

$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',
  ),
);

Et maintenant ça marche!

MW.
la source

Réponses:

3

Vous devez passer $form_statecomme référence; la fonction AJAX doit être définie comme dans l'exemple suivant:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 
nourcy
la source
Pour clarifier, vous avez besoin du & pour passer par référence plutôt que par valeur. Sans cela, vous ne faites que modifier une copie de $ form_state.
Malks
Oui, si vous ne le faites pas, vous ne modifiez qu'une variable locale.
nourcy
1
Bien sûr, je n'y ai pas pensé. Malheureusement, cela n'a eu aucun effet - toute modification apportée à $ form_state est ignorée dans le générateur de formulaires, et la prochaine fois que l'appel AJAX est effectué, $ form_state est annulé. Se pourrait-il que le formulaire ait déjà été généré au moment de l'exécution du rappel? Existe-t-il un moyen d'exécuter un gestionnaire de soumission personnalisé pour ce bouton?
MW.
Essayez de changer le type du bouton pour soumettre
nourcy
0

Je ne suis pas sûr que ce soit une réponse directe à votre question, mais cela peut fonctionner pour votre cas d'utilisation: au lieu de modifier $ form_state, ajoutez des valeurs à votre $ form. Si vous ne voulez pas qu'ils apparaissent, utilisez-les #hidden.

Malks
la source