Messaggio Modale
Ho letto qualcosa sui messaggi popUp e come farlo visualizzare con blocchi e moduli. Ho letto anche che potrebbe esser rchiamata una funzione con Ajax
Uso messenger per la visualizzazioen dei messaggi ma in questo caso preferisco che venga visualizzato un messaggio modale tipo alert di JavaScript. Ho fatto delle prove ma non ho capito come richiamarlo e non vorrei scrivere un modulo,
In una view con un pulsante edito il nodo e attraverso messenger visualizzo il messggio che m'interessa, però temo che non essendo un messaggio bloccante, possa non esser letto dall'utente.
Il messaggio lo visualizzo tramite una if in form_alter
Drupal::messenger()->addMessage( 'Non sei un TITOLARE, non tutti i campo verranno aggiornati ');
vorrei farele stessa cosa ALERT( 'Non sei un TITOLARE, non tutti i campo verranno aggiornati ');
Ho scritto di non voler usare il modulo in quanto è un semplice messaggio con blocco
E' possibile?
Risposte
Sto provando Ajax e va
Sto provando Ajax e va collegato ad un elemento della form. Ma non è il mio caso.
La func ajax prevede
e
C'è un modo per poter richiamare questo comando senza un callback sull'elemento?
Se ti occorre solo mostrare
Se ti occorre solo mostrare alcuni messaggi di sistema su un modale, potresti utilizzare o un modulo aggiuntivo tipo
https://www.drupal.org/project/better_messages
https://www.drupal.org/project/bootstrap_modal_messages
https://www.drupal.org/project/toastify
o cercare un tema che già mostra i messaggi di sistema su un modale oppure scriverti uno snippet jQuery all'interno del tema che usi.
Il modulo è la cosa +
Il modulo è la cosa + semplice, proverò i moduli che mi hai suggerito per vedere come lavorano.
Mi potresti dare un'indicazione sulle letture da fare per la creazione dello snippet
Il core ha un libreria
Il core ha un libreria dedicata core/drupal.dialog.ajax che puoi includere nei template o in un render array e richiamare il la finestra di dialogo in questo modo
Drupal.dialog($('.messages'), { title: 'Messaggi di sistema' }).showModal();
Provato il codice che mi hai
Provato il codice che mi hai postato.
In libraries.yml ho inserito
js:
js/udf.js: {}
dependencies:
- core/jquery
- core/jquery.once
- core/drupal.dialog.ajax
- core/jquery.form
All'interno di form_alter ho inserito
$form['#attached']['library'][] = 'core/drupal.dialog.ajax';
e subito dopo
Drupal.dialog($('.messages'), { title: 'Messaggi di sistema' }).showModal();
Mi riporta errore sul $ o le parentesi graffa. Ho fatto varie prova ma senza successo.
Ho fatto varie ricerche e provato il codiece per l'apertura del finestra modale collegata ad un link e mi funziona
Il codice che mi hai postato è l'ideale se capissi come fare per farlo funzionare
E' javascript quindi nel tuo
E' javascript quindi nel tuo caso puoi metterlo dentro il file udf.js, all'interno di un behavior o comunque all'interno di una funzione
(function($){
...
})(jQuery);
Grazie, la mia ignoranza è
Grazie, la mia ignoranza è abbissale.
Inizio a studiare come funziona JS e come si interfaccia con Drupal e come si richiama una FUNC JS
Ho letto un po' di materiale
Ho letto un po' di materiale e solo dopo varie prove ho capito il significato del codice che mi hai postato.
Questo il Codice Utilizzato
Visualizza i Msg di Sistema, attraverso Drupal::messenger(), in una finestra modale.
Realtivamente lal codice
Drupal.behaviors.VisMes = {
ho notato che dopo behaviors devo mettere un . ed almeno una carattere altriemnti non funzionae non sono riuscito a capire il perchè
Quel che volevo realizzare é una finestra modale dapoter richiamare quando serve attraverso una function, tipo
(function($) {
Drupal.behaviors.VisMes = {
attach: function(context) {
alert("OK");
}}})(jQuery);
con il richiamo in form-alter
MsgBox('Comunicazione');
Ma non mi riconosce la function. Ho letto JS su come si crea la function ma non ho capito come integrarla in Drupal
Spero di essere stato chiaro
Se "MsgBox('OK');" lo usi in
Se "MsgBox('OK');" lo usi in php (nel form alter) non può funzionare.
Non puoi chiamare una funzione javascript in questo modo pensando che php possa riconoscerla, non è proprio possibile. Inoltre un behavior non è nemmeno una funzione.
Ad ogni modo non è necessario che tu richiami il modale in alcun modo: con il codice scritto se un elemento con classe messages è presente nella pagina questo verrà automaticamente aperto su modale.
Se non funziona:
- o non esiste un elemento con classe messages
- o c'è qualche problema in qualche altro punto
Però se non uso il behavior
Però se non uso il behavior non mi richiama la finestra modale. Sicuramente sbaglio qualcosa.
Avevo immaginato ci fosse la necessità ci dovesse essere un collegamento ad un elemento.
Nel mio caso in form_alter di un content type faccio il controllo sull'utente. Se è l'amministraore o il responsabile attraverso l'eventuale alert lo avviso che se inserisce il movimento o se lo modifica, il title non verrà aggiornato (il title non è visibile in quanto l'aggiorno in fase di salvataggio.
La procedura esatta sarebbe di non permettere l'inserimento o l'editazione ma m'interessava capire come interagire.
Siccome il controllo viene effettuato in inserimento o in editazione posso interagire con la finestra modale solo in questo caso?
Se includi la libreria nel
Se includi la libreria nel form_alter è disponibile solo sulla pagina del form. Se dopo il submit il form redireziona altrove (ad esempio in home), il modale non è attivato in quanto non è inclusa la libreria. Se ti occorre ovunque nel frontend, meglio inserirla nel tema.
ho fatto il collegamento sia
ho fatto il collegamento sia nel file libraries.yml che nel form_alter. Il messaggi lo devo visualizzare prima del submit. Appena entro nella form
Appena entro nella form Ok,
Ok, devi fare in modo però che appena entri nella form, ci siano dei messaggi da mostrare.
Ad esempio, nel form_alter subito dopo l'inclusione della libreria mettere:
<?php
function tuo_form_alter(...){
....
$form['#attached']['library'][] = 'nome tua libreria udf';
if (... condizione per mostrare messaggio ...) {
\Drupal::messenger()->addMessage('... testo messaggio nel modale ...');
}
...
}
?>
Si questo lo faccio e
Si questo lo faccio e funziona
if ( in_array ( 'titolare', $ruoli ) ) {
....
} else {
Drupal::messenger()->addMessage( 'Non sei un TITOLARE, Ti ricordo che la Data nel TITOLO non verrà AGGIORNATA.');
E visualizza il Msg nella barra di Stato in alto. Utilizzando il codice postato nel precedente messaggio (JS) lo fa in modalità modale.
Preferisco usare la finestra modale solo quando mi serve altrimenti tutti gli altri msgg (tipo quello dell'aggiornamento del core) me li visualizza con la finestra modale.
Possibile? Potrebbe servirmi anche per altre segnalazioni per allertare l'utente
Certo ma in questo caso devi
Certo ma in questo caso devi adattare alle tue esigenze il codice. Puoi attivare il modale su una classe diversa da messages e creare un elemento markup nel form alter con il messaggio invece di usare il servizio messenger.
Drupal.dialog($('.lamiaclasse'), ....
nel form alter
<?php
$form['messaggio'] = [
'#markup' => '<div class="lamiaclasse">.. testo ..</div>'
];
?>
Provato ma sicuramente
Provato ma sicuramente sbaglio qualcosa nel codice
in JS
(function($) {
//Drupal.dialog($('.msg-mod'), { title: 'ATTENZIONE' }).showModal();
alert("OK");
})(jQuery);
form_alter
$form['messaggio'] = [
'#markup' => '<div class="msg-mod"> PROVA </div>'
];
Se lascio l'alter me lo manda in esecuzione in quanto è generico e viene eseguito su ogni pagina. Se remmo alert e lascio drupal.dialog non visulizza nulla. Rileggerò la documentazione per capire dove sbaglio
Form alter sembra ok ma js
Form alter sembra ok ma js deve essere simile al primo del tuo post qui sopra http://www.drupal.it/supporto/messaggio-modale#comment-13508
Grande Maurizio, provato e
Grande Maurizio, provato e funziona.
E' quello che volevo realizzare.
Appena possibile devo capire se si può personalizzare l'intestazione o altro
Grazie