Каков наилучший способ вставки 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;
?>
11 ответов
Если вы собираетесь делать вещи таким образом, вы хотите отделить свою логику и дизайн, правда.
Но вам не нужно использовать 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.
-1 для типичного истерического "используйте [мою любимую систему шаблонов] вместо этого!" сообщения. Каждый пост PHP, даже если нативный ответ PHP является однострочным, всегда вырождается в это, так же, как каждый однострочный вопрос JavaScript заканчивается полным "use [my favour Framework] вместо этого!". Это смущает.
Серьезно, мы знаем о разделении бизнес-логики и презентаций. Вы можете сделать это - или не делать этого - в любой системе шаблонов, будь то PHP, Smarty или что-то совершенно другое. Никакая система шаблонов волшебным образом не разделяет ваши проблемы, не задумываясь.
(На самом деле система шаблонов, которая является слишком строгой, может в конечном итоге привести к необходимости написания вспомогательного кода, который является чисто презентационным, загромождая вашу бизнес-логику проблемами представления. Это не победа!)
Чтобы ответить на заданный вопрос, первый пример в порядке, но его очень трудно прочитать из-за неправильного отступа. Смотрите пример Монзи для более удобного чтения; вы можете использовать: notation или {}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, лучше, посмотрите эти вопросы, например:
Если вы должны сделать это в любом случае, используйте фигурные скобки. Не повторяйте HTML с PHP.
Если движок шаблонов доставляет много хлопот, вы можете создать собственный движок шаблонов для бедняков. Этот пример обязательно должен быть улучшен и подходит не для всех задач, но для небольших сайтов может подойти. Просто чтобы дать вам представление:
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);
?>
Что-то, что я хотел бы знать, когда впервые начал заниматься PHP: держите тяжелый программный код как можно дальше от вывода HTML. Таким образом, они оба остаются большими, довольно смежными, читаемыми кусками.
Лучший способ, который я нашел для этого, - это сначала создать статический HTML-файл, возможно, с некоторыми поддельными данными, чтобы я мог поэкспериментировать с дизайном, а затем написать PHP-код для получения динамической части вывода и склеить их. оба вместе (как вы делаете эту часть, зависит от вас - вы могли бы сделать это с Smarty, как предлагают другие).
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 "{$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 может рассматриваться как таковой и изменяться как таковой, ваш дизайнер может понять это, и ему не нужно просматривать ваш код, пытаясь собрать кусочки из разных мест без какой-либо возможности посмотри, что она делает. Вы, с другой стороны, можете вносить изменения в логику, не беспокоясь о том, как она будет выглядеть на странице. Скорее всего, вы также будете делать меньше ошибок, потому что ваш код будет компактным и легко читаемым.
Ни. Используйте Smarty. Отделив внутреннюю логику от логики отображения, вы создадите код, который будет намного проще поддерживать. (Не идите по пути старой системы шаблонов PHPLib, которая пыталась полностью разделить PHP и HTML - она требует, чтобы логика отображения смешивалась с вашей основной бизнес-логикой, и это очень грязно.) Если вам абсолютно необходимо генерировать фрагменты HTML в своем коде PHP, используйте ваш второй метод, но передайте переменную в Smarty.
НЕ используйте smarty - PHP сам по себе является системой шаблонов. Рассмотрите возможность использования этого синтаксиса:
<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>