[PHP/MYSQL] recursive tree vullen en items verplaatsen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • klaaz
  • Registratie: April 2000
  • Laatst online: 18-09 22:37

klaaz

it's me!

Topicstarter
Ik heb al een tijdje geleden een werkend systeem gemaakt om een mooi javascript boompje te bouwen uit een mysql tabel. Deze werkt keurig recursive mbv 2 velden: ID en ID1, waarvan ID1 de koppeling met de parent (ID) is:
code:
1
2
3
4
5
6
7
id  id1  menu_nl
1   0    Hoofdmenu1
2   1      subitem1-1
3   1      subitem1-2
4   0    Hoofdmenu2
5   4      subitem2-1
6   4      subitem2-2
etc.

Het werkt heel aardig maar ik zou het graag uit wilen breiden met enkele mogelijkheden. Zo is het alleen mogelijk om de desbetreffende records te wijzigen en nieuwe toe te voegen. Na toevoegen wordt ID automatisch opgehoogd en de betreffende parentID wordt ingevuld in ID2

De nieuwe records worden relatief aan ID2 maar met een opgehoogd ID toegevoegd en komen dus altijd onderaan in het treelevel te staan.

Ik wil nu echter de mogelijkheid in bouwen om binnen de childs de records omhoog danwel naar beneden te verplaatsen, met andere woorden de volgorde te veranderen. Het fysiek verplaatsen is geen probleem. Kwestie van ID's omwisselen en zorgen dat de children meeveranderd worden.

Wat ik echter graag zou willen is dat in de tree duidelijk zichtbaar is welke nodes (children) omhoog, danwel naar beneden verplaatst kunnen worden, en wel door middel van een pijltje.

Voorbeeld:
code:
1
2
3
4
5
6
7
id  id1  menu_nl
1   0    Hoofdmenu1
2   1      subitem1-1   v
3   1      subitem1-2 ^ v
4   1      subitem1-3 ^ v
5   1      subitem1-4 ^ v
6   1      subitem1-5 ^

De query waarmee de zaak wordt ingelezen is nu als volgt:
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
$qry1 = "SELECT id, id1, menu_nl, visible, type FROM tabelletje order by id1 asc, id asc";
$result1 = mysql_query($qry1);
if (mysql_num_rows($result1)) // Indien resultaat
   {
      while($row = mysql_fetch_object($result1)) // Zolang resultaat
         {
            $a=0; // Eerste record
            while ($a < mysql_num_rows($result1)) // Zolang nog records over
               {
                  $_id   = mysql_result($result1, $a, "id");
                  $_id1 = mysql_result($result1, $a, "id1");
                  $MenuArray [$a]["id"] = mysql_result($result1, $a, "id");
                  $MenuArray [$a]["id1"] = mysql_result($result1, $a, "id1");
                  $MenuArray [$a]["Menu"] = mysql_result($result1, $a, "menu_nl");
                  $MenuArray [$a]["Link"] = "index.php?object=website&id=$_id";
                  if(?)
                     $MenuArray [$a]["up"] = "yes";
                  if(?)
                     $MenuArray [$a]["down"] = "yes";
               }
            ++$a;
         }
     }
}

Zoals wel duidelijk zal zijn wordt een array gevuld met de resultaten uit de query. Deze resultaten worden vervolgens met php en javascript in een mooie tree gegoten. De arraywaarden up en down moeten de informatie bevatten of de betreffende node ($a) omhoog, danwel omlaag verplaatst mag worden, wat zichtbaar moet zijn in de vorm van het pijltje in eerder genoemd voorbeeld. De resultaten uit de ene, grote query moeten dus gegroepeerd worden op de een of andere manier. Dit lukt mij niet zonder allerlei extra querys erop los te laten waardoor het geheel buitengewoon inefficient en onoverzichtelijk gaat worden.

Ik heb het idee dat ik langs de oplossing kijk... :(

[ Voor 8% gewijzigd door klaaz op 31-05-2005 15:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Extra veld toevoegen in de 'tree' tabel met volgorde. Numeriek veld, bij het ophalen ORDER BY volgorde gebruiken.

Acties:
  • 0 Henk 'm!

  • klaaz
  • Registratie: April 2000
  • Laatst online: 18-09 22:37

klaaz

it's me!

Topicstarter
Het gaat zoals gezegd niet om het fysiek omwisselen van tweee records, dat gaat prima maar ligt buiten het bestek van dit topic. Het gaat om het afhankelijk van de resultset zichtbaar zijn van pijlen up en down waarmee duidelijk is welke nodes omhoog danwel omlaag KUNNEN worden verplaatst.

Dit zou moeten worden vastgelegd in de arraywaarden $MenuArray [$a]["up"] en $MenuArray [$a]["down"]. Bij het uitlezen van de array verderop in het script wordt dit vertaald naar de pijltjes indien van toepassing.

Bij een parent met één child zal dan geen pijltje zichtbaar zijn bij de child.
Bij een parent met bijvoorbeeld 5 childs zal afhankelijk van de positie van de childnode iets zichtbaar moeten zijn als zichtbaar in het voorbeeld. :)

[ Voor 4% gewijzigd door klaaz op 31-05-2005 22:23 ]


Acties:
  • 0 Henk 'm!

  • Sh0ckTr00per
  • Registratie: Oktober 2003
  • Laatst online: 20-09 08:27
Misschien denk ik nu wel veel te simpel hoor, maar bedoel je dit?

code:
1
2
3
4
  if($a > 0 && $a <> mysql_num_rows($result1))
     $MenuArray [$a]["up"] = "yes";
  if($a < (mysql_num_rows($result1)-1))
     $MenuArray [$a]["down"] = "yes";


Na de eerste als het niet de enige is kun je ze omhoog verplaatsen, en zolang het niet de laatste is kun je ze naar beneden verplaatsen?