[php/mysql] Menu sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Oke, ik ben bezig om een menu'tje te maken wat mensen zelf kunnen bewerken, dus de volgorde bepalen, subitems toevoegen enzovoorts. Ik heb dit nu:
PHP:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
    error_reporting ( E_ALL );
    
    $menu = array ();
    
    // $menu [ 'parent_id' ] [] = array ( 'unieke_db_id', 'titel', 'type' (1=component, 2=pagina) );
    $menu [ 0 ] [] = array ( 1, 'Home', 2 );
    $menu [ 0 ] [] = array ( 2, 'Activiteiten', 2 );
    $menu [ 2 ] [] = array ( 3, 'Agenda', 1 );
    $menu [ 2 ] [] = array ( 4, 'Target', 2 );
    $menu [ 0 ] [] = array ( 5, 'Gastenboek', 1 );
    $menu [ 5 ] [] = array ( 6, 'Test', 1 );
    $menu [ 5 ] [] = array ( 7, 'Test', 1 );
    
    /* Functie die menu maakt, deze roept menuItems aan om de items er in te zetten */
    function menu ( $menu, $parent )
    {
        echo "<ul>";
        menuItems ( $menu, $parent );
        echo "\n</ul>\n";
    }

    function menuItems ( $menu, $parent, $level = 0 )
    {
        /* (Sub)items van de parent doorlopen */
        for ( $i = 0; $i < count ( $menu [ $parent ] ); $i ++ )
        {
            /* Variabelen instellen */
            $id = $menu [ $parent ] [ $i ] [ 0 ];
            $titel = $menu [ $parent ] [ $i ] [ 1 ];
            $type = $menu [ $parent ] [ $i ] [ 2 ];
            
            /* Hoever moet dit item inspringen? *alleen voor de tabs, voor de nette html* */
            if ( $parent == 0 )
                echo "\n\t";
            else
                echo "\n\t\t\t";
            
            /* Is dit item een component (mag niet bewerkt worden) of een pagina (mag wel bewerkt worden)? */
            if ( $type == 1 ) // Component.. dus niet bewerken
                echo '<li><a href="#" onclick="window.alert(\'Dit onderdeel is geen pagina, dus kun je deze niet bewerken!\nGa naar de site zelf voor het beheren van dit onderdeel!\');">' . $titel .'</a>';
            elseif ( $type == 2 ) // Component.. dus niet bewerken
                echo '<li><a href="bewerken/' . $id . '">' . $titel .'</a>';
            
            /* Sortering-pijltjes */
            echo ' <a href="menu?actie=omhoog&amp;id=' . $id . '">[img]"omhoog.png"></a><a[/img][img]"omlaag.png"></a[/img]';
            
            /* Heeft dit item subitem(s)? */
            if ( isset ( $menu [ $id ] ) && is_array ( $menu [ $id ] ) )
                echo "\n\t\t<ul>";
            else
                echo "</li>";
            
            /* Is dit een subitem van een item en heeft dít item geen subitems, en is het item 't laatste item van deze 'reeks'? Zoja, deze reeks afsluiten */
            if ( $level == 1 && ! isset ( $menu [ $id ] ) && ! isset ( $menu [ $parent ] [ $i + 1 ] ) )
            {
                echo "\n\t\t</ul>\n\t</li>";
            }
            
            /* Subitems? */
            if ( isset ( $menu [ $id ] ) && is_array ( $menu [ $id ] ) )
                menuItems ( $menu, $id, $level + 1 );
        }
    }

    menu ( $menu, 0 );

?>
*De menu-array wordt later opgehaald uit de database*.

Nu loop ik dus tegen het probleem aan van het sorteren van subitems. Moet ik daarvoor een extra kolom in de database aanmaken? Zoja, hoe bepaald ik de waarde die er in staat, zodat ik niet alle rijen hoef aan te passen? (Volg je me nog?) Of hoe pak ik dit aan?

Ik hoef geen lappen code, gewoon een duwtje in de juiste richting ;)

Heb al gezocht, hier en op google maar niet echt iets duidelijks gevonden..

Hoi!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een extra kolommetje in de database met daarin het ID van de parent doet vaak al wonderen. Daarna zul je alleen, voor zover ik weet, de spullen moeten sorteren met PHP, aangezien dat in SQL volgens mij niet kan bij oneindig diep geneste menu's. Meestal wordt dit met recursie opgelost. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Ik heb al een kolom in de database met 't ID van de parent, da's niet het probleem. ;)
Stel, ik heb 5 subitems, en ik wil de gebruiker laten bepalen welke er boven aankomt, welke er onderaan enzovoorts. Hoe zou ik dát dan moeten doen? Het bepalen waar subitems bij horen ed gaat goed, alleen dat dus niet. :P

Hoi!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Eerst sorteren op parent_id, en daarna op volgorde? Dan staat alles netjes per parent op volgorde, en hoef je alleen maar die hoofdgroepen gesorteerd te krijgen. :P 'Volgorde' is dan een extra veld in je tabel.

[ Voor 13% gewijzigd door NMe op 10-03-2005 20:46 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Hoe pak ik dat veld volgorde aan? Als ik 1, dan 2, dan 3 enzovoorts doe, moet ik toch als ik een item tussen 1 en 2 wil zette, alle items die er na komen ook aanpasse (=veel overbodig werkt, lijkt mij). Of heb ik het fout? :)

Hoi!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Tommetje schreef op donderdag 10 maart 2005 @ 20:47:
Hoe pak ik dat veld volgorde aan? Als ik 1, dan 2, dan 3 enzovoorts doe, moet ik toch als ik een item tussen 1 en 2 wil zette, alle items die er na komen ook aanpasse (=veel overbodig werkt, lijkt mij). Of heb ik het fout? :)
Hoe zou je het anders willen doen dan? ;) Het ID veld kun je er niet voor misbruiken, en verder is er niets dat je volgorde kan aangeven. En zoveel werk is dat niet, zijn twee simpele queries:
code:
1
UPDATE tabel SET volgorde = volgorde + 1 WHERE volgorde >= 2

code:
1
INSERT INTO tabel (.., .., .., .., volgorde) VALUES (.., .., .., .., 2)

Zo insert je op de goeie plaats je zooi, en het kost echt niet veel werk. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Hhhm, heb je gelijk in. Ik ga er vanmiddag eens naar kijken, nu eerst naar school. :P

Hoi!


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Tommetje schreef op donderdag 10 maart 2005 @ 20:25:
Stel, ik heb 5 subitems, en ik wil de gebruiker laten bepalen welke er boven aankomt, welke er onderaan enzovoorts. Hoe zou ik dát dan moeten doen? Het bepalen waar subitems bij horen ed gaat goed, alleen dat dus niet. :P
Wat ik zelf toepas bij een van mijn websites waar een lijst met artikelen staat die ook gesorteerd moeten worden (zelfde volgorde als hardcopy), daar heb ik in de tabel van de artikelen een veld ranking toegevoegd. De gebruiker kan via een overzichtje de volgorde van de artikelen veranderen simpelweg door het getal in de ranking te kiezen.

Nog een kleine tip wat ik zelf lang geleden bij pbase.com gebruikt zag worden is dat de ranking in plaats van 1, 2, 3 etc gaat, daar 10, 20, 30 van te maken. Grote voordeel is dat als je 1 artikel naar voren wilt schuiven, je bv 11 kiest om zo tussen 2 andere artikelen te passen zonder dat je de ranking van andere artikelen aan moet passen. Na elke bevestiging van nieuwe ranking krijgt alles opnieuw de toekenning met stappen van 10.

Ook Knor is aangestoken met het ligfietsvirus!

Pagina: 1