Differire inclusione di una modale

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Differire inclusione di una modale

    Eccomi, 

    il markup l'ho corretto così:

    	<?php
    		if ($result_pulsanti && mysqli_num_rows($result_pulsanti) > 0) {
    			echo '<button type="submit" class="btn btn-primary mr-4">CONTRATTI</button>';
    			echo '</form>';
    			echo '<button type="button" class="btn btn-warning" data-toggle="modal" data-target="#emailModal" id="loadContentButton">INVIO EMAIL</button>';
    		} else {
    			// Messaggio di avviso se non ci sono risultati
    			echo '<p></p>';
    		}
    	?>
    
    <div class="modal fade custom-modal" id="emailModal" tabindex="-1" role="dialog" aria-labelledby="emailModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-xl" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="emailModalLabel">Invio Documentazione per Erogazione </h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
               <div class="modal-body">
    				<!-- Il contenuto dell'email sarà inserito qui tramite AJAX -->
    				<form id="emailForm" onsubmit="inviaEmail(); return false;" enctype="multipart/form-data">
    					<div class="modal-footer justify-content-center">
    							<button type="submit" class="btn btn-primary">Invia Email</button>
    							<button type="button" class="btn btn-secondary" data-dismiss="modal">Chiudi</button>
    					</div>
    				</form>	
                </div>
            </div>
        </div>
    </div>
    	
    <script>
            $(document).ready(function() {
                $("#loadContentButton").click(function() {
                    // Effettua una richiesta AJAX a email_modal.php
                    $.ajax({
                        url: "email_modal.php",
                        type: "GET",
                        success: function(response) {
                            // Popola la modale con il contenuto ricevuto dalla risposta
                            $("#emailModal .modal-body").html(response);
                            // Apri la modale
                            $("#emailModal").modal("show");
    						console.log(response)
                        },
                        error: function() {
                            alert("Si è verificato un errore durante il recupero del contenuto.");
                        }
                    });
                });
            });
    </script>

    e email_modal.php :

    				<form onsubmit="inviaEmail(); return false;" enctype="multipart/form-data">
    					<div class="form-group">
    						<label for="recipientEmail">Destinatario Email</label>
    						<input type="email" class="form-control" id="recipientEmail" name="recipientEmail" value="<?php echo $email_comm ?>">
    					</div>
    					<div class="form-group">
    						<label for="emailSubject">Oggetto Email</label>
    						<input type="text" class="form-control" id="emailSubject" name="emailSubject" value="<?php echo $oggetto_email ?>">
    					</div>
    					<div class="form-group">
    						<label for="emailMessage">Messaggio Email</label>
    						<textarea class="form-control" id="emailMessage" name="emailMessage" rows="12"><?php echo $corpo_email ?></textarea>
    					</div>
    					
    					<!--DISPOSIZONI-->
    					<div>
    						<?php
    						$searchTerm = $num_praticatab_costi;
    
    						// Ottieni l'elenco dei file nella directory
    						$directory_disp = '../../Documenti/.................../' . $annocorrente;
    						$disp = scandir($directory_disp);
    
    						// Array per memorizzare i nomi dei file
    						$disposizioni_Names = array();
    
    						// Contatore per il numero delle disposizioni trovate
    						$disposizioneCount = 1;
    						
    						echo "<h6 class=\"text-center\">Disposizioni:</h6>";
    
    						// Scorri l'elenco dei file
    						foreach ($disp as $disposizioni) {
    							if ($disposizioni !== '.' && $disposizioni !== '..' && strpos($disposizioni, $searchTerm) !== false) {
    								$disposizioni_Names[] = $disposizioni;
    								$dispId = "attachment" . $disposizioneCount;
    								$dispName = "attachment" . $disposizioneCount;
    								echo "<input class=\"attachment-input\" type=\"text\" id=\"$dispId\" name=\"$dispName\" value=\"$disposizioni\"><br>";
    								$disposizioneCount++;
    							}
    						}
    						?>
    						<input type="hidden" name="searchTerm" value="<?php echo $searchTerm; ?>">
    					</div>
    					
    					<!--TEG e Data Allegato 4-->
    					<div>
    						<?php
    						$searchTerm = $num_praticatab_costi;
    
    						// Ottieni l'elenco dei file nella directory
    						$directory_teg = '../../Documenti/..................../' . $annocorrente . '/TEG';
    						$teg = scandir($directory_teg);
    
    						// Array per memorizzare i nomi dei file
    						$teg_Names = array();
    
    						// Contatore per il numero delle disposizioni trovate
    						$tegCount = 1;
    						
    						echo "<h6 class=\"text-center\">TEG e Data Allegato 4:</h6>";
    
    						// Scorri l'elenco dei file
    						foreach ($teg as $file_teg) {
    							if ($file_teg !== '.' && $file_teg !== '..' && strpos($file_teg, $searchTerm) !== false) {
    								$teg_Names[] = $file_teg;
    								$tegId = "attachment" . $tegCount;
    								$tegName = "attachment" . $tegCount;
    								echo "<input class=\"attachment-input\" type=\"text\" id=\"$tegId\" name=\"$tegName\" value=\"$file_teg\"><br>";
    								$tegCount++;
    							}
    						}
    						?>
    						<input type="hidden" name="searchTerm" value="<?php echo $searchTerm; ?>">
    					</div>
    					
    					<!--CONTRATTI-->
    					<div>
    						<?php
    						$searchTerm = $num_praticatab_costi;
    
    						// Ottieni l'elenco dei file nella directory
    						$directory_contratti = '../../Documenti/........................./' . $annocorrente . '/CONTRATTI FIRMATI';
    						$contratti = scandir($directory_contratti);
    
    						// Array per memorizzare i nomi dei file
    						$contratti_Names = array();
    
    						// Contatore per il numero delle disposizioni trovate
    						$contrattiCount = 1;
    						
    						echo "<h6 class=\"text-center\">Contratti:</h6>";
    
    						// Scorri l'elenco dei file
    						foreach ($contratti as $contrattipratica) {
    							if ($contrattipratica !== '.' && $contrattipratica !== '..' && strpos($contrattipratica, $searchTerm) !== false) {
    								$contratti_Names[] = $contrattipratica;
    								$contrattiId = "attachment" . $contrattiCount;
    								$contrattiName = "attachment" . $contrattiCount;
    								echo "<input class=\"attachment-input\" type=\"text\" id=\"$contrattiId\" name=\"$contrattiName\" value=\"$contrattipratica\"><br>";
    								$contrattiCount++;
    							}
    						}
    						?>
    						<input type="hidden" name="searchTerm" value="<?php echo $searchTerm; ?>">
    					</div>
    
    					<!--COMPENSAZIONE E LETTERA SCONTO-->
    					<div>
    						<?php
    						$searchTerm = $num_praticatab_costi;
    
    						// Ottieni l'elenco dei file nella directory
    						$directory_compensazione = '../../Documenti/................../' . $annocorrente . '/COMPENSAZIONI';
    						$compensazione = scandir($directory_compensazione);
    
    						// Array per memorizzare i nomi dei file
    						$compensazione_Names = array();
    
    						// Contatore per il numero delle disposizioni trovate
    						$compensazioneCount = 1;
    						
    						echo "<h6 class=\"text-center\">Lettera Compensazione Quote e Sconto:</h6>";
    
    						// Scorri l'elenco dei file
    						foreach ($compensazione as $file_compensazione) {
    							if ($file_compensazione !== '.' && $file_compensazione !== '..' && strpos($file_compensazione, $searchTerm) !== false) {
    								$compensazione_Names[] = $file_compensazione;
    								$compensazioneId = "attachment" . $compensazioneCount;
    								$compensazioneName = "attachment" . $compensazioneCount;
    								echo "<input class=\"attachment-input\" type=\"text\" id=\"$compensazioneId\" name=\"$compensazioneName\" value=\"$file_compensazione\"><br>";
    								$compensazioneCount++;
    							}
    						}
    						?>
    						<input type="hidden" name="searchTerm" value="<?php echo $searchTerm; ?>">
    					</div>
    				</form>
    			

    NONOSTANTE TUTTO….niente… pare che ignori lo script javascript. 

  • Re: Differire inclusione di una modale

    30/08/2023 - alessandro.vitale ha scritto:


     Ma una chiusura di un div in più puó causare tutto ció?   

    Se il <div> viene manipolato tramite script per essere visualizzato in un certo modo, e la mancanza della chiusura di uno di essi include elementi che dovrebbero rimanere separati, allora sì.

    E' sempre fondamentale accertarsi che la struttura della pagina HTML sia corretta, poiché il browser non è tenuto a segnalare nulla in merito, ma la gerarchia dei nodi che formano il DOM potrebbe essere diversa da quella che ci si aspetta.

  • Re: Differire inclusione di una modale

    HO AGGIRATO IL PROBLEMA! 

    praticamente ho creato un pulsante nascosto (forse non c'era neanche bisogno) 

    <button type="button" style="display:none;" id="eseguiTutteButton" onclick="eseguiTutteLeQuery()"></button>

    che esegue la funzione eseguituttelequery: 

    // Funzione per eseguire tutte le chiamate AJAX insieme
        function eseguiTutteLeQuery() {
            eseguiQuery("ricerca_nrpratica.php?azienda=", "risultatiricercaazienda");
            eseguiQuery("pulsantistampe.php?azienda=", "pulsanti");
        }

    che viene attivato dopo 1 secondo l'invio del form di stampa dei pdf 

    <form method="post" action="stp_contratti.php" onsubmit="setTimeout(function() { document.getElementById('eseguiTutteButton').click(); }, 1000);">

    così HO RISOLTO.

    Speravo di arrivarci in maniera pulita… MA non ci sono riuscito.

    grazie a tutti 

  • Re: Differire inclusione di una modale

    30/08/2023 - alessandro.vitale ha scritto:


    Tenete conto che questo script sta dentro una pagina (la prima) e il pulsante sta dentro un'altra pagina che popola la prima pagina.. ma alla fine dovrebbe trovarlo con l'id perchè al caricamento il pulsante anche se si trova dentro altra pagina comunque sarà dentro il DOM della prima pagina.

    Come mi capita di fare, se ho compreso bene quel che succede, quoto me stesso:

    L'unica cosa che posso dire è che bisogna stare attenti a non assegnare preventivamente via JavaScript gestori di evento (callback) a elementi della pagina che però vengono caricati solo in un secondo momento, tramite AJAX ad esempio.

    Se tu carichi elementi dinamicamente nella pagina, è in quel momento che devi agganciare l'handler dell'evento.

    Se scrivi qualcosa del tipo

        document.getElementById("loadContentButton").addEventListener("click", function() {

    e non esiste un elemento che si chiama “loadContentButton” nella pagina nel momento in cui l'istruzione viene eseguita, il click non verrà assegnato, ma questo non avverrà nemmeno in un secondo momento, ossia quando l'elemento con quell'ID verrà caricato nella pagina, a meno che non venga rieseguito questo pezzo di codice, o a meno che la gestione non avvenga in altro modo, ossia sfruttando (ad esempio) l'Event Bubbling.

    In pratica, quando esegui la addEventListener() su un elemento chiamandolo per ID, l'elemento deve trovarsi nella pagina; se non c'è l'elemento, non è possibile individuarlo e quindi agganciare la gestione dell'evento. A meno che non venga forzato in qualche modo (es. chiamando una apposita funzione di “wire up” della UI), il runtime di JavaScript non si occuperà di fare questo in automatico (non avrebbe senso e sfuggirebbe al controllo). L'alternativa è quella di agganciare l'evento a un elemento che conterrà quello dinamicamente caricato, così che si possa fissare una gestione su qualcosa che nella pagina non muta (non viene tolto né aggiunto dinamicamente) occupandosi anche di trigger che provengono da elementi caricati o creati dinamicamente al suo interno.

    Approfondisci questa tematica e vedi se è il tuo caso. :)

    Ciao!

  • Re: Differire inclusione di una modale

    Ti ricopio quello che ho scritto sopra:

    HO AGGIRATO IL PROBLEMA! 

    praticamente ho creato un pulsante nascosto (forse non c'era neanche bisogno) 

    <button type="button" style="display:none;" id="eseguiTutteButton" onclick="eseguiTutteLeQuery()"></button>

    che esegue la funzione eseguituttelequery: 

    // Funzione per eseguire tutte le chiamate AJAX insieme
        function eseguiTutteLeQuery() {
            eseguiQuery("ricerca_nrpratica.php?azienda=", "risultatiricercaazienda");
            eseguiQuery("pulsantistampe.php?azienda=", "pulsanti");
        }

    che viene attivato dopo 1 secondo l'invio del form di stampa dei pdf 

    <form method="post" action="stp_contratti.php" onsubmit="setTimeout(function() { document.getElementById('eseguiTutteButton').click(); }, 1000);">

    così HO RISOLTO.

    Speravo di arrivarci in maniera pulita… MA non ci sono riuscito.

    grazie a tutti 

  • Re: Differire inclusione di una modale

    30/08/2023 - alessandro.vitale ha scritto:


    Ti ricopio quello che ho scritto sopra: […]

    Qualunque cosa che non funziona, e invece va dopo un secondo, nasconde dietro le quinte una problematica più grave.

    Evitare di approfondire significa demandare a colui che dovrà metterci le mani un domani l'onere di risolvere la cosa, perché avrà potenziali impatti su eventuali sviluppi della funzionalità.

    Ad esempio, se ci sarà mai da aggiungere un nuovo pulsante, chissà quali effetti collaterali potrà avere su una logica implementata in questo modo.

    Comunque sia, contento tu, contenti tutti. :)

  • Re: Differire inclusione di una modale

    30/08/2023 - Alka ha scritto:


    30/08/2023 - alessandro.vitale ha scritto:


    Ti ricopio quello che ho scritto sopra: […]

    Qualunque cosa che non funziona, e invece va dopo un secondo, nasconde dietro le quinte una problematica più grave.

    Evitare di approfondire significa demandare a colui che dovrà metterci le mani un domani l'onere di risolvere la cosa, perché avrà potenziali impatti su eventuali sviluppi della funzionalità.

    Ad esempio, se ci sarà mai da aggiungere un nuovo pulsante, chissà quali effetti collaterali potrà avere su una logica implementata in questo modo.

    Comunque sia, contento tu, contenti tutti. :)

    Si ma la “cosa” non è che prima non funzionava e poi ha funzionato.. ho cambiato proprio approccio. Il codice che PRIMA NON FUNZIONAVA l'ho tolto e ho adottato quello che ho spiegato sopra… e ha funzionato subito. 

  • Re: Differire inclusione di una modale

    30/08/2023 - alessandro.vitale ha scritto:


    Il codice che PRIMA NON FUNZIONAVA l'ho tolto e ho adottato quello che ho spiegato sopra… e ha funzionato subito. 

    Il codice che “funziona subito” in realtà funziona se aspetti un secondo.

    Quell'attesa non ha senso di essere, salvo che è stata determinata sperimentalmente, cioè è come se tu scoprissi che con la luce della stanza accesa il tuo programma funziona, e quindi ti assicurassi che la luce sia sempre accesa quando il programma è in esecuzione. :)

    Quello che voglio dire è questo: le istruzioni devono avere un senso, e se il codice funziona con l'attesa di un secondo, e non c'è un apparentente motivo, significa che c'è qualcosa che non va da qualche parte, un errore nell'utilizzo delle istruzioni nella pagina, o in qualcosa che viene eseguito prima che elementi siano disponibili o scaricati.

    In breve, il codice per me è sicuramente buggato. Poi, come dicevo, se ti accontenti di questo tampone, nessun problema.
    Però domani potresti scoprire che i secondi devono passare da 1 a 5, o che a fronte di una modifica l'attesa non funziona più, e in tal caso dovrai riprendere in mano la questione, magari in emergenza perché devi fare un fix urgente o c'è qualcosa di bloccante in termini di funzionalità. Ecco che in quel momento rimpiangerai di non aver approfondito e analizzato meglio la questione, o aver scritto una soluzione più “pulita”, anche a costo di rifarla.

    Il debito tecnico, soprattutto quello di cui non si sa l'entità della risoluzione, è una mina vagante nello sviluppo software.
    Attenzione al botto… :)

    Ciao!

Devi accedere o registrarti per scrivere nel forum
22 risposte