Nano Hash - криптовалюты, майнинг, программирование

Как лучше всего вставить 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;
?>
04.11.2008

Ответы:


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

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

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

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

04.11.2008
  • вы также можете сделать $ pageData = new stdClass ();, что аналогично (object) (array ()); 06.11.2008
  • @tom, да, как ни странно, нотация (объект) несколько быстрее :). Но почему это так, я не знаю. 06.11.2008
  • 1060 тыс. Раз / сек против нечетных 819 тыс. Раз / сек. 06.11.2008
  • Это действительно важно для задачи, выполняемой один раз на запрос страницы. Обозначение: D (объект) является странным и, вероятно, не известно большинству разработчиков PHP. 20.01.2009
  • Настоящая ирония заключается в том, что я обнаружил (объектную) нотацию до нотации 'new stdClass'. 01.05.2009

  • 2

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

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

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

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

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

    04.11.2008
  • Я полностью согласен с тем, что вам не нужен механизм шаблонов, но вопрос задан о лучших практиках, и одним из наиболее важных является разделение бизнес-логики и представления. Вы можете знать о них все, но это не значит, что знает плакат. 04.11.2008
  • Я всегда пишу свои ответы таким образом, что предполагаю, что автор этого не знает и, что более важно, многие будущие читатели этого WIKI не узнают! 04.11.2008

  • 3

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

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

    04.11.2008
  • Ссылки были удалены. 02.08.2016
  • @MalusJan Спасибо, я удалил ссылки на удаленные вопросы. Но в целом (при условии, что у вас есть права на редактирование) просто продолжайте редактировать - никто не будет возражать! 05.08.2016

  • 4

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

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

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

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

    04.11.2008
  • о, серьезно, а что со стилем if: endif? исходный код Joomla 1.5 использует его повсюду, и это сводит меня с ума. Скобки просты и легки, и каждая IDE под солнцем их поймет. 04.11.2008
  • У Joomla не самый лучший код во вселенной, но альтернативный способ использования условных выражений может иногда сделать код более читабельным. 04.11.2008
  • Это хорошо только для коротких кодовых блоков. Как только он становится слишком большим, вы забываете закрыть блоки, и тогда ваша IDE не может показать вам, где вы ошиблись. { } навсегда! (Рубин понял это ОЧЕНЬ неправильно) 04.11.2008

  • 5

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

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

  • 6

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

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

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

    04.11.2008
  • ИМХО, это лучший ответ. Несмотря на это, для меня это зависит от масштабов проекта. 29.01.2015

  • 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);
    ?>
    
    04.11.2008
  • Нет нет нет! Вы не используете регулярные выражения, зачем использовать preg_replace? Вместо этого используйте str_replace, это намного быстрее. 09.06.2009

  • 8

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

    04.11.2008

    9

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

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

    02.12.2008

    10

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

    02.03.2009

    11

    НЕ ИСПОЛЬЗУЙТЕ smarty - PHP сам по себе является системой шаблонов. Рассмотрите возможность использования этого синтаксиса:

    <?php if($a):?>
    [SOME MARKUP]
    <?php else: ?>
    [SOME OTHER MARKUP]
    <? endif; ?>
    
    04.11.2008
  • Я спрашивал с теоретической точки зрения, «как это сделать». 04.11.2008
  • @tharkun: Можете ли вы опубликовать умный код, эквивалентный этому примеру? Мне было бы интересно узнать, насколько он более удобен в обслуживании и масштабируем. 04.11.2008
  • @Bobby Jack: Я хотел бы попросить кого-нибудь еще опубликовать код Smarty, потому что я не использую Smarty. 04.11.2008
  • @tharkun: Думаю, моя точка зрения была более общей, чем просто умный - можете ли вы назвать любой шаблонизатор, в котором эквивалентный шаблон был бы проще, чем приведенный выше фрагмент PHP? Я не могу, поэтому я на стороне PHP - это уже шаблонизатор, пусть он делает свою работу. Люди делают .. 04.11.2008
  • ... из того, что возможно 100% отделение макета от контента; через некоторое время все движки шаблонов станут полными по Тьюрингу :) 04.11.2008
  • Я говорю о том, что если Брайан использует свой метод в качестве общего подхода, вероятность того, что он столкнется с какой-то проблемой в какой-то момент, выше, чем при использовании подхода, который пытается разделить логику и представление! Дело не в простоте, а в ремонтопригодности, командной работе и т. д. 04.11.2008
  • Но я думаю, что его подход / разделяет / разделяет логику и точку зрения, насколько это реально может быть достигнуто. Как бы вы удалили эту логику из его примера (или эквивалентного кода smarty), но сохранили бы ее функцию? 05.11.2008
  • возможно, мы уже видим этот пример с разных точек зрения. для меня данный пример подразумевает, что у него есть один файл с управляющими структурами и разметкой. продолжением было бы добавить еще немного управляющего кода, а затем объединить некоторую разметку и получить файл, который его дизайнер не может прочитать. 05.11.2008
  • если вы возьмете его пример как шаблонную сторону уже существующего разделения, тогда, возможно, нечего будет удалять. Кстати. Я не был одним из тех, кто говорил, что нужно использовать с умом во что бы то ни стало. Я просто попытался объяснить, как разделение может работать, на легком для понимания уровне. 05.11.2008
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..