Toon posts:

Recursief menu met product totalen.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Hallo,

Ik probeer een menu te maken met aan het einde product totalen alleen kom ik maar niet tot het gewenste resultaat.

het resultaat dat ik wil hebben is:
Dell ( 1)
--Computer (1)
---Datacable ( 1)
----Extra Sub ( 0)
maar wat ik nu krijg is:
Dell ( 0)
--Computer ( 0)
---Datacable ( 1)
----Extra Sub ( 0)
de code die ik hiervoor gebruik is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function buildMenu($parentId, $menuData)
{
    $html = '';
    if (isset($menuData['parents'][$parentId]))
    {
        $html = '<ul>';
        $i = 0;
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $iCount  = ($menuData['items'][$itemId]['product_id'] != NULL) ? $menuData['items'][$itemId]['count'] : '0';
            $html   .= '<li>' . $menuData['items'][$itemId]['name'] . ' ( ' . $iCount . ') ';
            $html   .= buildMenu($itemId, $menuData);
            $html   .= '</li>';
        }
        $html .= '</ul>';
    }
    return $html;
}


Heeft iemand een idee om me op weg te helpen? Want ik zit me helemaal tureluur te staren op deze code.

[Voor 0% gewijzigd door BtM909 op 08-07-2011 13:00]


Acties:
  • 0Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 30-11-2022
Laat je buildMenu het aantal items returnen en tel dit bij elkaar op en je bent er.

Acties:
  • 0Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Kan je de structuur van $menuData eens laten zien?

Freelance Unity3D developer


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
PHP:
1
2
3
4
$menuData = array(
    'items' => array(),
    'parents' => array()
);

[Voor 8% gewijzigd door DirkZzZ op 08-07-2011 13:13. Reden: PHP ipv CODE tag]


Acties:
  • 0Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 08-06 08:38

Armageddon_2k

Trotse eigenaar: Yamaha R6

Een array met parents?
Ik snap dat een Object meerdere Items kan hebben, maar waarom meerdere parents?

[Voor 5% gewijzigd door Armageddon_2k op 08-07-2011 13:11]


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Armageddon_2k schreef op vrijdag 08 juli 2011 @ 13:11:
Een array met parents?
Ik snap dat een Object meerdere Items kan hebben, maar waarom meerdere parents?
Kwam omdat ik Crisp's blog: Formatting a multi-level menu using only one query als basis had gebruikt. ( Van een mede-tweaker ).

had het zelf ook al geprobeerd maar kwam toen ook vast te zitten, daardoor gaan googlen.
Armageddon_2k schreef op vrijdag 08 juli 2011 @ 13:11:
Een array met parents?
Ik snap dat een Object meerdere Items kan hebben, maar waarom meerdere parents?
Omdat ik meerdere toplevel menu's heb.


Maar de parent is al berekend wanneer de subitems komen, dus in mijn manier van denken gaat volgens mij daar al fout.

[Voor 26% gewijzigd door DirkZzZ op 08-07-2011 13:20]


Acties:
  • 0Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 08-06 08:38

Armageddon_2k

Trotse eigenaar: Yamaha R6

Nou, aangezien je je tree van top down in HTML aan het bouwen bent.
Gaat dit nooit goed komen volgens mij, want je bouwt je tree top-down op, maar je wilt van bottoms-up je getallen doorgeven.

Ik wil je aanraden nog even naar de mogelijkheden van recursief te kijken, en te begrijpen wat er allemaal gebeurt. Want net als een array met parents zou ik nooi gaan gebruiken, de kracht van recursie is dat je elke keer dezelfde fucntie/object gebruikt.

bijvoorbeeld:
[Systeem][Merk][Onderdeel]

Als ik van Onderdeel naar systeem wil, dan vraag ik de parent van onderdeel (Merk) en daar ook weer de parent van(Systeem). Het voordeel is dat je op die manier oneidnig diep kan gaan zonder dat je bij elke laag bakken met data gaat bijhouden.

Editje
-Heb het voorbeeld dat je gebruikt hebt even door gelezen, ik snap nu waarom er een parents array gebruikt is. Dus die opmerking mag je vergeten :P
Maar dan alsnog je bouwt je menu top-down, en dan kan je nooit je gegevens op dezelfde manier ook bottoms-up ophalen.

Nog een Edit
Voorbeeld (Van top-down)

Hoofdmenu Hier maak je al je hoofdmenu inclusief (0)
---Submenu
---Submenu Hier maak je al je submenu inclusief (0)
------Subsubmenu Hier kom je er pas achter dat je een (1) hebt

Je ziet dat al je hoofdmenu's al klaar zijn voordat jij er achter bent dat je eigenlijk een (1) had moeten hebben.

[Voor 31% gewijzigd door Armageddon_2k op 08-07-2011 13:33]


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Ja, dat snap ik.
Het ging me er meer om hoe ik het dan wel zou moeten doen.
Een extra functie, de huidige functie compleet ombouwen?

Acties:
  • 0Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 30-11-2022
Zoals ik net al zei, als je buildMenu het aantal items wat eronder hangt laat teruggeven, dan kan je deze optellen in de huidige scope van je functie. Dit getal + de items die eronder hanger return je dan weer.

/edit
Ik zie dat je functie ook de html al returned. Je zou een array kunnen returnen, alleen is dit niet de mooiste oplossing. Wat eventueel nog een oplossing is, is objecten gebruiken daar een methode aan te maken welke het aantal van het huidige element + die van je children teruggeeft.

[Voor 41% gewijzigd door Phoenix1337 op 08-07-2011 13:43]


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Bedankt voor de antwoorden, ik zal het eens bouwen.

Acties:
  • 0Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 09-06 10:58
Volgens mij moet je eerst alle counts gaan verzamelen. Je hebt namelijk het aantal al geprint op het moment dat je de result van buildMenu terug krijgt. Die kan je dus al niets meer laten returnen.
edit: dat is min of meer wat Phoenix1337 ook zegt

[Voor 11% gewijzigd door jip_86 op 08-07-2011 13:50]


Acties:
  • 0Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 30-11-2022
Dat ligt er maar net aan of je t pre-order, in-order of post-order doet.

Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Mijn idee nu was eigenlijk om een extra functie te bouwen, die bij de onderliggende categoriën de totalen optelt.

Acties:
  • 0Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 12:23
Eigenlijk wil je gewoon, zoals eerder aangegeven, een tree bouwen van objecten, op dit object een count bijhouden en een methode voor html output maken en deze dan postorder doorheenlopen. Dan kan je je html opbouwen in 1 functie incl de totalen.

Acties:
  • 0Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 30-11-2022
Een objectstructuur is inderdaad netter en makkelijker.

Acties:
  • 0Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 13-04-2019
En als je dan toch mooi met objecten werkt dan kun je meteen countable implementeren. ;) :Y

[Voor 5% gewijzigd door iH8 op 08-07-2011 14:15. Reden: verkeerde link]

Aunt bunny is coming to get me!


Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
iH8 schreef op vrijdag 08 juli 2011 @ 14:11:
En als je dan toch mooi met objecten werkt dan kun je meteen countable implementeren. ;) :Y
Daar mee kan ik toch niet het totaal aantal produten dat in de database onder een parent_id valt tellen?

Acties:
  • 0Henk 'm!

  • Siebsel
  • Registratie: November 2004
  • Laatst online: 09-06 15:40
DirkZzZ schreef op vrijdag 08 juli 2011 @ 14:14:
[...]


Daar mee kan ik toch niet het totaal aantal produten dat in de database onder een parent_id valt tellen?
Wat wil je dan tellen? Als ik het goed begrijp zit in Datacable een X aantal producten, die je in alle bovenliggende groepen weer wil geven? Dus onderstaand voorbeeld is ook mogelijk:
Dell (135)
--Computer (130)
---Datacable (125)
----Extra Sub (5)
--Screen (5)
edit: ik ga er dus vanuit dat je in totaal 135 Dell artikelen hebt, 130 computer artikelen waarvan 125 datakabels en 5 "extra's" en 5 screen producten

[Voor 13% gewijzigd door Siebsel op 08-07-2011 14:21]


Acties:
  • 0Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 09-06 10:58
Jawel, je moet een count methode implementeren. In die count methode implementeer je je count gedrag wat jij wilt.

Acties:
  • 0Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 29-04 14:43
Siebsel schreef op vrijdag 08 juli 2011 @ 14:17:
[...]


Wat wil je dan tellen? Als ik het goed begrijp zit in Datacable een X aantal producten, die je in alle bovenliggende groepen weer wil geven? Dus onderstaand voorbeeld is ook mogelijk:


[...]


edit: ik ga er dus vanuit dat je in totaal 135 Dell artikelen hebt, 130 computer artikelen waarvan 125 datakabels en 5 "extra's" en 5 screen producten
Exact, dit is wat ik zoek.
Ik zie echter door de bomen het bos niet meer.

Acties:
  • 0Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 12:23
Caelorum schreef op vrijdag 08 juli 2011 @ 14:01:
Eigenlijk wil je gewoon, zoals eerder aangegeven, een tree bouwen van objecten, op dit object een count bijhouden en een methode voor html output maken en deze dan postorder doorheen lopen. Dan kan je je html opbouwen in 1 functie incl de totalen.
Dat dus, zoals al meerdere keren aangegeven.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee