Recursief menuscript uitbreiden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Fullstack Developer /.NET Core @ Almere

2021-08-16 iSense Fullstack Developer /.NET Core Ben jij een ervaren Fullstack Developer, die graag zijn expertise van NET.Core inzet in een dynamische en bedrijf kritische omgeving? Is een jonge club waar je als IT-team het hart vormt van de organisatie, echt iets voor jou? Lees dan snel verder! ISMA49157 Organisatie Als Fullstack Developer kom je te werken in de regio Almere bij een organisatie, dat als internationale marktleider opereert op het gebied van detailhandel. Vanuit ruim tienduizend locaties verkopen zij hun producten aan de klanten. Om diverse data en bedrijfsprocessen van HR, CRM tot inkoop overzichtelijk in beeld te hebben

Bekijk vacature »

Java ontwikkelaar

Het schrijven van software en applicaties die er echt toe doen, dit doe jij onder andere als Java ontwikkelaar. Wij zoeken een Java ontwikkelaar voor ons hoofdkantoor in Waalwijk voor 40 uur per week. Het schrijven van software en applicaties die er echt toe doen, dit doe jij onder andere als Java ontwikkelaar. DMG, een huis vol mogelijkheden. Als Java ontwikkelaar werk je aan business applicaties, API’s en webservices die zowel binnen het bedrijf als door klanten en/of zakelijke partners worden gebruikt. Op deze manier kunnen we onze klanten nog beter bedienen en kunnen medewerkers hun werk eenvoudiger uitvoeren. Het

Bekijk vacature »

Junior Fullstack JAVA developer @ Regio Eindhoven

2021-10-17 iSense Junior Fullstack JAVA developer Heb je onlangs een hbo-, wo-opleiding of een minor richting de IT afgerond en wil je graag aan de slag als Fullstack JAVA Developer? Lees dan snel verder! Want in februari 2022 start de Experis Academy weer met een leerprogramma waarin IT-experts je opleiden tot developer met als specialisatie JAVA. Dit allemaal met een salaris en een vooruitzicht op een baan bij een topwerkgever. ISNA51135 Wat ga je doen tijdens het Fullstack JAVA ontwikkeltraject? Vanaf februari 2022 krijg jij via de Experis Academy een unieke kans om jouw IT-carrière een kickstart te geven en

Bekijk vacature »

Team Lead PHP

As Team Lead PHP, you make our customers smile by providing great software and building an effective team. How do I become a Team Lead PHP at Coolblue? As a Team Lead Web Development you build and lead a team that excels in providing high-quality and cost-efficient software. You support team members in defining their personal growth goals and with the approach to achieve them. Would you like to become a Team Lead PHP at Coolblue? Read below if the job suits you. You enjoy doing this Building and leading a team that excels in providing high quality and cost

Bekijk vacature »

Senior C# Developer IoT Platform (NL)

Senior C# Developer IoT Platform (NL) Den Haag HBO/WO IT Professional Om alle Unique Loading Devices (ULD's) real-time te kunnen volgen, hebben we een IoT landschap gecreëerd dat ons continu update met de locatie en sensor informatie van de ULD's. Het IoT platform is volledig ontworpen met behulp van AWS serverless componenten en Serverless Architecture staat in het middelpunt van al onze ontwerpen. Enkele van de componenten die we gebruiken zijn AWS IoT services, Amazon Location Services, AWS Lambda enzovoort. Op ons platform vertalen we alle detecties van ULD's, vanuit AWS IoT Core naar relevante informatie over wanneer een ULD

Bekijk vacature »

Senior Lead Developer (Magento) (40u)

ChromeBurner: online marktleider in de motorbranche in Nieuwkuijk is op zoek naar een Senior Lead Magento Developer om nog meer gas te kunnen geven en de volgende stap te maken! Bij ChromeBurner gaan we hard! Momenteel zijn wij, onder andere doordat we wereldwijd opereren, de grootste motorkleding specialist van Nederland. Met gemiddeld 50% groei per jaar zijn we hard op weg om één van de meest toonaangevende bedrijven in onze branche te worden wereldwijd. Deze groei is niet onopgemerkt gebleven, getuigen onze meerdere FD Gazellen awards van de afgelopen jaren en posities in de eCommerce top 50 en Top 250

Bekijk vacature »

Python Developer @ Amsterdam

2021-09-29 iSense Python Developer Ben jij een Python Developer die niets van de wereld wil missen? Wil jij dat jouw werkzaamheden zichtbaar zijn voor een groot publiek? Beschik jij over kennis van de modernste technieken en ben je in staat snel te switchen tussen verschillende projecten? Lees dan snel verder! ISRI51191 Organisatie Onze klant is een ambitieus mediabedrijf, gevestigd in Amsterdam. Om dagelijks tienduizenden mensen te voorzien van het laatste nieuws gebruiken zij diverse digitale middelen. Denk hierbij aan een website, mobiele nieuwsweergave en applicaties. Als Python Developer draag jij zorg voor deze digitale middelen; veel mensen maken hier gebruik

Bekijk vacature »

Salesforce Ontwikkelaar @ Apeldoorn

2021-09-20 iSense Salesforce Ontwikkelaar Heb jij ervaring opgedaan met het ontwikkelen in Salesforce? En lijkt het je tof om te werken binnen een informele organisatie waar jij een groot verschil kan uitmaken op dit gebied? Lees dan snel verder en solliciteer! ISHA50747 Organisatie Als Salesforce Developer kom je te werken bij een informele organisatie, waar groei een groot onderdeel is de afgelopen jaren. Ze zijn gespecialiseerd in meerdere onderdelen; verkoop van producten, met extra dienstverlening erbij en ook concepten rondom de fabrieken momenteel. Dit willen ze nog verder uitbreiden om hun klanten zo de beste service te kunnen geven. Bij

Bekijk vacature »

Front-end Developer / JavaScript @ Nijmegen

2021-07-20 iSense Front-end Developer JavaScript Wil jij als Front-end Developer de kar trekken, een nieuw JavaScript framework implementeren en meedenken met UI oplossingen? Lees dan snel verder en solliciteer! ISK50467 Nieuw Organisatie Je komt als Front-end Developer te werken bij een familiebedrijf, een kleine en zeer succesvolle organisatie. Ze zijn een online verkoopplatform en in Nederland één van de grootste op hun gebied. Ze zijn ook internationaal actief, in de rest van Europa. Totaal werken er ruim 20 collega's, waarvan 6 ontwikkelaars in het IT-team. Het online platform en de applicaties rondom het platform zijn recent geheel vernieuwd en hiervoor

Bekijk vacature »

Stage: Super programmeurs welkom (In Limburg)

Wat ga je doen? Je bouwt mee aan het CMS Serena. Je bouwt mee aan werken-bij websites van klanten. Je helpt met de koppelingen bouwen tussen onze werken-bij websites en diverse software pakketten. Over welke vaardigheden beschik je? Programmeren in PHP. Communicatief vaardig. Teamspeler. Eigen mening. Wat bieden we? 70% van al onze medewerkers hebben ooit stage gelopen bij Getnoticed. We zijn een gezellig bourgondisch bedrijf dat werkt voor de top van Nederland (ABN Amro, T-Mobile, Coolblue en meer). De volgende opties zijn mogelijk Een leerplaats die ook geschikt is voor minder validen Mogelijkheden voor zij-instromers

Bekijk vacature »

Junior Oracle Apex Developer @ Rotterdam

2021-10-05 iSense Junior Oracle Apex Developer Junior Oracle Apex Developer ISBO51165 Organisatie Voor onze klant in de omgeving van Rotterdam zijn we op zoek naar meerdere Oracle Apex Developers. Wordt jij blij van het meebouwen aan eigen software oplossingen bij een groeiend innovatief IT bedrijf, dan is dit iets voor jou! Voor de ontwikkeling van de software wordt er gebruik gemaakt van Oracle Application Express. De organisatie werkt vanuit een gebruikersgroep releasematig samen met haar klanten aan verdere innovaties van de software. De organisatie heeft een inspirerend kantoor in de omgeving van Rotterdam waar vanuit zij een uitdagende werkomgeving kunnen

Bekijk vacature »

Full Stack Java Developer - Banking

Do you have passion for technology and innovation? Are you ready to create innovative solutions to give the financial sector a solid lead in the digital world? Your day to day activities As Full stack Java Developer you will be part of the DevOps team. With a multidisciplinary team you will - in an Agile way - be working on building new functionalities and maintaining existing features. It covers both development and operations; helping to organize the continuous delivery pipeline, connecting to back end systems, performing automated tests and shaping the front end. The high-quality solutions you deliver result in

Bekijk vacature »

GEO-ICT/Smallworld GIS Ontwikkelaar

Bij onze klanten vormen Geographical Information System (GIS) systemen de basis van Asset Data Management. Zie jij het als een uitdaging om als onderdeel van een DEVOPS team de systemen van onze klanten te helpen vormgeven en continu te verbeteren? Wat ga je doen? Ons team heeft als doel nog relevanter te worden voor onze klantengroep van netbeheerders. Wij hebben een grote GEO-ICT Practice en daarmee zijn we in staat een fundamenteel deel van de basisregistratie van assets voor onze klanten vorm te geven. Dat doen we door het bedenken van concepten, onze klanten te adviseren op GEO-ICT gebied en

Bekijk vacature »

Organization Developer

Als Organization Developer help je mee CoolblueBezorgt zo in te richten dat alle Coolblue’ers optimaal hun werk kunnen doen. Wat doe je als Organization Developer bij Coolblue? Heb jij een passie voor HR en het doorvoeren van verbeteringen en wil je deze tastbaar maken door te werken aan interessante projecten? Dan is dit dé functie voor jou. Ook Organization Developer worden bij CoolblueBezorgt? Lees hieronder of het bij je past. Dit vind je leuk om te doen Zorgen voor het juiste organisatiemodel op jouw afdelingen, voor vandaag en voor de toekomst. Samen met afdelingsleidinggevenden bepalen welke functies er zijn, welke

Bekijk vacature »

Applicatieontwikkelaar .NET en of Java

We leven in een wereld die 24/7 draait op technologie. Een mooi gegeven, maar ook een flinke uitdaging. Niet iedereen weet complexe IT-omgevingen up and running te houden. Bij ICT Group weten wij heel goed hoe we alles wél draaiende kunnen houden. Hoe? Samen met onze collega’s van Outsourced Services. Onze (en wellicht jouw toekomstige) collega’s nemen het beheer van software uit handen van onze klanten en zorgen ervoor dat we een mooie balans creëren tussen investering en rendement. Deze afdeling heeft als doel een toegevoegde waarde te zijn voor haar klanten door mee te denken en samen tot innovatieve

Bekijk vacature »
Snelle Jaap

Snelle Jaap

27/06/2019 13:35:53
Quote Anchor link
Ik heb een recursief menu script dat oneindig niveau's diep kan gaan aan de hand van parents en subs maar nu loop ik tegen een probleem aan.

Dit is de situatie:

Momenteel is het menu opgebouwd uit categorieën, dat houd in, hoofdcategorieen en subcategorieen, je kan die oneindig door linken onder elkaar. Dat werkt prima maar nu heb ik in mijn CMS ook `artikelen` dit zijn pagina's die alleen maar onder categorieën kunnen hangen en dus niet oneindig diep, deze gaan maar 1 niveau diep, altijd onder een categorie.

parent_id is het id waarmee een categorie aan een andere categorie is gekoppeld
catid is het id waarmee een artikel aan een categorie is gekoppeld

Het lukt mij niet dit artikelen te tonen in mijn menu.

Momenteel is dit de hoofdquery die alle categorieen ophaalt:

SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC

Op de volgende manier stop ik dan alles in een menu:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
<div id="main-menu" class="main-nav zn_mega_wrapper ">
  <ul id="menu-main-menu" class="main-menu zn_mega_menu">
    <li><a href="home">Home</a></li>
    <?PHP
    $alias
= $_GET['alias'];
    //Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
    $menu = "
    SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
    FROM snm_categories cat
    LEFT JOIN snm_content cnt
    ON cnt.catid = cat.id
    WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
    AND cat.published = 1
    GROUP BY cat.id
    ORDER BY cat.rgt ASC"
;
    $menuconn = $conn->query($menu);
    // Maak een nieuwe array om te vullen met onderstaand resultaat
    $menuData = array(
        'items' => array(),
        'parents' => array()
    );

    // Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
    while($menu = $menuconn->fetch_assoc())
    {

        $menuData['items'][$menu['cat_id']] = $menu;
        $menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];
    }


    // Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
    function buildMenu($parentId, $menuData)
    {

        $html = '';
        if (isset($menuData['parents'][$parentId]))
        {

            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
            if($parentId == '1'){
              $html = '<li>';
            }
else{
              $html = '<ul class="sub-menu">';
            }

            foreach ($menuData['parents'][$parentId] as $itemId)
            {

                $html .= '<li class="menu-item"><a href="info/'.$menuData['items'][$itemId]['cat_alias'].'">'.$menuData['items'][$itemId]['cat_title'].'</a>';

                // Voer deze functie uit binnen de functie loop (recursief)
                $html .= buildMenu($itemId, $menuData);

                $html .= '</li>';
            }

            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
            if($parentId == '1'){
              $html .= '</li>';
            }
else{
              $html .= '</ul>';
            }
        }

        return $html;
    }

    // Echo het resultaat van de functie en geef 1 mee als parent_id
    echo buildMenu(1, $menuData);
    ?>

  </ul>
</div>


Nu probeer ik de artikelen op deze manier erbij te plaatsen:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<div id="main-menu" class="main-nav zn_mega_wrapper ">
  <ul id="menu-main-menu" class="main-menu zn_mega_menu">
    <li><a href="home">Home</a></li>
    <?PHP
    $alias
= $_GET['alias'];
    //Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
    $menu = "
    SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
    FROM snm_categories cat
    LEFT JOIN snm_content cnt
    ON cnt.catid = cat.id
    WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
    AND cat.published = 1
    GROUP BY cat.id
    ORDER BY cat.rgt ASC"
;
    $menuconn = $conn->query($menu);
    // Maak een nieuwe array om te vullen met onderstaand resultaat
    $menuData = array(
        'items' => array(),
        'parents' => array()
    );

    // Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
    while($menu = $menuconn->fetch_assoc())
    {

        $menuData['items'][$menu['cat_id']] = $menu;
        $menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];

        // Hier haal ik de artikelen onder de juiste categorie
        $submenu = "SELECT * FROM snm_content WHERE catid = '".$conn->real_escape_string($menu['cat_id'])."' AND catid NOT IN (8) AND state = 1 ORDER BY ordering";
        $submenuconn = $conn->query($submenu);
        while($submenu = $submenuconn->fetch_assoc()){
          $artikelsubs = '<li class="menu-item"><a href="info/'.$submenu['alias'].'">'.$submenu['title'].'</a>';
        }
    }


    // Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
    function buildMenu($parentId, $menuData)
    {

        $html = '';
        if (isset($menuData['parents'][$parentId]))
        {

            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
            if($parentId == '1'){
              $html = '<li>';
            }
else{
              $html = '<ul class="sub-menu">';
            }

            foreach ($menuData['parents'][$parentId] as $itemId)
            {

                $html .= '<li class="menu-item"><a href="info/'.$menuData['items'][$itemId]['cat_alias'].'">'.$menuData['items'][$itemId]['cat_title'].'</a>';
                // Voer deze functie uit binnen de functie loop (recursief)
                $html .= buildMenu($itemId, $menuData);

                $html .= '</li>';

            }

            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
            if($parentId == '1'){
              $html .= '</li>';
              $html .= $artikelsubs;
            }
else{
              $html .= '</ul>';
            }
        }

        return $html;
    }

    // Echo het resultaat van de functie en geef 1 mee als parent_id
    echo buildMenu(1, $menuData);
    ?>

  </ul>
</div>
Maar helaas zie ik niks in de broncode staan of op de website qua artikelen. Weet iemand waar het misgaat?

Als ik de query in phpmyadmin test met bijvoorbeeld '9' op de plaats van '".$conn->real_escape_string($menu['cat_id'])."' dan krijg ik de juiste data te zien.
 
PHP hulp

PHP hulp

22/10/2021 18:27:38
 
Thomas van den Heuvel

Thomas van den Heuvel

27/06/2019 14:10:14
Quote Anchor link
Quote:
Als ik de query in phpmyadmin test met bijvoorbeeld '9' op de plaats van '".$conn->real_escape_string($menu['cat_id'])."' dan krijg ik de juiste data te zien.

Dit laatste vertelt je alleen dat de oorspronkelijke data die je ophaalt goed / volledig is.

Vervolgens stop je dit in een datastructuur.

En deze datastructuur voer je aan een functie.

Dit zijn dus meerdere stappen.

Controleer de datastructuur $menuData, bijvoorbeeld door deze naar het scherm te dumpen.

Deze regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$menuData
['parents'][$menu['parent_id']][] = $menu['cat_id'];
?>

Is wellicht correct, maar dat zijn geen parents, maar children. Je voegt namelijk het huidige item toe als child van de parent :). En waarom zou je dat uberhaupt compliceren met twee subarrays? Nu kopieer je gewoon de "rauwe" kolomnamen van een recordrij ($menu) naar een array, maar je zou ook nettere/beter leesbare kolommen kunnen definiëren.

De naam $menuconn is ook misleidend. Dit is een result-object, geen connectie-object.

En dan de constructie van regel 23 t/m 34. Een query in een while-loop is vrijwel altijd een "code smell".

Ook het if-statement van regel 40 is niet nodig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (isset($menuData['parents'][$parentId])) { ... }

Je roept namelijk buildMenu() aan in een loop waarin je precies deze items doorloopt, die hoef je dan na aanroep niet nogmaals te controleren...

Als je $menuData nu eens wat zinniger had gestructureerd, bijvoorbeeld door de keys van dit array simpelweg het categorie-id te laten zijn, dan had je met een array_keys() de keys van het array hierop direct (met één query) alle relevante artikelen op kunnen halen.

En als je van dit alles een class had gemaakt, dan hoef je ook niet elke functie-aanroep het hele array mee te geven, de datastructuur kun je opslaan als klasse-variabele.

Ik heb een deja vu. Ik weet vrij zeker dat ik je (mogelijk in een ver verleden) als eens heb voorgesteld om het bouwen van de datastructuur en het weergeven van deze structuur in een HTML-menu beter in afzondering kan doen. Sterker nog, de hele bovenstaande aanpak passeerde daarin volgens mij de revue.

Ik zou dus die datastructuur ($menuData) eens onder de loep nemen en herstructureren zodat je hier handiger gebruik van kunt maken.

Functie om een en ander in leesbare vorm te dumpen:
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
<?php
// escape functie
function escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8'); // aangenomen dat je UTF-8 gebruikt
}

// veilige dump functie (alles wordt weergegeven als tekst en wordt niet geinterpreteerd als HTML/JS)
function dump($in) {
    if (is_array($in)) {
        $in = print_r($in, true);
    }

    echo '<pre>'.escape($in).'</pre>';
}

?>
Gewijzigd op 28/06/2019 12:43:56 door Thomas van den Heuvel
 
Snelle Jaap

Snelle Jaap

02/07/2019 13:47:51
Quote Anchor link
@Tomas van heuvel,

Klopt ik heb al een keer eerder iets gevraagd over dit script. Bedankt voor de uitleg ik ga proberen er iets mee te doen.
 



Overzicht Reageren

 
 

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.