Question Comment bien indenter un code mixte PHP / HTML? [fermé]


En mélangeant PHP et HTML, quel est le style d'indentation à utiliser? Dois-je indenter le code HTML généré pour que l'indentation soit correcte ou pour que le mixage PHP / HTML soit correctement formaté (et donc plus facile à lire)?

Par exemple, disons que j'ai un foreach boucle de sortie des lignes de la table. Lequel ci-dessous est correct?

PHP / HTML mix semble correct:

<table>
  <?php foreach ($rows as $row): ?>
    <tr>
      <?php if ($row->foo()): ?>
        <?php echo $row ?>
      <?php else: ?>
        Something else
      <?php endif ?>
    </tr>
  <?php endforeach ?>
</table>

Le HTML généré est correct:

<table>
<?php foreach ($rows as $row): ?>
  <tr>
  <?php if ($row->foo()): ?>
    <?php echo $row ?>
  <?php else: ?>
    Something else
  <?php endif ?>
  </tr>
<?php endforeach ?>
</table>

J'ai constaté que lorsque je suis confronté à cette situation (assez fréquemment), je n'ai pas de style standard à utiliser. Je sais qu’il n’ya peut-être pas de réponse «correcte», mais j’aimerais entendre les pensées des autres développeurs.


60
2017-07-20 20:30


origine


Réponses:


Le PHP et le HTML devraient chacun être mis en retrait afin qu’ils soient corrects par rapport à eux-mêmes sous la forme source, indépendamment les uns des autres et de la forme sortie:

<table>
<?php foreach ($rows as $row): ?>
    <tr>
    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>
        Something else
    <?php endif ?>
    </tr>
<?php endforeach ?>
</table>

46
2017-07-20 20:33



J'ai souvent réfléchi à cette question, mais je me suis alors rendu compte, à quoi ressemble la sortie HTML? Vos utilisateurs ne devraient de toute façon pas regarder votre code HTML. C'est pour TOI à lire, et peut-être quelques autres développeurs. Garder le la source code aussi propre que possible et oubliez à quoi ressemble la sortie.

Si vous avez besoin de déboguer la sortie, utilisez les outils de développement Chrome, Firebug ou même F12 Tools.


10
2017-07-21 05:31



Je mets généralement ouverture balises php au début de la ligne, mais indentez tout ce qui est à l'intérieur des balises pour correspondre au formatage HTML. Je ne le fais pas, cependant, pour les simples déclarations d'écho, car j'utilise des balises à ouverture courte. Je pense que cela simplifie la navigation dans le fichier pour trouver toutes les déclarations.

    <table>
<?  foreach ($foo as $bar): ?>
      <tr>
<?    foreach ($bar as $baz): ?>

         <td><?=$baz?></td>

<?    endforeach ?>
      </tr>
<?  endforeach ?>
    </table>

8
2017-07-20 20:38



  1. Réponse directe à votre question: Si vous avez besoin de lire souvent la sortie HTML, cela peut être une bonne chose de produire du HTML bien en retrait. Mais le cas le plus courant est que vous devez lire votre code source PHP, il est donc plus important que la source soit facilement lisible.
  2. Alternative aux deux options que vous avez mentionnées: Voir le chaos'  ou tj111 répondre.
  3. Mieux encore à mon avis: Ne mélangez pas HTML et PHP, utilisez plutôt un moteur de template.

4
2017-07-20 20:40



Vous pouvez toujours utiliser un peu d'espace pour améliorer la lisibilité. S'appuyant sur l'indentation du chaos:

<table>

<?php foreach ($rows as $row): ?>

    <tr>

    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>

        Something else

    <?php endif ?>

    </tr>

    <?php endforeach ?>

</table

Le seul inconvénient est que si vous avez beaucoup de code mixte peut rendre votre document deux fois plus long, ce qui rend plus de défilement. Bien que si vous avez ce code très mixte, vous voudrez peut-être envisager un moteur de modélisation.


2
2017-07-20 20:41



Vous ne devriez pas vous soucier de l'indentation de balisage dans l'environnement de production. Vous ne devez pas non plus utiliser Tidy ou d’autres purificateurs HTML. Il existe des cas d'utilisation valides, par ex. lorsque vous autorisez l'entrée HTML (mais envisagez d'utiliser Réduction à la place), bien que ce soit rare.

La plupart du temps, les filtres HTML sont utilisés pour masquer les problèmes sous-jacents avec le code. Ne pas Corrigez votre balisage manuellement.

Si vous devez indenter votre code uniquement dans l'environnement de développement, vous pouvez utiliser l'un des deux ci-dessus. Cependant, attention, ces bibliothèques tenteront de réparer votre balisage (leur objectif premier étant que l'indentation soit un sous-produit). J'ai écrit l'outil d'indentation basé sur l'expression régulière Dindent.

Dindent convertira le balisage comme ceci:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
    <div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <div><table border="1" style="background-color: red;"><tr><td>A cell    test!</td>
<td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr> <td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr>
        <td><input><input><input></td></tr><tr><td>Cell</td><td>Cell</td><td>Ce
            ll</td></tr></table></td></tr><tr><td>Test <span>Ce       ll</span></td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div>
</body>
</html>

Pour ça:

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
        <div>
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
            <div>
                <table border="1" style="background-color: red;">
                    <tr>
                        <td>A cell test!</td>
                        <td colspan="2" rowspan="2">
                            <table border="1" style="background-color: green;">
                                <tr>
                                    <td>Cell</td>
                                    <td colspan="2" rowspan="2"></td>
                                </tr>
                                <tr>
                                    <td>
                                        <input>
                                        <input>
                                        <input>
                                    </td>
                                </tr>
                                <tr>
                                    <td>Cell</td>
                                    <td>Cell</td>
                                    <td>Ce ll</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td>Test <span>Ce ll</span></td>
                    </tr>
                    <tr>
                        <td>Cell</td>
                        <td>Cell</td>
                        <td>Cell</td>
                    </tr>
                </table>
            </div>
        </div>
    </body>
</html>

Dindent ne tentera pas de nettoyer ou d’interférer de quelque manière que ce soit avec votre code au-delà de l’indentation. C'est pour faciliter votre développement / débogage. Pas pour la production.


2
2018-02-19 22:23