Jaki jest najlepszy sposób wstawiania HTML przez PHP?

Mówiąc z punktu widzenia "najlepszych praktyk", co według ciebie jest najlepszym sposobem wstawiania HTML za pomocą PHP. Na razie używam jednej z poniższych metod (głównie tej drugiej), ale jestem ciekaw, która według ciebie jest najlepsza.

<?php
  if($a){
?>
[SOME MARKUP]
<?php
  }
  else{
?>
[SOME OTHER MARKUP]
<?php
  }
?>

Przeciw:

<?php
  unset($out);
  if($a) $out = '[SOME MARKUP]';
  else $out = '[OTHER MARKUP]';
  print $out;
?>
Author: Ken, 2008-11-04

11 answers

Jeśli zamierzasz robić rzeczy w ten sposób, chcesz oddzielić swoją logikę od projektu, prawda.

Ale nie musisz używać Smarty do tego.

Priorytetem jest sposób myślenia. Widziałem, jak ludzie robią szokujące rzeczy w Smarty, a to w końcu zamienia się w ludzi rozwijających strony w Smarty, a potem jakaś jasna Iskra zdecyduje, że muszą napisać silnik szablonu w Smarty (nigdy nie lekceważ potencjału głupiego pomysłu).

Jeśli złamiesz swój kod na dwa części i zmusić się do przestrzegania standardu, a następnie otrzymasz znacznie lepszą wydajność.

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

Układ.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

PHP został napisany jako silnik szablonów, więc powinieneś przynajmniej spróbować użyć go do zaprojektowanego zadania, zanim ocenisz, czy musisz zagłębić się w Smarty.


Ponadto, jeśli zdecydujesz się użyć silnika szablonów, spróbuj uzyskać taki, który ucieka HTML przez default i "opt out" zamiast " opt do środka."Zaoszczędzisz sobie wielu bólów głowy XSS. Smarty jest pod tym względem słaby, a z tego powodu napisano w nim wiele naiwnych treści szablonów.

{if $cond}
    {$dangerous_value}
{else}
    {$equally_dangerous_value}
{/if}

To ogólnie jak działają Szablony Smarty. Problem polega na tym, że $dangerous_value może być dowolnym HTML, a to po prostu prowadzi do nawet więcej złych praktyk kodowania z niemożliwym do wyśledzenia kodem spaghetti wszędzie.

Każdy język szablonów, który uważasz za , powinien zaspokoić ten problem. np.:

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}

To sposób, twoje potencjalne drzwi do wyzysku są łatwo dostrzegalne w szablonie, w przeciwieństwie do drzwi do wyzysku, które są domyślnym zachowaniem .

 25
Author: Kent Fredric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-15 17:24:03

-1 dla typowego "użyj" [mój ulubiony system szablonów] zamiast!"posts. Każdy post PHP, nawet jeśli natywna odpowiedź PHP jest jednoliniowa, zawsze degeneruje się do tego, tak jak każde jednoliniowe pytanie JavaScript kończy się pełnym " użyj [mój ulubiony framework] zamiast!’. To żenujące.

Poważnie, my wiemy o oddzielaniu logiki biznesowej od problemów związanych z prezentacją. Możesz to zrobić-lub NIE - w dowolnym systemie szablonów, czy to PHP, Smarty czy coś zupełnie innego. Żaden system szablonów w magiczny sposób nie oddziela Twoich obaw bez odrobiny myślenia.

(w rzeczywistości system szablonów, który jest zbyt restrykcyjny, może skończyć się koniecznością napisania kodu pomocniczego, który jest czysto prezentacyjny, zaśmiecając Twoją logikę biznesową problemami prezentacyjnymi. To nie jest wygrana!)

Aby odpowiedzieć na pytanie, które zostało zadane, pierwszy przykład jest OK, ale bardzo trudny do odczytania z powodu złego wcięcia. Zobacz przykład monzee aby uzyskać bardziej czytelny sposób, możesz użyć : notation lub {} S, w zależności od tego, co wolisz, ale ważną rzeczą dla czytelności jest utrzymanie HTML i PHP jako jednej, 'dobrze uformowanej' hierarchii wcięć.

I ostatnia Prośba: remember htmlspecialchars (). Za każdym razem, gdy zwykły tekst musi wejść na stronę internetową, ten musi być użyty, albo będzie to XSS na całej podłodze. Wiem, że to pytanie nie jest bezpośrednio związane z tym, ale za każdym razem, gdy publikujemy przykładowy kod, w tym lub a odpowiednik framework bez uciekania, zachęcamy do kontynuowania obszaru katastrof bezpieczeństwa, jakim stała się większość aplikacji PHP.

 14
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 11:40:02

Najważniejszą kwestią jest oddzielenie logiki od prezentacji - mniej sprzężenia sprawi, że przyszłe zmiany w obu będą znacznie prostsze.

Możesz nawet rozważyć użycie jakiegoś systemu szablonów, takiego jak smarty .

 7
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 10:37:28

W bardzo prostym przypadku jak ten, dobrze jest użyć PHP jako szablonu. Jeśli jednak wykraczasz poza prostą logikę (i najprawdopodobniej będziesz), dobrym pomysłem jest użycie silników szablonów.

W Zend Framework, który domyślnie używa skryptów widoku PHP, zalecanym sposobem na to jest:

<?php if ($a) : ?>
    [MARKUP HERE]
<?php else : ?>
    [SOME MORE MARKUP]
<?php endif ?>

Bardziej wyrazista składnia sprawia, że łatwiej dopasować bloki warunkowe na pierwszy rzut oka niż używać szelek.

 4
Author: monzee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 09:58:24

Lepiej jest całkowicie oddzielić swoją logikę (kod PHP) od prezentacji (HTML), używając silnika szablonów.

Jest to szybkie i łatwe do wstawienia PHP do HTML, ale robi się bałagan bardzo szybko i jest bardzo trudne do utrzymania. Jest to Bardzo szybkie i Bardzo brudne podejście...

Jeśli chodzi o to, który ze wszystkich silników szablonów dostępnych w PHP jest lepszy, zobacz te pytania na przykład:

 2
Author: Treb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:10

Żadne. Użyj Smarty . Oddzielając wewnętrzną logikę od logiki wyświetlania, zbudujesz kod, który jest znacznie prostszy w utrzymaniu. (Nie podążaj ścieżką starego systemu szablonów PHPLib, który próbował całkowicie oddzielić PHP od HTML - wymaga to, aby logika wyświetlania była mieszana z podstawową logiką biznesową i jest bardzo niechlujna.) Jeśli koniecznie musisz wygenerować fragmenty HTML w kodzie PHP, użyj drugiej metody, ale przekaż zmienną do Smarty.

 1
Author: Jeremy Weathers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 09:37:28

Jeśli silnik szablonów wydaje się kłopotliwy, możesz stworzyć własny silnik szablonów biednego człowieka. Przykład ten należy zdecydowanie poprawić i nie nadaje się do wszystkich zadań, ale dla mniejszych miejsc może być odpowiedni. Po prostu wpadnij na pomysł:

Szablon.inc:

<html><head><title>%title%</title></head><body>
%mainbody%
Bla bla bla <a href="%linkurl%">%linkname%</a>.
</body></html>

Indeks.php:

<?php
$title = getTitle();
$mainbody = getMainBody();
$linkurl = getLinkUrl();
$linkname = getLinkName();
$search = array("/%title%/", "/%mainbody%/", "/%linkurl%/", "/%linkname%/");
$replace = array($title, $mainbody, $linkurl, $linkname);
$template = file_get_contents("template.inc");
print preg_replace($search, $replace, $template);
?>
 1
Author: neu242,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 09:57:57

Smarty jest w porządku, jeśli nie używasz frameworka lub jeśli używasz frameworka, który nie ma własnego systemu szablonów.

W przeciwnym razie większość frameworków PHP i CMS młodszej generacji ma własny system szablonów.

Ogólnie ideą systemu szablonów jest posiadanie plików zawierających prawie tylko HTML (plik widoku/szablonu) i plików zawierających tylko dane lub logikę biznesową (pliki modelu lub kontrolera).

Plik szablonu może wyglądać mniej więcej tak (przykład z SilverStripe):

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <% base_tag %>
        $MetaTags
        <link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" />
    </head>
    <body>
        <div id="Main">
            <ul id="Menu1">
                <% control Menu(1) %>
                <li class="$LinkingMode">
                    <a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a>
                </li>
                <% end_control %>
            </ul>
            <div id="Header">
                <h1>$Title</h1>
            </div>
            <div id="ContentContainer">
                $Layout
            </div>
            <div id="Footer">
                <span>Some Text</span>
            </div>
        </div>
     </body>
</html>

Widać, że w miejscach, w których dane zostaną wstawione przed wysłaniem strony do klienta, wstawionych jest tylko kilka elementów kodu innych niż HTML.

Twój kod może wtedy (uproszczony) wyglądać mniej więcej tak:

<?php
  unset($out);
  if($a) $out = '[SOME CONTENT TO INSERT INTO THE TEMPLATE]';
  else $out = '[SOME ALTERNATIVE CONTENT]';
  templateInsert($out);
?>

Świetna rzecz w tym: Twój HTML może być postrzegany jako taki i zmieniany jako taki, Twój projektant może to zrozumieć i nie musi przeglądać kodu, próbując zebrać kawałki i kawałki z różnych miejsca bez możliwości obejrzenia tego, co robi. Z drugiej strony możesz wprowadzać zmiany w logice bez obaw o to, jak będzie wyglądać na stronie. Prawdopodobnie popełnisz również mniej błędów, ponieważ twój kod będzie zwarty i czytelny.

 1
Author: markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 10:05:47

Coś, co chciałbym wiedzieć, kiedy po raz pierwszy zacząłem robić PHP: Trzymaj swój ciężki kod programu tak daleko od wyjścia HTML, jak to możliwe. W ten sposób oba pozostają w dużych, dość przylegających do siebie, czytelnych fragmentach.

Najlepszym sposobem, jaki znalazłem, jest utworzenie statycznego pliku HTML najpierw , może z fałszywymi danymi, żebym mógł poszperać i uzyskać poprawny projekt, a następnie napisać kod PHP, aby uzyskać dynamiczną część wyjścia i skleić je razem (jak zrobić tę część to zależy od ciebie - możesz to zrobić z Smarty jak inni sugerują).

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-02 00:56:44

Jeśli Musisz zrobić to tak czy inaczej, użyj kręconych szelek. Nie echo HTML z PHP.

 1
Author: PartialOrder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-02 18:18:45

Nie używaj smarty - PHP jest systemem szablonów sam w sobie. Rozważ użycie tej składni:

<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>
 0
Author: adnam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 10:13:59