nested sortable met 1 select query
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!
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 *
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
Maar wie niet slim is moet creatief zijn zeker :s
Ik loste het zo op.
Code (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
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>
';
}
?>
$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 -
Omdat de topistarter geholpen zal zijn en om onnodige reacties te voorkomen doe ik dit topic dicht.