WebForm - Aggiornamento campo
Nella WebForm ho vari campi e tra questi 2 campi data.
Per semplicità li chiamerò Data1 e Data2, entrambi vengono prepopolati con la data del giorno.
Al cambiare della data del campo Data1, vorrei che la data del campo Data2 venisse aggiornata con quella del campo Data1.
Ho visto sia i parametri della sezione Condizioni che le regole. Ma in entrambi non c'è la possibilità di fare l'aggiornamento del campo in inserimento o in variazione.
Secondo voi è possibile farlo con WebForm Alter?
Gaetano
Risposte
Sì, prova qualcosa del genere
Sì, prova qualcosa del genere (considera due campi Data semplici nel form che si chiamano Data 1 e Data 2)
<?php
function [nome-modulo]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id === 'webform_submission_[nome-macchina-webform]_add_form' || $form_id === 'webform_submission_[nome-macchina-webform]_edit_form') {
$form['elements']['data_1']['#attributes']['onchange'] = 'jQuery("#edit-data-2").val(jQuery(this).val())';
}
}
?>
Grazie della risposta
Grazie della risposta Maurizio.
Ho visto un esempio su come, in base alla proprietà #states, di un campo fosse possibile visualizzare o meno uno o più campi e mi chiedevo se ci fosse anche una proprietà che indicasse quale campo avesse il focus o se il camp fosse stato aggiornato e se ho capito bene questa proprietà è #attributes.
Mi inizia ad essere chiaro qualcosa.
Se ho letto bene il codice prevede l'aggiornamento del campo Data2 sia in Inserimento che in Variazione
Provo e ti faccio sapere.
L'esempio fatto è il più
L'esempio fatto è il più semplice possibile per raggiungere ciò che ti occorre (non è detto sia il migliore o il più corretto), agisce sfruttando l'attributo onchange dell'elemento html (https://www.w3.org/WAI/UA/TS/html401/cp0102/0102-ONCHANGE-INPUT.html).
Gli #states sono utili per definire facilmente lo stato di un campo in base allo stato di un altro (es: il campo A è visibile e richiesto se il dropdown B ha valore X).
Per le cose più complesse è sempre meglio crearsi una libreria che implementi i behavior.
sì, questo snippet si attiva sia in aggiunta che in modifica di una submission del webform.
uhhmm ho letto meglio il
uhhmm ho letto meglio il codice ed il tuo commento sullo snippets.
Effettua l'aggiornamento all'atto della conferma della WebForm. A me serve farlo prima della conferma/salvataggio.
Mi spiego meglio, cambio data a Data1, con uno snippets o altro, aggiorno il valore del campo Data2 e l'utente prosegue con gli input.
Arrivato al campo Data2 può confermare la data o cambiarla.
Poi conferma
Non so se con Drupal ciò si possa fare.
Se leggi sopra, ho detto che
Se leggi sopra, ho detto che "questo snippet si attiva sia in aggiunta che in modifica di una submission del webform":
<?php
...
($form_id === 'webform_submission_[nome-macchina-webform]_add_form' || $form_id === 'webform_submission_[nome-macchina-webform]_edit_form')
...
?>
l'evento "onchange" si verifica ogni volta che un utente modifica il campo Data 1. Anche l'inserimento della Data 1 provoca tale evento (modifica da vuoto a nuovo valore).
Conviene che lo provi, secondo quanto ho capito dovrebbe essere quello che ti serve.
Si l'avevo letto lo provo e
Si l'avevo letto lo provo e ti aggiorno
Ho provato il codice, ho
Ho provato il codice, ho dovuto cambiare il nome macchina missioni-cp-dipe, in missioni_cp_dipe
Di seguito il codice con le variabili reali Data1 = data_missione e Data2 = data_di_rientro
Ho anche controllato con kint($form); die(); se entrava nella IF ed entra
if ($form_id === 'webform_submission_missioni_cp_dipe_add_form' || $form_id === 'webform_submission_missioni_cp_dipe_edit_form') {
$form['elements']['data_missione']['#attributes']['onchange'] = 'jQuery("#edit-data_di_rientro").val(jQuery(this).val())';
}
Al cambio di Data1, sia contemporaneamente che nel salvataggio, non modifica il valore di Data2
I nomi macchina dei campi li ho presi dalla struttura per non sbagliare
Secondo me l'errore potrebbe
Secondo me l'errore potrebbe essere nel selettore jQuery. Mi pare strano che ci siano underscore invece di dash
jQuery("#edit-data_di_rientro").val(jQuery(this).val())';
sei sicuro non sia invece
jQuery("#edit-data-di-rientro").val(jQuery(this).val())';
?
provato cambiando
provato cambiando l'underscore in dash ma il risultato non cambia, sia prima che dopo il salvataggio
if ($form_id === 'webform_submission_missioni_cp_dipe_add_form' || $form_id === 'webform_submission_missioni_cp_dipe_edit_form') {
$form['elements']['data_missione']['#attributes']['onchange'] = 'jQuery("#edit-data-di-rientro").val(jQuery(this).val())';
}
ti allego gli S.S. delle chiavi dei campi
S.S. 1
S.S. 2
Non saprei, io ottengo questo
Non saprei, io ottengo questo applicandolo:
https://drive.google.com/file/d/1CR1OYDqbL4cZJLCuywwSCbb6qpCdzFz-/view
prova ad aggiungere nel form alter anche
$form['#attached']['library'][] = 'core/jquery';
prova anche a cambiare l'istruzione js in qualcosa tipo
alert('ok')
per vedere se il codice js viene eseguito
Del filmato vedo solo
Del filmato vedo solo l'immagine iniziale, sia da google che scaricando non vedo null'altro.
Se ho letto bene JQuery fa parte del core e non va abilitato. JS forse va abilitato o vanno caricate prima le librerie?
Provo ad inserire la leìinea che mi hai consigliato e ti farò sapere.
Ho visto che hai riprodotto l'esempio sul C.T. articolo.
L'altro giorno per curiosità l'ho provato anch'io ma se ho capito bene $form['element'][field_data1] non va bene, riprovo
Il formato del video è webm,
Il formato del video è webm, questo è in mp4
https://drive.google.com/file/d/1UNGscRc_XwsNpM8zwRjGsjkRt7JpIaGv/view?u...
jQuery fa parte del core e di solito viene richiamato già da alcuni moduli o temi ma se lo è questa stringa fa in modo di assicurare che la libreria venga caricata con il form.
Visto il video è proprio
Visto il video è proprio quello che serve a me.
Domattina faccio la prova su article per evitare che in WebForm possa aver fatto degli errori.
Se non va significa che mi mancano dei settaggi o delle dipendenze che non ho attivato durante l'installazione
Grazie per il tempo che mi stai dedicando
Ho visto che hai riprodotto
L'esempio è un webform che non è legato ad un content type.
Per i fields legati ad un nodo il codice è diverso a seconda del tipo di campo e widget utilizzato.
Ho replicato il tuo esempio
Ho replicato il tuo esempio nella WebForm contact per avere certezza che il codice sia lo stesso.
Ho anche inserito un alert JS ma penso che il codice non sia esatto perchè non carica la pagina web e mi ritorna l'avviso The website encountered an unexpected error. Please try again later. E dipende dal codice JS se lo remmo carica la pagina.
Di seguito il codice che ho usato per controllarne l'esattezza.
if ($form_id === 'webform_submission_contact_add_form' || $form_id === 'webform_submission_contact_edit_form') {
$form['#attached']['library'][] = 'core/jquery';
jQuery(document).ready(function () {
alert("OK");
});
$form['elements']['data_1']['#attributes']['onchange'] = 'jQuery("#edit_data_2").val(jQuery(this).val())';
//$form['elements']['data-1']['#attributes']['onchange'] = 'jQuery("#edit-data-2").val(jQuery(this).val())';
}
Ho fatto varie prove con i dash e l'underScore ma il risultato è sempre lo stesso non funziona
Non riesco a capire cosa sia sbagliato in quel che ho scritto e perchè non esegua il tuo codice
Non puoi mescolare Javascript
Non puoi mescolare Javascript e PHP in questo modo, l'errore dipende da questo.
Scrivi solo questo e vedi se almeno di apre un alert:
<?php
if ($form_id === 'webform_submission_contact_add_form' || $form_id === 'webform_submission_contact_edit_form') {
$form['#attached']['library'][] = 'core/jquery';
$form['elements']['data_1']['#attributes']['onchange'] = 'alert("OK")';
}
?>
Si hai ragione ho letto un
Si hai ragione ho letto un po' di documentazione e i files di JS vanno in una libreria a parte con altra gestione.
Penso che il problema sia jQuery, come se non lo riconoscesse. Il problema è che non mi riporta errori, non lo esegue e basta.
Ho inserito l'alert e dopo aver modificato la data e proseguito col tab mi esce la finestra. Perciò penso che a questo punto sia un problema di jQuery.
Cosa o ocme posso controllare per vedere se è attivo e funzionante?
Prova a vedere se così
Prova a vedere se così risolvi
<?php
$form['elements']['data_1']['#attributes']['onchange'] = 'this.form.data_2.value = this.value';
?>
Ciao Maurizio. Si il codice
Ciao Maurizio. Si il codice funziona. Nei prossimi giorni lo copio sul sito onLine per vedere come si comporta.
Proverò anche ad esplorare meglio le proprità della webform con kint
Grazie
Buongiorno Maurizio, mi
Buongiorno Maurizio, mi trovo in difficoltà. Siccome il codice che mi avevi inviato sulla mia WebForm non funzionava, ho riprodotto il tuo esempio funzionante sulla WebForm contact e come comunicato funziona.
Ho inserito il codice nella mia WebForm e non funziona.
La WebForm ha nome macchina missioni_cp_dipe. di seguito il codice dell'hook. La versione di Drupal è la 8.8.5
Ho provato anche ad inserire l'alert come puoi notare e la visualizzazione di un testo e mo lo visualizza.
Ho controllato le var anche con kint
Non so che pensare
Non penso di aver sbagliato a scrivere qualcosa
Nessun errore js in console?
Nessun errore js in console? Puoi postare un link al form?
Ciao Maurizio, non vorrei
Ciao Maurizio, non vorrei usare una terminologia inesatta, in locale come editor usao Visual Studio Node e in console non mi riporta alcun errore.
Se ti riferisce alla console di chrome mi riporta questo errore
DevTools failed to load SourceMap: Could not load content for chrome-extension://gighmmpiobklfepjocnamgkkbiglidom/include.preload.js.map: HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME
L'ho aperto e mi riporta varie righe con varie lettere ma non ho capito a cosa si riferisce
Questo il link alla form
Questo il link al modulo
In ogni caso ti allego tutto il codice
Evita l'echo potrebbe darti
Evita l'echo potrebbe darti problemi. Se devi printare qualcosa dentro un form usa un elemento markup tipo:
$form['testo'] = [
'#markup' => 'ga'
];
Ciao Maurizio, scoperto
Ciao Maurizio,
scoperto l'arcano ho fatto alcune prove d ho notato che l'errore dipende dalla sintassi del codice.
Il sorgente delle date è questo ed è dentro un riquadro, col nome riq_data:
riq_data:
'#type': fieldset
'#title': Riq_data
'#title_display': invisible
'#attributes':
class:
- 'form--inline clearfix'
'#format': details
data_missione:
'#type': date
'#title': del
'#title_display': before
'#description_display': after
'#help_display': element_after
'#size': '15'
'#required': true
'#flex': 12
'#default_value': today
'#date_days':
- '1'
- '2'
- '3'
- '4'
- '5'
- '6'
'#date_date_format': ''
data_di_rientro:
'#type': date
'#title': del
'#title_display': inline
'#help_display': element_after
'#required': true
'#default_value': today
'#date_days':
- '1'
- '2'
- '3'
- '4'
- '5'
- '6'
'#date_date_format': ''
Ho spostato i campi fuori dal riquadro ed il codice viene eseguito.
Ho modificato la linea relativa all'onChange ma la sintassi non sarà esatta in quanto non funziona. Ho scritto così:
$form['riq.data']['elements']['data_missione']['#attributes']['onchange'] = 'alert("OK")';
e
$form['elements']['riq.data']['data_missione']['#attributes']['onchange'] = 'alert("OK")';
non funziona e non ritorna alcun errore
Non vedo link sui post sopra,
Non vedo link sui post sopra, prova a ripostarli
Se le date sono dentro un
Se le date sono dentro un fieldset, posto che il suo nome macchina sia data_wrapper, è sufficiente modificare il codice così
<?php
$form['elements']['data_wrapper']['data_1']['#attributes']['onchange'] = ...
?>
adesso funziona. nel codice
adesso funziona. nel codice scritto avevo sbagliato. Avevo messo il dot invece dell'underscore
grazie