Comment puis-je faire écho au HTML en PHP?

122

Je souhaite générer une sortie HTML conditionnelle pour générer une page, alors quel est le moyen le plus simple de faire écho à des extraits de code HTML multilignes dans PHP 4+? Aurais-je besoin d'utiliser un framework de modèle comme Smarty?

echo '<html>', "\n"; // I'm sure there's a better way!
echo '<head>', "\n";
echo '</head>', "\n";
echo '<body>', "\n";
echo '</body>', "\n";
echo '</html>', "\n";
Le flash
la source
2
\ n ne fonctionne pas en html. Je suppose que vous vouliez dire echo "<br>";
Weishi Zeng
Une bonne pratique dit de séparer votre logique de la vue (comme dans MVC). utilisez le moteur templetig comme Twig pour séparer votre vue de la logique de script - twig.sensiolabs.org Insted d'implémenter votre balisage html dans votre script php, faites-le autrement. Implémentez des variables php dans twig temple. Dès que vous comprenez ce que je veux dire, vous verrez les avantages de cette approche. Twig résout ce genre de problèmes. Pour un petit changement de code, vous pouvez écrire votre propre extension twig que vous pouvez ensuite utiliser en quelques secondes pour effectuer des tâches compliquées mais répétitives.
DevWL

Réponses:

269

Il existe plusieurs façons de faire écho au HTML en PHP.

1. Entre les balises PHP

<?php if(condition){ ?>
     <!-- HTML here -->
<?php } ?>

2. Dans un écho

if(condition){
     echo "HTML here";
}

Avec les échos, si vous souhaitez utiliser des guillemets doubles dans votre HTML, vous devez utiliser des échos de guillemets simples comme ceci:

echo '<input type="text">';

Ou vous pouvez leur échapper comme ceci:

echo "<input type=\"text\">";

3. Heredocs

4. Nowdocs (à partir de PHP 5.3.0)

Les moteurs de modèles sont utilisés pour utiliser PHP dans des documents contenant principalement du HTML. En fait, l'objectif initial de PHP était d'être un langage de création de modèles. C'est pourquoi avec PHP, vous pouvez utiliser des choses comme des balises courtes pour faire écho à des variables (par exemple <?=$someVariable?>).

Il existe d'autres moteurs de modèles (tels que Smarty, Twig, etc.) qui rendent la syntaxe encore plus concise (par exemple {{someVariable}}).

Le principal avantage de l'utilisation d'un moteur de modèle est de séparer la conception ( logique de présentation ) du codage ( logique métier ). Cela rend également le code plus propre et plus facile à maintenir à long terme.

Si vous avez d'autres questions, n'hésitez pas à laisser un commentaire.

Des lectures complémentaires sont disponibles sur ces choses dans la documentation PHP .


REMARQUE: les balises PHP courtes <?et ?>déconseillées car elles ne sont disponibles que si elles sont activées avec la short_open_tagdirective de fichier de configuration php.ini, ou si PHP a été configuré avec l' --enable-short-tagsoption. Ils sont disponibles, quels que soient les paramètres à partir de la version 5.4 .

Chris Bier
la source
7
Le "/ * HTML ici * /" ne devrait-il pas VRAIMENT être un "<! - HTML ici ->"? ;)
Jeremy Logan
Oui, sur le premier message, vous avez raison. J'ai été pris dans le code haha. Je vous remercie.
Chris Bier
1
Merci, @Chris B. cela m'a aidé. Avec les échos, si vous souhaitez utiliser des guillemets doubles dans votre HTML, vous devez utiliser des échos de guillemets simples comme ceci: il me manquait en fait.
Ayush Mishra
1
Ce premier lien dans la réponse est maintenant supprimé :(
mcon
En fait, les seules balises courtes disponibles à partir de la version 5.4 sont les balises d'écho courtes <?=$var?>. Les balises courtes sont déconseillées comme d'habitude et doivent être supprimées ( <? doStuff() ?>).
igorsantos07
65

Essayez-le comme ceci ( syntaxe heredoc ):

$variable = <<<XYZ
<html>
<body>

</body>
</html>
XYZ;
echo $variable;
lfx
la source
8
@MhdSyrwan juste des caractères aléatoires, vous pouvez en lire plus ici php.net/manual/en
...
1
voulez-vous élaborer? Je ne vois pas les crochets PHP d'ouverture ou de fermeture, mais à la fois HTML et PHP, alors hein? - le lien fonctionne et y répond mieux, mais peut-être devrait-il être dans le texte de la réponse, pas dans les commentaires?
Julix
@Julix bien sûr, vous devez ajouter des balises PHP d' ouverture et ( dépend ) de fermeture. Il voulait juste rendre l'exemple court.
Fahmi
J? ai compris; en quelque sorte, j'ai manqué c'était la syntaxe heredocs (c'est-à-dire que tout le code est php). J'étais confus, car j'étais nouveau en PHP à l'époque et <?php $variable = "bla"; ?> <html> <body class="<?php echo $variable ?>"> </body> </html>j'avais l' habitude de voir une syntaxe comme --- Donc, je pensais qu'il manquait un tas de crochets et je ne savais pas où ils allaient exactement. C'est toujours drôle quand on répond à mes commentaires un peu plus anciens, car j'étais tellement nouveau dans tout cela à l'époque.
Julix
30

Vous pouvez utiliser la syntaxe alternative de syntaxe alternative pour les structures de contrôle et sortir de PHP:

<?php if ($something): ?>
    <some /> <tags /> <etc />
    <?=$shortButControversialWayOfPrintingAVariable ?>
    <?php /* A comment not visible in the HTML, but it is a bit of a pain to write */ ?>
<?php else: ?>
    <!-- else -->
<?php endif; ?>
Tom Haigh
la source
@Jeremy: C'est probablement la meilleure façon, la plus directe en supposant que vous ne cherchez pas quelque chose de plus ... Cherchez-vous quelque chose de plus?
Frank V
1
Oui, en particulier la possibilité d'utiliser des commentaires PHP entre le HTML, des commentaires qui ne seront pas repris.
TheFlash
15

En gros, vous pouvez placer du HTML n'importe où en dehors des balises PHP. Il est également très avantageux de faire tous vos traitements de données nécessaires avant d'afficher des données, afin de séparer la logique et la présentation.

L'affichage des données lui-même peut être au bas du même fichier PHP ou vous pouvez inclure un fichier PHP séparé composé principalement de HTML.

Je préfère ce style compact:

<?php
    /* do your processing here */
?>

<html>
<head>
    <title><?=$title?></title>
</head>
<body>
    <?php foreach ( $something as $item ) : ?>
        <p><?=$item?></p>
    <?php endforeach; ?>
</body>
</html>

Remarque: vous devrez peut-être utiliser <?php echo $var; ?>au lieu de <?=$var?>dépendre de votre configuration PHP.

Chèvre mécontente
la source
7

Je suis friand de ce style:

  <html>
    <head>
<%    if (X)
      {
%>      <title>Definitely X</title>
<%    }
      else
      {
%>      <title>Totally not X</title>
<%    }
%>  </head>
  </html>

J'utilise des balises de style ASP, oui. Le mélange de PHP et HTML semble super lisible à mes yeux. L'astuce consiste à obtenir les marqueurs <%et %>juste.

John Kugelman
la source
Les balises ASP sont-elles compatibles avec PHP 4+?
TheFlash
4
Oui mais obtenez-les pendant qu'ils durent - ils sont supprimés de PHP (je ne sais pas quelle version ... s'ils ne sont pas déjà partis)
Greg
7

Une autre approche consiste à placer le HTML dans un fichier séparé et à marquer la zone à modifier avec un espace réservé [[content]] dans ce cas. (Vous pouvez également utiliser sprintf au lieu de str_replace.)

$page = 'Hello, World!';
$content = file_get_contents('html/welcome.html');
$pagecontent = str_replace('[[content]]', $content, $page);
echo($pagecontent);

Alternativement, vous pouvez simplement afficher tous les éléments PHP sur l'écran capturé dans un tampon, écrire le HTML et remettre la sortie PHP dans la page.

Cela peut sembler étrange d'écrire le PHP, de l'attraper, puis de le réécrire, mais cela signifie que vous pouvez faire toutes sortes de choses de formatage ( heredoc , etc.), et le tester correctement sans les tracas de la page modèle qui gêne. (Le CMS Joomla le fait de cette façon, BTW.)

C'est à dire:

<?php
    ob_start();
    echo('Hello, World!');
    $php_output = ob_get_contents();
    ob_end_clean();
?>
<h1>My Template page says</h1>
<?php
    echo($php_output);
?>
<hr>
Template footer
Julz
la source
2

Utilisez simplement la fonction d' impression pour faire écho au texte dans le fichier PHP comme suit:

<?php

  print('
    <div class="wrap">

      <span class="textClass">TESTING</span>

    </div>
  ')
?>
Espion de code
la source
2
$enter_string = '<textarea style="color:#FF0000;" name="message">EXAMPLE</textarea>';

echo('Echo as HTML' . htmlspecialchars((string)$enter_string));
Ezequiel Wernicke
la source
1

En plus de la réponse de Chris B , si vous devez echoquand même l' utiliser , vous voulez toujours la garder simple et structurée et ne pas envoyer de spam avec le code<?php stuff; ?> 's, vous pouvez utiliser la syntaxe ci-dessous.

Par exemple, vous souhaitez afficher les images d'une galerie:

foreach($images as $image)
{
    echo
    '<li>',
        '<a href="', site_url(), 'images/', $image['name'], '">',
            '<img ',
                'class="image" ',
                'title="', $image['title'], '" ',
                'src="', site_url(), 'images/thumbs/', $image['filename'], '" ',
                'alt="', $image['description'], '"',
            '>',
        '</a>',
    '</li>';
}

Echo prend plusieurs paramètres, donc avec une bonne indentation, il semble plutôt bon. L'utilisation echoavec des paramètres est également plus efficace que la concaténation.

totymedli
la source
1
echo '
<html>
<body>
</body>
</html>
';

ou

echo "<html>\n<body>\n</body>\n</html>\n";
Alessandro
la source
1

Essaye ça:

<?php
    echo <<<HTML

    Your HTML tags here

HTML;
?>
edCoder
la source
0

Ne faites pas écho au HTML.

Si vous souhaitez utiliser

<?php echo "<h1>  $title; </h1>"; ?>

vous devriez faire ceci:

<h1><?= $title;?></h1>
Hmache
la source
-1

Voici comment je fais:

<?php if($contition == true){ ?>
         <input type="text" value="<?php echo $value_stored_in_php_variable; ?>" />
<?php }else{ ?>
         <p>No input here </p>
<?php } ?>
Cristi Bejan
la source