2009-11-25 16 views
7

Ich lerne viel darüber, wie MVC-Frameworks arbeiten, indem Sie sich umschauen und bestehende studieren. Es scheint, dass jedes Framework, das ich sehe, ein Layout hat, in dem jede Methode in jedem Controller eine eigene Template-Datei hat. Also wird es eine Login-Vorlage, eine Logout-Vorlage, Registrierung, usw. geben.Erstellen von HTML-Vorlagen mit PHP

Meine Frage ist, wie und warum würden Sie eine Vorlage für die gesamte Seite alle innerhalb einer Datei erstellen. Angenommen, Sie möchten das Anmeldeformular auf mehr als einer Seite anzeigen. Müssten Sie nicht das Anmeldeformular für jede Vorlage erstellen, auf der es angezeigt werden soll? Steht das nicht gegen die Regel nicht wiederholen (DRY)?

Die Art, wie ich bisher Dinge gemacht habe, ist, dass ich kleine Chunks von Templates erstellt und sie dann kombiniert habe, um jede Seite zu erstellen. Anstatt also so etwas wie dies zu tun,

$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> 

Ich habe das getan,

$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> 

Wie alle Tage würde Ich mag nur die richtige Art und Weise kennen, es zu tun, zusammen mit, wie und warum. ..Es scheint nur gegen die DRY-Regel zu gehen.

Dank

Antwort

1

Ein Wort: Organisation. Wenn Sie jeden Teil der Seite trennen, können Sie jede Seite einzeln anzeigen/bearbeiten. Dieses einfache Konzept ist sehr vorteilhaft. Zum Beispiel kann jeder im Team, der mit dem Login-Prozess umgehen möchte, leicht herausfinden, dass er login_form.phtml bearbeiten muss, und sie können sicher sein, dass die Bearbeitung von login_form.phtml weniger wahrscheinlich unbeabsichtigt andere Funktionen beeinträchtigt.

Als die beste Praxis, hier ist, wie ich es mache (nicht genau aber ähnlich).

$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:

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> 

Lassen Sie mich noch einmal daran erinnern, dass dies nicht das ist genau das, was ich tun (was ich OOP verwenden), um diese als nicht gerade laufen kann, und Sie können es bearbeiten müssen.

3

Sie sollten die Begriffe 'layouts' Check-out und 'view helpers'. Während ich mit der Zend Framework-Version dieser Konzepte verlinkt habe, sollten andere MVC-Frameworks (und das MVC-Konzept) sie ebenfalls haben.

Die Grundidee ist, dass Ihre Seite "Ansicht" - zum Beispiel das Login-Formular - in Ihrer Website "Layout" enthalten ist - die allgemeine Vorlage, die auf Ihrer Website verwendet wird. Wenn Sie einen anderen Controller mit einer anderen Ansicht, z. B. einem Benutzerprofil, anfordern, ist diese Ansicht ebenfalls im selben Layout enthalten.

Um so etwas wie ein Login-Formular auf allen Seiten einzubinden, kann ein View-Helfer verwendet werden. Dieser Ansichts-Helper könnte den aktuellen Benutzer anzeigen oder ein Login-Formular anzeigen, abhängig vom Login-Status. View-Helfer können im Layout enthalten sein oder durch den spezifischen Controller eingeschlossen sein (solange das MVC-Framework irgendeine Art von benannten Rendersegmenten erlaubt).

Die zweistufige "include" -Methode funktioniert besser als lineare Einfügung von Teilen (einschließlich Header, dann Inhalt, dann Fußzeile - was Sie jetzt tun), weil Ihre Vorlagen HTML-Tags nicht teilen müssen. Der Zend Guide hat eine good visual example Ansichtsvorlagen in einem Layout.

0

Für dieses Projekt arbeite ich, alle Ansichten sind XSL-Vorlagen. Anstatt Variablen an die Ansicht zu übergeben, erzeuge ich das gesamte XML im Controller und transformiere es mit der Ansicht.

Ich mag diese Struktur, weil ich alle meine Vorlagen in einer Datei behalten kann, und arrangiere sie trotzdem ich will. Es ist auch eine Standard-Template-Sprache, die sehr flexibel ist und jede Menge Dokumentation enthält. Das hat bisher sehr gut geklappt.

Ein wirklich gutes Beispiel für diese Struktur ist die WoW Armory Website (siehe die Quelle).

1

Die gängigste Methode HTML Templating mit PHP zu tun, ist eine dieser beliebten Templating Engines zu verwenden:


Alternativ können Sie nur Platzhalter in Ihren HTML setzen, die so etwas wie <% variablename %> aussehen. Laden Sie einfach Ihren HTML-Code, suchen Sie in einer Regex nach allen Platzhaltern und ersetzen Sie sie durch die entsprechenden Variablen.


Alternativ können Sie Ihre HTML laden, analysieren sie als DOM document und dann DOM ändern. Ich habe die Bibliothek DOM Query erstellt, um dies mit einer jQuery-ähnlichen Syntax zu tun, aber Sie könnten auch vanilla PHP oder eine von mehreren anderen Bibliotheken verwenden.


Alternativ können Sie HTML-Vorlagen im Frontend mit JavaScript erstellen. Wenn Sie HTML-Vorlagen sowohl im Frontend als auch im Backend erstellen möchten, sollten Sie die Verwendung von Mustache in Betracht ziehen, da Mustache-Vorlagen sowohl im Frontend (mit JavaScript) als auch im Backend (mit PHP) verwendet werden können.

Verwandte Themen