2010-05-08 8 views
7
<? 
if($id == 2) { 
?> 
     html goes here 
<? 
} 
else { 
?> 
     if id is not 2 then something goes here 
<? 
} 
?> 

Wie kann ich php + html in einer Datei schöner schreiben, ohne Smarty zu lernen?Wie schreibe ich PHP + HTML in eine Datei schöner?

+0

Schönheit ist in der ... es ist nicht wirklich wichtig. Wenn Sie mit Designern arbeiten, mögen sie vielleicht kurze Tags. – bschaeffer

Antwort

23

können Sie PHP's alternative syntax for control structures verwenden:

<? if ($id == 2): ?> 
    <h2>some html</h2> 
<? else: ?> 
    <h2>another html chunk</h2> 
<? endif ?> 

Beachten Sie, dass short_open_tags eine php.ini-Richtlinie ist, die explizit aktiviert werden muss, sonst würden Sie <?php jedes Mal schreiben.

+1

Ich benutze immer auch diesen Stil. Sieht sauber aus, macht es sehr einfach, Code-Abschnitte zu verschieben, und es ist viel einfacher zu verstehen, was vor sich geht. Wenn du ein endif oder endwhile siehst, sagst du mehr Widerstand gegen eine Reihe von} geschweiften Klammern. Übrigens, vergessen Sie nicht das Semikolon nach z. endif; Wenn Sie mehr Code hinzufügen müssen: . – Alec

-2

By using this - PHP-Echo. Wenn es das ist, was Sie wollen, dann ist es vielleicht lesbarer, mit dem fortzufahren, was Sie tun, wenn Sie große Mengen an HTML ausgeben.

-2
<?php 

if($id == 2) { 
    //echo all your html stuff 
    echo "<title>Title is where id is 2</title>"; 
    echo "<h1>Hellow</h1>"; 

} 
else { 

    echo "<title>Title is where id isn't 2</title>"; 

} 

?> 
+0

Echo html ??? Wer hat diese Antwort hochgeladen? Ich kann nicht wundern, was passiert, wenn ein Designer die Hände darauf legt ... und es ist eine schlechte Praxis sowieso. – Strae

+0

@DaNieL Ich weiß, es ist keine gute Idee, alle HTML-Inhalte zu wiederholen. Wenn man bedenkt, dass Donator ein Anfänger ist (ich nehme an), muss man nicht direkt mit MVC, EOH usw. anfangen. Dies ist eine einfache Möglichkeit, eine HTML-Anweisung zu wiederholen. – ggfan

+0

sicherlich ein voller MVC-Muster ist ein bisschen kompliziert für einen Neuling (äh .. und für mich auch;), aber ich denke, dass ein guter Rat ist, andere Lösungen zu finden, klein und schnell zu implementieren, um sein Ziel zu erreichen, aber ohne scheitern in anderen Punkt .. – Strae

1

Ich mag und verwende soulmerge 's Methode. Aber verlassen andere mehr:

<?php 

if ($id == 2) 
echo <<< END 
    <h2>some html</h2> 
END; 
else 
echo <<< END 
    <h2>another html chunk</h2> 
END; 

?> 
0

Man könnte es so machen ...

<? 
$html_1 = <<<EOH 
my html goes here 
EOH; 

$html_2 = <<<EOH 
my html <i>something else</i> html goes here 
EOH; 

echo ($id==2?$html_1:$html_2); 
?> 

Buuut, wenn Sie es leichter machen wollen für Ihre Designer, verwenden Sie einfach externe Dateien:

<? 
$html=($id==2 ? file_get_contents("html_1.html") : file_get_contents("html_2.html")); 
$html=str_replace("%php generated content%", 1 + 1, $html); 
echo $html; 
?> 

und verwenden Sie Ihre vordefinierten Schlüsselwörter, um PHP berechneten Inhalt einfügen (wie % php generierten Inhalt% in diesem Beispiel durch 2 (1 + 1) ersetzt werden)

+0

Der ursprüngliche Beitrag erwähnt nichts über das Teilen von Code mit Designern, es sagt nur über "Schönheit" davon aus. –

2

Ich empfehle HEREDOC für einige HTML-Code.

So:

<?php 
if($id==2) 
echo <<<EOT 
Blah 
EOT; 
else 
echo <<<EOT 
Your id is <b>{$id}</b> 
EOT; 
?> 

Sie können aber auch einen Ansatz versuchen, wo Sie zwei Dateien: eine PHP-Datei und eine phtml Datei. Die PHP-Datei ist die Hauptlogik, dann ist die PHP-Datei die HTML-Ausgabe.

wie in Ihrem Beispiel

// logic.php file 
if($id==2) 
$sOutput = 'Yes'; 
else 
$sOutput = 'No'; 
// somewhere at the end of the file 
include 'logic.phtml'; 

// logic.phtml 
<html> 
<title><?=$sOutput?></title> 
<body> 
Blah blah blah <?=$sOutput?> you can login 
</body> 
</html> 
+0

Hinzugefügt Hinweis: Wenn Sie mit Designern arbeiten, bevorzugen sie vielleicht eine sauberere phtml-Datei, weil es nicht eine ganze Menge PHP gibt, die in den Weg kommen. – Daniel

+1

vorsichtig, kurze Tags werden in php6 veraltet sein – Strae

+1

Ich persönlich denke HTML in heredocs ist hässlich –

0

Ich persönlich mag es nicht, kurz-Tags, wie ich sie im Widerspruch zwischen Dateien finden und lieber ein Verfahren kleben.

<? if($id == 2) { ?> 

     <p>html goes here</p> 

<? } else  { ?> 

     <span>if id is not 2 then something goes here</span> 

<? }     ?> 

Ein bisschen einfacher als einige der anderen Antworten, sondern auch die Art und Weise würde ich finden die meisten lesbar: Sie können es sofort wie so ein bisschen besser lesbar mit einigen einfachen Änderungen aussehen. Es geht wirklich um Ihre eigene Vorliebe, obwohl viele andere gute Methoden vorgeschlagen worden sind (so würde ich es tun).

+0

Möglicherweise ein bisschen zu viel unnötiger Speicherplatz dort, aber ich finde es besser, Tags auszurichten. Ich bin so wählerisch. – Jack

+1

nur als Randnotiz: ' Strae

+0

Ich wusste das aber bemerkte es nicht in meiner Antwort, haha! Danke, dass du es aufgezeigt hast. – Jack

5

Sie können die MVC (Model, View, Controler) implementieren Entwurfsmuster, kann Ihr Code als modele verwendet werden, um die Ansicht zu laden:

<?php 
if($id == 2) 
{ 
//somes variable and array controls 
} 
else 
{ 
//somes variable and array controls 
} 
//include the view 
include('view.php'); 
?> 

Im view.php, zeigen Sie die HTML-Seite mit nur den Echos für PHP-Variablen und Array.

+2

Die Verwendung des MVC-Modells bedeutet nicht, dass es keine einfache Logik in der Ansicht geben kann. Wenn Sie ein Array vom Controller zum View senden, benötigen Sie z. foreach(), um die Variablen des Arrays anzuzeigen. An diesem Punkt sind Sie wieder bei der ursprünglichen Frage. – Alec

+0

Es gibt kein Problem dafür, ich lade Sie ein, diesen Thread über MVC-Implementierung zu sehen, wo ich einen Kommentar http://stackoverflow.com/questions/2333093/how-to-implement-mvc-from-scratch-in-php/2799399 # 2799399 –

2

Wie viele andere vorgeschlagen, könnten Sie die MVC verwenden, oder wenn Sie nicht möchten, eine strenge MVC-Struktur zu implementieren, sollten Sie auf jeden Fall ein Templating-System verwenden.

Dies bedeutet nicht, dass Sie Smarty lernen müssen, können Sie Ihr eigenes Template-System mit nur der Funktion schreiben, die Sie tatsächlich benötigen.

Wenn Sie mit Designern arbeiten und Leistung ist nicht Ihr erster Punkt, können Sie eine HTML-Datei mit einfachen Platzhaltern erstellen, wo die dynamischen Inhalte gehen müssen, und ersetzen sie dann mit PHP (str_replace, preg_replace) .. aber dies wird verlangsamen Sie Ihre Anwendung.

Beispiel:

//html template 
// the @[var] syntax is just as an example 
<title>@[title]</title> 
<body> 
    @[content] 
</body> 

und Ihre Templat-Datei:

$title = 'Hello world'; 
if($id == 2){ 
    $content = get_content(); 
}else{ 
    $content = get_another_content(); 
} 
//really, this is just as example ;) 
ob_start(); 
include('template.html'); 
$output = ob_get_clean(); 
echo str_replace(
    array('@[title]', '@[content]'), 
    array($title, $content), 
    $output 
); 

Das ist wirklich ein einfaches Beispiel, und hat zwei Probleme:

  1. Aufführung;
  2. Designer müssen angewiesen werden, die Platzhalter NICHT zu berühren.

    //html template 
    <title><?php echo $title; ?></title> 
    <body> 
        <?php echo $content; ?> 
    </body> 
    

    und php:

kann eine einfachere Lösung sein

$title = 'Hello world'; 
if($id == 2){ 
    $content = get_content(); 
}else{ 
    $content = get_another_content(); 
} 
include('template.php'); 

Aber Echo html sollte wie möglich reduziert werden, keine gute Praxis ist es logisch mischen mit Inhalt Logic is logic, data is data, and life is good

0

Hinzufügen zu DaNieL's Antwort, könnten Sie etwas wie tun:

function htmlVars($html, $vars){ 
    $html = preg_replace_callback('/@\[([0-9a-zA-Z_\$]*)\]/',function ($matches) use ($vars){ 
    return isset($vars[$matches[1]])?$vars[$matches[1]]:""; 
},$html); 
return $html; 
} 

Beispiel:

echo htmlVars('foo is @[foo] and bar is not @[bar]', 
    Array('foo'=>'foo','bar'=>'barz')); 

Ergebnis:

foo is foo and bar is not barz 

Anonyme Funktionen arbeiten nur für PHP 5.3 oder höher

4

Für eine bessere Zukunft möglich (Design) Wartbarkeit, würde ich schlagen Sie so etwas vor:

<?php 
if ($id == 2){ 
$someText = 'I like your id!'; 
}else{ 
$someText = 'I love your id!'; 
} 
?> 
<html> 
...complex html... 
<p><?php echo $someText ?></p> <!-- or <?= $someText ?> --> 
...complex html... 
</html> 
0

Es gibt zwei Fälle wirklich:

1) Vorlagencode. Ich würde soulmerges Ansatz der alternativen Syntax für Kontrollstrukturen empfehlen.

2) Kurzer, View-Helper-PHP-Code, der die Ausgabe generiert (normalerweise für die spätere Ersetzung), die nicht notwendigerweise eine eigene Untervorlage verdient.

für 2 ziehe ich es so etwas wie:

public function draw(){ 
    $html = array(); 
    foreach($this->item as $item){ 
     $html[] = <<<EOD 
<li class="{$item->class()}">{$item->label()}</li> 
EOD; 
    } 
    return implode($html); 
} 

Ich ziehe diese über jede Art von wonky Alternative, die ob_start() und ?> <?php Blöcke beinhalten könnten. Sie möchten immer, dass Ihre Funktionen Zeichenfolgen und nicht direkt die Ausgabe von Echos zurückgeben, so dass die Aufrufer die Möglichkeit haben, Ergebnisse zu verketten und anderweitig zu manipulieren, ohne die Last der Ausgabepufferung auf den Aufgerufenen zu übertragen.

Das Heredoc macht es einfach, String-Ausgabe zu identifizieren, und obwohl ich denke, das Brechen der Einrückung ist eine Art hässlich, es am Ende ist sehr effektiv, wie Ihre HTML-Ausgabe wie kleine Haftnotizen abhebt. Das und die Tatsache, dass es in meiner IDE (PDT) gut grün hervorgehoben wird. (Nicht hier in der SO-Textmarker gesehen ...) so ist es immer explizit genau, welche Art von "Modus" ich bin.

Im Gegensatz dazu macht die ?> <?php Technik macht es schwierig, HTML von PHP-Code zu unterscheiden. Sobald Sie es ein paar Mal tun, wird es ärgerlich zu verfolgen, ob Sie eine ?> oder eine <?php benötigen. Schließlich ist es oft ausführlicher, Auswechslungen mit <?php echo $obj->func() ?> vs {$obj->func()}

zu tun Wenn Ihr Code komplexer wird, dann könnte es Zeit für Refactoring sein. Ich mag heredoc, denn wenn ich etwas ad-hoc mache, wird es hervorstechen und in ein paar Monaten ganz offensichtlich werden (ad-hoc tendiert dazu, zu einem Schlammball zu degenerieren, wenn man Anforderungen hinzufügt), wenn ich es getan habe habe 40 Zeilen von hredoc, die als 5 gestartet haben könnten. Wenn ich zurückkomme und meinen Code betrachte und die nicht vollständig ad-hoc-Version entwickle, ist es viel einfacher, die Teile der Datei zu identifizieren, in denen ich schlecht war. Dies geht zurück auf die Haftnotizen, grün hervorgehobener Kommentar, den ich auch über den Einzug gemacht habe.

Verwandte Themen