nested sortable met 1 select query

Overzicht

Sponsored by: Vacatures door Monsterboard

Racoon smasher

racoon smasher

15/12/2016 21:04:33
Anchor link
Jullie kennen het vast wel nested sortable. handig voor een menu in te delen. Nu ben ik bezig met een CMS en heb ik al vaker met nested sortable gewerkt, maar ik heb geen zin nested repeaters aan te maken voor het sorteren ervan als ik al me data ophaal en dan ontelbaar query's uit te voeren.

Het liefste haal ik al mijn pagina's in 1 keer op (parent id in de row ofcourse) en sorteer ik ze doormiddel van jQuery. Is er iemand die weet hoe dit moet of heeft ergens een tutorial, want ik krijg jammer genoeg niks gevonden. Misschien dat ik verkeerd zoek.

Alvast bedankt!
 
PHP hulp

PHP hulp

17/09/2021 03:38:50
 
Thomas van den Heuvel

Thomas van den Heuvel

16/12/2016 15:04:44
Anchor link
Ik neem aan dat je ook een veld hebt die de volgorde op een bepaalde diepte bijhoudt?

Je zou alle items in één keer kunnen ophalen gesorteerd op parent en vervolgens op volgorde.

Vervolgens kun je de resultaten in een soort datastructuur opslaan waarbij je tevens een "virtueel root element" aanmaakt. Heeft het item geen parent (NULL) verwijst deze naar dit root element. Bij elk element houd je tevens bij wat hun children zijn.

En hier komt de truuk: vanwege de volgorde waarin je de elementen ophaalt kun je een child na afloop toekennen aan zijn parent. Zie het volgende abstracte voorbeeld voor het opbouwen van de datastructuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// bouw root element in datastructuur
items[0] = array(
    'parent'   => false,
    'children' => array(),
    // en wat je hier nog meer op wilt slaan
)

* loop door items *
// root element?
parentId = <parent id> == NULL ? 0 : <parent id>;

// bouw huidig element in datastructuur
items[<id huidig element>] = array(
    'parentId' => parentId,
    'children' => array(),
    // en wat je hier nog meer op wilt slaan
)

// ken item aan de parent toe als child
items[parentId]['children'][] = <id huidig element>
* einde loop *

Daarna kun je recursief door deze boom heen (volg de children in de datastructuur) om een lijst op volgorde op te halen.

Merk hierbij op dat je tijdens het opbouwen van de datastructuur ook dataverrijking kunt toepassen, zo zou je on-the-fly een (weliswaar) redundant veld (maar kan van pas komen) "diepte" uit kunnen rekenen en toe kunnen voegen aan de elementen.
Gewijzigd op 16/12/2016 15:10:15 door Thomas van den Heuvel
 
Dimitri Velghe

Dimitri Velghe

07/08/2018 07:58:25
Anchor link
Niet volgens de regels van de kunst vermoed ik ....
Maar wie niet slim is moet creatief zijn zeker :s
Ik loste het zo op.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
$teller
= 0;
                                                                    
                                 $sql_q_salon ="SELECT
                                    *
                                    FROM
                                    shop_produkt_type
                                    WHERE
                                    sh_pt_onderdeel_van = 65    
                                    ORDER BY
                                    sh_pt_volgorde"
;
                                    $r_list = mysqli_query($con, $sql_q_salon);
                                    while($salon = mysqli_fetch_assoc($r_list))
                                        {

                        $parent[''.$teller.''] = array(
                                                                'id' => $salon['sh_pt_id'],
                                                                'volgorde' => $salon['sh_pt_volgorde'],
                                                                'titel' => $salon['sh_pt_naam_'.$_SESSION['lg'].'']);
                                        
                                        $teller++;
                                        
                                        }

                                  
                              
                                   foreach($parent AS $column)
                                       {

                                       echo'<ul class="column" >
                                            <li class="column-title">'
.$column['titel'].'</li>
                                            '
;  
                                        
                                        
                                            $q_list ="SELECT
                                                *
                                                FROM
                                                shop_produkt_type
                                                WHERE
                                                sh_pt_onderdeel_van = '"
.$column['id']."'    
                                                
                                                "
;
                                            $r_list = mysqli_query($con, $q_list) or die (mysqli_error());
                                            while($list = mysqli_fetch_assoc($r_list))
                                                {

                                                echo'<li><a href="/?view=category&id='.$list['sh_pt_id'].'">'.$list['sh_pt_naam_'.$_SESSION['lg'].''].'</a></li>
                                                '
;
                                                }

                                        
                                        echo'</ul>
                                        '
;
                                        }

?>
Gewijzigd op 07/08/2018 21:12:53 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

07/08/2018 21:13:53
Anchor link
Bedankt voor het delen, maar je reageert nu op een oud topic.
Omdat de topistarter geholpen zal zijn en om onnodige reacties te voorkomen doe ik dit topic dicht.
 
 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.