Je suis entrain de mettre en place un menu dynamique multi-niveau en PHP et CSS et je rencontre actuellement un problème de mise en place du code dans mes pages. On dirait que le problème viens de l'appel de la fonction php qui ne se fait pas. Du mois, le return de la fonction n'a pas l'air de renvoyer quelque chose.
Le menu (et donc les fonctions) fonctionnent pourtant bien dans une simple page PHP mais refuse de marcher lorsque je désire mettre le menu dans mes pages.
Voici le code complet fonctionnel du menu (sans le CSS) dans une simple page PHP
<?php
// ON CREE LE MENU DANS UN ARRAY
$menu = array
(
1 => array
(
'text' => 'Mon profil',
'class' => 'users',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
2 => array
(
'text' => 'Documents',
'class' => 'documents',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
3 => array
(
'text' => 'Photos',
'class' => 'photos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
4 => array
(
'text' => 'Videos',
'class' => 'videos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
5 => array
(
'text' => 'Options liées',
'class' => 'monitor',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
6 => array
(
'text' => 'Mes documents',
'class' => 'documents',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
7 => array
(
'text' => 'Mes videos',
'class' => 'videos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
8 => array
(
'text' => 'Mes photos',
'class' => 'photos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
9 => array
(
'text' => 'Mes options liées',
'class' => 'monitor',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
10 => array
(
'text' => 'Aide',
'class' => 'aide',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
);
// FONCTIONS PERMETTANT DE CREER LE MENU
function build_menu ( $menu )
{
$out = '<div class="container4">' . "\n";
$out .= ' <div class="menu4">' . "\n";
$out .= "\n".'<ul>' . "\n";
for ( $i = 1; $i <= count ( $menu ); $i++ )
{
if ( is_array ( $menu [ $i ] ) ) {//must be by construction but let's keep the errors home
if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == 0 ) {//are we allowed to see this menu?
$out .= '<li class="' . $menu [ $i ] [ 'class' ] . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
$out .= $menu [ $i ] [ 'text' ];
$out .= '</a>';
$out .= get_childs ( $menu, $i );
$out .= '</li>' . "\n";
}
}
else {
die ( sprintf ( 'menu nr %s must be an array', $i ) );
}
}
$out .= '</ul>'."\n";
$out .= "\n\t" . '</div>';
return $out . "\n\t" . '</div>';
}
function get_childs ( $menu, $el_id )
{
$has_subcats = FALSE;
$out = '';
$out .= "\n".' <ul>' . "\n";
for ( $i = 1; $i <= count ( $menu ); $i++ )
{
if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == $el_id ) {//are we allowed to see this menu?
$has_subcats = TRUE;
$add_class = ( get_childs ( $menu, $i ) != FALSE ) ? ' subsubl' : '';
$out .= ' <li class="' . $menu [ $i ] [ 'class' ] . $add_class . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
$out .= $menu [ $i ] [ 'text' ];
$out .= '</a>';
$out .= get_childs ( $menu, $i );
$out .= '</li>' . "\n";
}
}
$out .= ' </ul>'."\n";
return ( $has_subcats ) ? $out : FALSE;
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dynamic PHP/CSS menu by visualight</title>
<link href="css/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div style="width:932px;margin:100px auto">
<h2>Dynamic PHP/CSS menu by visualight</h2>
// ON AFFICHE LE MENU
<?= build_menu ( $menu ) ?>
</div>
</body>
</html>
Ce qui nous donne ce type de menu (avec le CSS) :
DONC, LE MENU FONCTIONNE
Quand je désire le mettre dans mes pages :
1. je mets le CSS du menu dans "Head"
2. Je copie l'array et les fonctions du menu dans ma page
3. J'appelle la fonction build_menu comme ceci :
build_menu ( $menu );
RESULTAT ==> CA NE FONCTIONNE PAS. Le menu ne s'afficha pas et quand je fais un "afficher le code source de la page" je ne vois rien non plus.On dirait que la fonction de création du menu n'est pas correctement appelée OU, DU MOINS, le return de la fonction ne renvoie rien.
Voici une partie du code de la page dans laquelle je désire implémenter mon menu :
<?php
// ON CONSIDERE QUE LE CSS A ETE CHARGE DANS LE HEADER DU SITE (header.inc.php)
// LA BALISE BODY A ETE OUVERTE EGALEMENT ET EST CORRECTEMENT FERMEE A LA FIN DE LA PAGE DANS LE FOOTER (footer.inc.php)
//Affichage du titre et menu de la gallerie
echo '<h2 class="galleryFullTitle">'.$title.'</h2>';
$menu = array
(
1 => array
(
'text' => 'Mon profil',
'class' => 'users',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
2 => array
(
'text' => 'Documents',
'class' => 'documents',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
3 => array
(
'text' => 'Photos',
'class' => 'photos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
4 => array
(
'text' => 'Videos',
'class' => 'videos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
5 => array
(
'text' => 'Options liées',
'class' => 'monitor',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
6 => array
(
'text' => 'Mes documents',
'class' => 'documents',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
7 => array
(
'text' => 'Mes videos',
'class' => 'videos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
8 => array
(
'text' => 'Mes photos',
'class' => 'photos',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
9 => array
(
'text' => 'Mes options liées',
'class' => 'monitor',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 1
),
10 => array
(
'text' => 'Aide',
'class' => 'aide',
'link' => '#',
'show_condition'=> TRUE,
'parent' => 0
),
);
function build_menu ( $menu )
{
$out = '<div class="container4">' . "\n";
$out .= ' <div class="menu4">' . "\n";
$out .= "\n".'<ul>' . "\n";
for ( $i = 1; $i <= count ( $menu ); $i++ )
{
if ( is_array ( $menu [ $i ] ) ) {//must be by construction but let's keep the errors home
if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == 0 ) {//are we allowed to see this menu?
$out .= '<li class="' . $menu [ $i ] [ 'class' ] . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
$out .= $menu [ $i ] [ 'text' ];
$out .= '</a>';
$out .= get_childs ( $menu, $i );
$out .= '</li>' . "\n";
}
}
else {
die ( sprintf ( 'menu nr %s must be an array', $i ) );
}
}
$out .= '</ul>'."\n";
$out .= "\n\t" . '</div>';
return $out . "\n\t" . '</div>';
}
function get_childs ( $menu, $el_id )
{
$has_subcats = FALSE;
$out = '';
$out .= "\n".' <ul>' . "\n";
for ( $i = 1; $i <= count ( $menu ); $i++ )
{
if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == $el_id ) {//are we allowed to see this menu?
$has_subcats = TRUE;
$add_class = ( get_childs ( $menu, $i ) != FALSE ) ? ' subsubl' : '';
$out .= ' <li class="' . $menu [ $i ] [ 'class' ] . $add_class . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
$out .= $menu [ $i ] [ 'text' ];
$out .= '</a>';
$out .= get_childs ( $menu, $i );
$out .= '</li>' . "\n";
}
}
$out .= ' </ul>'."\n";
return ( $has_subcats ) ? $out : FALSE;
}
echo '<div style="width:932px;margin:100px auto">';
build_menu ( $menu );
echo '</div>';
die();
?>
Avez-vous une idée du pourquoi ça ne marche pas ?
L'appel de fonction est il correct ?
Merci pour votre aide précieuse,
Raph