Modifica $ form_state nel callback AJAX


16

Sto creando un modulo che utilizza l' '#ajax'attributo API del modulo e devo apportare modifiche $form_statequando viene premuto il pulsante abilitato AJAX. Ecco cosa ho:

All'interno della mia funzione di generatore di moduli:

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

...

Ed ecco la funzione di callback:

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 modifica che ho apportato $form_statesembra essere persa una volta terminata la richiamata. Esiste un modo per apportare una modifica $form_statein questa funzione o c'è un'altra funzione che dovrei usare per questo invece?

MODIFICARE

A quanto pare, il callback è il posto sbagliato per fare questa logica. Invece, nella parte superiore della funzione di creazione del modulo, ho aggiunto questo:

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

Certo, ho dovuto dare al pulsante il nome:

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

E ora funziona!

Risposte:


3

Devi passare $form_statecome riferimento; la funzione AJAX deve essere definita come nell'esempio seguente:

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

Per chiarire, è necessario che & passi per riferimento anziché per valore. Senza di essa stai solo modificando una copia di $ form_state.
Malks,

Sì, se non lo fai, modifichi solo una variabile locale.
Nourcy

1
Certo, non ci ho pensato. Sfortunatamente, non ha avuto alcun effetto: qualsiasi modifica apportata a $ form_state viene ignorata nel generatore di moduli e la volta successiva che viene effettuata la chiamata AJAX, viene ripristinato $ form_state. È possibile che il modulo sia già stato generato al momento dell'esecuzione del callback? Esiste invece un modo per eseguire un gestore di invio personalizzato per questo pulsante?
MW.

Prova a cambiare il tipo di pulsante da inviare
nourcy

0

Non sono sicuro che sia una risposta diretta alla tua domanda, ma potrebbe funzionare per il tuo caso d'uso: invece di cambiare $ form_state aggiungi valori al tuo $ form. Se non vuoi che mostrino, usa e basta #hidden.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.