PHP et Javascript Dynamique

WRInaute discret
Bonjour à tous,

J'ai besoin d'un petit conseil concernant le Javascript dynamique.

Je m'explique :
Dans ma page PHP, j'ai quelque chose comme ça :

Code:
<script src="monjs.js"></script>

Ma question est, comment changer le contenu de mon fichier JS suivant si je suis sur telle ou telle page PHP.
Des paramètres comme monjs.js?a=1&b=2 ?? (Pas terrible et pas propre !) :?

Y a-t-il une façon propre d'injecter du PHP dans du Javascript ???

Bien sûr que si j'ai, l'exemple suivant, est plus simple, mais le problème c'est que je n'ai pas qu'un seul js (il y a plusieurs librairies), et ma page PHP risque de devenir un beau bordel...

Code:
<script>
alert("<?php="toto";?>")
</script>

Il y a peut-être le rewriting je renomme mes fichiers .js en .php et ça "devrait" rouler...

Mais y-a-t-il un autre moyen plus propre ???

Merci à tous.

Olivier
 
WRInaute accro
Oui mais c'est dépendant de ton hébergement :
htaccess :
Code:
	# demander au moteur php d'interpréter le javascript
	AddType x-mapp-php5 .js
dans le fichier JS au tout début du script :
PHP:
<span class="syntaxdefault"><?php<br />    session_start</span><span class="syntaxkeyword">();</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// si tu as besoin des sessions<br /></span><span class="syntaxdefault">    ob_start</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"ob_gzhandler"</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-Type: text/javascript;'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// offset cache 24 heures * 365 jours<br /></span><span class="syntaxdefault">    $offset </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 3600 </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> 24 </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> 365</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    $expire </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'Expires: '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">gmdate</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"D, d M Y H:i:s"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> time</span><span class="syntaxkeyword">()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> $offset</span><span class="syntaxkeyword">).</span><span class="syntaxstring">' GMT'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Cache-Control: max-age='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$expire</span><span class="syntaxkeyword">.</span><span class="syntaxstring">', public'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$expire</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">?></span>
tu peux donc envisager ensuite d'utiliser php dans le JS genre :
PHP:
<span class="syntaxhtml">var urldoc = String(document.location);<br />if(urldoc.substring(0,20)!='<span class="syntaxdefault"><? echo $domain</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> ?></span>'){<br />   document.location='<span class="syntaxdefault"><? echo $domain</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> ?></span>';<br />}</span>
Attention toutefois a la gestion du cache qui pourrait pousser un navigateur a ne pas prendre en compte le JS adapté a une certaine page en privilégiant un fichier chargé pour une autre (mais bon la partie header est modifiable)
Dans ton cas une variable php du genre "$page" ou $_SERVER['REQUEST_URI'] sera utile pour déterminer la page qui demande le JS.
 
WRInaute passionné
encore plus simple:

Code:
<script src="monjs.php"></script>
ou
Code:
<script src="monjs.js.php"></script>
pour plus de clareté

ton fichier js est en fait un fichier php, tu génère ton js dans ton fichier php
 
WRInaute discret
Salut Zeb,

Et merci pour ta réponse.

J'ai ajouté la ligne suivante dans le htaccess du répertoire js et dans le répertoire du fichier php, et rien, ça ne fonctionne pas..

Code:
# demander au moteur php d'interpréter le javascript
   AddType x-mapp-php5 .js

J'ai bien-sûre ajouté l'entête dans le fichier js, dans lequel j'ai juste mis un alert("<?php echo time();?>")

Dommage, voila une solution propre..
 
WRInaute passionné
Orsam a dit:
Dommage, voila une solution propre..

je ne trove pas ca si propre que ca que de demander au serveur de lire les js comme du php...

as tu lu ma réponse?, ca fonctionne (faut envoyer le bon hedar http), et c'est plus propre je trouve...
 
WRInaute discret
Salut frenchhorn,

Et merci pour ta réponse...

Ca fonctionne très bien, à part un petit détail que j'ai modifié.

ton code :
Code:
<script src="monjs.js.php"></script>

je l'ai laissé en :
Code:
<script src="monjs.js"></script>

et j'ai mis dans le htaccess :

Code:
RewriteRule ^([A-z0-9-]+).js$ $1.php

Ce qui va me permettre de faire un espèce de "contrôleur" pour mes .JS (si tu trouve le fichier .js tu l'utilise autrement trouve le .php du même nom)..

La seule chose un peut gênante, c'est que mon IDE (NetBeans) ne fait plus la différence (pour la couleur syntaxique) entre le code JS et le code PHP. :(

Merci à tous les deux...

Olivier
 
WRInaute accro
Il te faut le "Apache Module mod_mime" activé sur le serveur. Ce qui te permet entre autre de faire la même chose avec du CSS, du XML ou n'importe quoi.

Au passage changer l'extension du fichier reviens au même (puisque dans les deux cas c'est le php engine qui va parser et traiter de la même façon le fichier) seulement dans un cas tu aura je sais plus ou (il me semble de mémoire que c'est dans les outils de validation de code entre autre) un avertissement qui te dira que le système "suppose" que le .php est un .js
 
WRInaute accro
tu peux essayer ça aussi :
Code:
AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
 
<FilesMatch "\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>

regarde en bas de : Bonnes pratiques pour un .htaccess de qualité
Attention aux règles de réécriture avec des expressions régulières, je n'ai pas d'info précise la dessus mais il se peut qu'elles soit plus gourmandes que d'autres ... Multiplié par X sur chaque requêtes sur un serveur ça peut chiffrer au final.
 
WRInaute discret
C'est pas plus simple et plus propre :

<script> var page = 'toto'; </script>
<script src="monscript.js"></script>

Et de gérer en fonction de la variable "page" dans le JS ?

Car dire au serveur d'interpréter tous les .js comme du PHP, c'est vraiment bête !
 
WRInaute discret
Philings a dit:
C'est pas plus simple et plus propre :

<script> var page = 'toto'; </script>
<script src="monscript.js"></script>

Et de gérer en fonction de la variable "page" dans le JS ?

Car dire au serveur d'interpréter tous les .js comme du PHP, c'est vraiment bête !

Philing,
Le var page='toto' ne me va pas, car j'ai des fonctions JS entières qui doivent changer selon la page PHP sur laquelle je me trouve.

En ce qui concerne la redirection des JS, mon code rewriting été un exemple, ne t'inquiète pas, je ne compte rediriger que deux ou trois fichiers. :mrgreen:

Code:
RewriteRule ^monfichier1.js$ monfichier1.php
RewriteRule ^monfichier2.js$ monfichier2.php
RewriteRule ^monfichier3.js$ monfichier3.php

Merci pour ta réponse..

Olivier
 
WRInaute discret
zeb a dit:
tu peux essayer ça aussi :
Code:
AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
 
<FilesMatch "\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>

regarde en bas de : Bonnes pratiques pour un .htaccess de qualité
Attention aux règles de réécriture avec des expressions régulières, je n'ai pas d'info précise la dessus mais il se peut qu'elles soit plus gourmandes que d'autres ... Multiplié par X sur chaque requêtes sur un serveur ça peut chiffrer au final.

Zeb,

Comment avec ce système, demander l'utilisation du moteur php uniquement pour deux ou trois fichiers JS donnés ??

Merci beaucoup...

Olivier
 
WRInaute impliqué
En affinant FilesMatch peut-être. Par exemple :
Code:
<FilesMatch "(fichier1|fichier2|fichierX)\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>
 
WRInaute discret
[Résolu] PHP et Javascript Dynamique

Blount a dit:
En affinant FilesMatch peut-être. Par exemple :
Code:
<FilesMatch "(fichier1|fichier2|fichierX)\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>

Super, ça marche nickel...

Merci encore à tous,

Olivier
 
WRInaute accro
Re: [Résolu] PHP et Javascript Dynamique

Orsam a dit:
Super, ça marche nickel...
bah voila :D
Car dire au serveur d'interpréter tous les .js comme du PHP, c'est vraiment bête !
Autant je suis regardant sur une expression régulière (voir exemple plus haut) autant je pense pas qu'un fichier ne comportant aucune ouvrante php (<?php) ne pose problème (ça doit glisser tout seul).
Mais bon la remarque est bonne, perso j'ai pas de données pour comparer en revanche.
 
WRInaute passionné
Orsam a dit:
La seule chose un peut gênante, c'est que mon IDE (NetBeans) ne fait plus la différence (pour la couleur syntaxique) entre le code JS et le code PHP. :(

et bien...dans ton fichier.js.php tu n'a qu'à inclure tes fichier JS comme ca tu garde la coloration syntaxique dans tes includes ;)

un autre avantage est pouvoir regrouper tout tes fichiers JS en un seul et même de pouvoir les minifier, et même de préciser dans l'entete une compression gzip cela fait moins de requetes http pour le navigateur, donc tes pages s'afficheront plus vite

cool non ?
 
WRInaute discret
frenchhorn a dit:
Orsam a dit:
La seule chose un peut gênante, c'est que mon IDE (NetBeans) ne fait plus la différence (pour la couleur syntaxique) entre le code JS et le code PHP. :(

et bien...dans ton fichier.js.php tu n'a qu'à inclure tes fichier JS comme ca tu garde la coloration syntaxique dans tes includes ;)

un autre avantage est pouvoir regrouper tout tes fichiers JS en un seul et même de pouvoir les minifier, et même de préciser dans l'entete une compression gzip cela fait moins de requetes http pour le navigateur, donc tes pages s'afficheront plus vite

cool non ?

Oui, je reconnais, c'est cool...
 
Discussions similaires
Haut