Menu met uitklapbare submenu's (Opgelost)
Ultimatum - 05/11/2007 23:08
PHP expert
Ey, ik heb deze code gevonden op het forum (dank aan Grayen ). En wat aangepast zodat hij bij mij werkt. Maar nu heb ik de volgende vraag. Nu staan mijn submenu's al direct onder het parentmenu. Maar hoe kan ik het maken dat als je er op klikt, dan pas de submenu's te voorschijn komen?
<?php
function submenu($current, $rows, $layer = 0) {
global $settings;
foreach($rows as $key => $value) {
if($value['menu_sub'] == $current) {
echo '<li><a href="'. $settings['url'] .'/'. (!empty($value['menu_groep']) ? $value['menu_groep'] : '') .'/'. strtolower($value['menu_link']) .'/">'. $value['menu_name'] .'</a></li>' . "\n";
unset($rows[$key]);
submenu($value['menu_id'], $rows, $layer + 1);
}
}
return true;
}
?>
<?php
function submenu( $current , $rows , $layer = 0 ) {
foreach ( $rows as $key => $value ) {
if ( $value [ 'menu_sub' ] == $current ) {
echo '<li><a href="' . $settings [ 'url' ] . '/' . ( ! empty ( $value [ 'menu_groep' ] ) ?
$value [ 'menu_groep' ] : '' ) . '/' . strtolower ( $value [ 'menu_link' ] ) . '/">' . $value [ 'menu_name' ] . '</a></li>' . "\n " ;
submenu( $value [ 'menu_id' ] , $rows , $layer + 1 ) ;
}
}
return true ;
}
?>
Zo pas ik het toe:
<?php
$menus = array();
$select = $db->query("SELECT menu_id, menu_name, menu_link, menu_view, menu_sub, menu_groep
FROM menus
ORDER BY menu_order ASC");
while($arr = $db->fetch($select)) {
if(menuAccess($arr['menu_groep'], $arr['menu_view'])) {
$menus[] = $arr;
}
}
submenu(0, $menus);
?>
<?php
$select = $db -> query ( "SELECT menu_id, menu_name, menu_link, menu_view, menu_sub, menu_groep
FROM menus
ORDER BY menu_order ASC" ) ;
while ( $arr = $db -> fetch ( $select ) ) {
if ( menuAccess( $arr [ 'menu_groep' ] , $arr [ 'menu_view' ] ) ) {
$menus [ ] = $arr ;
}
}
submenu( 0 , $menus ) ;
?>
De functie menuAccess heb ik van dit script "gejat" . (Dank aan Rens)
10 antwoorden
Gesponsorde links
delta_004 - 06/11/2007 08:28
Onbekend
Dat is hierin niet mogelijk, je geeft nu alleen het PHP gedeelte. Maar je ziet ergens in je html een mouseover ofzo? Probeer dat eens te veranderen naar onClick
Ultimatum - 06/11/2007 08:53
PHP expert
Huh? Wat bedoel je. Dat bedoel ik niet, en hier staat toch mijn html in? (Regel 10, eerste blok). En ik wil het aan de hand van GET doen ofzo, niet met javascript of wat dan ook..
Grayen - 06/11/2007 14:03
PHP ver gevorderde
Zoiets? Ik weet niet of het werkt, want ik kan het nu niet testen, maar in theorie moet het kloppen, omdat je nu controleert of de parentmenu zijn submenu's wel mag weergeven.
<?php
function submenu($current, $rows, $layer = 0) {
global $settings;
foreach($rows as $key => $value) {
if($value['menu_sub'] == $current) {
echo '<li><a href="'. $settings['url'] .'/'. (!empty($value['menu_groep']) ? $value['menu_groep'] : '') .'/'. strtolower($value['menu_link']) .'/">'. $value['menu_name'] .'</a></li>' . "\n";
unset($rows[$key]);
if ($value['menu_id'] == $_GET['menu_id']) {
submenu($value['menu_id'], $rows, $layer + 1);
}
}
}
return true;
}
?>
<?php
function submenu( $current , $rows , $layer = 0 ) {
foreach ( $rows as $key => $value ) {
if ( $value [ 'menu_sub' ] == $current ) {
echo '<li><a href="' . $settings [ 'url' ] . '/' . ( ! empty ( $value [ 'menu_groep' ] ) ?
$value [ 'menu_groep' ] : '' ) . '/' . strtolower ( $value [ 'menu_link' ] ) . '/">' . $value [ 'menu_name' ] . '</a></li>' . "\n " ;
if ( $value [ 'menu_id' ] == $_GET [ 'menu_id' ] ) {
submenu( $value [ 'menu_id' ] , $rows , $layer + 1 ) ;
}
}
}
return true ;
}
?>
Ultimatum - 06/11/2007 14:30
PHP expert
Hmm, krijg het echt niet aan de praat. Ik zal eens even wat meer info geven denk ik .
ik heb een veld sub_menu in de database, en daar staat een id van partent in, maar in de url pak ik menu_link. Dus moet ik de een string vergelijken en lukt het niet met een id, zoals jij doet. Ik krijg geen fouten meer opzich, maar er het submenu komt ook niet.
http://plaatscode.be/3928 /
Dit is de ourput die ik krijg als ik bovenstaande draai.
Citaat:
Array ( [p] => docenten/overzichten [letter] => ) Current: 0
# Home
Current: 0
# Overzichten
Array ( [p] => docenten/overzichten [letter] => ) Current: 0
Current: 0
Current: 0
Current: 0
# Loguit
Current: 0
Current: 0
Current: 0
Current: 0
# Loguit
$current is dus altijd 0 waardoor er geen submenu komt, maar weet niet hoe ik het moet oplossen
Grayen - 06/11/2007 14:39
PHP ver gevorderde
Zou je met PHPMyAdmin je MySQL tabel + rijen die erin zitten kunnen geven, dan kan ik het ook testen, anders is het moeilijker om tot de oplossing te komen.
Ultimatum - 06/11/2007 14:55
PHP expert
Beetje een rommeltje maar dit gebruik ik:
DROP TABLE IF EXISTS `menus`;
CREATE TABLE `menus` (
`menu_id` tinyint(3) unsigned NOT NULL auto_increment,
`menu_name` varchar(200) collate latin1_general_ci NOT NULL,
`menu_link` varchar(200) collate latin1_general_ci NOT NULL,
`menu_view` tinyint(1) NOT NULL,
`menu_order` tinyint(2) NOT NULL,
`menu_sub` tinyint(3) unsigned NOT NULL default '0',
`menu_groep` varchar(50) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
INSERT INTO `menus` VALUES ('7','Home','home','0','1','0','0');
INSERT INTO `menus` VALUES ('2','Overzichten','overzichten','3','2','0','docenten');
INSERT INTO `menus` VALUES ('3','Studenten','studentenoverzicht','3','3','2','docenten');
INSERT INTO `menus` VALUES ('4','Bedrijven','bedrijvenoverzicht','3','4','2','docenten');
INSERT INTO `menus` VALUES ('5','Projecten','projectenoverzicht','3','5','2','docenten');
INSERT INTO `menus` VALUES ('8','Login','login','1','2','0','0');
INSERT INTO `menus` VALUES ('9','Aanmelden','aanmelden','1','3','0','0');
INSERT INTO `menus` VALUES ('10','Contact','contact','1','4','0','0');
INSERT INTO `menus` VALUES ('11','Nieuws','nieuws','3','1','0','0');
INSERT INTO `menus` VALUES ('12','Loguit','loguit','2','5','0','0');
DROP TABLE IF EXISTS `menus` ;
CREATE TABLE `menus` (
`menu_id` tinyint( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`menu_name` varchar( 200 ) collate latin1_general_ci NOT NULL ,
`menu_link` varchar( 200 ) collate latin1_general_ci NOT NULL ,
`menu_view` tinyint( 1 ) NOT NULL ,
`menu_order` tinyint( 2 ) NOT NULL ,
`menu_sub` tinyint( 3 ) UNSIGNED NOT NULL DEFAULT '0' ,
`menu_groep` varchar( 50 ) collate latin1_general_ci NOT NULL ,
PRIMARY KEY ( `menu_id` )
) ENGINE= MyISAM AUTO_INCREMENT = 16 DEFAULT CHARSET= latin1 COLLATE= latin1_general_ci;
INSERT INTO `menus` VALUES ( '7' , 'Home' , 'home' , '0' , '1' , '0' , '0' ) ;
INSERT INTO `menus` VALUES ( '2' , 'Overzichten' , 'overzichten' , '3' , '2' , '0' , 'docenten' ) ;
INSERT INTO `menus` VALUES ( '3' , 'Studenten' , 'studentenoverzicht' , '3' , '3' , '2' , 'docenten' ) ;
INSERT INTO `menus` VALUES ( '4' , 'Bedrijven' , 'bedrijvenoverzicht' , '3' , '4' , '2' , 'docenten' ) ;
INSERT INTO `menus` VALUES ( '5' , 'Projecten' , 'projectenoverzicht' , '3' , '5' , '2' , 'docenten' ) ;
INSERT INTO `menus` VALUES ( '8' , 'Login' , 'login' , '1' , '2' , '0' , '0' ) ;
INSERT INTO `menus` VALUES ( '9' , 'Aanmelden' , 'aanmelden' , '1' , '3' , '0' , '0' ) ;
INSERT INTO `menus` VALUES ( '10' , 'Contact' , 'contact' , '1' , '4' , '0' , '0' ) ;
INSERT INTO `menus` VALUES ( '11' , 'Nieuws' , 'nieuws' , '3' , '1' , '0' , '0' ) ;
INSERT INTO `menus` VALUES ( '12' , 'Loguit' , 'loguit' , '2' , '5' , '0' , '0' ) ;
Met het laatste veld controleer ik of iemand toegang heeft als view op 3 staat. (Zie script van Rens in beginpost)
Ultimatum - 06/11/2007 22:55 (laatste wijziging 07/11/2007 07:20)
PHP expert
Bedankt Grayen, zie nu wel de submenus als ik op een link klik. Maar als ik dan op een submenu klik dan verdwijnt alles. Kan het ook zo dat de submenus wel blijven staan?
Heb nu dit, moest paar dingen veranderen
Plaatscode: 3939
btw: lees het nu pas, maar ik hoef ook geen eeuwige submenu's, 2 levels is genoeg
Grayen - 07/11/2007 13:37
PHP ver gevorderde
Omdat je in url geen id hebt maar een link wordt dit best irritant, het makelijkste lijkt mij een sessie hiervoor aan te maken met daarin alle parentmenu's die open staan en dan in plaats van:
$value['menu_link'] == splitPage()
$value [ 'menu_link' ] == splitPage( )
dan zoiets
in_array($value['menu_link'], $_SESSION['subs'])
in_array ( $value [ 'menu_link' ] , $_SESSION [ 'subs' ] )
Ik denk dat je wel begrijpt wat ik bedoel. Op deze manier kun je wel eeuwige subs maken.
Ultimatum - 07/11/2007 13:58 (laatste wijziging 07/11/2007 14:22)
PHP expert
Hmm.., zo kan het ook wel ja. Zal even testen .
Ik heb het nu opgelost met een beetje sturing van Grayen . Heb beetje anders opgelost:
Een extra function subs aangemaakt.
<?php
function submenu($current, $rows, $layer = 0) {
global $settings;
foreach($rows as $key => $value) {
if($value['menu_sub'] == $current) {
echo '<li><a href="'. $settings['url'] .'/'. (!empty($value['menu_groep']) ? $value['menu_groep'] : '') .'/'. strtolower($value['menu_link']) .'/">'. $value['menu_name'] .'</a></li>';
unset($rows[$key]);
if ($value['menu_link'] == splitPage() || in_array(splitPage(), $_SESSION['subs'])) {
submenu($value['menu_id'], $rows, $layer + 1);
}
}
}
return true;
}
function subs() {
global $db;
$_SESSION['subs'] = array();
$select = $db->query("SELECT menu_link
FROM menus
WHERE menu_sub != 0");
while($arr = $db->fetch($select)) {
$_SESSION['subs'][] = $arr['menu_link'];
}
}
?>
<?php
function submenu( $current , $rows , $layer = 0 ) {
foreach ( $rows as $key => $value ) {
if ( $value [ 'menu_sub' ] == $current ) {
echo '<li><a href="' . $settings [ 'url' ] . '/' . ( ! empty ( $value [ 'menu_groep' ] ) ?
$value [ 'menu_groep' ] : '' ) . '/' . strtolower ( $value [ 'menu_link' ] ) . '/">' . $value [ 'menu_name' ] . '</a></li>' ;
if ( $value [ 'menu_link' ] == splitPage
( ) || in_array ( splitPage
( ) , $_SESSION [ 'subs' ] ) ) {
submenu( $value [ 'menu_id' ] , $rows , $layer + 1 ) ;
}
}
}
return true ;
}
function subs( ) {
$_SESSION [ 'subs' ] = array ( ) ;
$select = $db -> query ( "SELECT menu_link
FROM menus
WHERE menu_sub != 0" ) ;
while ( $arr = $db -> fetch ( $select ) ) {
$_SESSION [ 'subs' ] [ ] = $arr [ 'menu_link' ] ;
}
}
?>
En bovenaan index.php de functie subs aanroepen om een sessie met subs te maken:
<?php
if(!isset($_SESSION['subs'])) {
subs();
}
?>
<?php
if ( ! isset ( $_SESSION [ 'subs' ] ) ) {
subs( ) ;
}
?>
Appeltje eitje dus . Bedankt
Gesponsorde links
Dit onderwerp is gesloten .