Вопрос

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

Решение

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

Но вам не нужно использовать 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 по по умолчанию , и вы " opt out " вместо " opt in. " Вы избавите себя от многих головных болей XSS. Smarty слаб в этом отношении, и из-за этого в нем много контент-на & # 239; ве шаблонов, написанных на нем.

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

шаблон.inc:

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

индекс.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);
?>

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

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

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

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

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

<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top