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


8

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 ... tuttavia 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.


Risposte:


13

Sembra che puoi scegliere come target parti diverse di un modulo utilizzando i comandi ajax, tuttavia devi scegliere di restituire solo una delle seguenti opzioni:

  • HTML o

  • Un array renderizzabile o

  • Una matrice di comandi AJAX

Nella situazione di cui ho scritto in origine, stavo cercando di restituire sia una matrice di comandi AJAX che una matrice renderizzabile, che non sembra possibile.

Il codice nel modulo di esempio mostra come targetizzare diverse parti di un modulo usando una matrice di comandi 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.


0

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

In bocca al lupo!


Grazie per il suggerimento :) Mi sono reso conto che non è necessario restituire affatto il campo del titolo del nodo perché viene semplicemente utilizzato come campo di utilità per organizzare gli elenchi. Viene popolato quando il mio modulo viene ricostruito a seguito del mio callback ajax esistente.
Rick,

0

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 tua funzione di callback potrebbe essere semplice come:

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

Questo dovrebbe essere chiamato da un #ajaxarray su un elemento del form ( field_whateverper l'esempio sotto) definito in un hook_form_FORM_ID_alter()(o qualche tipo di hook di modifica del form) in cui testare $form_statee apportare modifiche $formall'array, 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;
 }
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.