Pages :
Bonsoir,
J'ai adapté le menu déroulant jQuery grâce au tuto de Thomas D. liée à une base de données mySQL. Tout fonctionne, mais…
y a t'il un moyen de laisser le menu ouvert une fois qu'on a cliqué sur une des sous-catégories et que la page de destination s'est chargée ?
Car pour l'instant il se referme à chaque page téléchargée
Merci d'avance.
Bonjour, fais une recherche sur le forum avec le mot clé open_at_load et tu trouveras une piste à ton problème.
Bonjour
Si dans ton menu il y a une classe du type "current" désignant la page qui a été ouverte alors tu dois pouvoir développer ton menu en ciblant cette classe.
Merci à tous
je vais plancher la-dessus et je suis soulagée qu'il y a bien un moyen, car un développeur m'avait indiqué le contraire ?!!
Bonne journée
Je reviens sur le sujet, j'ai trouvé des choses interessantes, mais… tout ce que j'arrive à faire c'est que le menu reste ouvert tout le temps et lorsque j'appelle une page.php, le menu s'est refermé.

Je souhaiterais lors d'un clic dans le sous menu, que celui-ci reste ouvert le temps de l'affichage de la page PHP afin de savoir où l'on est dans le site

Le menu fait appel à une bdd mySQL
Je débute en PHP, et ne sais pas comment attribuer ces conditions à la class open_at_load
Ci-dessous le code d'une rubrique et de sas sous-rubrique

function affiche_discipline() {
connexion_DB('nombdd');
$strSQL = 'SELECT `nom` FROM `discipline` ORDER BY `nom`';
$resultat = requete_SQL($strSQL);
$menu_retour = '';
while ($tabl_result = mysql_fetch_array($resultat)) {
$res=Affiche_menu($tabl_result['nom']);
if ($res!='') {
$menu_retour .= '<li class="toggleSubMenu2"><span>'.$tabl_result['nom'].'</span>
<ul class="subMenu2">';
$menu_retour .= $res;
$menu_retour .= '</ul> </li>';
}
}
return $menu_retour;
}


Merci d'avance si vous pouvez m'éclairer.
Bonne journée
Oui c'est assez simple en jquery si l’élément du menu qui correspond à la page courante est ciblage par une class ou autre.
Du genre
jQuery('#page-courrante').next('ul').show();
Un truc du genre.
Bin en fait tout est indiqué dans le tuto dont tu parles.

Au début du script tu ne fermes que les menus qui n'ont pas la classe 'open_at_load'.
Si je comprend ton pb c'est que tu n'arrives pas à ajouter cette classe automatiquement.

Ton site est dynamique ?
Selon le système que tu utilises il doit bien y avoir une classe dans ton menu qui désigne la page courante.
C'est quoi comme système ? Tu as un lien en ligne ou le code source du menu ?
Je voudrais voir la structure du menu et les classes qui sont appliquées.
Voici le code html avec insert base de données :

</head>
<body>
<div id="page">
<div id="bandeau">
<h1>LOGOTYPE et TITRE</h1>
</div>
<div id="bandeau-menu">
<ul class="navigation">
<li><a href="#" title="A propos de moi">A propos</a></li>
<li><a href="#" title="News">News</a></li>

<li class="toggleSubMenu"><span>Portfolio [par discipline]</span>
<ul class="subMenu">
<?php echo affiche_discipline(); ?>
</ul>
</li>
<li class="toggleSubMenu"><span>Portfolio [par secteur]</span>
<ul class="subMenu open_at_load">

<?php echo affiche_secteur(); ?>
</ul>
</li>
<li><a href="#" title="Contact">Contact</a></li>
</ul>
</div>



et ici le menu.php a qui il est relié
<?php

// Se connecte à la DB
// Paramètres : nom de la base -> $name_DB
function connexion_DB($name_DB) {
// Déclaration des paramètres de connexion
$host = "mysql5-15.pro";
$user = "username modéré";
$bdd = $name_DB;
$passwd = "mot de passe modéré";
// Connexion au serveur
mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
}

// --------------------------------------------------------------------------------------------------------------------------
// Deconnection de la DB
function deconnexion_DB() {
mysql_close();
}

// --------------------------------------------------------------------------------------------------------------------------
// Exécute une requète SQL. Si la requête ne passe pas, renvoit le message d'erreur MySQL
// Paramètres : chaine SQL -> $strSQL
// Renvoie : enregistrements correspondants -> $result
function requete_SQL($strSQL) {
$result = mysql_query($strSQL);
if (!$result) {
$message = 'Erreur SQL : ' . mysql_error() . "<br>\n";
$message .= 'SQL string : ' . $strSQL . "<br>\n";
$message .= "Merci d'envoyer ce message au webmaster";
die($message);
}
return $result;
}
function extraction_infos_DB() {
$strSQL = 'SELECT * FROM `pages` WHERE `Id_page` = '.$_ENV['id_page'];
$resultat = requete_SQL($strSQL);
$tabl_result = mysql_fetch_array($resultat);
$_ENV['mots_cles'] = $tabl_result['Mots_cles'];
$_ENV['description'] = $tabl_result['Description'];
$_ENV['titre'] = $tabl_result['Titre'];
$_ENV['contenu'] = $tabl_result['Contenu'];
$_ENV['id_parent'] = $tabl_result['Id_parent'];
}

function affiche_discipline() {
connexion_DB('listeCLTS');
$strSQL = 'SELECT `nom` FROM `discipline` ORDER BY `nom`';
$resultat = requete_SQL($strSQL);
$menu_retour = '';
while ($tabl_result = mysql_fetch_array($resultat)) {
$res=Affiche_menu($tabl_result['nom']);
if ($res!='') {
$menu_retour .= '<li class="toggleSubMenu2"><span>'.$tabl_result['nom'].'</span>
<ul class="subMenu2">';
$menu_retour .= $res;
$menu_retour .= '</ul> </li>';
}
}
return $menu_retour;
}

function affiche_secteur() {
connexion_DB('listeCLTS');
$strSQL = 'SELECT `nom` FROM `secteur` ORDER BY `nom`';
$resultat = requete_SQL($strSQL);
$menu_retour = '';
while ($tabl_result = mysql_fetch_array($resultat)) {
$res=Affiche_menu($tabl_result['nom']);
if ($res!='') {
$menu_retour .= '<li class="toggleSubMenu2"><span>'.$tabl_result['nom'].'</span>
<ul class="subMenu2">';
$menu_retour .= $res;
$menu_retour .= '</ul> </li>';
}
}
return $menu_retour;
}

function affiche_menu($secteur) {
connexion_DB('zonefreefrk007');

$strSQL = "SELECT `nom`, `page` FROM `clients` WHERE `secteur` = '".$secteur."' ORDER BY `nom`";
$resultat = requete_SQL($strSQL);
$menu_retour = '';
while ($tabl_result = mysql_fetch_array($resultat)) {
$menu_retour .= '<li>';
$menu_retour .= '<a href="'.$tabl_result['page'].'" title="'.$tabl_result['nom'].'">'.$tabl_result['nom'].'</a>';
$menu_retour .= '</li>';
}
return $menu_retour;
}
?>

Merci
Modifié par Tony Monast (07 Jan 2011 - 15:52)
Modérateur
Bonjour,

khyriana, lorsque tu présentes un code source sur un forum, prends toujours soin de retirer les informations de connexion pour ta base de données (nom d'utilisateur et mot de passe). Ne sachant pas s'il s'agissait des véritables informations de connexion, j'ai édité ton message pour les retirer.
Je copie le code du jQuery, mais qui est le même que Thomas

$(document).ready( function () {
// On cache les sous-menus
// sauf celui qui porte la classe "open_at_load" :
$(".navigation ul.subMenu:not('.open_at_load')").hide();
// On selectionne tous les items de liste portant la classe "toggleSubMenu"

// et on remplace l'element span qu'ils contiennent par un lien :
$("li.toggleSubMenu span").each( function () {
// On stocke le contenu du span :
var TexteSpan = $(this).text();
$(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '</a>') ;
} ) ;


// pareil avec submenu2
$("ul.subMenu2:not('.open_at_load2')").hide();
$("li.toggleSubMenu2 span").each( function () {
var TexteSpan = $(this).text();
$(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '</a>') ;
} ) ;

// On modifie l'evenement "mouseover" sur les liens dans les items de liste
// qui portent la classe "toggleSubMenu" :
$("li.toggleSubMenu > a").click( function () {

// Si le sous-menu était déjà ouvert, on le referme :
if ($(this).next("ul.subMenu:visible").length != 0) {
$(this).next("ul.subMenu").slideUp("normal", function () { $(this).parent().removeClass("open") } );
}
// Si le sous-menu est cache, on ferme les autres et on l'affiche :
else {
$("ul.subMenu").slideUp("normal", function () { $(this).parent().removeClass("open") } );
$(this).next("ul.subMenu").slideDown("normal", function () { $(this).parent().addClass("open") } );
}
// On empêche le navigateur de suivre le lien :
return false;
});

// pareil avec "toggleSubMenu2" :
$("li.toggleSubMenu2 > a").click( function () {
if ($(this).next("ul.subMenu2:visible").length != 0) {
$(this).next("ul.subMenu2").slideUp("slow", function () { $(this).parent().removeClass("open") } );
}
else {
$(".navigation ul.subMenu2").slideUp("normal", function () { $(this).parent().removeClass("open") } );
$(this).next("ul.subMenu2").slideDown("slow", function () { $(this).parent().addClass("open") } );
}
return false;
});

} ) ;

merci d'avance
Alors écoute apparemment le code prévois ce cas de figure puisque qu'il ne referme que les menu qui n'ont pas la classe open_at_load

$(".navigation ul.subMenu:not('.open_at_load')").hide();


Et dans ton html je vois bien cette classe

<ul class="subMenu open_at_load">

<?php echo affiche_secteur(); ?>
</ul>



Normalement ce menu ne devrait pas se refermer.

Ce qui m'intrigue c'est comment cette classe est appliquée. Ce n'est pas le script qui l'applique. Il est juste prévue pour pouvoir en tenir compte.

En résumé, pour pouvoir utiliser la fonction du script qui laisse le menu ouvert il faut que tu puisses appliquer la classe open_at_load à l' <ul> qui doit rester ouverte.
Si c'est ça le problème alors il va te falloir plonger dans php
Merci beaucoup de la réponse
Mince je vais être coïncée, car j'en suis aux prémices du PHP
J'arai tellement souhaité que cela soit au niveau du php
Bon WE
Bonjour,
J'ai loué les sces d'une développeuse pour me faire la base de données liée à ce menu déroulant à 2 niveaux et lui ai demandé de corriger le code PHP suivant les informations citées précédemment. Apparemment, elle n'y arrive pas, je lui ai demandé (bien que j'ai mis en copie la page du forum), de générer cette classe, en fonction d'une variable $_GET['page'] ou autre.
Il faut dire au script de fermer tous les sous-menus au chargement, sauf celui qui porte la classe "open_at_load" (dont cette fonction est déja OK dans mon js).

Est-ce bien cela ?
Merci d'avance
oui sans pb
tu pourrais avoir
www.nomsite.php/communication/specialite.html
par exemple
Pas compliquer du tout
ca prend 5mn
tu aurras un .htacess dans ce genre

RewriteEngine on
RewriteRule ^(.*)\(.*)\.html$   /page.php?rubrique=$1&spec=$2 [L]

Je ne suis pas un grand spécialiste des expressions régulières alors je te conseil de vérifier et surtout de limiter un peu plus car la j'accepte n'importe quelle chaine de caractère et ca pose un pb de sécurité puisqu'il devient possible d'injecter du code par l'url.
Pages :