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!
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) { /* … */ }
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
.