2010-06-15 21 views
5

Sto programmando il mio primo vero sito Web PHP e mi sto chiedendo come rendere il mio codice più leggibile a me stesso. Il libro di riferimento che sto usando è PHP e MySQL Web Development 4th ed.Separazione di presentazione e business logic in PHP

Il libro di cui sopra dà tre approcci per la separazione logica e contenuti:

  • file include
  • funzione o classe API
  • sistema di template

io non ho scelto uno di questi eppure, mentre avvolgere il mio cervello attorno a questi concetti richiede del tempo. Tuttavia, il mio codice è diventato un ibrido tra i primi due perché sto solo copiando e incollando qui e modificando mentre procedo.

Sul lato presentazione, tutte le mie pagine hanno questi elementi comuni: intestazione, navigazione in alto, navigazione barra laterale, contenuto, barra laterale destra e piè di pagina.

Gli esempi basati sulle funzioni nel libro suggeriscono che potrei avere queste funzioni di visualizzazione che gestiscono tutti gli esempi di presentazione. Quindi, il mio codice pagina sarà simile a questo:

display_header(); 
display_navigation(); 
display_content(); 
display_footer(); 

Tuttavia, non mi piace questo perché gli esempi del libro hanno queste dichiarazioni di stampa con HTML e PHP mescolati in questo modo:

echo "<tr bgcolor=\"".$color."\"><td><a href=\"".$url."\">" ... 

Preferirei avere HTML con qualche PHP nel mezzo, non il contrario.

Sto pensando di creare le mie pagine in modo tale che all'inizio della mia pagina, recupererò tutti i dati dal database e li inserirò negli array. Riceverò anche i dati per le variabili. Se ci sono errori in uno di questi processi, li inserirò in stringhe di errore.

Quindi, nel codice HTML, effettuerò il ciclo di questi array utilizzando foreach e visualizzandone il contenuto. In alcuni casi, ci saranno alcune variabili che verranno mostrate. Se è presente una variabile di errore impostata, la visualizzerò nella posizione corretta.

(Come nota a margine: La cosa che non capisco è che nella maggior parte codice di esempio, se un po 'di query di database o roba del genere dà un errore, c'è sempre:

else echo 'Error'; 

Questo mi sconcerta, perché quando il codice di esempio restituisce un errore, a volte viene echeggiato anche prima dell'inizio dell'HTML ...)

Per le persone che hanno utilizzato ASP.NET, sono stato in qualche modo utilizzato per i file code-behind e lblError e I sto cercando di fare qualcosa di simile qui.

La cosa che non ho capito è come avrei potuto fare questa cosa "fare prima la logica, poi la presentazione" in modo che non avrei dovuto replicare per esempio la logica di navigazione e la presentazione di navigazione in tutte le pagine.

Devo fare alcuni file inclusi o potrei usare le funzioni qui, ma un po 'diversamente? Ci sono dei buoni articoli in cui questi "stili" di separazione tra presentazione e logica sono spiegati un po 'più a fondo. Il libro ho solo un paragrafo su questa roba.

Quello che sto pensando è che sto parlando di alcuni concetti o modi di programmazione PHP qui, ma non conosco ancora i termini per loro.

So che questa non è una domanda semplice, ho solo bisogno di aiuto nell'organizzare i miei pensieri.

+0

Buona cosa nessuno ha menzionato heredocs. Per qualche ragione ogni volta che c'è una domanda per separare la logica e la presentazione, qualcuno menziona heredocs e ottiene un'assurda quantità di upvotes. –

risposta

4

Mai eco fuori HTML con PHP. Invece scriverlo in linea (senza il male tag brevi) come

<tr class="<?php echo $myclass; ?>">

Altre opzioni per aiutare a separare la logica/vista sarebbe quella di utilizzare un quadro di PHP come CodeIgniter.

Vorrei abbandonare il libro e concentrarsi maggiormente sull'apprendimento delle competenze di base del PHP come funzioni, classi, ecc. Quindi avviare la riproduzione dello several popular frameworks.

Come nota a margine: La cosa che non capisco è che nella maggior parte codice di esempio , se qualche query di database o roba del genere dà un errore, c'è sempre:

Questo perché stanno visualizzando gli errori in modo errato. È necessario memorizzare gli errori in una sessione e visualizzarli sulla pagina (cancellandoli) oppure inserirli nel registro degli errori con la funzione error_log. error_log("Something happened in MyClass");

La cosa che non ho capito è come avrei potuto fare questa "logica fare prima, poi presentazione" cosa in modo che avrei non dover replicare ad esempio la logica navigazione e navigazione presentazione in tutte le pagine.

Pensare a cose in un approccio MVC. Si chiama prima il controller (logica). Capisce cosa è necessario. Se ha bisogno di dati dal database, richiama un modello e lo richiede. Quindi lo formatta, aggiunge altri dati, esegue query aggiuntive e quindi le passa alla vista.

+1

Grazie mille per l'input su errori ed eco. Ho guardato le pagine di CodeIgniter e mi piace l'idea di MVC, ma è stato un po 'troppo per me capire ancora. Ecco perché spero di trovare il modo di fare le cose con saggezza con solo PHP. –

+1

@ Markus: quindi utilizzare include nella parte superiore delle pagine. Se una pagina ha una logica (input di modulo, lavoro di database, ecc.), Prova ad incollare tutta la pagina logica e usa '$ _SESSION' insieme ai reindirizzamenti per fornire un flusso visivo. –

1

suona come un motore di template è quello che stai cercando - chiedi a google un sacco di risultati. personalmente, mi piace molto lo smarty.

(e buttare via quel libro, il suono come se fosse ... vecchio)

+0

Oh sì. Ora che guardo la mia domanda e guardo Smarty, sembra che faccia le cose nello stesso modo in cui stavo pensando. Tuttavia, mi chiedo se ho bisogno di smarty o se potessi semplicemente fare le cose in un modo "smarty". –

1

MVC (Model View Controller) sembra adatto alle proprie esigenze. Puoi leggere a riguardo di questo here.