2008-09-22 14 views
10

Ich erstelle eine Website, in der verschiedene Seiten abhängig von bestimmten Bedingungen (dh eingeloggt oder nicht, Formular ausgefüllt oder nicht, etc.) sehr unterschiedlich aussehen können. Dies macht es notwendig, verschiedene Blöcke von HTML zu verschiedenen Zeiten auszugeben.Keeping my PHP pretty

Doing, das macht jedoch meine PHP-Code entsetzlich aussehen ... es ist wirklich mit der Formatierung und "Form" des Codes. Wie soll ich das umgehen? Einschließlich benutzerdefinierten "HTML-Dump" -Funktionen am Ende meiner Skripte? Das Gleiche, aber mit beinhaltet? Heredocs (sieht nicht gut aus)?

Danke!

Antwort

25

Keine Panik, Jeder neue Web-Programmierer ist mit diesem Problem konfrontiert.

Sie müssen Ihre Programmlogik von Ihrem Display trennen. Versuchen Sie zunächst, Ihre eigene Lösung mit zwei Dateien für jede Web-Seite zu machen:

  • eine mit nur PHP-Code (kein HTML), die Variablen
  • einen anderen mit HTML und nur sehr wenige PHP füllt: Das ist Ihre Seite Design

Dann gehören, wo/wann Sie es brauchen. Beispiel:

myPageLogic.php

<?php 

// pure PHP code, no HTML 

$name = htmlspecialchars($_GET['name']); 
$age = date('Y') - htmlspecialchars($_GET['age']); 

?> 

myPageView.php

// very few php code 
// just enought to print variables 
// and some if/else, or foreach to manage the data stream 

<h1>Hello, <?php $name ?> !</h1> 

<p>So your are <?php $age?>, hu ?</p> 

(Sie können die alternative PHP syntax für diesen einen verwenden, aber versuchen Sie nicht zu hart, um es das zu machen zu perfektionieren. erstes Mal, wirklich.)

myPage.php

<?php 

require('myPageLogic.php'); 
require('myPageView.php'); 
?> 

Sorgen Sie sich nicht um Leistungsprobleme für jetzt. Dies ist nicht Ihre Priorität als Neuling. Diese Lösung ist nicht perfekt, aber hilft Ihnen, das Problem mit Ihrem Programmierniveau zu lösen und wird Ihnen die Grundlagen vermitteln.

Dann, sobald Sie mit diesem Konzept vertraut sind, kaufen Sie ein Buch über das MVC-Muster (oder suchen Sie nach Stack-Überlauf-Einträge darüber). Das, was Sie die NEXT TIME tun möchten. Dann werden Sie einige Templating-Systeme und -Frameworks ausprobieren, aber LATER. Fürs Erste, einfach programmieren und von Anfang an lernen. Du kannst ein Projekt wie dieses perfekt programmieren, als Anfänger, es ist in Ordnung.

+0

Das mache ich heute. Verarbeiten Sie die Daten in einem Skript, das entsprechende 'view'-Skript enthält. Im View-Skript gebe ich nur Variablen innerhalb von HTML zurück und verwende if-else, wenn nötig, Schleifen. – Imran

+3

Sehr, sehr guter Rat. Viel besser als nur "MVC verwenden". – da5id

+3

Ja, manchmal bereue ich, dass mir das in den ersten Jahren niemand gesagt hat. Die Leute sollten Noobs einfach etwas tun lassen, anstatt sie zu bitten, einen perfekten Start für jede neue Technologie zu machen, zu der sie kommen. –

0

In solchen Fällen schreibe ich alles schrittweise in eine Variable oder manchmal ein Array und dann die Variable/Array Echo. Es hat den zusätzlichen Vorteil, dass die Seite immer auf einmal und nicht progressiv gerendert wird.

0

Was ich in dieser Situation mache, ist das Erstellen von "Template" -Dateien von HTML-Daten, die ich einschließe, und dann mit regulären Ausdrücken analysieren. Es hält den Code sauber und erleichtert es, Teile an einen Designer oder eine andere HTML-Person zu übergeben.

prüfen bei Wikipedia die Ideale hinter MVC Programmierpraktiken aus

7

ein MVC-Ansatz verwenden.

http://www.phpmvc.net/

Das ist nicht etwas, das Sie in ein paar Stunden abholen. Du musst es wirklich üben. Die Hauptsache ist, dass der Controller auf Ihr Modell (die Db-Ebene) zugreift, Ihre Daten bearbeitet und sie dann zum Rendern an die Ansicht sendet. Dies ist stark vereinfacht, aber Sie müssen es nur lesen und üben, um es zu verstehen.

Das ist etwas, was ich verwendet habe, um mir zu helfen, es zu lernen. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

1

Von dem Klang Ihres Problems scheint es, dass Sie in Ihrem Code nicht viel Trennung zwischen Logik und Präsentation haben. Wenn Sie eine Anwendung entwerfen, ist dies eine sehr wichtige Überlegung, aus Gründen, die genau durch die Situation, der Sie gerade ausgesetzt sind, gezeigt werden.

Wenn Sie nicht bereits ich einige PHP Templating-Engines wie Smarty betrachten.

4

Versuchen Sie, Ihren Inhalt und Ihr Layout so weit wie möglich von Ihrem Code zu trennen. Jedes Mal, wenn Sie HTML in eine .php-Datei schreiben, halten Sie an und denken Sie "Gehört das wirklich hierher?"

Eine Lösung besteht darin, Vorlagen zu verwenden. Betrachten Sie das Templating-System Smarty für eine ziemlich einfach zu bedienende Option.

+0

Jede Vorlage-Engine wäre eine Lösung ohne die Gemeinkosten eines MVC-Frameworks. Smarty ist eine ausgezeichnete Wahl. – Ian

+1

Ein Templating-System (Smarty) auf einem anderen Templating-System (PHP selbst) ist im Prinzip Overhead. Ich bin alles für die Verwendung von Techniken wie XSL Transformationen (http://www.w3schools.com/xsl/) Twan – Twan

+1

Mann, ernsthaft ... XSLT ist waaaaay zu kompliziert und definitiv nicht benötigt von dem, worüber das OP sprach. Für den Anfang benötigen Sie etwas XML, um an erster Stelle zu transformieren. – nickf

0

Sie benötigen ein Framework. Dies macht nicht nur Ihren Code hübsch (wegen des bereits erwähnten Model-View-Controller-Patterns, MVC) - es spart Ihnen Zeit, weil die Komponenten bereits dafür geschrieben sind.

Ich empfehle QCodo, es ist erstaunlich; Es gibt andere - CakePHP, Symfony.

0

Wenn es ein großes Projekt ist, könnte ein Framework in Ordnung sein. Wenn nicht, erstellen Sie einige Vorlagendateien und entscheiden Sie oben auf der Seite, welche Vorlagendatei Sie einschließen möchten.

zum Beispiel

if ($_SESSION['logged_in']) 
    include(TPL_DIR . 'main_logged_in.tpl'); 
else 
    include(tPL_DIR . 'main.tpl'); 

nur ein einfaches Beispiel

0

wie oben .. Sie erwähnt das Symptom sind Befestigungs, nicht das Problem ..

Was Sie brauchen, ist die Trennung von Logik und Präsentation. Was kann mit einer Art von MVC-Framework getan werden. Selbst wenn Sie nicht den ganzen Weg mit einem MVC-Framework gehen wollen. Eine Template-Engine ist ein Muss, zumindest wenn Ihre Logik kompliziert genug ist, dass Sie Probleme damit haben, was Sie erklären.

0

empfehle ich savant statt Smarty,

  • Sie müssen keine neue Templat „Sprache“ lernen, um Vorlagen zu erstellen, Savant-Vorlagen sind in PHP geschrieben
  • , wenn Sie don‘ t wollen pHP verwenden, können Sie Ihre eigene Vorlage „Sprache“ mit einem Compiler
  • es leicht erweiterbar durch Ihre eigenen pHP-Objekte

Trennung Logik von presenta definieren Dies bedeutet nicht, dass Sie Ihre Geschäftslogik in php und Ihre Präsentationslogik in etwas anderem haben müssen, die Trennung ist eine konzeptionelle Sache, Sie müssen die Logik trennen, die die Daten von derjenigen vorbereitet, die sie zeigt. Offensichtlich muss die Geschäftslogik keine Präsentationselemente enthalten.

0

Anstatt Templating-Systeme auf einem Templating-System (PHP selbst) zu implementieren und standardmäßig Overhead zu erzeugen, können Sie eine robustere Lösung wie XSL Transformations wählen, die auch der MVC princples entspricht (vorausgesetzt, Sie trennen Ihre Daten). Retrieval, und ich teile persönlich die Logik von der Anzeige der XML mit verschiedenen Dateien).

Stellen Sie sich vor, Sie haben die folgenden Informationen in einem Array, das Sie in einer Tabelle anzeigen möchten.

Array 
{ 
    [car] => green 
    [bike] => red 
} 

Sie einfach ein Skript erstellen, das diese Informationen in XML ausgibt:

echo "<VEHICLES>\n"; 
foreach(array_keys($aVehicles) as $sVehicle) 
    echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n"; 
echo "</VEHICLES>\n"; 

in der folgenden XML Resultierende:

<VEHICLES> 
    <VEHICLE> 
    <NAME>car</NAME> 
    <COLOR>green</COLOR> 
    </VEHICLE> 
    <VEHICLE> 
    <NAME>bike</NAME> 
    <COLOR>red</COLOR> 
    </VEHICLE> 
</VEHICLES> 

Jetzt ist das alles sehr gut, aber das wird nicht Anzeige in einem schönen Format. Dies ist, wo XSLT kommt mit einigen einfachen Code, können Sie dies in eine Tabelle umwandeln kann.

<xsl:template match="VEHICLES"> 
    <TABLE> 
    <xsl:apply-templates select="VEHICLE"> 
    </TABLE> 
</xsl:template> 

<xsl:template match="VEHICLE"> 
    <TR> 
    <TD><xsl:value-of select="NAME"></TD> 
    <TD><xsl:value-of select="COLOR"></TD> 
    </TR> 
</xsl:template> 

Et voila, Sie haben:

<TABLE> 
    <TR> 
    <TD>car</TD> 
    <TD>green</TD> 
    </TR> 
    <TR> 
    <TD>bike</TD> 
    <TD>red</TD> 
    </TR> 
</TABLE> 

nun für dieses einfache Beispiel, das ist ein bisschen von Overkill; Bei komplexen Strukturen in großen Projekten ist dies jedoch ein absoluter Weg, um Ihre Skriptlogik von Ihrem Markup fernzuhalten.

+0

Verwenden Sie htmlspecialchars beim Erstellen von XML/HTML mit String-Verkettung. – troelskn

+0

Sie haben absolut Recht. Und ein CDATA-Tag ist immer auch gut. Aber ich habe diese weggelassen, da sie nur das Ziel dieses Posts verschleiern würden :) – Twan

0

prüfen diese question über PHP und HTML zu trennen, gibt es verschiedene Möglichkeiten, es zu tun, einschließlich selbst geschrieben Templating-Systeme, Templating-Systeme wie Smarty, PHP als Template-System auf seine eigene, etc etc etc ...

0

Ich denke, Sie haben hier zwei Möglichkeiten, entweder verwenden Sie ein MVC-Framework oder verwenden Sie die faule Templating-Methode, die Ihren Code erheblich überlasten würde. Offensichtlich bin ich mit der ersten, ich denke, MVC zu lernen ist einer der besten Web-Entwicklung Tricks in dem Buch.

2

Das macht jedoch, dass mein PHP-Code entsetzlich aussieht ... es verwirrt wirklich mit der Formatierung und "Form" des Codes. Wie soll ich das umgehen?

Behandeln Sie PHP und HTML als eine einzige Hierarchie mit einer einzigen konsistenten Einrückungsstruktur.Eine einschließende PHP-Struktur wie ein 'if' oder 'for' führt also zu einer neuen Ebene der Einrückung, und ihr Inhalt ist immer eine ausgewogene Menge von Start- und End-Tags. Im Wesentlichen machen Sie Ihr PHP im XML-Sinne "wohlgeformt", unabhängig davon, ob Sie tatsächlich XHTML verwenden oder nicht.

Beispiel:

<div class="prettybox"> 
    Hello <?php echo(htmlspecialchars($name)) ?>! 
    Your food: 
    <?php foreach($foods as $food) { ?> 
     <a href="/food.php?food=<?php echo(urlencode($food)) ?>"> 
      <?php echo(htmlspecialchars($food)) ?> 
     </a> 
    <?php } ?> 
    <?php if (count($foods)==0) { ?> 
     (no food today) 
    <?php } ?> 
</div> 

vorsichtig sein, der religiösen Dogma um Trennung Logik und Auszeichnungs den Kopf in den Antworten hier wieder Aufzucht. Während Sie sicherlich Ihre Geschäftslogik aus Ihrem Seitenausgabecode heraushalten wollen, bedeutet dies nicht unbedingt, dass eine Belastung durch die Verwendung separater Dateien, Klassen, Vorlagen und Frameworks für das, was Sie tun, wirklich notwendig ist. Für eine einfache Anwendung reicht es wahrscheinlich aus, den action/logic-Befehl oben in der Datei und die Seite unten auszugeben.

(zum Beispiel von einem der obigen Ausführungen, htmlspecialchars tun() ist Seite-Ausgabe Funktionen, die Sie auf jeden Fall do nicht wollen, in der Action-Bit Ihrer PHP setzen, in allen Geschäftslogik gemischt. Immer halten Sie Text als einfache, ungespannte Strings bis zu dem Punkt, wo er Ihre Anwendungslogik verlässt.Wenn Sie 'echo (htmlspecialchars (...)') immerzu zu Wort geben, können Sie immer eine Funktion mit einem kurzen Namen wie 'h machen "Das macht das gleiche."

+0

Dies ist eine interessante Möglichkeit, 'urlencode' und' htmlspecialchars' in der Vorlage/Ansicht zu verwenden. Ist das wirklich eine bessere Methode, als sich auf das Controller-/Framework-View-Objekt zu verlassen, um die Zeichen zu entschlüsseln und die Daten einfach an die View für das Echo zu übergeben? Ich persönlich benutze Letzteres. Der Controller ist verantwortlich für das Abrufen und Manipulieren der Daten. Dies ist nicht die Verantwortung der Ansichten. Es echos einfach Daten, nicht manipulieren. –

+0

Woher weiß das Framework (viel weniger der Controller), was die Ausgabeansichtsphase zu umgehen hat? Es kann nicht nur HTML-Escaping, sondern auch Templating-Werte in URLs ('urlencode' /' rawurlencode' je nach Bit) oder JavaScript-Stringliterale ('json_encode') oder ein CSS-Stringliteral oder ein pastierbares HTML-Snippet enthalten (Doppel-HTML-Codierung), oder spuckt den Inhalt in eine reine Text-E-Mail (keine Kodierung). Wenn der Controller alles in HTML vorcodiert, kann dies nicht funktionieren. Flucht in den Kontext ist absolut ein Kernanliegen der Sichtweise. – bobince