[PHP] Menu met submenu items weergeven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een menu uit de database te halen met PHP. Het moet generiek zijn, dus je moet een onbeperkt aantal subitems kunnen toevoegen. Stel mijn database ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
Pages (id,title,parent,sequence)
1,Hoofd 1,0,0
2,Hoofd 2,0,1
3,Sub 1,2,2
4,Sub 2,2,3
5,Subsub 1,4,4
6,Subsub 2,4,5
7,Sub 3,4,6
8,Hoofd 3,0,7

Dan moet dit eruit komen op de een of andere manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<ul>
  <li>Hoofd 1</li>
  <li>
    Hoofd 2
    <ul>
      <li>Sub 1</li>
      <li>
        Sub 2
        <ul>
          <li>Subsub 1</li>
          <li>Subsub 2</li>
        </ul>
      </li>
      <li>Sub 3</li>
    </ul>
  </li>
  <li>Hoofd 3</li>
</ul>

Ik heb al op deze link gekeken en ik wil sowieso 'The Adjacency List Model' gebruiken en niet 'The Nested Set Model'. Het lukt me niet om uit te vinden welke logica hierachter zit. Waarschijnlijk zal er ergens een recursieve functie in moeten staan. Uiteraard wil ik alles bij 1 query houden. Stel ik gebruik deze query:
code:
1
2
3
4
5
SELECT p1.id AS id1,p1.title AS lev1,p2.id AS id2,p2.title AS lev2,p3.id AS id3,p3.title AS lev3
FROM pages AS p1
LEFT JOIN pages AS p2 ON p2.parent=p1.id
LEFT JOIN pages AS p3 ON p3.parent=p2.id
ORDER BY p1.id,p2.id,p3.id

Dan moet je dus van tevoren weten hoeveel niveau's je menu bevat. Daarom moet (?) het dus met de query in de volgende PHP code. Als de database klasse niet duidelijk is hoor ik het wel, maar het spreekt voor zich lijkt me. Ik weet dat je beter eerst een array als resultaat kunt ophalen, maar dat komt later wel. Eerst wil ik weten hoe je zoiets dergelijks maakt. Zo ver ben ik (niet ver dus):
code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$tree = array();
$db->query("SELECT id,title,parent FROM pages ORDER BY sequence");
while ($db->nextRecord()) {
  $pId = $db->f("id");
  $tree[$pId]['title'] = $db->f("title");
  $tree[$pId]['parent'] = $db->f("parent");;
}
foreach ($tree as $pId => $pData) {
  // ????
}

Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 19-09 15:18

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Alleen de order by veranderen naar parent,sequence en de code is 1 op 1 over te zetten :P

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is echt precies wat ik zocht... Je wilt niet weten hoe lang ik hier al naar op zoek ben. Super bedankt!

Nog 1 vraagje, hoe zorg ik er nu voor dat hij inspringt met spaties i.p.v. een <ul> (om in een dropdown te weergeven). Ik heb nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
include("class.database.php");
$db = new database();
$db->query("SELECT id,parent,title FROM pages ORDER BY parent,sequence");
$menuData = array(
    'items' => array(),
    'parents' => array()
); 
while ($db->nextRecord()) {
    $pageId = $db->f("id");
    $pageTitle = $db->f("title");
    $pageParent = $db->f("parent");
    $menuData['items'][$pageId] = $pageTitle;
    $menuData['parents'][$pageParent][] = $pageId;
}
echo "<pre>";
print_r($menuData);
echo "</pre>";
function buildMenu($parentId,$menuData,$space = false,&$spaces = 0)
{
    $html = '';
    if (isset($menuData['parents'][$parentId])) // bestaat het gegeven parentid
    {
                foreach ($menuData['parents'][$parentId] as $itemId) // voor elk gegeven parent id => haal page id op
        {
                        if ($space) {
                            $spaces += 2;
                            $html .= str_repeat('&nbsp;&nbsp;',$spaces);
                        }
                        $space = (isset($menuData['parents'][$itemId])) ? true : false;
                        $html .= $menuData['items'][$itemId].'<br />'; //laat titel van bijbehorende page id zien
            // find childitems recursively
            $html .= buildMenu($itemId,$menuData,$space); // bouw menu met huidige pageid als parent
        }
    }
    return $html;
}
echo buildMenu(0,$menuData); 
?>

En ik krijg dit:
code:
1
2
3
4
5
6
Hoofditem 1
    Subitem 1
    Subsubitem 2
Subsubitem 1
      Subitem 2
    Hoofditem 2

Is iets anders dan de voorbeeldtabel die ik hierboven gebruikt heb, maar je begrijpt het idee. Eerlijk gezegd ben ik maar wat aan het prutsen met die spaties. Volgensmij heb ik sowieso een referentie variabel nodig... Zou het niet kunnen liggen aan de volgorde waarin de array wordt opgebouwd?

[ Voor 74% gewijzigd door Verwijderd op 24-06-2010 20:26 ]


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Dit zou moeten werken :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function buildMenu($parentId, $menuData, $depth=0)
{
    $html = '';
    if (isset($menuData['parents'][$parentId]))
    {
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $html .= str_repeat('&nbsp;', $depth) . $menuData['items'][$itemId].'<br />';
            // find childitems recursively
            $html .= buildMenu($itemId,$menuData,$depth+1);
                        $html .= '&nbsp;&nbsp;';
        }
    }
    return $html;
}
echo buildMenu(0,$menuData); 
?>

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wolfboy schreef op donderdag 24 juni 2010 @ 20:28:
Dit zou moeten werken :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function buildMenu($parentId, $menuData, $depth=0)
{
    $html = '';
    if (isset($menuData['parents'][$parentId]))
    {
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $html .= str_repeat('&nbsp;', $depth) . $menuData['items'][$itemId].'<br />';
            // find childitems recursively
            $html .= buildMenu($itemId,$menuData,$depth+1);
                        $html .= '&nbsp;&nbsp;';
        }
    }
    return $html;
}
echo buildMenu(0,$menuData); 
?>
Damn, waarom lukt me dat zelf nu niet... Als ik het zie is het allemaal zo logisch!

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

We maken er geen scriptrequest van he?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Was ook niet de bedoeling, maar ik kwam er zelf niet uit. Als je me stap voor stap helpt hoor je me niet klagen :)

Maar nu het volgende probleem. Ik probeer deze pagina's weer te geven in een CMS. Voor elke pagina heb je een tabel rij. Voor elke pagina kun je deze omhoog of omlaag verplaatsen, bewerken, verwijderen en nog een paar opties. Dit gaat me volgensmij niet lukken, want omhoog- en omlaag staan bijvoorbeeld voor de paginatitel (dus kolommen links ervan), en bewerken en verwijderen staan er rechts van. Als je de kolommen voor verplaatsen heb gemaakt, ga je kijken of er child-items zijn en deze weergeven. Dan sluit je de rij weer af met gegevens van het vorige element en zo klopt je hele tabelstructuur niet meer. Hoop dat het een beetje te volgen is?

Is dit überhaupt wel op te lossen?

EDIT: begint nu al ergens op te lijken, maar klopt nog niet uiteraard
code:
1
2
3
4
5
6
7
8
9
10
11
12
            function buildMenu($parentId,$menuData,$depth = 0) {
                $html = NULL;
                if (isset($menuData['parents'][$parentId])) {
                    foreach ($menuData['parents'][$parentId] as $itemId) {
                        $row[$itemId] = "<tr><td>omhoog</td><td>omlaag</td>";
                        $row[$itemId] .= str_repeat('&nbsp;&nbsp;&nbsp;', $depth).$menuData['items'][$itemId]['title'];
                        $return[] = buildMenu($itemId,$menuData,$depth+1);
                        $row[$itemId] .= "<td>edit</td><td colspan='4'>delete</td></tr>";
                    }
                }
                return array($row,$return);
            }

[ Voor 24% gewijzigd door Verwijderd op 24-06-2010 22:04 ]


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Totaal onlogische uitleg, en nadat je gewaarschuwd bent voor er geen script request van te maken, post je binnen het uur een volgend probleem.

Een probleem waar je niet eens een uur zelf op gezocht hebt ruikt naar 'kan iemand mijn site in mijn plaats maken?'

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tharulerz schreef op donderdag 24 juni 2010 @ 22:03:
Totaal onlogische uitleg, en nadat je gewaarschuwd bent voor er geen script request van te maken, post je binnen het uur een volgend probleem.

Een probleem waar je niet eens een uur zelf op gezocht hebt ruikt naar 'kan iemand mijn site in mijn plaats maken?'
Ja je hebt gelijk... Ik ga er wel zelf aan verder totdat ik echt niet meer verder kom.
Pagina: 1