[RESOLU] Dans un site PHP, peut-on faire un index HTML ailleurs ?

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 févr. 2023, 13:19

Bonjour,

Après pas mal de recherches et d'essais, j'ai réussi à faire afficher le JS (sans erreur) de tests de QI enregistré dans "entete_inc.php".

Comme j'ai vu que le 1er fonctionnait bien, j'ai commencé le second.
Mais, comme d'habitude, un malheur ne vient jamais seul, comme les scripts contiennent les mêmes noms de variables, c'est toujours le 1er qui est affiché.
Je rappelle que ces script sont assez anciens, peut-être avant 1995.

Auparavant, il n'y avait aucun problème puisque chaque fichier était dans une page HTML distincte, donc, un script dans chacune d'elles.

Je pense que le problème va se résoudre en HTML, parce que je me sens pas capable de modifier le nom des variables dans chaque script afin que tout soit opérationnel.
Le problème est qu'il y a une dizaine de fichiers avec les mêmes variables, et que si je mets tous les JS dans "entete_inc.php", ce sera toujours le 1er qui sera exécuter.

Une autre solution serait, si cela est possible, d'exécuter ces tests mais en "HTML", ce qui ferait comme avant, 1 page HTML pour 1 code JS.
Avant, ça fonctionnait comme ça.
http://qi98.free.fr/tests/menu_tests.php

A votre avis, est-ce que cela est possible ?

Merci d'avance.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 févr. 2023, 14:02

Pourquoi ne pas inclure tel ou tel autre javascript de la même manière que tu inclus tel ou tel contenu de page ? ou plutôt la ça me rappelle cette histoire de titre. ^^

Page mot étranger
$js2Include = 'mot-etranger.js';
include 'entete_inc.php';

Page Manque chiffre ou lettre
$js2Include = 'manque-chiffre-ou-lettre.js';
include 'entete_inc.php';

Fichier entete_inc.php
// ...
?>
<script>
<?php include $js2include; ?>
</script>
<?php
// ...
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 févr. 2023, 14:23

L'idée est astucieuse, mais je n'ai jamais fait ça !
Tout ce que je peux dire, c'est qu'un JS fait 730 lignes, c'est le-plus volumineux.

Par contre, j'ai pas trop saisi ce qui est dans "entete_inc.php" ?
Je comprends, sauf erreur, que chacun des fichiers se sert d'une variable, qui elle-même est reprise dans entete_inc.php.
Mais j'ai du mal à saisir exactement ? Désolé !

D'abord parce que je vois 2 noms de variables à appeler différents, mais si "entete_inc.php" n'appelle qu'une sorte de varaible, il faudrait faire pareil à chaque fois ?

Code : Tout sélectionner

Fichier entete_inc.php // ... ?> <script> < ?php include $js1include; ?> </script> <script> < ?php include $js2include; ?> </script> <script> < ?php include $js3include; ?> </script> (...) <?php

Code : Tout sélectionner

<!-- manque_chiffre_lettre.js --> <script> //<![CDATA[ var iq = new Array("<tr><td colspan=7 class='rouge gras'>" + "1 - Complétez le chiffre manquant :</td></tr>" + "<tr><td colspan=7 class='centre'><img src='pages/tests/images/tri1.jpg' border='0' alt=''><br />" + "<input type='text' id='ant0' name='ant0' size=2 value=\"?\" onfocus=\"'this.value='';\" onKeyUp='antW[0]=this.value;'> ?" + "</td></tr>" + "<tr><td colspan=7 style='height:10px;'><hr style='height:1px;color:#808080;width:100%'></td></tr>" + (...) document.getElementById('nom').focus(); } var iqPunt = new Array(0,80,85,90,93,95,97,100,102,105,107,110,112,115,117,120,122,125,127,130,132,135,137,140,145,150); function apercu_imp() { iqP = iqPunt[goed]; var L1 = "<div style='font: bold 25px verdana,arial,garamond;text-align:center;'>Tests effectués avec QI98</div><hr>"; var L2 = "<div style='font: bold 20px verdana,arial,garamond;text-align:center;border-style:double;border-width:4px;border-color:#ff0000;padding:20px 0px 20px 0px;'> Evaluation de : " + nom + "<br />"; var L3 = "Date du test : <span class='bleu'>" + jour + "/" + mois + "/" + annee + "</span><br />"; var L4 = "Notation de son QI : <span class='bleu'>" + iqP + "</span><br />"; var L5 = "Temps effectué : <span class='bleu'>" + tijdIQ + "</span></div><hr>"; var L6 = "<div style='font-style:italic;font:bold 16px verdana,arial,garamond;color:#00008B;'>Références de l'évaluation du QI.</div><br />"; var L7 = "<div style='font-style:italic;font: bold 13px verdana,arial,garamond;color:#0000FF;'>" + "Entre 55 et 85 = réflexion faible.<br />"; var L8 = "Entre 85 et 100 = réflexion moyenne.<br />"; var L9 = "Entre 100 et 125 = bonne réflexion.<br />"; var L10 = "Au-delà de 125= Très bonne réflexion.</div><hr>"; var L11 = "<INPUT TYPE='BUTTON' VALUE='Imprimer le résultat du test' onclick='print()'>"; var L12 = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; var L13 = "<INPUT TYPE='BUTTON' VALUE='Fermer cette fenêtre' onClick='window.close()'>"; var L14 = "<div style='text-align:center;font:bold smaller verdana,arial;'>Copyright (c) 1998-2010 QI98</div><hr>"; var imp_resutat = L1+L14+L2+L3+L4+L5+L6+L7+L8+L9+L10+L11+L12+L13; reportWin = window.open("","","width=630,height=570,toolbar=no,menubar=no,location=no,directories=no,status=no,menubar=no,resizable=no,scrollbars=no"); reportWin.document.write(imp_resutat); reportWin.document.close(); } //]]> </script>
Franchement, je ne vois pas la possibilité de faire tout ça dans ufichier !

Avatar du membre
Mammouth du PHP | 1564 Messages

17 févr. 2023, 14:34

Non, ce que Saian veut dire c'est que ceci :
$js2Include = 'mot-etranger.js';
include $js2include;
Revient à écrire ceci :
include 'mot-etranger.js';
Mais tu risque de te retrouver avec un code source très long suivant la longueur de tes script JS, le mieux est d'inclure un script avec <script></script> mais en lui indiquant la source :
<script src="mot-etranger.js"></script>
Tu peux donc faire ceci dans ta page :
$js2Include = '<script src="mot-etranger.js"></script>';
Et dans le fichier entete_inc.php :
<head>
...
<?= $js2Include ?>
...
</head>
Si tu as plusieurs scripts, tu peux faire ça propre en définissant une variable de type array dans ta page :
//définit un tableau
$array_js = [];
Puis de le remplir avec autant de script que tu veut :
//ajoute un script au tableau $array_js
$array_js[] = 'mot-etranger.js';

//et un autre, pourquoi pas, c'est prévu pour :
$array_js[] = 'un-autre-script.js';
Puis dans ton entete_inc.php :
<head>
...
<?php
//on boucle tous les script enregistrés dans la variable $array_js
foreach($array_js as $script){
    echo '<script src="' . $script . '"></script>';
}
?>
...
</head>
C'est un niveau au dessus de tes compétences, mais ça te montre des possibilités.

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 févr. 2023, 16:48

Tes explications sont claires pour toi two3d, mais pour moi, c'est pas gagné d'avance parce que je n'ai qu'un toute petite approche du PHP, mais alors, toute petite... mais pas du JS,

C'est vrai que ça me semble plus facile à prime abord, mais d'abord, il faudrait que je saches comment ça marche pour le script, il fait 730 lignes pour le plus grand !
En moyenne c'est entre 400 et 500 pour chaque fichier JS, et il y en a neuf exactement !
Comme je sais qu'un JS doit être entre HEAD de l'header, j'ai du mal à comprendre parce qu'il y en a 9, donc, c'est très volumineux vu le nombre de lignes !

J'ai compris ce que voulait me dire Saian, mais tu me mets "<script src="mot_etranger.js"></script>" en me disant que je risque d'avoir un code source très long et qu'il vaudrait mieux les mettre en "include" ???? Là, je suis paumé !

Bon, je crois avoir compris l'histoire de variables dans les pages dont celles-ci seraient appelées depuis le HEAD de l"entete_inc.php, mais le problème est là, je ne comprends pas l'histoire des variables dans les pages et le JS par lui-même !

Comme j'y suis depuis ce matin 4h, je vais décompressé et tout reprendre demain... avec les idées plus claires !

Avatar du membre
Mammouth du PHP | 1564 Messages

17 févr. 2023, 17:53

Les <script> sont pas obligés d'être entre les balises <head></head>.

Récapitulons :

Si tu met 9 scripts entre les balises <script>ton script js</script>, résultat : code source final très long et pas la bonne méthode
Si tu met 9 scripts dans les balises <script src="tonfichier1.js"></script><script src="tonfichier2.js"></script>...<script src="tonfichier9.js"></script>, résultat : tu gagne en lisibilité avec un code source plus "léger" et c'est la bonne méthode à adopter

Il me semble que Google pénalise les codes source de script à rallonge, à confirmer.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 févr. 2023, 18:42

Normalement un fichier js ne doit pas contenir de balise html, c'est pour ça que dans mon exemple j'ai mis la balise <script></script> dans entete_inc.php.

Ensuite, tu n'as pas besoin de multiplier les variables. $js2include, le 2 c'est juste pour dire "à", js2include = js to include = javascript à inclure. J'aurai pu écrire $jsToInclude ou encore $javascriptToInclude, peu importe, le tout étant juste d'avoir un nom de variable suffisamment parlant pour comprendre à quoi elle sert. Pour chacune de tes 9 pages tu vas donner une valeur différente à cette variable et ainsi c'est le bon js qui sera inclus dans entete_inc.php.

Dans mon exemple également, comme souligné par two3d, le contenu du fichier js va effectivement se retrouver dans le code source de la page html finale. Tu peux simplement remédier à se problème comme il le propose
$js2Include = '<script src="mot-etranger.js"></script>';
et l'inclure dans entete_inc.php avec un simple
echo $js2Include;
Lorsque le navigateur recevra la page, à la vue de la balise <script src="mot-etranger.js"></script> il chargera le fichier.

Dans tous les cas, avec cette méthode, seul le script nécessaire à la page sera inclus ce qui normalement devrait régler ton problème de départ (la présence de tous les scripts quelque soit la page).

Si tu utilises le même fichier entete_inc.php dans d'autres pages qui elles n'ont pas besoin de script spécifique, il suffit de ne pas déclarer la variable $js2Include avant l'inclusion du fichier entete_inc.php et de vérifier dans ce dernier l'existence de la variable avant d'afficher son contenu :
if (isset($js2Include)) {
    echo $js2Include;
}

Je te remets un exemple complet :

Page mot étranger
...
$js2Include = '<script src="mot-etranger.js"></script>';
include 'entete_inc.php';
...

Page Manque chiffre ou lettre
...
$js2Include = '<script src="manque-chiffre-ou-lettre.js"></script>';
include 'entete_inc.php';
...

Une autre page qui n'a pas besoin d'inclure un javascript supplémentaire
...
include 'entete_inc.php';
...

Fichier entete_inc.php
...
<?php if (isset($js2include;)) { echo $js2include; } ?>
...
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 févr. 2023, 19:24

Hou là !
Ce n'est pas que c'est difficile à suivre, mais entre toutes les informations que je recueille, à force, j'ai du mal à cerner la problème !

Avant toute chose,
<!-- *************************************************************** -->
<!-- Mot_etranger.php -->
<!-- *************************************************************** -->
<script>
var iq = new Array(
/* Série 1 */
"<tr>" +
"<td style='text-align:center;width:25%'>Bateau<br /><input type='radio' name='sel1' onclick='ant[0]=0;'></td>" +
"<td style='text-align:center;width:25%'>Voile<br /><input type='radio' name='sel1' onclick='ant[0]=0;'></td>" +
...
Actuellement, le script source est dans le HEAD de entete_inc.php.

Donc, je peux le mettre dans la page "mot_etranger.php"
<?php
/** mot_etranger.php */
?>

<section>
	<article>
		<header>
			<div class="intitule bleu gras"><span class="puce-libelle">&nbsp;&nbsp;&nbsp;</span>Retrouvez le mot étranger dan la série ?</div>
		</header>

		<br>
		<div class="ecart">
			<span class="gras bleu">20 séries au total</span> en 4 minutes de réflexion.
		</div>
		<div class="ecart">
			Vous aurez <span class="gras bleu">12 secondes par série</span> pour trouver la solution.
		</div>
		
		<br><br><br>

				<form name="fm1" action="javascrit,void(0);">
					<table class="ecart" style="width:100%;" cellpadding="0" cellspacing="0">
						<tr>
							<td colspan=2><span id="res">&nbsp;</span></td>
						</tr>
						<tr>
							<td align="center" colspan=4><input class="bouton gras" type="button" name="but" value="Commencer le test ?" onClick="window.clearTimeout(SD);tel+=1;t0=klok[tel];calc();"></td>
						</tr>
					</table>
						<!-- ##### Pour l'affichage des résultats ##### -->
						<table><tr><td><span id="ok">&nbsp;</span></td></tr></table>
				</form>

	</article>
</section>	
Juste avant <section> par exemple !

Donc, juste après, ou avant, dans le même fichier, je mets la variable
$js2Include = '<script src="mot_etranger.js'></script>
?
La choucroute est bien garni parce que je patauge sérieusement !

Faisant la même chose dans les 9 pages avec à chaque fois le script et le nom de la variable, je n'aurais que mettre dans "entete_inc.php",
echo $js2Include;
et lorsque je cliquerai le lien dans le menu adéquat, ça devrait fonctionner ? C'est ça !

Quand je disais que je n'avais les yeux en face des trous ! #-o

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 févr. 2023, 20:43

Bon WE à vous deux.
Je vais me pencher sur la question et vais essayer.

Avatar du membre
Mammouth du PHP | 1609 Messages

19 févr. 2023, 13:47

Si dans chacune des pages (mot_etranger.php, etc) tu inclus le fichier entete_inc.php et que ce fichier contient le echo $js2Include; et que la variable est bien définie avant l'include, alors oui, tu auras bien la bonne balise script dans chacune des pages et seulement la bonne.
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

20 févr. 2023, 11:14

Bonjour two3d et Saian,

Ce matin, j'ai repris ce que vous m'aviez préconisé, ça fonctionne très bien !

C'est pas évident de tout comprendre !
Donc, si j'ai bien compris, le JS que j'ai mis dans les pages de tests a une sorte de raccourci, comme on ferais dans Windows
$js2Include = '<script src="suite_logique.js"></script>';
Au passage, j'ai gardé ce nom parce qu'il me plaît beaucoup ! :D

En tout cas, ça fonctionne parfaitement !
Le plus long, donc laborieux, c'est de faire la mise en page des scripts qui contiennent des tableaux.

Concernant la 1ère ligne qui de décale dans un "<p>'" ou un "<div>", je ne sais pas d'où ça vient ! :cry:
J'ai regardé les css "entete_inc", "menu_inc", "pied_inc" et "style" pour déceler si un écart était déclaré, je n'ai rien vu.
Ce qui me semble bizarre, c'est qu'il n'y a que la 1ère ligne qui soit décalée dans un texte qui fait plusieurs lignes.
De plus, si dans un long texte, je fais des "<br>, toutes les lignes sont normales.

Alors, la solution trouvée et que dans style, je fasse une class
.ecart{margin-left:50px;}
, il n'y a que comme ça que tout s'aligne avec "<span>".

Bien que j'essaie d'organiser au mieux le php, je dois faire pareil avec le css, surtout dans "style.css"... et c'est pas gagné !