Differire inclusione di una modale

di il
22 risposte

Differire inclusione di una modale

Buonasera,

ho una modale che viene inclusa AHIME al caricamento della pagina “padre" e mostrata al click del pulsante INVIO EMAIL:


	<?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">INVIO EMAIL</button>';
		} else {
			// Messaggio di avviso se non ci sono risultati
			echo '<p></p>';
		}
	?>

<!-- Include la modale -->
<?php include 'email_modal.php';?> 

nella pagina “padre” arrivo già con alcuni file pdf generati precedentemente con altra pagina . Nella pagina “padre” però ho altri due pulsanti che mi generano altri pdf. quindi come vedrete dal codice della modale, i file generati prima vengono caricati correttamente, mentre i file generati DOPO l'apertura della pagina “padre” e quindi dopo l'incvlusione della modale ovviamente NON vengono considerati se non dopo che faccio un refresh della pagina…perdendo quindi i dati della pagina “padre”. 

Ecco il codice della modale: 

<!-- Modal -->

<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">
				<form id="emailForm" 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 = '++++PERCORSO DEI FILE++++' . $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 = '++++PERCORSO DEI FILE++++' . $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 = '++++PERCORSO DEI FILE++++' . $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 = '++++PERCORSO DEI FILE++++' . $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>
					<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>

Quindi mi capita che i file DISPOSIZIONI e COMPENSAZIONE E SCONTO siccome generati prima di atterrare nella pagina “padre” vengono mostrati, mentre i file dentro la cartella TEG e quelli dentro la cartella CONTRATTI  no perchè vengono generati dentro la pagina “padre” che alla sua apertura ha incluso la modale prima di generare questi ultimi due file.

Quale soluzione mi consigliate per far si che all'apertura della modale vengano inclusi anche quelli generati dopo la prima inclusione? 

Grazie

22 Risposte

  • Re: Differire inclusione di una modale

    Tra “padre”, inclusioni, prima e dopo, io non ho capito assolutamente nulla.

    Credo convenga una descrizione generale dell'obiettivo per chiarire qual è la soluzione che si sta cercando di realizzare.
    Poi occorre spiegare qual è il desiderio dal punto di vista funzionale e cosa va/non va rispetto a quella implementata.

  • Re: Differire inclusione di una modale

    Ok scusa, 

    in parole molto povere e andando al succo del discorso voglio evitare che l'include della modale avvenga al caricamento della pagina “padre” (intesa come pagina dove ho inserito l'include). voglio quindi condizionare l'include al click del pulsante INVIO EMAIL. 

    Questo perchè? Perchè nella modale ho del codice che mi scansiona una directory. Ma i file in questa diretory ci saranno SOLO dopo che ho generato dei pdf nella pagina PRINCIPALE. Quindi quando si caricherà la pagina principale con l'include questi file ancora non esistono… e di conseguenza non verranno visti nella modale. Se invece genero i pdf e poi faccio un banale F5 della pagina PRINCIPALE (o padre) allora siccome ora i file pdf esistono li vedrò nella modale. 

    In sostanza apro pagina principale (e mi include la modale senza farmela vedere perchè poi la visualizzo con il click al pulsante invio email) genero i pdf nella pagina principale e clicco su invio email e non mi RIESEGUE la scansione della directory perchè l'aveva eseguita in precedenza all'apertura della pagina principale. Se la eseguisse SOLO dopo il click del pulsante INVIO EMAIL avrei risiolto il problema. 

    spero di non essere stato confusionario. 

  • Re: Differire inclusione di una modale

    Secondo me, la questione si può affrontare in diversi modi.

    Credo che una cosa assodata sia il fatto che un “include” non può essere regolato con alcun “if”, ma è fisso.

    Detto questo, le soluzioni possono essere

    • includere la dialog ogni volta, ma fare in modo che lo script PHP della dialog tenga conto di variabili che consentano di determinare se questa deve essere mostrata oppure no;
    • includere la dialog in modo fisso, e spostare nella logica JavaScript la verifica delle condizioni che danno luogo alla sua visualizzazione; nel caso la dialog debba avere un contenuto dinamico, si potrebbe introdurre uno script che carichi via AJAX la parte di interfaccia che implementa la dialog in grado di mostrare le informazioni richieste, salvando i dati necessari in sessione o passandoli come parametri alla chiamata stessa.

    Diciamo che ciascuna delle strade possibili presuppone conoscenze e una adeguata analisi e architettura adeguata, a seconda di quanto si vuole rendere riutilizzabile.

  • Re: Differire inclusione di una modale

    E se utilizzassi un approccio del tipo…

    Sottopongo include ad una if legata ad una checkbox 

    Inizialmente la check é su false, appena clicco sul pulsante la check diventa true e soddisfo la condizione della if con include!

    É fattibile?  

  • Re: Differire inclusione di una modale

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


    Sottopongo include ad una if legata ad una checkbox […]

    Cito me stesso… :)

    Credo che una cosa assodata sia il fatto che un “include” non può essere regolato con alcun “if”, ma è fisso.

    Tuttavia, può essere che io mi confonda con il processo di inclusione usato tipicamente in altri linguaggi che sono non dinamici.

    Per sciogliere ogni dubbio, guarda la documentazione relativa.

    Diciamo che, conoscendo altre strade, non è quella che sceglierei io, ma se è più semplice implementarla…..

  • Re: Differire inclusione di una modale

    29/08/2023 - Alka ha scritto:


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


    Sottopongo include ad una if legata ad una checkbox […]

    Cito me stesso… :)

    Credo che una cosa assodata sia il fatto che un “include” non può essere regolato con alcun “if”, ma è fisso.

    Tuttavia, può essere che io mi confonda con il processo di inclusione usato tipicamente in altri linguaggi che sono non dinamici.

    Per sciogliere ogni dubbio, guarda la documentazione relativa.

    Diciamo che, conoscendo altre strade, non è quella che sceglierei io, ma se è più semplice implementarla…..

    Hai ragione, una volta che carico la pagina principale e poi soddisfo la if, la include non me la INCLUDE perché la condizione é che sia caricata e inclusa dall'inizio altrimenti NON CARICA

     .

    PROVERÓ CON javascript e ajax.

  • Re: Differire inclusione di una modale

    Devo creare un div vuoto dargli un id e popolarlo con la modale utilizzando javascript e ajax?

  • Re: Differire inclusione di una modale

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


    Devo creare un div vuoto dargli un id e popolarlo con la modale utilizzando javascript e ajax?

    Secondo me sarebbe l'ideale. La parte del modal la importi comunque, ma senza visualizzare subito la dialog, e predisponi una funzione che la mostra e scarica via AJAX la pagina, o meglio il “pezzettino” che serve, da mettere nella dialog prima di mostrarla sul momento.

    I dati li puoi conservare in memoria con JavaScript e passarli come parametri, oppure lato server nella sessione da passare nella richiesta.

  • Re: Differire inclusione di una modale

    29/08/2023 - Alka ha scritto:


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


    Devo creare un div vuoto dargli un id e popolarlo con la modale utilizzando javascript e ajax?

    Secondo me sarebbe l'ideale. La parte del modal la importi comunque, ma senza visualizzare subito la dialog, e predisponi una funzione che la mostra e scarica via AJAX la pagina, o meglio il “pezzettino” che serve, da mettere nella dialog prima di mostrarla sul momento.

    I dati li puoi conservare in memoria con JavaScript e passarli come parametri, oppure lato server nella sessione da passare nella richiesta.

    Domani provo, ti dico.. grazie

  • Re: Differire inclusione di una modale

    Ciao,

    niente non riesco proprio!!

    guarda: 

    ho una pagina chiamata teg_contratti.php che dentro ha vari div vuoti che vengono popolati. tra questi div c'è questo 

    <div class="d-flex justify-content-center" id="pulsanti"></div>

    che viene popolato tramite questo script  (insieme ad un altro div ma che non è l'oggetto del discorso)

    <script>
        // Funzione per eseguire una chiamata AJAX e aggiornare un div con i risultati
        function eseguiQuery(url, divId) {
            var aziendaValue = document.getElementById("aziendaInput").value;
            var div = document.getElementById(divId);
    
            // Rimuovi il contenuto precedente del div
            div.innerHTML = "";
    
            // Esegui la chiamata AJAX solo se è presente un valore nell'input
            if (aziendaValue.trim() !== "") {
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                        div.innerHTML = this.responseText;
                    }
                };
                xhttp.open("GET", url + encodeURIComponent(aziendaValue), true);
                xhttp.send();
            }
        }
    
        // Funzione per eseguire tutte le chiamate AJAX insieme
        function eseguiTutteLeQuery() {
            eseguiQuery("ricerca_nrpratica.php?azienda=", "risultatiricercaazienda");
            eseguiQuery("pulsantistampe.php?azienda=", "pulsanti");
        }
    
        // Esegui tutte le query al caricamento della pagina e ogni volta che l'input cambia
        document.addEventListener("DOMContentLoaded", eseguiTutteLeQuery);
        document.getElementById("aziendaInput").addEventListener("input", eseguiTutteLeQuery);
    </script>

    quindi il div in questione “pulsanti” vienen popolato tramite la pagina pulsantistampe.php . Ora non incollo tutta la pagina di pulsantistampe.php ma vi metto il pezzo di codice che non mi funziona :

    <?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="openEmailModal">INVIO EMAIL</button>';
    		} else {
    			// Messaggio di avviso se non ci sono risultati
    			echo '<p></p>';
    		}
    ?>
    
    <div id="email_modal"></div>
    <script>
    $(document).ready(function() {
        $('#openEmailModal').click(function() {
            // Esegui una chiamata AJAX per ottenere il contenuto di email_modal.php
            $.ajax({
                url: 'email_modal.php', // Sostituisci con il percorso corretto
                method: 'GET',
                success: function(response) {
                    // Popola il div con il contenuto ottenuto
                    $('#email_modal').html(response);
                },
                error: function() {
                    console.error('Errore durante il recupero del contenuto della modal.');
                }
            });
        });
    });
    </script>

    come detto ieri ho creato il div email_modal e ho scritto la funzioncina in javascript e fatto la chiamata ajax per popolare il div con la pagina email_modal.php. 

    Ma al click del bottone INVIO EMAIL  non succede nulla!!!

    Perchè?

    Il codice della modale è lo stesso incollato sopra. 

  • Re: Differire inclusione di una modale

    C'è codice troppo disordinato per capirci qualcosa, e sfuggono le dinamiche delle pagine e come sono interconnesse tra loro.

    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.

    Per dare riferimenti più precisi, qui si dovrebbe debuggare e vedere innanzitutto come viene assegnato il click al pulsante a runtime, quando l'applicazione è in funzione. Farlo da remoto in questo modo è difficile.

  • Re: Differire inclusione di una modale

    Hai ragione ma ho fatto un piccolo passo avanti. 

    nella stessa pagina del bottone ho creato questo :

    <?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 -->
                    </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");
                        },
                        error: function() {
                            alert("Si è verificato un errore durante il recupero del contenuto.");
                        }
                    });
                });
            });
        </script>

    ora al click mi apre la modale ma VUOTA!!! nel senso che il div modal-body NON VIENE popolato da nulla. infatti ho solo l'intestazione 

    Invio Documentazione per Erogazione e basta. 

    poi, per prova, ho incollato tutto il codice della modale nel modal body (popolandolo a mano) e mi apre la modale correttamente. Quindi credo ci sia un problema nella chiamata ajax. ma non riesco a capire quale. é molto semplice come costrutto 

  • Re: Differire inclusione di una modale

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


    ora al click mi apre la modale ma VUOTA!!! nel senso che il div modal-body NON VIENE popolato da nulla. infatti ho solo l'intestazione 

    Temo ci sia la chiusura di un </div> di troppo qui:

               <div class="modal-body">
    				<!-- Il contenuto dell'email sarà inserito qui tramite AJAX -->
                    </div>
                </div>

    La mancata visualizzazione può essere dovuta a un markup strutturalmente errato.

    Verifica anche cosa viene ricevuto dal server tramite i Developer Tools (tasto F12).

  • Re: Differire inclusione di una modale

    Ora sono a casae non in ufficio. Appena torno provo a verificare tutta la struttura e le chiusure

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

Devi accedere o registrarti per scrivere nel forum
22 risposte