web-dev-qa-db-fra.com

Changer $ form_state en AJAX

Je crée un formulaire qui utilise l'API de formulaire '#ajax' attribut, et je dois apporter des modifications à $form_state lorsque 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'];
}

La modification que j'ai apportée à $form_state semble perdu une fois le rappel terminé. Existe-t-il un moyen d'apporter une modification à $form_state dans cette fonction, ou y a-t-il une autre fonction que je devrais utiliser à la place?

MODIFIER

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!

16
MW.

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

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

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 changer le $ form_state, ajoutez des valeurs à votre $ form. Si vous ne voulez pas qu'ils apparaissent, utilisez simplement #hidden.

0
Malks