Каков наилучший способ вставки HTML через PHP?
-
06-07-2019 - |
Вопрос
Говоря с точки зрения «лучшей практики», какой, по вашему мнению, лучший способ вставки 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 "{$Title}" 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; ?>