2010-08-27 2 views
0

J'ai rencontré des dizaines de scripts dans lesquels html est echo au lieu d'être stocké. Je me demande si c'est généralement une bonne pratique de toujours de stocker le code HTML dans une chaîne en raison de la nature flexible?Dois-je toujours stocker une chaîne de HTML au lieu d'en imprimer des parties à la fois?

Un exemple aléatoire serait que j'ai une fonction qui retourne le html pour une sous-navigation dynamique. Je l'impression de la balise div d'ouverture, l'impression du contenu de celui-ci, et l'impression puis la balise div fin séparément:

<div id="nav"> 
<?php echo $nav->getHTML();?> 
</div> 

Cependant, je dois maintenant attribuer une classe spéciale aux #nav div, selon que le montant des éléments de la liste et la somme des caractères à l'intérieur de $nav->getHTML() dépasse un certain montant, afin d'attribuer séparément un différent line-height et height. Pour cela, je dois le charger dans un DOMDocument et utiliser DOMXpath et faire quelques évaluations. Je pense, ne devrait-il pas être préférable de toujours stocker quelque chose comme ça pour rendre les choses plus flexibles pour les futures demandes qui nécessitent une manipulation de chaîne? Ou suis-je tout simplement inutile? Ou peut-être que je vais à ce sujet dans le mauvais sens, et besoin de refactoriser ma classe pour faire le DOM interroger à l'intérieur plutôt qu'à l'extérieur?

EDIT: Après déterminer si les ul s'étendront sur plusieurs lignes (ce qui est une liste horizontale) basée sur une limite de caractères (disons 200) Je vais ajouter une classe spéciale à l'élément et de #nav puis faire le style en CSS.

Clause de non-responsabilité: Je ne veux pas du tout compter sur JS. Je suis conscient que je peux le résoudre, mais je veux qu'il soit immédiatement rendu correctement.

Répondre

1

Je dirais que puisque, dans ce cas, vous savez que la chaîne est soumise à la manipulation, alors il est logique de la stocker maintenant. Si vous construisez un modèle ou une autre vue qui ne fait l'objet d'aucune manipulation côté serveur, vous vous retrouverez en train de devenir fou en gardant la trace de toutes vos missions, dont la plupart ne seront jamais touchées.

Maintenant, pour votre réel problème, il semble que ce que vous n'avez pas besoin est la manipulation côté serveur, mais certains CSS dur. Cela serait probablement conforme à la meilleure pratique générale de séparation du style, du contenu et du comportement.

+0

La résolution de cette purement CSS est impossible. Je manipulais dynamiquement une position absolue "ul" qui doit coller au bas d'un autre élément S'il y a plusieurs rangées de 'li's alors j'ai besoin de changer la hauteur et la hauteur de ligne de' ul' Ceci doit aussi être compatible avec tous les navigateurs Je ne peux pas "savoir" de manière dynamique si le "ul" couvre plusieurs lignes ou pas avec du code purement CSS –

+0

Pourquoi pas? bs. positionné en bas nécessite un fond: 0; il ne nécessite pas de hauteur. Si vous définissez un style intelligent (affichage: inline-block, overflow: auto, à l'UL, et float: à gauche, aux LI), alors les li devraient s'enrouler sur une nouvelle ligne comme s'ils étaient des mots dans un paragraphe, et votre ul maintiendrait une hauteur de fluide. Vous pouvez également utiliser jQuery pour faciliter les calculs visuels, en ajoutant chaque li à l'UL tant que sa largeur totale calculée est inférieure à la largeur de l'ul, et en multipliant la hauteur de l'ul en conséquence. – dmrnj

1

Personnellement, je suis réticent à mettre des détails de présentation (comme le calcul des propriétés line-height ou height que vous avez mentionnées) dans un script côté serveur. Je voudrais essayer de le gérer avec CSS ou (dans le pire des cas) javascript.

Dans votre cas, je ne sais pas beaucoup $nav, mais ne pouvez-vous pas calculer line-height et d'autres au cours de sa génération, pas à la source? Dites, ont getHeight et getLineHeight méthodes en plus de getHTML.

1

L'analyse syntaxique générée pour générer une logique métier/de rendu n'est pas une bonne idée. Je préfère avoir une autre fonction appelée "getClass" qui retourne la classe en fonction de la quantité d'éléments de la liste ou de la somme des caractères dans $ nav-> getHTML().

< div id = "nav" class = "<?php echo $ nav- > getDisplayClass() ;? > ">

<? Php echo $ nav- > getHTML() ;? >

</div >

+0

Le seul inconvénient est que je ne suis pas vraiment autorisé à jouer avec la classe. –

Questions connexes