affichage d'un menu

affichage d'un menu - PHP - Programmation

Marsh Posté le 20-04-2010 à 14:39:03    

Bonjour à tous,
 
Dans mon site en php, j'ai un menu horizontal à double niveau. Tout s'affiche correctement lorsque j'active les liens du menu. En revanche, dès que j'active un lien externe au menu du type "contact", la ligne du sous-menu est invisible. Le site est construit de la manière suivante :
 
index.php (je passe les meta et head)

Code :
  1. <body>
  2.         <div id="site">
  3.                 <?php include('./functions.php'); ?>
  4.                 <?php include('./public/top.php'); ?>
  5.                 <div id="container">
  6.                         <?php
  7.                         define('PATH', './includes/');
  8.                         $tableau = glob(PATH.'*.inc.php');
  9.                         if(isset($_GET['page']) && in_array(PATH.$_GET['page'].'.inc.php', $tableau))
  10.                         {
  11.                         $pageinc = PATH.$_GET['page'].'.inc.php';
  12.                     }
  13.                     else
  14.                         {
  15.                         $pageinc = PATH.'1.inc.php';
  16.                     }
  17.                     include $pageinc;
  18.                         ?>
  19.                         <div class="spacer"> </div>
  20.                         <div id="bloc_img"></div>
  21.                 </div>
  22.                 <?php include('./public/bottom.php'); ?>
  23.         </div>
  24. </body>


 
top.php : dans lequel figure tous les liens internes et externes au menu

Code :
  1. <a href="index.php" id="logo"><img src="img/logo.gif" alt="Logo" /></a>
  2. <a href="index.php?page=contact" id="contact"><img src="img/contact.gif" alt="contact" /></a>
  3. <dl id="menu">
  4.         <dt><a href="index.php?page=1" title="p1" <?php stylen1(1); ?>>menu1</a></dt>
  5. <dd <?php stylen1(1); ?>>
  6.                 <ul>
  7.                         <li><a href="index.php?page=1&amp;rubrique=1" title="1-1" <?php stylen2(1,1); ?>>Sous-menu1</a></li>
  8.                         <li><a href="index.php?page=1&amp;rubrique=2" title="1-2" <?php stylen2(1,2); ?>>Sous-menu2</a></li>
  9.                         <li><a href="index.php?page=1&amp;rubrique=3" title="1-3" <?php stylen2(1,3); ?>>Sous-menu3</a></li>
  10.                         <li><a href="index.php?page=1&amp;rubrique=4" title="1-4" <?php stylen2(1,4); ?>>Sous-menu4</a></li>
  11.                 </ul>
  12.         </dd>
  13.         <dt><a href="index.php?page=2" title="p2" <?php stylen1(2); ?>>menu2</a></dt>
  14.         <dd <?php stylen1(2); ?>>
  15.                 <ul>
  16.                         <li><a href="index.php?page=2&amp;rubrique=1" title="2-1" <?php stylen2(2,1); ?>>Sous-menu1</a></li>
  17.                         <li><a href="index.php?page=2&amp;rubrique=2" title="2-2" <?php stylen2(2,2); ?>>Sous-menu2</a></li>
  18.                         <li><a href="index.php?page=2&amp;rubrique=3" title="2-3" <?php stylen2(2,3); ?>>Sous-menu3</a></li>
  19.                         <li><a href="index.php?page=2&amp;rubrique=4" title="2-4" <?php stylen2(2,4); ?>>Sous-menu4</a></li>
  20.                 </ul>
  21.         </dd>
  22. </dl>


 
fonction.php

Code :
  1. <?php
  2. function stylen1($a)
  3. {
  4.         if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
  5.        
  6.         if($a == $page)
  7.         {
  8.                 echo('class="active"');
  9.         }
  10. }
  11. function stylen2($a,$b)
  12. {
  13.         if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
  14.         if(isset($_GET['rubrique'])) {$rubrique = $_GET['rubrique'];} else{$rubrique = 0;}
  15.        
  16.         if(($b == $rubrique))
  17.         {
  18.                 echo('class="active"');
  19.         }
  20. }
  21. function insertion()
  22. {
  23.         if(isset($_GET['page'])) {$page = $_GET['page'];}
  24.         else {$page = 1;}
  25.        
  26.         if(isset($_GET['rubrique'])) {$rubrique = $_GET['rubrique'];}
  27.         else {$rubrique = 0;}
  28.        
  29.         $file = 'includes/'.$page.'/'.$rubrique.'.php';
  30.        
  31.         include($file);
  32. }
  33. ?>


 
Prenons l'exemple du fichier contact

Code :
  1. <div id="illustrations" class="contact"></div>
  2. <div id="corps">
  3.         <h1>Contact</h1>
  4.     <p>texte du paragraphe</a></p>
  5. </div>


 
J'ignore d'où vient le problème.
En analysant le code, je pense qu'il vient du fichier "top.php" qui ne donne pas l'instruction d'activer le menu. J'ai donc essayé d'intégrer "<?php stylen2(1,1); ?>" dans la ligne ci-dessous, sans résultat.
<a href="index.php?page=contact" id="contact"><img src="img/contact.gif" alt="contact" /></a>
Manquerait-il l'instruction <?php insertion(); ?> dans mon fichier "contact.php"
 
Dois-je intervenir sur le fichier "functions.php" ou "top.php" ?
Je tourne un peu en rond, auriez-vous une piste ?
Merci d'avance pour votre aide.  

Reply

Marsh Posté le 20-04-2010 à 14:39:03   

Reply

Marsh Posté le 20-04-2010 à 16:35:15    

Une fonction doit retourner quelquechose.  
 
Essaye de rajouter dans tes fonctions return $variable
 
J'ai l'impression que tu confond fonction et include non ?

Reply

Marsh Posté le 20-04-2010 à 17:46:18    

Tout d'abord, merci de la réponse, ça fait plaisir de ne pas se sentir seule face à son problème.
En effet, ce n'est pas très clair.  
Une fonction permet de mener des actions pour afficher quelque chose (une sorte de raccourci pour éviter de refaire les mêmes manipulations)
Pour moi, Include est une fonction qui permet d'insérer un certain code dans ma page.
Est-ce exact ?
Mon objectif est que : lorsque j'active un lien hors menu, celui-ci s'affiche avec ses 2 niveaux comme sur la page d'accueil (index.php).
 
Donc, selon "cette" logique, pour que mon menu (top.php) apparaisse comme sur l'état d'index je dois intégrer l'instruction d'activer le menu par défaut. Mais où et comment ?
 
Tu me dis d'ajouter return $variable.
Est-ce que je peux, par ce biais, lui donner une instruction du genre :
Quand la page a afficher n'est pas incluse dans le menu, alors, active par défaut le menu tel qu'il apparaît dans la page d'accueil ?
 
Comme tu vois, ce n'est pas si clair...

Reply

Marsh Posté le 21-04-2010 à 09:40:48    

Essaye de remplacer les

 

echo('class="active"');

 

de tes fonctions par un $retour="active";

 

Et ensuite avant le } qui ferme ta fonction insère un return $retour;

 

et refait le test, dis moi si ca marche

 

EDIT: je viens de relire ton code, je sais pas si tu peux utiliser des $_GET dans les fonctions, je t'avoue que j'ai jamais essayé. Si jamais ca ne fonctionne pas, regarde de ce coté.

Message cité 1 fois
Message édité par aspirateur le 21-04-2010 à 09:44:26
Reply

Marsh Posté le 21-04-2010 à 10:25:40    

Salut,
 
Tu as un "</a>" qui traine dans ton fichier contact.
Changes tes dl,dd,dt par des ul et li.
 
Tu as du css?
Est possible de voir la page ?

Reply

Marsh Posté le 21-04-2010 à 12:48:03    

En faisant ce remplacement, je perds totalement mon niveau 2.
Par ailleurs, mon menu fonctionne très bien avec les 2 niveaux à partir du moment où j'active des liens du menu.
 
Comment donner une instruction par défaut si c'est une page hors menu comme l'index, à savoir page [1] rubrique [0] ?
 
Quand je regarde mon fichier top.php et que je compare le lien vers "contact" et celui de l'index, il manque l'instruction d'afficher le menu
 
# <a href="index.php?page=contact" id="contact"><img src="img/contact.gif" alt="contact" /></a>
#
# <dl id="menu">
#         <dt><a href="index.php?page=1" title="p1" <?php stylen1(1); ?>>menu1</a></dt>
 
Je ne sais pas si je dois intervenir sur le fichier "top.php" ; "functions.php" et ou "contact.php"
 
En tout cas, merci de tes idées, au moins, j'avance en procédant par élimination.

Reply

Marsh Posté le 21-04-2010 à 14:31:18    

Par défaut, quand tu es sur ton index, $_GET['page'] n'est pas défini.

Citation :

function stylen1($a)
{
        if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
       
        if($a == $page)
        {
                echo('class="active"');
        }
}


Ce qui fait que : stylen1(1) affiche "classe="active" sur l'index.
Ce n'est plus le cas sur la page contact.
 

Citation :

<body>
        <div id="site">
                <?php include('./functions.php'); ?>


Généralement, les inclusions des fichiers de configuration, fonction, classes... se font au début du fichier.

Reply

Marsh Posté le 21-04-2010 à 19:16:09    

Merci Arcan_- de ta réponse,
 
Pour répondre au 1er message
Le "</a>" qui traine dans mon fichier contact est une erreur de copier/coller (en fait j'ai un lien)
J'ai bien un css

Code :
  1. @import url('reset.css');
  2. body
  3. {
  4. font-family:Arial, Helvetica, sans-serif;
  5. background-color:#0e5dc5;
  6. font-size: 12px;
  7. color: #858585;
  8. text-align: left;
  9. }
  10. object
  11. {
  12. display: block;
  13. outline: none;
  14. }
  15. #site
  16. {
  17. width:960px;
  18. position: relative;
  19. margin: 0 auto;
  20. background-image: url(img/background.jpg);
  21. background-repeat: repeat;
  22. background-color: #fff;
  23. }
  24. a#logo
  25. {
  26. display: block;
  27. position:absolute;
  28. top:0px;
  29. left:0px;
  30. }
  31. a#acces
  32. {
  33. display: block;
  34. position:absolute;
  35. top:0px;
  36. right:0px;
  37. }
  38. a:hover#acces 
  39. {
  40. background-image:url(img/acces_pros_ro.gif);
  41. top:1px;
  42. right:1px;
  43. }
  44. dl#menu
  45. {
  46. height: 36px;
  47. margin: 0 auto;
  48. padding: 50px 0 0 78px;
  49. background-image: url(img/haut.jpg);
  50. background-repeat: no-repeat;
  51. }
  52. dl#menu dt
  53. {
  54. float: left;
  55. height: 36px;
  56. margin:0 4px 0 0;
  57. line-height: 24px;
  58. font-size:10px;
  59. width:130px;
  60. font-weight: bold;
  61. }
  62. dl#menu dt a
  63. {
  64. display: block;
  65. height: 36px;
  66. background-image: url(img/ro_on.gif);
  67. padding: 0 10px;
  68. color: #fff;
  69. text-transform: uppercase;
  70. }
  71. dl#menu dt a:hover,dl#menu dt a.active
  72. {
  73. background-image: url(img/ro_off.gif);
  74. }
  75. dl#menu dd
  76. {
  77. display: none;
  78. }
  79. dl#menu dd.active
  80. {
  81. display: block;
  82. position: absolute;
  83. top: 85px;
  84. left: 78px;
  85. }
  86. dl#menu dd ul
  87. {
  88. height: 30px;
  89. width: 803px;
  90. background-image: url(img/ro_off_sub.gif);
  91. background-repeat: repeat-x;
  92. }
  93. dl#menu dd ul li
  94. {
  95. float: left;
  96. height: 30px;
  97. line-height: 30px;
  98. }
  99. dl#menu dd ul li a
  100. {
  101. color: #000;
  102. padding: 2px 5px;
  103. border-left: 1px solid #000;
  104. }
  105. dl#menu dd ul li a.active
  106. {
  107. color: #fff;
  108. }
  109. #container
  110. {
  111. width:803px;
  112. position: relative;
  113. margin: 30px auto 0 78px;
  114. background-color:#fff;
  115. }
  116. div#container a:link { color: #0CF;}
  117. div#container a:visited { color: #F90;}
  118. div#container a:hover { color: #F60;}
  119. #dossiers
  120. {
  121. width:220px;/*250*/
  122. padding:10px;
  123. float:left;
  124. }
  125. #dossiers a
  126. {
  127. display:block;
  128. padding-left:120px;
  129. background-repeat: no-repeat;
  130. }
  131. #dossiers a.dossier1 {background-image:url(img/dossier1.jpg); padding-top:30px;height:100px;}
  132. #dossiers a.dossier2 {background-image:url(img/dossier2.jpg); padding-top:10px;height:120px;}
  133. #dossiers a.dossier3 {background-image:url(img/dossier3.jpg); padding-top:30px;height:100px;}
  134. #corps
  135. {
  136. width:512px;
  137. padding:10px;
  138. float:left;
  139. border-left: 1px dotted #0CF;
  140. }
  141. div#corps h1
  142. {
  143. margin-bottom:14px;
  144. font-size:14px;
  145. color:#333333;
  146. font-weight: bold;
  147. }
  148. div#corps h2
  149. {
  150. font-size:12px;
  151. color:#0e5dc5;
  152. margin-bottom:2px;
  153. }
  154. div#corps p
  155. {
  156. margin-bottom:10px;
  157. }
  158. div#corps ul
  159. {
  160. margin-bottom:10px;
  161. line-height:18px;
  162. }
  163. div#corps ul li
  164. {
  165. list-style-type:disc;
  166. list-style:inside;
  167. font-size:11px;
  168. color:#999999;
  169. }
  170. #illustrations
  171. {
  172. width:220px;
  173. height:390px;
  174. margin-top:20px;
  175. padding:10px;
  176. float:left;
  177. background-repeat: no-repeat;
  178. }
  179. .histoire { background-image:url(img/notre_histoire.png);}
  180. .contact { background-image:url(img/contact.jpg);}
  181. .mentions_legales { background-image:url(img/mentions_legales.jpg);}
  182. #bloc_img
  183. {
  184. background: url(img/img_bloc.jpg) no-repeat;
  185. margin:0 auto;
  186. height: 16px;
  187. width:803px;
  188. clear: both;
  189. }
  190. #bas
  191. {
  192. display: block;
  193. }
  194. #footer
  195. {
  196. width:960px;
  197. text-align: center;
  198. height: 34px;
  199. color: #000;
  200. text-decoration: none;
  201. font-size:0.9em;
  202. background-image:url(img/footer.jpg);
  203. background-repeat:repeat-x;
  204. margin: 0 auto;
  205. padding:5px 0 0;
  206. }
  207. #footer a { color: #000; text-decoration: none;}
  208. #footer a:hover { color: #fff; text-decoration:none;}
  209. #footer p { margin-top:4px;}
  210. #footer #nav li
  211. {
  212. list-style-type: none;
  213. margin:5px 5px 0 0;
  214. display:inline;
  215. }
  216. .spacer
  217. {
  218. clear: both;
  219. font-size: 1px;
  220. height: 1px;
  221. }


 
Pour le second message...

Citation :

Par défaut, quand tu es sur ton index, $_GET['page'] n'est pas défini.


Je pensais qu'il l'était du fait que dans le fichier top.php soit notifié

Code :
  1. <dt><a href="index.php?page=1" title="p1" <?php stylen1(1); ?>>menu1</a></dt


ce qui renvoie au fichier "functions.php"  

Code :
  1. :
  2.    1. <?php
  3.    2. function stylen1($a)
  4.    3. {
  5.    4.         if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
  6.    5.       
  7.    6.         if($a == $page)
  8.    7.         {
  9.    8.                 echo('class="active"');
  10.    9.         }
  11.   10. }


En lien avec le fichier "index.php"

Code :
  1. <?php include('./functions.php'); ?>


 
C'est un peu compliqué.  
Je donnerai bien le lien vers le site mais le problème est que le php ne s'affiche pas difficile d'analyser le code.
Que puis-je faire pour faciliter la compréhension du problème : envoyer par mail les fichiers sources ?
Encore merci Arcan_- et Aspirateur de votre suivi.

Reply

Marsh Posté le 21-04-2010 à 23:04:31    

aspirateur a écrit :

Essaye de remplacer les
EDIT: je viens de relire ton code, je sais pas si tu peux utiliser des $_GET dans les fonctions, je t'avoue que j'ai jamais essayé. Si jamais ca ne fonctionne pas, regarde de ce coté.


$_GET, $_POST, $_SERVER, $_SESSION etc sont des superglobales, les superglobales sotn accessibles n'importe ou dans ton application, que ce soit une fonction, une classe ...

Reply

Marsh Posté le 22-04-2010 à 08:14:42    

Oranjade a écrit :


Pour le second message...

Citation :

Par défaut, quand tu es sur ton index, $_GET['page'] n'est pas défini.


Je pensais qu'il l'était du fait que dans le fichier top.php soit notifié


 
tu as bien à la fin de ton adresse "?page=blabla"  ?
 

Alisteroid a écrit :


$_GET, $_POST, $_SERVER, $_SESSION etc sont des superglobales, les superglobales sotn accessibles n'importe ou dans ton application, que ce soit une fonction, une classe ...


 
Merci, je ne savais pas ;) (ou plutot je me suis jamais posé la question :p )

Reply

Marsh Posté le 22-04-2010 à 08:14:42   

Reply

Marsh Posté le 22-04-2010 à 09:44:38    

Tant que tu n'as pas "?page=xxxx" dans ton url, $_GET['page'] ne sera pas défini.
 
S'il n'est pas défini, $page dans ta fonction stylen1 aura "1" comme valeur.
Donc stylen1(1) affichera toujours "classe="active"".
 
Quand tu es sur ta page contact, $_GET['page'] (et donc $page dans ta fonction) est défini (il a "contact" pour valeur) => stylen(1) n'affiche rien.
 
Ton menu ne s'affiche que si $a == $page.
Il faudrait que tu aies stylen1('contact') pour que le menu s'affiche quelque part, ou que tu modifie la condition de ta fonction stylen(1).

Reply

Marsh Posté le 22-04-2010 à 13:50:00    

Citation :

Tant que tu n'as pas "?page=xxxx" dans ton url, $_GET['page'] ne sera pas défini.


Mon url a la forme suivante
http://www..................../index.php?page=contact
Les conditions sont donc bien réunies ?
 
Comme plusieurs pages sont concernées (lien hors menu), je cherche l'instruction qui dise :  
Si lien hors menu alors afficher par défaut la position (et non le contenu) du menu {$page = 1;} {$rubrique = 0;}
Ce n'est en effet pas le contenu de la page 1 rubrique 0 (correspondant au menu à double niveau) que je cherche mais son affichage
Une telle instruction devrait se trouver dans ce fichier "functions.php" ?

Code :
  1. <?php
  2. function stylen1($a)
  3. {
  4. if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
  5. if($a == $page)
  6. {
  7.  echo('class="active"');
  8. }
  9. }
  10. function stylen2($a,$b)
  11. {
  12. if(isset($_GET['page'])) {$page = $_GET['page'];} else{$page = 1;}
  13. if(isset($_GET['rubrique'])) {$rubrique = $_GET['rubrique'];} else{$rubrique = 0;}
  14. if(($b == $rubrique))
  15. {
  16.  echo('class="active"');
  17. }
  18. }
  19. function insertion()
  20. {
  21. if(isset($_GET['page'])) {$page = $_GET['page'];}
  22. else {$page = 1;}
  23. if(isset($_GET['rubrique'])) {$rubrique = $_GET['rubrique'];}
  24. else {$rubrique = 0;}
  25. $file = 'includes/'.$page.'/'.$rubrique.'.php';
  26. include($file);
  27. }
  28. ?>


 
Si oui, est-ce que ça pourrait être quelque chose du style

Code :
  1. function stylen0($a,$b)
  2. {
  3. $page = 1; $rubrique = 0;
  4. {
  5.  echo('class="active"');
  6. }
  7. }


 
Ensuite, dans mon fichier "top.php" qui réunit l'ensemble des liens du site (menu et hors menu) dont voici quelques lignes

Code :
  1. <a href="index.php?page=contact" id="acces"><img src="img/acces.gif" alt="Acc&egrave;s" /></a>
  2. <dl id="menu">
  3. <dt><a href="index.php?page=1" title="titre" <?php stylen1(1); ?>>titre</a></dt>
  4. <li><a href="index.php?page=6&amp;rubrique=5" title="Liens" [#f0000e]<?php stylen2(6,5); ?>[/#e2001c]>Liens</a></li>


il faudrait que la ligne du contact intègre l'appel de l'instruction

Code :
  1. <a href="index.php?page=contact" id="acces" <?php stylen0(1,0); ?>><img src="img/acces.gif" alt="Acc&egrave;s" /></a>


 
J'ai testé et en l'état ça ne fonctionne pas. Il me signale une erreur sur le fichier "functions.php" qui correspond à "include($file);" de la function insertion()
Toutefois, avant de vérifier chaque ligne, virgule, position, symbole... pourriez-vous me dire si la logique est bonne ?

Reply

Marsh Posté le 23-04-2010 à 09:16:16    

Ta fonction stylen0() telle qu'elle est là ne sert à rien :

  • tes arguments ne sont pas utilisés,
  • pas de condition,
  • des "{" et "}" qui trainent...,
  • elle affichera toujours class="active"...


Tu pourrais tout aussi bien faire :

Code :
  1. <a href="index.php?page=contact" id="acces" <?php stylen1('contact'); ?>><img src="img/acces.gif" alt="Acc&egrave;s" /></a>

Reply

Marsh Posté le 23-04-2010 à 11:14:49    

ok, je crois qu'il faut que je reprenne tout depuis le début. Je vais essayer de bien comprendre chaque élément du code en espérant parvenir à débloquer mon problème.
En tout cas, merci à tous de votre aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed