2010-02-22 2 views
2

Je veux mettre des extraits comme ceux-ci à l'intérieur de quelques fichiers php et ensuite les exiger dans ma page principale, au lieu d'utiliser des fichiers css et js "purs". Je veux dire, je le fais déjà essentiellement pour mon DOM HTML.est-il une mauvaise pratique d'exiger des fichiers php plutôt que de lier à js et css?

ceci:

<script type='text/javascript'> 
var foo = <?php echo $bar; ?>; 
</script> 

ou ceci:

<style type='text/css'> 
.foo{ 
background-image:url('<?php echo $bar; ?>image.png'); 
} 
</style> 

est que la pratique vraiment mauvais?

et, si oui, quels sont les avantages et les inconvénients d'une telle approche?

Mise à jour:

Ces jours, je suis juste en utilisant Drupal qui passe poignées variables PHP js dans le système thématique et prend en charge CSS préprocesseurs comme MOINS et SASS. Les deux cas d'utilisation que j'ai soulevés dans cette question sont traités assez bien par les frameworks/préprocesseurs modernes.

+0

'foo' devrait être' .foo' ou '# foo' :) – Sampson

+0

@Jonathan Pas nécessairement ... Vous pouvez utiliser Javascript pour créer des balises je crois. –

+0

@Chacha: Bien sûr, vous pouvez créer une balise 'foo', mais je doute que c'est ce que l'utilisateur avait en tête :) – Sampson

Répondre

2

Bien que CSS ne soit pas un problème, vous auriez des problèmes si vous vouliez l'envoyer en tant que réponse HTTP via AJAX.

<script type='text/javascript'> 
var foo = <?php echo $bar; ?>; 
</script> 

AJAX ne permet pas Javascript pour des raisons de sécurité. La meilleure pratique consiste à garder votre Javascript dans un fichier séparé. De cette façon, la mise en cache côté client du script sera à votre avantage en termes de trafic.

+2

C'est certainement le plus gros problème avec ce que j'ai suggéré pour les types de projets sur lesquels je travaille. Merci pour le heads up! cela aurait été une douleur à déboguer. –

1

Je ne pense pas qu'il y ait quelque chose de nécessairement mauvais à ce sujet. Ça va être une plaie pour certaines personnes, mais ça ira. Assurez-vous de garder cette intégration au minimum, vous ne voulez vraiment pas beaucoup de php entremêlés dans votre css, javascript et html.

+0

Heck avec ça! Faire un 'css.php' prend prend le fichier comme un paramètre GET et analyse les jetons comme'% varname% 'en ceux donnés par la base de données! Trop compliquer FTW! –

+0

il ne s'agit pas de trop compliquer. J'utilise codeigniter comme framework et j'adorerais utiliser la fonction base_url() dans mon css pour améliorer la portabilité et réduire le typage. Si j'utilise des URL relatives, mes images d'arrière-plan n'apparaissent souvent pas lorsque j'édite le CSS à l'aide de l'addon développeur de Firefox. Ce sont les petites choses qui font la différence .. –

+1

@ user278457 Les chemins relatifs en CSS ne devraient pas poser de problème, puisqu'ils sont toujours servis depuis le même répertoire. Y compris CSS avec chaque page rendra effectivement beaucoup plus difficile à gérer les problèmes de chemin. Obtenez un éditeur CSS décent pour l'édition (CSSEdit pour OS X). ;-P – deceze

5

Mettre Javascript à travers l'interpréteur PHP n'est probablement pas une bonne idée. De même, CSS

  • Il encourage le antimodèle d'avoir le code côté serveur écriture de code côté client
  • Il rend plus difficile de tester la JS et CSS dans l'isolement (si elles commencent à être plein de code PHP)
  • Il rend la sortie de PHP plus
  • clients ne fait pas partie de cache d'une page, seul un objet entier

développiez la dernière partie - Javascript et CSS peuvent devenir gros (par rapport à HTML). Si le navigateur client les met en cache, il n'a pas besoin de les télécharger. Vrai, y compris dans le document principal signifie qu'il n'y a pas de demande séparée qui réduit les frais généraux (en particulier avec SSL), mais le client doit toujours télécharger le fichier. Le faire venir du cache client est généralement plus rapide.

D'autre part, votre code

<script type='text/javascript'> 
var foo = <?php echo $bar; ?>; 
</script> 

On dirait qu'il est un morceau de données, pas de code Javascript, donc il peut varier. Vous pouvez également vouloir échapper $ bar correctement.

+0

cela me semble assez raisonnable. Ce n'est donc pas un NON absolu en raison d'un problème de sécurité flagrant, mais plutôt d'un problème de performances et de développement. Les deux devraient être pesés dans le contexte du projet, et je pense que je peux le faire en fonction de ce que vous avez dit :) Merci! –

0

Après le fil de MarkR (ne peut pas voir comment y répondre), en supposant que vous essayez juste de transmettre des données à JS:

Une façon vous pourriez gagner le meilleur des deux mondes serait d'inclure une certaine logique dans ce bit PHP de sorte qu'il vérifie un certain cookie et qu'il ait une certaine valeur (par exemple version/heure). Comme:

if (!isset($_COOKIE['warm']) && $_COOKIE['warm'] !== 'today') { 
    echo '<script type=\'text/javascript\'>'; 
     echo "var foo = $bar;"; 
    echo '</script>'; 
} 

Le côté client devrait d'abord chercher la foo globale et si elle existait, il faudrait que et en cache (par exemple localStorage) et définir un cookie avec le temps ou une version ou une propriété de la foo objet. Si foo n'était pas présent, il vérifiait le cache (par exemple localStorage). S'il n'y était pas présent, il ferait un appel AJAX pour cela. De cette façon, vous enregistrez la requête supplémentaire sur un visiteur de cache/premier accès au cache, et bénéficiez d'un avantage de mise en cache sur ses répétitions. Je ne devrais pas devenir fou avec ça, mais je pense que ça devrait convenir aux petits objets de données importants (bootstrap, profil utilisateur, informations sur le tableau de bord, etc.). Pour être clair, l'idée centrale de garder cette approche facilement réalisable et maintenable est de garder le code côté serveur qui génère $ bar pour JS dans un endroit qui peut être appelé à la fois quand PHP affiche var foo et lors de la génération de la réponse JSON. De même, le côté client utiliserait une fonction pour l'analyse de $ bar, qu'elle provienne du var, du cache ou de AJAX.

Questions connexes