Question

Je crée un site dans lequel différentes pages peuvent avoir une apparence très différente selon certaines conditions (par exemple, connecté ou non, formulaire rempli ou non, etc.). Cela rend nécessaire la sortie de différents blocs de HTML à des moments différents.

Faire cela, cependant, donne à mon code php une apparence horrible ... ça gâche vraiment le formatage et la forme. du code. Comment devrais-je contourner cela? Incluant la personnalisation " html dump " fonctionne au bas de mes scripts? La même chose, mais avec comprend? Heredocs (ne semble pas trop beau)?

Merci!

Était-ce utile?

La solution

Ne paniquez pas, chaque nouveau programmeur Web est confronté à ce problème.

Vous DEVEZ séparer la logique de votre programme de votre affichage. Commencez par créer votre propre solution en utilisant deux fichiers pour chaque page Web:

  • un avec uniquement du code PHP (pas de HTML) qui remplit les variables
  • une autre avec HTML et très peu de PHP: ceci est votre conception de page

Indiquez ensuite où et quand vous en avez besoin. E.G:

myPageLogic.php

<?php

// pure PHP code, no HTML

$name = htmlspecialchars(

Ne paniquez pas, chaque nouveau programmeur Web est confronté à ce problème.

Vous DEVEZ séparer la logique de votre programme de votre affichage. Commencez par créer votre propre solution en utilisant deux fichiers pour chaque page Web:

  • un avec uniquement du code PHP (pas de HTML) qui remplit les variables
  • une autre avec HTML et très peu de PHP: ceci est votre conception de page

Indiquez ensuite où et quand vous en avez besoin. E.G:

myPageLogic.php

// very few php code
// just enought to print variables
// and some if / else, or foreach to manage the data stream

<h1>Hello, <?php $name ?> !</h1>

<p>So your are <?php $age?>, hu ?</p>

myPageView.php

<?php

require('myPageLogic.php');
require('myPageView.php');
?>

(Vous pouvez utiliser la autre syntaxe PHP. pour celui-ci. Mais n'essayez pas trop fort de le rendre parfait la première fois, vraiment.)

myPage.php

<*>

Ne vous préoccupez pas des problèmes de performances pour le moment . Ce n'est pas votre priorité en tant que débutant. Cette solution est imparfaite, mais vous aidera à résoudre le problème avec votre niveau de programmation et vous enseignera les bases.

Ensuite, une fois familiarisé avec ce concept, achetez un livre sur le modèle MVC (ou recherchez des entrées de débordement de pile à ce sujet). C’est ce que vous voulez faire la PROCHAINE HEURE . Vous allez ensuite essayer des systèmes et des frameworks de templates, mais PLUS TARD . Pour l'instant, il suffit de coder et d'apprendre dès le début. Vous pouvez parfaitement coder un projet comme celui-là. En tant que recrue, ça va.

GET['name']); $age = date('Y') - htmlspecialchars(

Ne paniquez pas, chaque nouveau programmeur Web est confronté à ce problème.

Vous DEVEZ séparer la logique de votre programme de votre affichage. Commencez par créer votre propre solution en utilisant deux fichiers pour chaque page Web:

  • un avec uniquement du code PHP (pas de HTML) qui remplit les variables
  • une autre avec HTML et très peu de PHP: ceci est votre conception de page

Indiquez ensuite où et quand vous en avez besoin. E.G:

myPageLogic.php

<*>

myPageView.php

<*>

(Vous pouvez utiliser la autre syntaxe PHP. pour celui-ci. Mais n'essayez pas trop fort de le rendre parfait la première fois, vraiment.)

myPage.php

<*>

Ne vous préoccupez pas des problèmes de performances pour le moment . Ce n'est pas votre priorité en tant que débutant. Cette solution est imparfaite, mais vous aidera à résoudre le problème avec votre niveau de programmation et vous enseignera les bases.

Ensuite, une fois familiarisé avec ce concept, achetez un livre sur le modèle MVC (ou recherchez des entrées de débordement de pile à ce sujet). C’est ce que vous voulez faire la PROCHAINE HEURE . Vous allez ensuite essayer des systèmes et des frameworks de templates, mais PLUS TARD . Pour l'instant, il suffit de coder et d'apprendre dès le début. Vous pouvez parfaitement coder un projet comme celui-là. En tant que recrue, ça va.

GET['age']); ?>

myPageView.php

<*>

(Vous pouvez utiliser la autre syntaxe PHP. pour celui-ci. Mais n'essayez pas trop fort de le rendre parfait la première fois, vraiment.)

myPage.php

<*>

Ne vous préoccupez pas des problèmes de performances pour le moment . Ce n'est pas votre priorité en tant que débutant. Cette solution est imparfaite, mais vous aidera à résoudre le problème avec votre niveau de programmation et vous enseignera les bases.

Ensuite, une fois familiarisé avec ce concept, achetez un livre sur le modèle MVC (ou recherchez des entrées de débordement de pile à ce sujet). C’est ce que vous voulez faire la PROCHAINE HEURE . Vous allez ensuite essayer des systèmes et des frameworks de templates, mais PLUS TARD . Pour l'instant, il suffit de coder et d'apprendre dès le début. Vous pouvez parfaitement coder un projet comme celui-là. En tant que recrue, ça va.

Autres conseils

Utilisez une approche MVC.

http://www.phpmvc.net/

Ce n'est pas quelque chose que vous allez prendre dans quelques heures. Vous avez vraiment besoin de le pratiquer. Le principal est que le contrôleur accède à votre modèle (la couche de base de données), traite les données et les envoie ensuite à la vue pour le rendu. C’est trop simpliste mais il vous suffit de le lire et de le pratiquer pour le comprendre.

C’est quelque chose que j’avais l'habitude de faire pour m'aider à l'apprendre. http://www.onlamp.com/pub/a /php/2005/09/15/mvc_intro.html

Essayez de séparer le plus possible votre contenu et votre mise en page de votre code. Chaque fois que vous écrivez du code HTML dans un fichier .php, arrêtez-vous et pensez "Est-ce que cela est vraiment ici?"

Une solution consiste à utiliser des modèles. Consultez le système de modèles Smarty pour une option très simple à utiliser.

  

Faire cela, cependant, donne à mon code php une apparence horrible ... ça gâche vraiment le formatage et la forme. du code. Comment puis-je contourner cela?

Traitez votre PHP et votre HTML comme une hiérarchie unique, avec une structure d'indentation unique et cohérente. Ainsi, une structure englobante PHP telle que 'if' ou 'for' introduit un nouveau niveau d'indentation, et son contenu est toujours un ensemble équilibré de balises de début et de fin. Votre code PHP est "bien formé" au sens XML du terme, que vous utilisiez ou non le XHTML.

Exemple:

<div class="prettybox">
    Hello <?php echo(htmlspecialchars($name)) ?>!
    Your food:
    <?php foreach($foods as $food) { ?>
        <a href="/food.php?food=<?php echo(urlencode($food)) ?>">
            <?php echo(htmlspecialchars($food)) ?>
        </a>
    <?php } ?>
    <?php if (count($foods)==0) { ?>
        (no food today)
    <?php } ?>
</div>

Méfiez-vous du dogme religieux autour de la séparation de la logique et du balisage en relevant les réponses. Bien que vous souhaitiez certainement garder votre logique métier en dehors du code de sortie de votre page, cela ne signifie pas forcément une charge supplémentaire liée à l’utilisation de fichiers, classes, modèles et frameworks distincts, qui est vraiment nécessaire pour ce que vous faites. Pour une application simple, il suffit probablement de placer l'action / les éléments logiques en haut du fichier et la sortie de la page ci-dessous.

(Par exemple, dans l’un des commentaires ci-dessus, htmlspecialchars () est une fonctionnalité de sortie de page que vous tenez à ne pas mettre dans le bit d’action de votre PHP, mélangé à tous les Conservez toujours le texte sous forme de chaînes simples et non échappées jusqu’au point où il quitte la logique de votre application. Si vous saisissez 'echo (htmlspecialchars (...))' tout le temps est trop long, vous pouvez toujours créer une fonction avec nom comme 'h' qui fait la même chose.)

À en juger par le son de votre problème, il semble que vous n’ayez pas beaucoup de séparation entre logique et présentation dans votre code. Lors de la conception d’une application, il s’agit là d’une considération très importante, pour des raisons parfaitement illustrées par la situation à laquelle vous êtes actuellement confronté.

Si vous ne l'avez pas déjà fait, je jetterai un coup d'œil à certains moteurs de modélisation PHP, tels que Smarty . .

Dans de tels cas, j'écris tout ce qui est incrémentiel dans une variable ou parfois un tableau, puis je répète la variable / tableau. L’avantage supplémentaire est que la page s'affiche toujours en une fois et non progressivement.

Ce que je finis par faire dans cette situation est de construire des fichiers 'modèles' de données HTML que j'inclus, puis d'analyser avec des expressions régulières. Cela permet de garder le code propre et facilite le transfert des éléments à un concepteur ou à une autre personne travaillant avec HTML.

Découvrez les idéaux qui sous-tendent les pratiques de programmation MVC sur Wikipedia

Vous avez besoin d'un framework. Cela rendra non seulement votre code joli (à cause du modèle modèle-vue-contrôleur déjà mentionné, MVC) - cela vous fera gagner du temps grâce aux composants déjà écrits pour cela.

Je recommande QCodo, c'est incroyable; il y en a d'autres - CakePHP, Symfony.

S'il s'agit d'un grand projet, un framework peut être en ordre. Sinon, créez des fichiers de modèle et choisissez en haut de la page le fichier de modèle à inclure.

par exemple

if (

S'il s'agit d'un grand projet, un framework peut être en ordre. Sinon, créez des fichiers de modèle et choisissez en haut de la page le fichier de modèle à inclure.

par exemple

<*>

juste un exemple simple

SESSION['logged_in']) include(TPL_DIR . 'main_logged_in.tpl'); else include(tPL_DIR . 'main.tpl');

juste un exemple simple

comme mentionné ci-dessus .. vous corrigez le symptôme, pas le problème ..

Vous avez besoin de séparer la logique et la présentation. Ce qui peut être fait avec une sorte de framework mvc. Même si vous ne voulez pas aller jusqu'au bout avec un framework mvc .. Un moteur de templates est indispensable, du moins si votre logique est suffisamment compliquée pour que vous ayez du mal à comprendre ce que vous expliquez

Je suggère fortement savant au lieu de smarty,

  • vous n'êtes pas obligé d'apprendre un nouveau "modèle" de langage " afin de créer des modèles, les modèles Savant sont écrits en php
  • si vous ne voulez pas utiliser php, vous pouvez définir votre propre modèle " langue " avec un compilateur
  • il est facilement extensible par vos propres objets php

Séparer la logique de la présentation ne signifie pas que toute votre logique commerciale doit être en php et votre logique de présentation en autre chose, la séparation est une chose conceptuelle, vous devez séparer la logique qui prépare les données de celle qui les montre. . Il est évident que la logique métier ne doit pas nécessairement contenir d’éléments de présentation.

Au lieu d'implémenter des systèmes de templates sur un système de templates (PHP lui-même), créant ainsi des frais généraux par défaut, vous pouvez opter pour une solution plus robuste telle que Transformations XSL , qui est également conforme aux Principes de MVC (à condition que vous sépariez votre récupération de données; de plus, je sépare personnellement la logique d'affichage du code XML avec différents fichiers).

Imaginez que vous ayez les informations suivantes dans un tableau que vous souhaitez afficher dans un tableau.

Array
{
  [car] => green
  [bike] => red
}

Vous créez facilement un script produisant ces informations au format XML:

echo "<VEHICLES>\n";
foreach(array_keys($aVehicles) as $sVehicle)
  echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n";
echo "</VEHICLES>\n";

Résultat dans le code XML suivant:

<VEHICLES>
  <VEHICLE>
    <NAME>car</NAME>
    <COLOR>green</COLOR>
  </VEHICLE>
  <VEHICLE>
    <NAME>bike</NAME>
    <COLOR>red</COLOR>
  </VEHICLE>
</VEHICLES>

Tout cela est excellent, mais cela ne s'affichera pas dans un format agréable. C’est là que XSLT entre en jeu. Avec un code simple, vous pouvez le transformer en tableau:

<xsl:template match="VEHICLES">
  <TABLE>
    <xsl:apply-templates select="VEHICLE">
  </TABLE>
</xsl:template>

<xsl:template match="VEHICLE">
  <TR>
    <TD><xsl:value-of select="NAME"></TD>
    <TD><xsl:value-of select="COLOR"></TD>
  </TR>
</xsl:template>

Et voila, vous avez:

<TABLE>
  <TR>
    <TD>car</TD>
    <TD>green</TD>
  </TR>
  <TR>
    <TD>bike</TD>
    <TD>red</TD>
  </TR>
</TABLE>

Maintenant, pour cet exemple simple, c’est un peu exagéré; mais pour les structures complexes dans les grands projets, il s'agit d'un moyen absolu de garder votre logique de script à l'écart de votre balisage.

Cochez cette question sur la séparation des données PHP et HTML, il existe différentes façons de le faire, y compris les systèmes de templates auto-écrits, les systèmes de templates tels que Smarty, PHP en tant que système de templates autonome, etc etc etc ...

Je pense que vous avez deux options ici, soit utiliser un framework MVC, soit utiliser une méthode de "template" paresseuse, qui entraînerait une surcharge significative de votre code. Évidemment, je suis avec l'ancien, je pense que l'apprentissage de MVC est l'une des meilleures astuces de développement web du livre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top