Каков наилучший способ вставить HTML через PHP? - PullRequest
26 голосов
/ 04 ноября 2008

Говоря с точки зрения «лучшей практики», что, по вашему мнению, является лучшим способом вставить HTML с помощью PHP. На данный момент я использую один из следующих методов (в основном последний), но мне любопытно узнать, какой из них вы считаете лучшим.

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

В противоположность:

<?php
  unset($out);
  if($a) $out = '[SOME MARKUP]';
  else $out = '[OTHER MARKUP]';
  print $out;
?>

Ответы [ 11 ]

25 голосов
/ 04 ноября 2008

Если вы собираетесь делать вещи таким образом, вы хотите отделить свою логику и дизайн, правда.

Но вам не нужно использовать Smarty для этого.

Приоритет - это мышление. Я видел, как люди делают шокирующие вещи в Smarty, и в конечном итоге он превращается в людей, разрабатывающих сайты в Smarty, и тогда какая-то яркая искра решит, что им нужно написать шаблонизатор в Smarty (Никогда не стоит недооценивать потенциал глупая идея).

Если вы разобьете свой код на две части и заставите себя придерживаться стандарта, тогда вы получите гораздо лучшую производительность.

PageLogic.php

<?php 

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

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

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

Layout.php

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

PHP был написан как движок шаблонов, так что вы по крайней мере должны попробовать использовать его для своей заданной задачи, прежде чем оценивать, стоит ли вам углубляться в Smarty.


Более того, если вы решите использовать шаблонизатор, попробуйте получить тот, который экранирует HTML по по умолчанию , и вы «отказываетесь» вместо «отказаться». Вы избавите себя от многих головных болей XSS. Smarty слаб в этом отношении, и поэтому в нем написано много шаблонов, не содержащих контента.

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

Обычно так идут шаблоны Smarty. Проблема в том, что $ опасных_значений может быть произвольным HTML, и это просто приводит к еще более плохим практикам кодирования с неразборчивым спагетти-кодом повсюду.

Любой язык шаблонов, который вы считаете , должен удовлетворить эту проблему. например:

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

Таким образом, ваши потенциальные дверные проемы для эксплуатации легко различимы в шаблоне, в отличие от дверного проема для эксплуатации, представляющего собой поведение DEFAULT .

14 голосов
/ 04 ноября 2008

-1 для типичных истеричных сообщений «используйте вместо меня [мою любимую систему шаблонов]!». Каждый пост PHP, даже если нативный ответ PHP является однострочным, всегда вырождается в это так же, как и каждый однострочный вопрос JavaScript в конечном итоге полон «используйте [мой любимый фреймворк] вместо этого!». Это неловко.

Серьезно, мы знаем о разделении бизнес-логики и задач презентации. Вы можете сделать это - или , а не сделать это - в любой системе шаблонов, будь то PHP, Smarty или что-то совершенно другое. Никакая система шаблонов волшебным образом не разделяет ваши проблемы, не задумываясь.

(На самом деле система шаблонов, которая слишком ограничена, может в конечном итоге привести к необходимости написания вспомогательного кода, который является чисто презентационным, загромождая вашу бизнес-логику проблемами представления. Это не победа!)

Чтобы ответить на заданный вопрос, первый пример в порядке, но его очень трудно прочитать из-за неправильного отступа. Смотрите пример Монзи для более удобного чтения; вы можете использовать: нотацию или {} s, в зависимости от того, что вы предпочитаете, но для удобства чтения важно сохранить ваши HTML и PHP в виде единой «правильно сформированной» иерархии с отступами.

И последняя просьба: вспомните htmlspecialchars (). Каждый раз, когда на веб-страницу нужно вводить простой текст, необходимо использовать или XSS по всему полу. Я знаю, что этот вопрос не имеет к этому никакого отношения, но каждый раз, когда мы публикуем пример кода, включающий <? Php echo ($ title)?> Или эквивалентный фреймворк, без экранирования, мы поощряем продолжение области аварийной безопасности большинство приложений PHP стали.

7 голосов
/ 04 ноября 2008

Самое важное соображение - держать логику отдельно от представления - меньшее сцепление сделает будущие изменения обоих гораздо более прямыми.

Возможно, вы даже захотите использовать какую-то систему шаблонов, такую ​​как smarty .

4 голосов
/ 04 ноября 2008

Для очень простого случая, подобного этому, можно использовать PHP в качестве шаблона. Однако, если вы выходите за рамки простой логики (и вы, скорее всего, так и сделаете), рекомендуется использовать шаблонизаторы.

В Zend Framework, который по умолчанию использует PHP-скрипты, рекомендуемый способ сделать это будет выглядеть так:

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

Более подробный синтаксис значительно упрощает сопоставление условных блоков, чем использование фигурных скобок.

2 голосов
/ 04 ноября 2008

Лучше полностью отделить вашу логику (код PHP) от представления (HTML), используя механизм шаблонов.

Вставить PHP в HTML быстро и легко, но он очень запутан и очень сложен в обслуживании. Это очень быстрый и очень грязный подход ...

Что касается того, какой из шаблонизаторов, доступных в PHP, лучше, посмотрите эти вопросы, например:

1 голос
/ 02 марта 2009

Если вы должны сделать это, используйте фигурные скобки. Не выводите HTML с PHP.

1 голос
/ 02 декабря 2008

Что-то, что мне хотелось бы знать, когда я впервые начал заниматься PHP: держите свой тяжелый программный код как можно дальше от вывода HTML. Таким образом, они оба остаются большими, довольно смежными, читаемыми кусками.

Лучший способ сделать это - создать статический HTML-файл сначала , возможно, с какими-то фальшивыми данными, чтобы я мог поэкспериментировать с дизайном, а затем написать PHP-код динамическая часть вывода и склейте их вместе (то, как вы делаете эту часть, зависит от вас - вы можете сделать это с помощью Smarty, как предлагают другие).

1 голос
/ 04 ноября 2008

Smarty в порядке, если вы не используете фреймворк или когда вы используете фреймворк, у которого нет собственной системы шаблонов.

В противном случае большинство PHP-фреймворков и CMS молодого поколения имеют свою собственную систему шаблонов.

В целом идея шаблонной системы состоит в том, чтобы иметь файлы, которые содержат почти только HTML (файл представления / шаблона), и файлы, которые содержат только данные или бизнес-логику (файлы модели или контроллера).

Файл шаблона может выглядеть примерно так (пример из 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>

Вы можете видеть, что в местах, в которые будут вставлены данные перед отправкой страницы клиенту, вставлено всего несколько фрагментов кода, отличных от HTML.

Ваш код может (упрощенно) выглядеть примерно так:

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

Самое замечательное в этом: ваш HTML может рассматриваться как таковой и изменяться как таковой, ваш дизайнер может понять это, и ему не нужно просматривать ваш код, пытаясь собрать кусочки из разных мест без есть шанс посмотреть, что она делает. Вы, с другой стороны, можете вносить изменения в логику, не беспокоясь о том, как она будет выглядеть на странице. Скорее всего, вы также будете делать меньше ошибок, потому что ваш код будет компактным и легко читаемым.

1 голос
/ 04 ноября 2008

Если движок шаблонов доставляет много хлопот, вы можете создать собственный движок шаблонов для своего бедняка. Этот пример обязательно должен быть улучшен и подходит не для всех задач, но для небольших сайтов может подойти. Просто чтобы дать вам представление:

template.inc:

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

index.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 голос
/ 04 ноября 2008

Ни. Используйте Smarty . Отделив внутреннюю логику от логики отображения, вы создадите код, который будет намного проще поддерживать. (Не идите по пути старой системы шаблонов PHPLib, которая пыталась полностью разделить PHP и HTML - она ​​требует, чтобы логика отображения смешивалась с вашей основной бизнес-логикой, и это очень грязно.) Если вам абсолютно необходимо генерировать фрагменты HTML в своем коде PHP , используйте ваш второй метод, но передайте переменную в Smarty.

...