Utilizzo degli ajax callback in hook_form_alter
Dopo aver visto l'esempio di simpleForm e averlo riprodotto in form_alter (funziona) ho scritto il codice successivo ma non funziona. Ci sono ancora alcune cose che non mi sono chiare.
Per quel che ho letto, se non ho cpaito male, in form_alter devo scrivere il codice e la funzione di callBack deve solo restituire il resfesh della parte della form. Però ho visto anche degli esempi dove viene riportata la scritta trigger e la chiamata a ajax rsponse e la mia confuzione è aumentata.
La maggior parte degli esempi è fatta su una lista (select)
Per capire bene come funziona, ho fatto una piccola prova. 2 campi field_testo_a e field_test_b, obiettivo dopo aver scritto qualcosa nel campo field_testo_a far visualizzare la stessa scritta nel campo field_testo_b
Ecco il codice
FORM_ALTER
...
$form['field_testo_a']['widget'][0]['value']['#ajax'] = [
'callback' => 'ProvaCallback',
'wrapper' => 'edit-field-testo-b-0-value',
];
...
FUNZIONE, qui mi sono trovato in difficoltà
function ProvaCallback(&$form, FormStateInterface $form_state) {
return $form['edit-field-testo-b-0-value'];
}
Provato anche con
$form['field_testo_b']['widget'][0]['value']['#value'] = $form_state->getValue('field_testo_a');
Nella funzione ho messo anche che il campo testo b doveva avere il valore del testo a ma nulla.
Dopo aver scritto il dato nel campo testo a, vedo che gira ma alla fine non so se è entrato nella funziona e il motivo per cui non aggiorna il campo
Risposte
Con questo codice funziona,
Con questo codice funziona, mi sa che c'erano problemi nello svuotare la cache
Ho notato alcune cose:
a) oltre al campo di input mi riscrive anche la labe, mi duplica il tutto
b) funziona solo la prima volta, se ritorno sul campo testo a e cambio la scritta, no mi aggiorna il campo testo b. Forse si potrà fare con event?
c) non memorizza il valore quando salvo
Prova <?php$form['field_testo
Prova
<?php
$form['field_testo_a']['widget'][0]['value']['#ajax'] = [
'callback' => 'ProvaCallback',
'wrapper' => 'wrapper-campo-b',
];
// prepara il container da sostituire con il callback ajax
$form['wrapper_campo_b'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'wrapper-campo-b'
],
];
// se il valore è presente il form è stato inviato (ajax o submit), costruisce il nuovo elemento
if ($valore_testo = $form_state->getValue('field_testo_a')) {
$form['wrapper_campo_b']['field_testo_b'] = [
'#type' => 'textfield',
'#title' => 'Prova ajax',
'#default_value' => $valore_testo
];
}
?>
nel callback:
<?php
return $form['wrapper_campo_b'];
?>
Copiato il codice
Copiato il codice integralmente ma non funziona. Non so se possa dipendere dalla versione da me in uso Drupal 8.8.5
Avevo visto l'esempio completo che mi hai riprodotto, ma non avevo capito il perchè di questo:
// prepara il container da sostituire con il callback ajax
$form['wrapper_campo_b'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'wrapper-campo-b'
],
];
Leggendo le tue note ho capito che il wrapper non è l'ID html del campo ineteressato ma solo l'ID del contenitore che andrà a sostituire il campo interessato e si può inserie la descriizone che si vuole.
Comportamente del codice, digitando qualcosa in field_testo_a lancia il callback ma non visualizza il valore del campo digitato in testo a.
Mi faccio printare il valore della variabile $valore_testo e siccome è vuota o non uguale a testo a non visualizza il wrapper
Il codice va leggermente
Il codice va leggermente adattato alle esigenze. Se provi ad utilizzare come base il title di un nodo e vuoi cambiare il valore dell'input ad ogni chiamata e non solo il default:
<?php
if ($valore_testo = $form_state->getValue('title')) {
$form['wrapper_campo_b']['field_testo_b'] = [
'#type' => 'textfield',
'#title' => 'Prova ajax',
'#value' => $valore_testo[0]['value']
];
}
?>
ottenendo:
Nota: per i textfield meglio
Nota: per i textfield meglio utilizzare l'evento change ('event' => 'change',) altrimenti ogni chiamata ti riporta il focus sul campo rendedno difficile l'inserimento degli altri dati.
Mi è più chiaro quando usare
Mi è più chiaro quando usare event con change.
Anche con le varazioni non funziona. Il problema è che non riesce a prendere il valore di testo a.
Ho riprodotto l'esempio (di title) da te indicato, funziona ma non come nella tua animazione (a proprosito, complimenti)
Scrivo qualcosa sul titolo e mi compare il container (Prova ajax) con la scritta del titolo.
Se scrivo qualche altra cosa sul titolo non mi aggiorna (come a te) il valore del wrapper.
Visto che almeno la prima volta funziona, devo capire perchè per il campo "testo a" non riesca a prendere il valore. E' per questo che non mi visualizza il wrapper
Di seguito tutto il codice del title per capire perchè funziona solo la prima volta
$form['title']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'ProvaCallback',
'wrapper' => 'wrapper-campo-b',
];
// prepara il container da sostituire con il callback ajax
$form['wrapper_campo_b'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'wrapper-campo-b'
]
];
// se il valore è presente il form è stato inviato (ajax o submit), costruisce il nuovo elemento
$valore_testo = $form_state->getValue('title');
if ( $valore_testo = $form_state->getValue('title') ) {
$form['wrapper-campo-b']['title'] = [
'#type' => 'textfield',
'#title' => 'Prova ajax',
'#value' => $valore_testo[0]['value']
];
}
L'errore credo sia qui: if (
L'errore credo sia qui:
if ( $valore_testo = $form_state->getValue('title') ) {
$form['wrapper-campo-b']['title'] = [
deve essere
if ( $valore_testo = $form_state->getValue('title') ) {
$form['wrapper_campo_b']['title'] = [
Maurizio non penso sia quello
Maurizio non penso sia quello il problema, anzi mettendo il trattino il wrapper non compare proprio.
La cosa che mi disturba è che gli esempi che leggo e che provo e che dicono funzionanti a me non funzionano, come nel caso del tuo esempio ed esco pazzo. Per questo ho preferito riprodurre il tuo esempio funzionante.
Comunque la cosa strana è che togliendo l'if il wrapper mi viene visualizzato ma non al posto del campo precendete ma in aggiunta
Magari non è l'unico problema
Magari non è l'unico problema ma è certamente un errore.
Prova a postare l'intero modulo.
Di seguito tutto il codice
Di seguito tutto il codice presente nel modulo. L'ho provato acnhe con il content type articolo, stersso risultato
<?php
use Drupal\user\UserInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\Plugin\DataType\EntityReference;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
/**
* form alter per i vari settaggi e controlli
*
* @param [type] $form
* @param \Drupal\Core\Form\FormStateInterface $form_state
* @param [type] $form_id
* @return void
*/
function udf_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$form['title']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'ProvaCallback',
'wrapper' => 'wrapper-campo-b',
];
// prepara il container da sostituire con il callback ajax
$form['wrapper-campo-b'] = [
'#type' => 'container',
'#attributes' => [
'id' => 'wrapper-campo-b'
]
];
// se il valore è presente il form è stato inviato (ajax o submit), costruisce il nuovo elemento
$valore_testo = $form_state->getValue('title');
if ( $valore_testo = $form_state->getValue('title') ) {
$form['wrapper-campo-b']['title'] = [
'#type' => 'textfield',
'#title' => 'Prova ajax',
'#value' => $valore_testo[0]['value']
];
}
}
//===========================================================================
function ProvaCallback(&$form, FormStateInterface $form_state) {
//return $form['field_testo_a']['widget'][0]['value']['#default_value'];
//return $form_state->getValue('field_testo_a')[0]['value'];
return $form['wrapper-campo-b'];
}
grazie
Il tuo codice funziona
Il tuo codice funziona correttamente.
Per comodità puoi mettere un #weight => -100 al container in modo che appaia sopra al titolo. Ma questa è solo una miglioria, non una correzione.
Non saprei che dirti ...
nel senso che se scrivi
nel senso che se scrivi qualcosa nel titolo ti compare nel wrapper e se aggiung qualcosa alla riga ti aggiorna il wrapper?
L'effetto (con weight
L'effetto (con weight impostato) è esattamente quello che vedi nell'animazione sopra.
No maurizio, non è possibile.
No maurizio, non è possibile. Ho inserito il weight. Se metto -100 precedente il campo del title mi funziona (Sia la prima volta che scrivo che le successive). Se invece metto un altro peso ed il wrapper è successivo al campo del title non mi funziona (solo quando scrivo la prima volta.
Ho ripreso l'esempio che mi serve. Coè Visualizzare sul campo field_testo_b il valore del campo field_testo_a quando scrivo o modifico.
Ho notato che il problema è qui
Se remmo l'if mi visualizza il wrapper 2 volte. Una prima volta col rendere ed una seconda volta quando scrivo sul campo testo_field_a ed è giusto che sia così.
Il wrapper mi viene visualizzato ma successvamente al campo testo b, anche se ho messo lo stesso peso.
A me serve mettere il valore del campo testo a in testo b
E' possibile?
Prova a utilizzare un nome
Prova a utilizzare un nome per il campo diverso da title per quello generato tramite ajax (es: $form['wrapper-campo-b']['title2']).
Se hai un ulteriore campo di testo semplice field_testo qualcosa del genere dovrebbe andare
<?php
..
$form['field_testo']['widget'][0]['value']['#prefix'] = '<div id="wrapper-campo-b">';
$form['field_testo']['widget'][0]['value']['#suffix'] = '</div>';
if ($valore_testo = $form_state->getValue('title')) {
$form['field_testo']['widget'][0]['value']['#value'] = $valore_testo[0]['value'];
}
..
?>
nel callback devi ritornare l'elemento giusto
<?php
..
return $form['field_testo']['widget'][0]['value'];
..
?>
fai una prova
Grande, adesso funziona come
Grande, adesso funziona come volevo e mi è più chiaro come funziona il callBack (anche se per quel che ho letto ci sono almeno altre 2 modalità d'uso.
Se ti ricordi ti chiesi per il webForm come fare per aggiornare una data tramite la modifica di un'altra data. Penso che per il content type possa usare lo stesso codice.
Non so se posso osare con un'altro chiarimento.
Questo esempio mi è servito per capire come funziona il callBack. Nell'esigenza reale a me serve aggiornare un campo entity reference attraverso il valore di un campo di un content type di un altro entity reference e penso che possa provare inserendo il codice nell'if.
Ci provo
Di nuovo grazie Maurizio, tramite te sto imparando e mi sto chiarendo tatni dubbi
Siccome mi hai detto di condividere posto il codice completo:
In form_alter
Nel callBack
La struttura dei componenti
La struttura dei componenti di un webform e dei field di un content type è diversa ma puoi prendere degli spunti.
Il caso dell'entity reference è più complesso ma avendo capito la logica dei callback ora e di come estrarre i dati da un campo / form_state prima hai un quadro completo per risolvere.
Buon lavoro!
Grazie, penso che farò rima
Grazie,
penso che farò rima delle prove coun un campo data e se dovesse andare tutto bene, passerò all'entity reference
Proseguito le prove con un
Proseguito le prove con un campo data (stesso meccanismo, 2 campi data field_data_a e field_data_b) ma mi sono bloccato nuovamente in quanto non riesco a capire come attribuire il valore della data. Se ci fai caso mi sono fatto stampare il valore ed è esatto, corrisponde alla data scelta. Ho controllato gli array con kint ed ho notato che non porta la chiave #value ma se non la uso non mi visualizza il risultato, significa che il comando senza #value non è esatto. Di seguito il codice
$form['field_data_a']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'MissDataCB',
'wrapper' => 'wr-miss-data',
];
$form['field_data_b']['widget'][0]['value']['#prefix'] = '<div id="wr-miss-data">';
$form['field_data_b']['widget'][0]['value']['#suffix'] = '</div>';
if ($valore_testo = $form_state->getValue('field_data_a')) {
\Drupal::messenger()->addMessage( "callBak " . date( 'd/m/Y', strtotime($form_state->getValue('field_data_a')[0]['value']) ) );
$form['field_data_b']['widget'][0]['value']['#value'] = date( 'd/m/Y', strtotime($form_state->getValue('field_data_a')[0]['value']) );
}
Ho usato anche questo comando ma nulla
$form['field_data_b']['widget'][0]['value']['#value'] = Drupal\Core\Datetime\DrupalDateTime::createFromTimestamp(time($form_state->getValue('field_data_a')[0]['value']));
function MissDataCB( &$form, FormStateInterface $form_state ) {
return $form['field_data_b']['widget'][0]['value'];
}
L'elemento data viene
L'elemento data viene processato dopo il form alter che stai utilizzando. Puoi modificarlo ad esempio attraverso una funzione after build, che viene eseguita dopo che l'intero form ed ogni suo elemento è stato processato.
Un esempio pratico, nel form alter aggiungi:
$form['#after_build'][] = 'my_after_build';
poi dichiari la funzione:
<?php
function my_after_build($form, \Drupal\Core\Form\FormStateInterface $form_state) {
$form['NOMECAMPODATA']['widget'][0]['value']['date']['#value'] = date('Y-m-d');
// IMPORTANTE: la funzione di after build DEVE sempre ritornare l'intero form
return $form;
}
?>
combinando questo codice con i precedenti e adattandolo alle tue esigenze dovresti avere tutti gli elementi.
Letto un po' di materiale su
Letto un po' di materiale su after_build. Su drupal 8 non c'è tanto.
E' una callback come quella di ajax e permette di accedere a tutti i campi della form.
Fatto delle prove. Come per la callBack ajax ottengo il valore della data ma non riesco a valorizzare il filed_data_b col valore di field_data_a.
Penso che o con ajax o su after_build il problema sia lo stesso.
Provato anche con #default_value ma nulla
Ho fatto la prova utilizzando il codice del primo esempio callBack ajax di field_testo_a e field_testo_b che prima funziona ma ora non più
Cancellato la cache ma nulla
L'unica cosa che è variata è stato l'aggiornamento di Drupal dalla versione 8.8.5 allal versione 8.9.6
Possibile che sia cambiato qualcosa?
Non credo sia cambiata così
Non credo sia cambiata così radicalmente una api del core. Prova comunque a guardare tra i changelog delle varie versioni per essere più sicuro.
Installata la versione 9 ed
Installata la versione 9 ed ho fatto delle prove sia sulla versione 8.9.6 che su 9.0.5
e si comporta nella stessa maniera per entrambe le versioni
Il codice relativo al campo testo, funziona su entrambi
Il codice relativo al campo Date, non funziona su entrambi
Per evitare errori ho duplicato il codice relativo al campo testo (funzionante) e modificato il campo.
E' presente anche il codice dell'after_build ma sembra non funziona
La cosa strana è che il valore del field_data_1 ce l'ho e lo riesco aprintare ma non lo inserisce nel campo field_data_2
Tutta questa complessità non la capisco
Di seguito il codice
$form['field_data_1']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'ProvaCallbackData',
'wrapper' => 'wrapper-campo-b',
];
$form['#after_build'][] = 'AfterBuild';
$form['field_data_2']['widget'][0]['value']['#prefix'] = '<div id="wrapper-campo-b">';
$form['field_data_2']['widget'][0]['value']['#suffix'] = '</div>';
if ($valore_testo = $form_state->getValue('field_data_1')) {
$form['field_data_2']['widget'][0]['value']['#value'] = $valore_testo[0]['value'];
}
function ProvaCallback(&$form, FormStateInterface $form_state) {
return $form['field_campo_2']['widget'][0]['value'];
}
function AfterBuild($form, FormStateInterface $form_state) {
$form['field_data_2']['widget'][0]['value']['#value'] = date( 'd/m/Y', strtotime( $form_state->getValue('field_data_1')[0]['value']) );
// IMPORTANTE: la funzione di after build DEVE sempre ritornare l'intero form
return $form;
}
Prova ad usare il modulo kint
Prova ad usare il modulo kint in Afterbuild:
ksm($form['field_data_2']['widget'][0]['value']);
ksm($form_state->getValue('field_data_1'));
ti sarà sicuramente di aiuto per capire com'è struttura un elemento data.
Ciao Maurizio, in questi
Ciao Maurizio, in questi giorni ho fatto varie prove e letto altro. Ho seguito il tuo consiglio ed il valore della data compare in kint
Non ho capito se callBack e after_build convivono o l'uno esclude l'altro
Ho controllato anche un tuo suggerimento precedente e fatte le prove con entrambe le linee di codice
Controllato anche con kint ma il risultato non cambia. Sugli esempi visti l'after_buil è messo subito dopo il campo
Accoda la tua funzione
Accoda la tua funzione nell'elemento #after_build del form:
$form['#after_build'][] = 'afterBuild';
callBack e after_build hanno due funzioni completamente diverse, quindi sì, possono convivere. L'ajax callback viene chiamato solo dopo un certo evento tramite ajax. L'after build è sempre eseguito, ogni volta che il form viene costruito o inviato.
Ciao Maurizio, inserito il
Ciao Maurizio, inserito il codice e fatto prove. Purtroppo non funziona e sono sempre convinto che il problema stia nell'array del campo field_data_b
Ho visto con kint che la proprietà #value non esiste per il campo data e ciò potrebbe essere il problema.
Nelle prove ho notato una cosa che ti illustrerò tramite degli S.S. Spero di essere chiaro.
In form_alter
Codice del campo Data sempre in form_alter
// callBack Data
Codice rebuild
Entrambi icampi di field_data_a e field_data_b sono valorizzati con la data del giorno attraverso i settaggi del campo con l'IDE.
In rebuild faccio visulizzare il valore del campo filed_data_a e corrisponde, ma il valore del campo field_data_b viene azzerato e compaiono i dati di default gg/mm/aaa
di seguito gli S.S.
Immagine Iniziale
Immagine dopo aver digitato la data ed è qui che visualizzo la data e il valore di field_data_2 si azzera. Ciò è dovuto a questa linea presente in campo data in form_alter.
Se la remmo non si azzera la data di field_data_b, ma continua a non aggiornare il campo field_data_b
Immagine con la linea remmata
Scusa la prolissità ma penso che ci manchi proprio poco per capire perchè non visualizza il dato.
Cerchiamo di semplificare le
Cerchiamo di semplificare le cose. Posto che l'obiettivo è solo quello di copiare un valore di campo tramite una chiamata ajax, si può provare a risolvere esclusivamente usando il callback in questo modo (posto anche di avere due campi data field_data e field_data_2):
<?php
function mymodule_form_alter(array &$form, \Drupal\Core\Form\FormStateInterface $form_state, string $form_id) {
if ($form_id === 'node_contenuto_esempio_form') {
$form['field_data']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'mymodule_data_callback',
'wrapper' => 'data-ajax-wrapper',
];
$form['field_data_2']['widget'][0]['value'] += [
'#prefix' => '<div id="data-ajax-wrapper">',
'#suffix' => '</div>'
];
}
}
function mymodule_data_callback(array &$form, \Drupal\Core\Form\FormStateInterface $form_state) {
$data = $form_state->getValue('field_data');
$form['field_data_2']['widget'][0]['value']['date']['#value'] = $data[0]['value']['date'];
return $form['field_data_2']['widget'][0]['value'];
}
?>
Provato il codice e funziona.
Provato il codice e funziona. Confesso che non sarei mai arrivato a questa soluzione. Ho rivisto la profondità dell'array con kint($form['field_data_2']) ma non ho trovato la chiave date che mi hai postato
e non saprei nemmeno come cercare materiale che parla di ciò
Nel frattempo ho continuato a leggere articoli e provato AjaxResponse() e invoke command e funziona
Alla luce di ciò, devo capire come fare il callBack di un campo entity reference. Il codice per analogia potrebbe essere supponendo di avere 2 campi entity reference field_entirefe_a e field_entirefe_b:
$EnRe = $form_state->getValue('field_entirefe_a');
$form['field_entirefe_a']['widget'][0]['target_id']['entityRference <invece di date?'>]['#value'] = $EnRe[0]['value']['entityRference <invece di date?'>'];
Grazie
Dipende dal widget
Dipende dal widget selezionato per il campo. Potresti provare a impostare entrambi gli entity reference a select invece che autocomplete e adattare il codice (i valori degli autocomplete vengono processati e ridotti al target numerico ma non è il valore che il widget richiede, se provi a copiarlo in un altro autocomplete non passerà la validazione).
Per similitudine ho cambiato
Per similitudine ho cambiato il codice ma non va.
Ho cambiato il widget di field_enre_a da autocomplete in select ed il secondo l'ho lascito come autocomplete.
Penso che il codice non vada bene ma non so come fare e non trovo materiale per capire come dev'essere scritto l'array
form_alter
callBack
targed_id non è un elemento
targed_id non è un elemento dell'array, inoltre il widget select non ha la struttura [0]['target_id'] (basta che guardi con kint).
Metti entrambi come select nelle impostazioni poi prova
form_alter
<?php
$form['field_entirefe_a']['widget']['#ajax'] = [
'event' => 'change',
'callback' => 'MissRichCB',
'wrapper' => 'enti-ajax-wrapper',
];
$form['field_entirefe_b']['widget'] += [
'#prefix' => '<div id="enti-ajax-wrapper">',
'#suffix' => '</div>'
];
?>
callBack (nota field_data_b non va bene)
<?php
function MissRichCB( array &$form, FormStateInterface $form_state ) {
$form['field_entirefe_b']['widget']['#value'] = $form['field_entirefe_a']['widget']['#value'];
return $form['field_entirefe_b']['widget'];
}
?>
Codice provato e funziona
Codice provato e funziona perfettamente. L'ho modificato in quanto la mia esigenza è diversa.
Il primo entity reference Field_entirefe_a è collegato ad un conte type anagrafica che ha anche il campo Località
Il secondo entity reference Field_entirefe_a è collegato alle Anagrafiche delle Località. Nel callBack ho aggiunto delle linee per richiamare una funzione che
- prende il nid,
- Carica il nodo
- Prende il nid della località inserendolo in field_entirefe_b e mi visualizza la località
// Ricerca il Nodo per il Comune
$nid = $form['field_entirefe_a']['widget']['#value'];
$ComuID = CercaNodo( $nid, 'Richiedente' );
$form['field_entirefe_b']['widget']['#value'] = $ComuID;
return $form['field_entirefe_b']['widget'];
Ricordo che tra i vari articoli che ho letto ci sarebbe la possibilità di prendere direttamente un campo del content type collegato, per evitare tutte le righe che ho scritto. Ho fatto delle prove ma senza successo. Ho provato questo codice
$a = $form_state->field_entirefe_a->entity->field_localita->target_id; (Nel C.T. località il widget è autocompletamento
Il codice successivo non ho capito se mi restituisce tutti i campi entity reference o anche glia ltri campi del C.T collegato
$entities = $entity->field_items->referencedEntities();
Il codice che hai scritto è
Il codice che hai scritto è il modo corretto di estrarre la info che ti serve.
Questo invece
$form_state->field_entirefe_a->entity->field_localita->target_id
non è applicabile in questo contesto.
Direi che l'argomento del topic è stato largamente discusso e risolto, nel caso apri un'altra issue per non andare off topic su questa.
Maurizio scusa se riapro il
Maurizio scusa se riapro il thread ma non riesco a capire.
A questo link
http://drupal.it/supporto/callback-form-alter#comment-13419
Mi indicasti la soluzione per poter aggiornare un campo data tramite l'aggiornamento di un altro campo data.
Per postare l'esempio, avevo creato un altro content type per le prove.
Adesso ho inserito il codice indicando i campi del content type dove mi serve per davvero, ma non mi funziona. Non mi riporta alcun errore e per le prove effettuate non mi richiama la funzione di callBack
Hai qualche consiglio per poter controllare come mai non richiama la funzione di callBack?
Così su due piedi non saprei.
Così su due piedi non saprei. Prova a postare il codice intero del modulo.
Trovato perchè non funziona
Trovato perchè non funziona sulla scheda effettiva.
Nel 2 campo data per visualizzare la label e l'input sulla stessa riga (non label sopra e input sotto), ho scritto questo codice
$form['field_data_rientro']['widget'][0]['value']['#prefix'] = '<div class="container-inline">';
$form['field_data_rientro']['widget'][0]['value']['#suffix'] = '</div>';
mentre il codice che mi hai indicato per il callBack è
$form['field_data']['widget'][0]['value']['#ajax'] = [
'event' => 'change',
'callback' => 'MissDataCB',
'wrapper' => 'data-ajax-wrapper',
];
$form['field_data_rientro']['widget'][0]['value'] += [
'#prefix' => '<div id="data-ajax-wrapper">',
'#suffix' => '</div>'
];
Penso che i 2 prefeix vadano in conflitto, una volta che ho remmato il primo prefix ha funzionato bene.
Adesso da trovare come far visualizzare i dati in orizzontale senza indicare la classe container-inline
Ah sì, in pratica se
Ah sì, in pratica se modifichi il prefix togli il riferimento da sostituire dopo la chiamata ajax. Potresti provare aggiungere la classe al wrapper:
<?php
$form['field_data_rientro']['widget'][0]['value'] += [
'#prefix' => '<div id="data-ajax-wrapper" class="container-inline">',
'#suffix' => '</div>'
];
?>
devi però controllare che su chiamate successive venga mantenuta.
Provato in questa
Provato in questa maniera
Il callBack funziona ma non il container-inline
Non so se con i CSS si possa gestire la Visualizzazione della Form
grazie
Mi sono accorto che non si
Mi sono accorto che non si vedeva l'ultimo codice che avevo scritto, ricontrolla il post.
Assolutamente sì, se hai classi e/o id sufficienti per stilizzare l'elemento.
Ha funzionato. solo per un
Ha funzionato. solo per un campo no e non capisco il perchè. L'unica differenza è che precede un campo creato al volo