Каков наилучший способ вставки HTML через PHP?

Говоря с точки зрения "лучшей практики", как вы думаете, лучший способ вставить 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;
?>

Ответ 1

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

Но вам не нужно использовать 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. Проблема в том, что $danger_value может быть произвольным HTML, и это просто приводит к еще более более плохой практике кодирования с непревзойденным кодом спагетти везде.

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

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

Таким образом, ваши потенциальные дверные проемы для эксплуатации легко различимы в шаблоне, в отличие от дверного проема для эксплуатации, это поведение ПО УМОЛЧАНИЮ.

Ответ 2

-1 для типичного истерического 'использования [моя любимая система шаблонов] вместо этого! сообщения. Каждый пост PHP, даже если собственный PHP-ответ является однострочным, всегда дегенерирует в этом, так же как и каждый однострочный JavaScript-запрос заканчивается "use [my favorite framework]]! Это смущает.

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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);
?>

Ответ 8

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

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

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

Файл шаблона может выглядеть примерно так (пример 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 можно рассматривать как таковой и изменить как таковой, ваш дизайнер может понять это и не должен просматривать ваш код, пытаясь собрать биты и куски из разных мест без любой шанс посмотреть, что она делает. Вы, с другой стороны, можете вносить изменения в логику, не заботясь о том, как она будет выглядеть на странице. Вероятно, вы также будете делать меньше ошибок, потому что ваш код будет компактным и удобным для чтения.

Ответ 9

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

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

Ответ 10

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

Ответ 11

НЕ использовать smarty - PHP - это система шаблонов сама по себе. Используйте этот синтаксис:

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