Je vais tenter d'être plus clair...

Eléphant du PHP | 139 Messages

03 mars 2007, 16:01

Je suis désolé de la longueur de ma question mais je vais essayer d'être le plus clair possible pour éviter la confusion et ainsi vous faire travailler pour rien.
J'ai un menu déroulant en Javascrit avec le partie d'identification des items qui est dans un fichier .js. Voici la partie de mon code où les éléments du menu sont identifiés:
var menuItems = [
["Rapports", , , , , "0", "0", , ],
["|Compléter un rapport",""],
["||Premier cycle",""],
["|||1-01","formulaire_rapport.php?id=101"],
["|||1-02","formulaire_rapport.php?id=102"],
["|||2-01","formulaire_rapport.php?id=201"],
["|||2-02","formulaire_rapport.php?id=202"],
["||Toisième secondaire",""],
["|||3-01","formulaire_rapport.php?id=301"],
["|||3-02","formulaire_rapport.php?id=302"],
["||Quatrième secondaire",""],
["|||4-01","formulaire_rapport.php?id=401"],
["|||4-02","formulaire_rapport.php?id=402"],
["|||4-03","formulaire_rapport.php?id=403"],
["||Cinquième secondaire",""],
["|||5-01","formulaire_rapport.php?id=501"],
["|||5-02","formulaire_rapport.php?id=502"],
];
Je suis donc à le compléter et c'est très long. Parce qu'en plus, dans chacun des groupes, je voudrais avoir la liste des élèves dans un niveau supplémentaire du menu avec le user id de l'élève. Ainsi, lorsque la souris arrive par dessus "rapports", un sous-menu apparait. Si je vais sur compléter un rapport, un sous-sous-menu apparait avec le choix des groupes et ainsi de suite jusqu'à ce que je vois apparaitre le nom des élèves du groupe. Si je clique sur la case de l'élève je suis redirigé vers le script où l'on remplit le rapport pour l'élève. J'aimerais savoir s'il est possible de faire générer automatiquement la liste des élèves dans le menu via une base de données SQL sans tomber dans une petite case de formulaire php parce que cela je l'ai déjà fait, ça fonctionne, mais c'est laid! voici de quoi a l'air ma base de données:

no_fiche prenom Nom code_permanent no_telephone responsable groupe residence
1 Lindsay Beaudin BEAL????9207 949-??10 Cindy 101 0
2 Yanick Béland BELY????9106 538-??48 Michel 101 0
3 Rosie Boucher BOUR????9308 538-??81 Claudine 101 0
4 Marie-Pier Cyr CYRM????9022 538-??39 Martin 101 0
Ce choix d'élèves doit apparaitre dans plein de fonctions :
-Compléter un rapport
-Modifier un rapport
-Supprimer un rapport
-modifier le dossier d'un élève
-Imprimer un rapport
-statistiques de l'élève
-etc.

Je n'ai pas envie de modifier mon script à 50 endroits à chaque fois qu'un élève abandonne, apparaît et imaginez le travail à rentrée d'août! J'aimerais n'avoir à modifier que la base de données. Puis-je faire cela sans perdre l'apparence de mon menu que je trouve très joli! Suis-je assez clair ?

Merci de l'intérêt que vous porterez à ma demande.

Eléphant du PHP | 139 Messages

03 mars 2007, 18:07

J'ai inséré le nom des élèves dans le fichier pour transférer par url le numéro d'usager à l'autre script. résultat, mon script a près de 2000 lignes et ça prend près de 20 secondes à loader la page! C'est dommage parce que c'est très esthétique! Il faut qu'il existe une autre façon.

VaN
Mammouth du PHP | 1107 Messages

03 mars 2007, 19:21

J'aimerais savoir s'il est possible de faire générer automatiquement la liste des élèves dans le menu via une base de données SQL
no_fiche prenom Nom code_permanent no_telephone responsable groupe residence
$sql = "SELECT prenom, Nom
          FROM ELEVES
          ORDER BY Nom;"
$query = mysql_query($sql);
//début du script du menu jusqu'a afficher le nom/prenom de l'eleve
while($result = mysql_fetch_array($query))
{
     echo $result['Nom'].' '.$result['prenom'];
}
// fin du sscript du menu
Quelque chose comme ça ? (dans le cas ou ta table s'apelle ELEVES)

Eléphant du PHP | 139 Messages

03 mars 2007, 20:06

En PHP pour faire apparaître une liste c'est ok, mais ce que je veux c'est le faire apparaître dans la liste d'éléments du menu en javascript.

VaN
Mammouth du PHP | 1107 Messages

03 mars 2007, 20:13

et bien il suffit de générer le reste du menu Javascript par le biais du PHP non ?

d'où mes commentaires
//début du script du menu jusqu'a afficher le nom/prenom de l'eleve

Eléphant du PHP | 139 Messages

03 mars 2007, 20:17

J'avais essayé d'intégrer du php dans le javascript sans succès mais j'avoue que je n'ai pas essayé l'inverse. Je vais essayer cet après midi.

Eléphant du PHP | 139 Messages

03 mars 2007, 20:30

Voici le code qui appelle le menu:
<HTML>

<HEAD>
<title>Test des menus</title>

<script type="text/javascript">var dmWorkPath = "menudir/";</script>
<script type="text/javascript" src="menudir/dmenu.js"></script>

<HEAD>

<BODY>
<br>

<table>


*******j'imagine que c'est ici que je place ma boucle !!!!!!


<tr>


<td><script type="text/javascript" src="menudir/data.js"></script></td>
</tr>

******* et que c'est là qu'elle finit
</table>

</BODY>
</HTML>

VaN
Mammouth du PHP | 1107 Messages

03 mars 2007, 20:45

Non. la boucle va se faire à l'interieur meme du menu, dans le fichier JS. Tu devrai d'ailleurs supprimer le fichier JS, et copier son contenu dans ton fichier PHP global. la boucle sert juste a créer la liste des noms.

VaN
Mammouth du PHP | 1107 Messages

03 mars 2007, 21:03

J'avais essayé d'intégrer du php dans le javascript sans succès
Normal, si ton fichier ne portait pas l'extension .php

Des que le fichier comporte du php, l'extension .php est obligatoire.

Eléphanteau du PHP | 49 Messages

04 mars 2007, 15:45

Bonjour à tous,
J'avais essayé d'intégrer du php dans le javascript sans succès mais j'avoue que je n'ai pas essayé l'inverse.
Insérer du php dans le javascript ???… On nage en pleine science-fiction, là :lol:. PHP est interprété côté serveur, et javascript travaille côté client. Comment serait-il possible d'insérer du php dans le javascript ?!

Sinon, pour ton problème, bien sûr qu'il est résolvable très facilement, et sans que ce soit lourd.

Deux conseils, si tu le permets.

Premier conseil : plutôt que de faire des listes entre crochets (javascript) telles que tu les fais avec ton `menuItems`, il vaut souvent mieux créer des objets, c'est beaucoup plus facile à manipuler, et souvent plus lisible pour le programme.

Je ne sais pas à quoi exactement correspondent tes éléments de liste, dans ce `menuItems` (je parlais de lisibililté, justement), donc mon exemple sera peut-être erroné, mais tu le corrigeras sans problème.

Donc, au lieu de ça :

Code : Tout sélectionner

var menuItems = [ ["|Compléter un rapport",""], ["||Premier cycle",""], ["|||1-01","formulaire_rapport.php?id=101"], ["|||1-02","formulaire_rapport.php?id=102"] ]
:(

C'est nettement mieux d'avoir :

Code : Tout sélectionner

var menuItems = [ {label: "|Compléter un rapport", lien: null}, {label: "||Premier cycle", lien""}, {label: "|||1-01", lien: "formulaire_rapport.php?id=101"}, {label: "|||1-02", lien "formulaire_rapport.php?id=102"}, ];
:D

Note que les `label` et `lien` que j'utilise n'ont rien de définitif ou de réservé. Tu mets ce que tu veux au lieu de `label` et `lien`.
Note aussi l'utilisation des accolades au lieu des crochets

Un exemple tout de suite pour te dire comment tu facilites et tu éclaircis ton code ensuite : tu veux par exemple t'occuper de ton 3e menus (donc d'indice 2 — 0-start pour les tableaux).

Tu le prends bien sûr en faisant :

Code : Tout sélectionner

var mon3eMenu = menuItems[2] ;

C'est maintenant que ça devient intéressant :

Au lieu de faire…

Code : Tout sélectionner

var monLabelPourMenu = mon3eMenu[0] ;
:(

… tu peux faire maintenant :

Code : Tout sélectionner

var monLabelPourMenu = mon3eMenu.label ;
:D

L'idée de clarté n'apparaît peut-être pas sur une simple ligne, mais sois sûr que lorsque tu en as 2000, avec 500 paramètres, ça compte beaucoup.

Sans compter le fait qu'il n'y a rien de plus facile de se tromper dans une liste. Tu oublies une virgule et tout foire.
Ici, dans un "objet", tu peux même mettre les éléments dans le désordre, ça ne changera rien. Ce que j'ai appelé "label" restera toujours l'attribut "label" de l'élément.

Si j'avais à créer ce menu dans la page par javascript, je pourrais faire :

Code : Tout sélectionner

/* Pré-requis : Dans le code HTML en dur que j'ai mis dans mon fichier, j'ai juste écrit : <select id="mon-menu-truc"></select> sans aucun "option" */ /* Ma fonction javascript qui va construire les items de menu */ // Je prends d'abord mon menu créé ci-dessus en dur var monMenu = document.getElementById("mon-menu-truc"); /* Je boucle dans mon liste de menus */ var dataItem, oOption ; // pour la clarté (cf-ci-dessous) for (var iMenu in menuItems ) { // Je prends les données de mon menu dataItem = menuItems[iMenu] ; // Je crée un objet DOM item de menu : oOption = document.createElement('option') ; // Je mets mes valeurs dedans oOption.setAttribute("value") = dataItem.lien ; oOption.innerHTML = dataItem.label ; // Ça, ça pourrait être + propre, mais je simplifie // Et je mets mon item dans le menu monMenu.appendChild(oOption) ; // —> il apparaît dans la page } // fin de la boucle sur chaque item de menu
Le second conseil, si je peux me permettre, c'est celui-là : pourquoi surcharger la liste avec des "formulaire_rapport.php" ? Dès qu'il y a des données redondantes, il vaut mieux les faire disparaître.

Dans ta liste, je n'ai vu qu'une alternative :
— Soit un lien est défini, et il utilise "formulaire_rapport.php"
— Soit il n'y a pas de lien (ou égal à "")

Donc ton tableau, au lieu de :

Code : Tout sélectionner

var menuItems = [ ["|Compléter un rapport",""], ["||Premier cycle",""], ["|||1-01","formulaire_rapport.php?id=101"], ["|||1-02","formulaire_rapport.php?id=102"], etc.
:(

… gagnerait à devenir :

Code : Tout sélectionner

var menuItems = [ { menu: "|Compléter un rapport", id: null}, { menu: "||Premier cycle", id: null}, { menu: "|||1-01", id: 101], { menu: "|||1-02", id: 102], { menu: "||Deuxième cycle", id: null} etc.
:D

Tu noteras que je n'ai gardé que la donnée essentielle : l'identifiant. Tout le reste est parti à la poubelle, puisque ça ne sert à rien.

Il suffirait ensuite de dire à ta fonction qui construit les menus de s'occuper de ça :

Code : Tout sélectionner

if ( dataMenu.id == null ) { /* ne rien faire */ } else { leLien = "formulaire_rapport.php?id=" + dataMenu.id ; }
Là, je t'ai décortiqué les choses. Dans la vraie vie, on utiliserait un truc du genre…

Code : Tout sélectionner

var lelien = (lid=dataMenu.id) ? "formulaire_rapport.php?id=" + lid : null ;

Voilà, j'espère que ça pourra t'apporter une aide quelconque et que je n'ai été ni trop long ni trop abscons.

Bonne chance à toi, et sois sûr que ce que tu cherches à faire est possible,


Phil