Je crée un formulaire qui utilise l' '#ajax'
attribut API de formulaire , 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'];
}
Le changement que j'ai effectué $form_state
semble être perdu une fois le rappel terminé. Existe-t-il un moyen de modifier $form_state
cette 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!
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
.la source