it-swarm.it

Posso usare Ajax per indirizzare più elementi di modulo da un input?

Sto cercando di utilizzare Ajax per aggiornare due diverse parti di un modulo drupal da una sola sfocatura di input del modulo.

Ho il materiale standard Ajax sul mio input:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Funziona bene, sostituendo il mio div quando l'input viene aggiornato ... comunque Voglio anche aggiornare un altro input del modulo altrove nel modulo con un codice diverso a causa della sfocatura sul mio input originale .

È possibile, qualche idea?

Modifica: per chiarezza, ecco il mio esempio nel mondo reale:

  • Tipo di contenuto "film"
  • Aggiunto campo 'primary_title'
  • Quando "primary_title" viene aggiornato, il mio callback ajax verifica stringhe simili e restituisce html.
  • L'html dal callback viene inserito in un div vuoto.

    Quella parte funziona alla grande!

Sto provando a modificare anche l'input del nodo standard 'title', dandogli il valore di 'primary_title' dopo aver eseguito un regex per riordinare la stringa (rimuovendo "La" o "A" dall'inizio ecc.) Il risultato saranno due campi del titolo, uno con il titolo completo 'primary_title' e un 'titolo' tagliato che sarà utile per ordinare e visualizzare i record.

8
Rick

Sembra che puoi scegliere come target parti diverse di un modulo utilizzando i comandi ajax, tuttavia devi scegliere di restituire solo uno di uno dei due:

  • HTML o

  • Un array renderizzabile o

  • Un array di AJAX

Nella situazione di cui avevo scritto in origine, stavo cercando di restituire sia un array di AJAX sia un array renderizzabile , che non sembra possibile.

Il codice nel modulo esempi dimostra come targetizzare diverse parti di un modulo usando una matrice di AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

In questo esempio di codice, #html_div sta ottenendo $ text e separatamente #html_status sta ottenendo "Aggiornato html_command_example con text = $ text;". data ('r'). ""

Due posizioni diverse in un modulo con due diverse informazioni dall'unica chiamata ajax!

Guardando di nuovo a cosa stavo lavorando, mi sono reso conto che non avevo bisogno di restituire il campo del titolo del nodo. Sarà solo un campo di utilità, utilizzato per ordinare i dati negli elenchi.

Ho nascosto il campo nel modulo nodo e viene popolato la seconda volta che il mio modulo viene creato quando viene attivato il callback ajax originale.

13
Rick

Un'altra opzione, da drupal.org :

Puoi sostituire facilmente l'intero modulo se è più semplice. Basta aggiungere un #prefix e #suffix all'intero array di moduli, quindi impostarlo come #ajax ['wrapper']. (Ciò consentirà di modificare più elementi del modulo tramite una singola chiamata Ajax.) L'unico motivo per non farlo è che il processo è più veloce se vengono trasferite meno informazioni.

La funzione di callback potrebbe essere semplice come:

function _callback($form, $form_state) {
  return $form;
}

Dovrebbe essere chiamato da un array #ajax Su un elemento del modulo (field_whatever Per l'esempio di seguito) definito in un hook_form_FORM_ID_alter() (o un qualche tipo di hook di modifica del modulo) dove verifica anche $form_state e modifica l'array $form, come:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
0
cdmo

Sono abbastanza nuovo di Drupal ma finora ho trovato il framework Ajax piuttosto poco flessibile. Funziona benissimo finché lo usi come previsto. Quindi nel tuo caso se conosci qualche JS il migliore sarebbe sicuramente rendere quella sceneggiatura te stesso che dovrebbe essere molto leggera.

In bocca al lupo!

0
silkAdmin