2009-11-25 21 views
7

Im imparare molto su come funzionano i framework MVC guardando e studiando quelli esistenti. Sembra che ogni framework che vedo abbia un layout in cui ogni metodo in ogni controller ha il proprio file di modello. Quindi ci sarà un modello di login, un modello di logout, un registro, così via e così via.Creazione di modelli html con PHP

La mia domanda è, come e perché dovresti creare un modello per l'intera pagina in un unico file. Diciamo che volevi mostrare il modulo di login su più di una pagina, non dovresti creare il modulo di login per ogni modello che vuoi venga visualizzato? Non va contro la regola non ripeti te stesso (ASCIUTTO)?

Il modo in cui ho fatto finora le cose è che ho creato blocchi di modelli di liitle e li ho combinati per creare ogni pagina. Così, invece di fare qualcosa di simile,

$title = 'Blah Blah Blah'; 
$user = 'Jon Miller'; 

include 'index.phtml'; 

<html> 
    <head> 
    <title><?php echo $title; ?></title> 
    </head> 
    <body> 
    <h3><?php echo $user; ?></h3> 
    <form>login form</form> 
    </body> 
</html> 

Ho fatto questo

$title = 'Blah Blah Blah'; 

include 'header.phtml'; 

$user = 'Jon Miller'; 

include 'user.phtml'; 
include 'login_form.phtml'; 
include 'footer.phtml'; 

header.phtml 
<html> 
    <head> 
    <title><?php echo $title; ?></title> 
    </head> 
    <body> 

user.phtml 
    <h3><?php echo $user; ?></h3> 

login_form.phtml 
    <form>login form</form> 

footer.phtml 
    </body> 
</html> 

Come sempre puntuale, vorrei solo sapere il modo corretto di farlo, insieme a come e perché. .. Sembra solo andare contro la regola DRY.

Grazie

risposta

1

Una parola: Organizzazione. La separazione di ciascuna parte della pagina consentirà a ciascuna di esse di essere visualizzate/modificate separatamente. Questo semplice concetto è molto utile. Ad esempio, chiunque nel team che desidera gestire il processo di accesso può facilmente capire che deve modificare login_form.phtml e può essere sicuro che la modifica di login_form.phtml avrà meno probabilità di interferire involontariamente con altre funzionalità.

Come da buona pratica, ecco come lo faccio (non esattamente ma simile).

$Title = 'Blah Blah Blah'; 
$User = 'Jon Miller'; 

$ThemeName = "MyGreenPage"; 
$Contents = array("User", "Login_Form"); 

function Include($FileName) { 
    if (file_exists($FileName)) 
     include $FileName; 
} 

MyGreenPage.phtml:

<html> 
    <head> 
    <title><?php echo $title; ?></title> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.pcss"); 
?> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.pjs"); 
?> 
    </head> 
    <body> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.phtml"); 
?> 
    </body> 
</html> 

User.pcss:

/* Some styles needed by User */ 

User.pjs:

/* Some script needed by User */ 

User.phtml:

<h3><?php echo $user; ?></h3> 

Login_Form.pcss:

/* Some styles needed by Login_Form */  

Login_Form.pjs:

/* Some script needed by Login_Form */ 

Login_Form.phtml:

<form>login form</form> 

Vi ricordo ancora una volta che questo non è che esattamente quello che faccio (quello che io faccio uso OOP), quindi questo non può esattamente eseguito come è e potrebbe essere necessario di modificarla.

3

si dovrebbe verificare i concetti di 'layouts' e 'view helpers'. Mentre sono collegato alla versione Zend Framework di questi concetti, anche altri framework MVC (e il concetto MVC) dovrebbero averli.

L'idea di base è che la "vista" della pagina, ad esempio il modulo di accesso, sia inclusa nel "layout" del sito, ovvero il modello generale utilizzato in tutto il sito. Quando si richiede un controller diverso, con una vista diversa, ad esempio un profilo utente, anche quella vista viene inclusa nello stesso layout.

Per includere qualcosa come un modulo di accesso su tutte le pagine, è possibile utilizzare un helper di visualizzazione. L'helper di visualizzazione può visualizzare l'utente corrente o visualizzare un modulo di accesso, a seconda dello stato di accesso. Gli helper di vista possono essere inclusi nel layout o inclusi dal controller specifico (purché il framework MVC consenta alcuni tipi di segmenti di rendering con nome).

Il metodo "include" in due passaggi funziona meglio dell'inclusione lineare delle parti (tra cui intestazione, contenuto e piè di pagina: cosa si sta facendo ora) perché i modelli non devono suddividere i tag HTML. La guida Zend ha un modello good visual example di viste in un layout.

0

Per questo progetto su cui sto lavorando, tutte le viste sono modelli XSL. Invece di passare variabili alla vista, genero tutto il codice XML nel controller e lo trasformo con la vista.

Mi piace questa struttura perché posso conservare tutti i miei modelli in un unico file e organizzarli comunque. È anche un linguaggio modello standard che è molto flessibile e ha un sacco di documentazione. Questo ha funzionato davvero bene finora.

Un ottimo esempio di questa struttura è il sito Web WoW Armory (visualizzare la fonte).

1

Il modo più comune per fare template HTML con PHP, è quello di utilizzare uno di questi motori di templating popolari:


In alternativa, si può semplicemente mettere i segnaposto nel codice HTML che sembrano qualcosa come <% variablename %>. Basta caricare il codice HTML, fare una regex trovare tutti i segnaposto e sostituirli con le variabili corrispondenti.


In alternativa, è possibile caricare il codice HTML, analizzare come DOM document e quindi modificare il vostro DOM. Ho creato la libreria DOM Query per essere in grado di farlo con una sintassi simile a jQuery, ma potevi usare vanilla PHP o una delle numerose altre librerie.


In alternativa, è possibile eseguire alcuni template HTML in frontend con JavaScript. Se si desidera eseguire il template HTML sia sul frontend che sul backend, si potrebbe prendere in considerazione l'utilizzo di Mustache, poiché i modelli di baffi possono essere utilizzati sia in frontend (con JavaScript) che in backend (con PHP).