Je souhaite créer un menu avec sous menu (infini) à partir d'une table sql.
Voici ma table et son contenu
--
-- Structure de la table `cms_menu`
--
CREATE TABLE IF NOT EXISTS `cms_menu` (
`menu_id` mediumint(8) unsigned NOT NULL,
`menu_parent_id` mediumint(8) unsigned NOT NULL,
`menu_left_id` mediumint(255) unsigned NOT NULL,
`menu_right_id` mediumint(255) unsigned NOT NULL,
`menu_name` varchar(255) COLLATE utf8_bin NOT NULL,
`menu_link` varchar(255) COLLATE utf8_bin NOT NULL,
`menu_is_published` tinyint(1) NOT NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
--
-- Contenu de la table `cms_menu`
--
INSERT INTO `cms_menu` (`menu_id`, `menu_parent_id`, `menu_left_id`, `menu_right_id`, `menu_name`, `menu_link`, `menu_is_published`) VALUES
(1, 0, 3, 5, 'Forum', '', 1),
(3, 0, 0, 1, 'Home', '', 1),
(4, 0, 5, 0, 'Cat 2', '', 1),
(5, 0, 1, 4, 'Cat 1', '', 1),
(7, 5, 9, 0, 'Sub Cat 1.2', '', 1),
(9, 5, 0, 7, 'Sub Cat 1.1', '', 1);
Et voici mon code php
$sql = 'SELECT *
FROM `cms_menu`
WHERE `menu_is_published` = 1';
$result = $db->sql_query($sql);
while($row = $db->sql_fetchrow($result))
{
if( $row['menu_parent_id'] == 0 && $row['menu_left_id'] == 0 )
$menu_id = $row['menu_id'];
$a_menu[$row['menu_id']] = array( 'menu_value' => '<li><a href="' . $row['menu_link'] . '">' . $row['menu_name'] . '</a></li>', 'menu_right_id' => $row['menu_right_id'] );
}
echo '<ul>';
while( $menu_id != 0 ) //J'ai donné la valeur de 0 à menu_right_id si y'a plus de menu après
{
echo $a_menu[$menu_id]['menu_value'];
$menu_id = $a_menu[$menu_id]['menu_right_id'];
}
echo '</ul>';
Ceci fonctionne pour le premier niveau ... mais comment y inclure les sous niveaux de manière 'intelligente' ?