A volte abbiamo bisogno di dividere il modulo in diverse parti (pagine), elaborarle separatamente e poi assemblarle in un unico risultato.
Questo articolo descrive metodi e design pattern per farlo.
Nota:
Il problema di dividere un modulo in più passi è molto complesso, specialmente se si vuole farlo bene. Ho incontrato molti approcci nel corso della mia vita, di cui parlerò qui. Alcuni approcci sembrano attraenti, ma sono ingenui e funzionano solo in casi specifici. Per ogni approccio, descrivo quando ha senso e quali approcci non hanno senso.
Di solito l'obiettivo è quello di ottenere i dati di base dal primo modulo sulla prima pagina, convalidarli, poi salvarli "da qualche parte" e visualizzare la pagina successiva.
Quando l'utente arriva all'ultima pagina, l'intero modulo deve essere inviato e gli input elaborati.
Ad ogni passo, è importante convalidare sempre accuratamente tutti i dati e permettere all'utente di saltare indietro attraverso le pagine a piacimento in modo che possa correggere i dati quando incontra un errore. Inoltre, se il modulo deve essere reso condizionatamente in base ai dati già ottenuti, questo è un processo molto impegnativo.
Possiamo implementare noi stessi i singoli moduli in puro HTML e poi gestire l'elaborazione in PHP, oppure usare soluzioni già pronte come Nette forms.
Esempio dalla vita:
Molto spesso, i programmatori alle prime armi mi mandano un'email e fanno domande apparentemente semplici per le quali c'è una soluzione già pronta. Per esempio, specificamente sull'elaborazione dei moduli in PHP.
Raccomando sempre di saltare del tutto l'elaborazione manuale e di usare invece una soluzione già pronta. In realtà, è molto complicato implementare correttamente, per esempio, la convalida dell'email inserita e che 2 password in 2 campi corrispondano, mentre vogliamo reindirizzare l'utente al modulo precompilato secondo i suoi dati e con messaggi di errore in caso di errore.
Perché la gente non sa di non sapere di non sapere e così invece di investire 1 ora di tempo per imparare una soluzione già pronta per il 99,99% dei problemi, preferisce scegliere la propria soluzione, che passa decine di ore a fare il debug, e ci sono ancora casi in cui i moduli non funzionano, lanciano errori, hanno vulnerabilità di sicurezza e non proteggono i dati inseriti.
Quindi l'obiettivo di questo passo è quello di implementare diverse pagine a diversi URL che conterranno moduli vuoti.
Raccomando di implementare ogni modulo indipendentemente dagli altri (atomicamente) e di gestire il passaggio di stato su un diverso livello di applicazione. La ragione è che ogni modulo in pratica gestirà la validazione dei dati in modo diverso, scriverà i suoi output in modo diverso, gestirà gli errori in modo diverso, e probabilmente vorremo estenderlo o cambiarlo nel tempo, quindi non abbiamo bisogno di conoscere il contesto dell'intero processo e cambiare decine di siti per farlo.
Quando si elabora il primo modulo, vogliamo prima convalidare i dati ricevuti e se sono corretti, poi reindirizzare l'utente al secondo passo. È una buona idea gestire il reindirizzamento come un reindirizzamento HTTP, perché può facilmente accadere che i dati non siano validi, nel qual caso vogliamo riportare l'utente al primo modulo e non al passo successivo.
Possiamo fondamentalmente memorizzare gli stati in 4 modi:
Non consigliato:
Raccomandato:
Nessuna di queste soluzioni è perfetta o l'unica corretta. Io stesso combino più approcci quando lavoro su soluzioni a più fasi. Tipicamente, per esempio, risolvo un carrello della spesa come una tabella di database, alla quale assegno i dati che ho già raccolto e la lego o a un utente (se è loggato) o a una sessione (se non è loggato e non ci conosciamo ancora).
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | it