Каков наилучший способ вставки 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; ?> с <?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 по умолчанию, и вы «откажитесь» вместо «выбрать». Вы сэкономите много головных болей 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}}} 

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

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

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

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

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

И окончательная мольба: помните htmlspecialchars (). Каждый раз, когда обычный текст нужно заходить на веб-страницу, это должно использоваться, или это XSS по всему полу. Я знаю, что этот вопрос напрямую не связан с этим, но каждый раз, когда мы отправляем пример кода, включая <? 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, лучше, см. Эти вопросы, например:

  • Шаблоны PHP – с PHP
  • Безопасные PHP-шаблоны

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

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

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

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