[PHP] Aantal nodes onder node

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
Ik ben bezig met een hierarchische menu structuur voor een soort webshop. Alle categorieën moeten dus worden getoond als menu met daaronder weer submenu's etc etc.

2 tabellen:

table Categorie:
parentcat_idchildcat_id
01
12
13
24
35


table Hierarchie:
categorie_idnaam
1hoofdcategorie
2categorie1
3categorie2
4subcategorie1
5subcategorie2


Volgens de 'The Adjacency List Model' op sitepoint.

Nou is het me al gelukt om de hele tree te outputten met indent en al, dmv deze functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function showMenu($parentcat, $level)
{
    $sql = "SELECT
             h.*, c.naam
            FROM
             Hierarchie AS h
             LEFT JOIN Categorieen AS c ON c.categorie_id = h.childcat_id
            WHERE h.parentcat_id = '".$parentcat."'
            ";
    $res = mysql_query($sql) or die(mysql_error());
    $tel = mysql_num_rows($res);
    
    while( $row = mysql_fetch_assoc($res) )
    {
        echo str_repeat("--", $level)." ".$row['naam']."<br>";
        
        showMenu($row['childcat_id'], $level+1);
    }
}


Werkt prima, maar ik wil de hele tree in 1x outputten, zodat JSCookMenu het snapt (voor menu weergave, wordt ook gebruikt door oa mambo: klik).

Urls/items moeten zo aangeleverd worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript"><!--
var myMenu =
[
    ['icon', 'title', 'url', 'target', 'description'],  // a menu item
    ['icon', 'title', 'url', 'target', 'description'],  // a menu item
    _cmSplit,
    ['icon', 'title', 'url', 'target', 'description',   // a folder item
        ['icon', 'title', 'url', 'target', 'description'],  // a menu item
        _cmSplit,
        ['icon', 'title', 'url', 'target', 'description'],  // a menu item
        ['icon', 'title', 'url', 'target', 'description',   // a folder item
            ['icon', 'title', 'url', 'target', 'description'],  // a menu item
            ['icon', 'title', 'url', 'target', 'description']  // a menu item
        ]
    ]
];
--></script>


De layout is uiteraard geen probleem, maar om precies op het goede moment de '[' en de ']' te outputten heb ik moeite. Heb van alles geprobeerd, maar krijg het niet voor elkaar. Ik zit te denken dat het misschien mogelijk is als je weet hoeveel nodes er nog onder zitten, zodat je rekening kan houden met het outputten van [ en ], maar weet het niet zeker. Kreeg de functie ook niet gebakken die weer het aantal nodes eronder zou moeten uitrekenen. Aantal nodes erboven is me gelukt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function nodes_above($childcat, $counter=0)
{
    //Haal parent id op behorende bij de meegegeven child
    $res = mysql_query("SELECT
                        h.parentcat_id
                        FROM
                        Hierarchie AS h
                        WHERE childcat_id='".$childcat."' ") or die(mysql_error()); 
    $row = mysql_fetch_assoc($res); 
    
    //Als parent id niet 0 is, dan zijn we nog niet aan het einde van de boom
    if ($row['parentcat_id'] != 0)
    { 
        $counter = nodes_above($row['parentcat_id'], $counter+1);
    }
    return $counter; 
}

Maar zoiets maken voor aantal nodes eronder is volgens mij niet mogelijk... Ik hoop dat iemand mij op weg kan helpen.

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 17-06 06:06
Je kunt de tree outputten d.m.v. een recursieve functie in het bovenste blok code.
Kun je dan niet iets doen als het volgende in pseudo code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function showMenu($parentcat, $level)
{
    $sql = "query"
          
    $res = mysql_query($sql) or die(mysql_error());
    $tel = mysql_num_rows($res);
    
    while( $row = mysql_fetch_assoc($res) )
    {
        echo open blokhaak+ de rest van de opbouw
        
        showMenu($row['childcat_id'], $level+1);
        
        echo sluitBlokhaak

    }
}
?>


nu ontstaat dus dat je voor elk subitem iets dergelijks krijgt [ item [ subitem 1] [ subitem2 ]]

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
bat266 schreef op donderdag 07 december 2006 @ 10:16:
....

nu ontstaat dus dat je voor elk subitem iets dergelijks krijgt [ item [ subitem 1] [ subitem2 ]]
Nee, volgens mij niet. Nu ontstaat:
[item1] [item2] [item3] etc etc. Probleem is dat op bepaalde momenten de ']' weggelaten moet worden en op een ander (later) punt er weer aan moet worden gezet.

[ Voor 63% gewijzigd door RadioheadRules op 07-12-2006 10:33 ]


Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 17-06 06:06
Ik ben ervan overtuigd als je het zo opzet in de while
PHP:
1
2
3
4
5
6
7
8
9
while( $row = mysql_fetch_assoc($res) )
    {
        echo "['icon', 'title', 'url', 'target', 'description' " ;//let op geen sluithaak
        
        showMenu($row['childcat_id'], $level+1);//doet echo van subitems
        
        echo "]"; //hier wel sluithaak

    }


wel mijn output krijgt.

wat je doet is voor hoofditem x en sub item y en z krijg je zoiets
code:
1
2
3
4
5
6
7
8
showmenu(x) echood eerst [ bla bla 
  roept showmenu(y) aan deze echood [bla bla 
  heeft geen childs dus de showmenu doet niks 
  echo ]van showmenu (y)
  roept showmenu(z) aan deze echood [bla bla 
  heeft geen childs dus de showmenu doet niks 
  echo ]van showmenu (z)
echo ] van showmenu(x)

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

  • RadioheadRules
  • Registratie: November 2003
  • Laatst online: 12-03-2009
je hebt gelijk, dit doet hij inderdaad goed, thanks!! Ben nu alleen ff met de kommas aan het rommelen, want die moeten er ook nog tussen ...

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 17-06 06:06
nja dat zal wel lukken met enig puzzelen :) maar werkt natuurlijk volgens hetzelfde recept

Better to remain silent and be thought a fool then to speak out and remove all doubt.

Pagina: 1