Quelle est la meilleure façon d'insérer du HTML via PHP?

En parlant d'un point de vue "meilleure pratique", Quelle est la meilleure façon d'insérer du HTML en utilisant PHP. Pour le moment, j'utilise l'une des méthodes suivantes (principalement la dernière), mais je suis curieux de savoir laquelle vous pensez être la meilleure.

<?php
  if($a){
?>
[SOME MARKUP]
<?php
  }
  else{
?>
[SOME OTHER MARKUP]
<?php
  }
?>

Opposé à:

<?php
  unset($out);
  if($a) $out = '[SOME MARKUP]';
  else $out = '[OTHER MARKUP]';
  print $out;
?>
26
demandé sur Ken 2008-11-04 12:31:17

11 réponses

Si vous allez faire les choses de cette façon, vous voulez séparer votre logique et votre design, Vrai.

Mais vous n'avez pas besoin D'utiliser Smarty pour le faire.

La priorité concerne l'état d'esprit. J'ai vu des gens faire des choses choquantes dans Smarty, et il finit par se transformer en personnes développant des sites dans Smarty, puis une étincelle brillante décidera qu'ils doivent écrire un moteur de modèle dans Smarty (ne sous-estimez jamais le potentiel d'une idée stupide).

Si vous cassez votre code en deux pièces et vous forcer à adhérer à une norme, alors vous obtiendrez de meilleures performances.

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

Mise en page.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

PHP a été écrit comme un moteur de template, donc vous devriez au moins essayer de l'utiliser pour sa tâche conçue avant d'évaluer si vous devez ou non vous plonger dans Smarty.


De plus, si vous décidez d'utiliser un moteur de template, essayez d'en obtenir un qui échappe au HTML par default et vous "opt out" au lieu de " opt dans."Vous vous épargnerez beaucoup de maux de tête XSS. Smarty est faible à cet égard, et à cause de cela, il y a beaucoup de modèles naïfs de contenu écrits dedans.

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

Est généralement la façon dont les modèles Smarty vont. Le problème est $dangerous_value peut être HTML arbitraire et cela conduit juste à même plus mauvaises pratiques de codage avec du code spaghetti intraçable partout.

Toute langue de modèle que vous considérez devrait répondre à cette préoccupation. par exemple:

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

Ce de manière, vos portes potentielles pour l'exploitation sont facilement discernables dans le modèle, par opposition à la porte à l'exploitation étant le comportement par défaut.

25
répondu Kent Fredric 2012-08-15 17:24:03

-1 pour l'hystérique typique ‘utilisez [mon système de template préféré] à la place!’ post. Chaque post PHP, même si la réponse PHP native est un one-liner, dégénère toujours en cela, tout comme chaque question JavaScript one-liner finit par être remplie de ' utiliser [mon framework préféré] à la place!’. C'est gênant.

Sérieusement, nous connaissons la séparation de la logique métier et des problèmes de présentation. Vous pouvez le faire-ou Pas dans n'importe quel système de Template, que ce soit PHP, Smarty ou quelque chose de complètement différent. Aucun système de modèle ne sépare magiquement vos préoccupations sans un tas de réflexion.

(en fait, un système de template trop restrictif peut vous obliger à écrire du code auxiliaire purement présentationnel, encombrant votre logique métier avec des préoccupations de présentation. Ce n'est pas une victoire!)

Pour répondre à la question qui a été posée, le premier exemple est OK, mais très difficile à lire en raison de la mauvaise indentation. Voir l'exemple de monzee pour une manière plus lisible; vous pouvez utiliser la notation : ou {}s, selon votre préférence, mais l'important pour la lisibilité est de garder votre HTML et PHP comme une seule hiérarchie en retrait "bien formée".

Et un plaidoyer final: rappelez-vous htmlspecialchars (). Chaque fois que texte brut doit aller dans une page web, ce doit, ou c'est XSS sur le sol. Je sais que cette question n'est pas directement liée à cela, mais chaque fois que nous publions un exemple de code, y compris ou un équivalent framework sans l'évasion, nous encourageons la poursuite de la zone de catastrophe de sécurité que la plupart des applications PHP sont devenues.

14
répondu bobince 2008-11-04 11:40:02

La considération la plus importante est de garder la logique séparée de la présentation - le couplage sans présentation rendra les modifications futures à la fois beaucoup plus simples.

Vous pourriez même envisager d'utiliser une sorte de système de template comme smarty.

7
répondu Ken 2016-08-05 10:37:28

Pour un cas très simple comme celui - ci, il est bon d'utiliser PHP comme modèle. Cependant, si vous allez au-delà de la logique simple (et vous le ferez probablement), c'est une bonne idée d'utiliser des moteurs de modèles.

Dans Zend Framework, qui utilise des scripts de vue PHP par défaut, la méthode recommandée pour le faire serait la suivante:

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

La syntaxe plus verbeuse rend beaucoup plus facile de faire correspondre les blocs conditionnels en un coup d'œil que d'utiliser des accolades.

4
répondu monzee 2008-11-04 09:58:24

Il est préférable de séparer complètement votre logique (code PHP) de la présentation (HTML), en utilisant un moteur de modèle.

Il est rapide et facile d'insérer PHP dans HTML, mais il devient très rapide et très difficile à maintenir. Il est un très rapide et très sale approche...

Quant à savoir lequel de tous les moteurs de modèles disponibles en PHP est le meilleur, voir ces questions par exemple:

2
répondu Treb 2017-05-23 12:25:10

Ni. Utilisez Smarty . En séparant votre logique interne de la logique d'Affichage, vous construirez un code beaucoup plus simple à maintenir. (Ne prenez pas le chemin de L'ancien système de modèles de PHPLib qui a essayé de séparer complètement PHP et HTML-il nécessite que la logique d'affichage soit mêlée à votre logique métier principale et est très désordonnée.) Si vous devez absolument générer des extraits HTML dans votre code PHP, utilisez votre 2ème méthode, mais passez la variable à Smarty.

1
répondu Jeremy Weathers 2008-11-04 09:37:28

Si un moteur de modèle semble beaucoup de tracas, vous pouvez créer le moteur de modèle de votre propre pauvre homme. Cet exemple devrait certainement être amélioré et ne convient pas à toutes les tâches, mais pour les sites plus petits pourrait convenir. Juste pour vous avoir une idée:

Modèle.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);
?>
1
répondu neu242 2008-11-04 09:57:57

Smarty est ok, si vous n'utilisez pas de framework ou si vous utilisez un framework qui n'a pas son propre système de template.

Sinon, la plupart des frameworks PHP et des CMS de la jeune génération ont leur propre système de template.

En général, l'idée d'un système de Template est d'avoir des fichiers qui contiennent presque uniquement du HTML (View/Template File) et des fichiers qui ne contiennent que des données ou des logiques métier (Model ou Controller Files).

Un fichier modèle peut ressembler à ceci (exemple de 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>

Vous pouvez voir qu'il n'y a que quelques éléments de code non HTML insérés dans les endroits où les données seront insérées avant que la page ne soit envoyée au client.

Votre code peut alors (simplifié) plutôt ressembler à quelque chose comme:

<?php
  unset($out);
  if($a) $out = '[SOME CONTENT TO INSERT INTO THE TEMPLATE]';
  else $out = '[SOME ALTERNATIVE CONTENT]';
  templateInsert($out);
?>

La grande chose à ce sujet: votre code HTML peut être vu comme tel et changé en tant que tel, votre concepteur peut en donner un sens et n'a pas à regarder à travers votre code en essayant de rassembler les morceaux de différents endroits sans aucune chance de voir ce qu'elle fait. Vous, d'autre part, pouvez apporter des changements dans la logique sans vous soucier de la façon dont il va regarder sur la page. Vous ferez probablement moins d'erreurs car votre code sera compact et donc lisible.

1
répondu markus 2008-11-04 10:05:47

Quelque chose que j'aurais aimé savoir quand j'ai commencé à faire PHP: Gardez votre code de programme lourd aussi loin de votre sortie HTML que possible. De cette façon, ils restent tous les deux en gros morceaux assez contigus et lisibles.

La meilleure façon que j'ai trouvée de le faire est de créer un fichier HTML statique d'abord , peut-être avec de fausses données pour que je puisse fouiller et bien concevoir, puis écrire du code PHP pour obtenir la partie dynamique de la sortie et les coller ensemble (comment vous faites cette partie est à vous - vous pouvez le faire avec Smarty comme d'autres le suggèrent).

1
répondu 2008-12-02 00:56:44

Si vous devez le faire de toute façon, utilisez les accolades. Ne faites pas écho au HTML avec PHP.

1
répondu PartialOrder 2009-03-02 18:18:45

Ne pas utiliser smarty-PHP est un système de Template en soi. Pensez à utiliser cette syntaxe:

<?php if($a):?>
[SOME MARKUP]
<?php else: ?>
[SOME OTHER MARKUP]
<? endif; ?>
0
répondu adnam 2008-11-04 10:13:59