Recursief menuscript uitbreiden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Android Developer

As a Mobile Developer, you make sure our mobile app gives our users the best possible way to buy, browse and interact with Coolblue. How do I become a Android Developer at Coolblue? Your specialty is Android so you are successful in writing Kotlin in an agile fashion and do some pair programming with your colleagues to guarantee higher quality. Besides that you think about technical decisions like architecture, tools and processes. You also keep an eye on the performance of the app and you analyse with your team how to improve it. In short, you get energy from building

Bekijk vacature »

Java Developer / Interne job / Leaseauto / Groeipa

Bedrijfsomschrijving Deze ambitieuze organisatie is inmiddels 50 man groot en ze werken nationaal voor grote organisaties en instanties die hulp nodig hebben bij het ontwikkelen van diverse applicaties. Denk hierbij aan overheden, nutsbedrijven, banken, echter ook not-for-profit instellingen maken gebruik van de kennis en ervaring van de medewerkers van mijn klant. Ze ontwikkelen voornamelijk in Java en gebruiken front-end Angular. Men gaat starten met eigen interne projecten die op kantoor in Amersfoort gemaakt gaan worden. Hierdoor hoeft er dus niet naar eindklanten afgereisd te worden aangezien het een interne baan is. Ondanks dat het intern is bieden ze medewerkers die

Bekijk vacature »

Senior Java Developer (NL)

Senior Java Developer (NL) Den Haag HBO/WO IT Professional Als Senior Java Developer bij PostNL Pakketten impact maken op de groeiende E-commerce markt met onze logistieke software. Je doet dit door complexe bedrijf kritische logistieke business processen te vertalen naar de ontwikkeling en uitbreiding van onze Cloud IT-platformen en software oplossingen. Wat ga je doen? Supply chain logistiek is de wetenschap en kunst van het controleren en beheren van de stroom van middelen, informatie en goederen van de ene bestemming naar de andere. Een essentiële vereiste voor het bereiken van operational excellence in een supply chain is vooruitzien! En dan

Bekijk vacature »

Delphi Developer

As a Delphi Developer you work together with other development teams to make our back-office applications work as optimal as possible. How do I become a Delphi Developer at Coolblue? You work together with other development teams to make our back-office applications work as optimal as possible, being extending features or migrating them to APIs. Everything to put a smile in our colleagues' faces! Although you are a Delphi Developer, you are not averse to a some C# or JavaScript. Would you also like to become a Delphi Developer at Coolblue? Read below if the job suits you. You enjoy

Bekijk vacature »

Junior Front-End Developer

Je maakt een vliegende start van je carrière, door meteen mee te bouwen aan de digitale aspecten van Coolblue. Wat doe je als Junior Front-End Developer bij Coolblue? Als Junior Front-End Developer ben je meteen vanaf de start onderdeel van een development team. Je kijkt veel mee met collega’s en volgt trainingen om te groeien als Junior Developer. Op dat moment komt je wil om steeds te blijven leren naar boven. Daarnaast pak je in de sprints ook je eigen stories op om Coolblue iedere dag een beetje beter te maken. Je sterk analytisch vermogen komt dan goed van pas!

Bekijk vacature »

Lead Software Developer

De afdeling ICT is belangrijk binnen onze organisatie. Deze afdeling ontwikkelt zich steeds meer naar een flexibele, innovatieve en zakelijke organisatie, die marktconform werkt en een hoogwaardig aanbod aan diensten biedt. We kennen een grote diversiteit aan systemen (ERP, Warehouse management, Enterprise Service Bus, BI, e-commerce). Onlangs hebben we onze systemen vernieuwd. Ter versterking van deze afdeling zijn we op zoek naar een enthousiaste collega voor de functie van: Lead Software Developer (32 – 40 uur) Als Lead Software Developer geef je vakinhoudelijk leiding aan het ontwikkelteam en ben je samen met jouw teamleden verantwoordelijk voor het verder ontwikkelen van

Bekijk vacature »

Senior Java Ontwikkelaar @ Amsterdam

2021-08-11 iSense Senior Java Ontwikkelaar Ben jij een ervaren Java Developer en lijkt het jou gaaf om te werken aan innovatieve interne projecten voor een groot aantal aansprekende klanten? Spreekt het jou daarnaast aan om te gaan werken bij een van de nummer 1 organisaties in Nederland wanneer het gaat om maatschappelijk betrokken oplossingen? Lees dan snel verder! ISTA50719 Organisatie Als Java Developer kom je te werken bij een internationale organisatie in regio Amsterdam die zich richt op procesoptimalisatie door middel van zeer complexe IT oplossingen. Dit doen zij op het allerhoogste niveau met vestigingen over heel de wereld en

Bekijk vacature »

Senior Azure Developer / Java @ Amsterdam

2021-08-25 iSense Senior Azure Developer Java Are you an ambitious Cloud Developer, with proven experience in Java and creating APIs? Do you have experience working with Azure frameworks? And are you passionate about enabling your team members to deliver the best possible results? If your answers are yes, then don't hesitate to apply! Please note: You need to already be living in the Netherlands for this position! ISDI47772 Organisatie You will work in Amsterdam for a big financial company. This organization is an international financial service provider and is operating on the basis of cooperative principles. The culture of the

Bekijk vacature »

BPM Developer

Je levert een belangrijke bijdrage aan de optimalisatie en inrichting van onze processen. Voor ons hoofdkantoor in Waalwijk zoeken wij een BPM Developer voor 32 tot 40 uur per week. Als BPM Developer lever je een belangrijke bijdrage aan de optimalisatie en inrichting van onze processen. Je levert een coördinerende en uitvoerende bijdrage in elke fase van de digitalisering van ons bedrijf. DMG, een huis vol mogelijkheden. DMG werkt met de software van Pegasystems. We werken zeer nauw samen met de Pega organisatie in NL, USA en India. DMG is begonnen met de invoering van Customer Service, Sales en Field

Bekijk vacature »

Ervaren Java developer met eigen visie voor nieuw

Bedrijfsomschrijving Voor dit familiebedrijf in Aalsmeer ben ik op zoek naar een ervaren software developer op het gebied van Java. Het bedrijf is gespecialiseerd in de ontwikkeling van zowel online als offline transactiesystemen. Zo hebben ze onder andere een online platform ontwikkeld waar zowel consumenten als bedrijven zaken als beltegoed, loterijsystemen, toegangskaarten en giftcards gemakkelijk kunnen aanschaffen. Dat betekent onder meer dat de software toepassingen geïntegreerd worden in kassa's van supermarkten maar ook bij honderden tankstations in Nederland. Momenteel zijn ze met twaalf personen en ondergaan ze een sterke groei. De sfeer is informeel en ze vinden het erg belangrijk

Bekijk vacature »

Software Developer Azure .NET

Eindhoven Bij OrangeNXT werken wij met een team dat beschikt over diepgaande kennis en expertise over digitale transformatie. Wij brengen people, devices en data moeiteloos bij elkaar. Dit doen we met een team dat bestaat uit diverse expertises: data engineers, data scientist, azure developers en we hopen jou als .NET (en Azure) developer aan ons team toe te voegen! Ben jij een kei in het ontwerpen en coderen van software, maar wil je meer dan dat? Ben je klaar voor een volgende stap en heb je een gezonde groei ambitie? Dan zijn wij op zoek naar jou. Ter uitbreiding van

Bekijk vacature »

C# .NET Core Ontwikkelaar

Locatie: Veel van onze werkzaamheden voeren wij uit op ons kantoor in Barendrecht of Nieuwegein of bij onze klanten in de regio. Momenteel werken wij zoveel mogelijk vanuit huis. In de toekomst zullen we juiste balans bieden tussen thuiswerken, op kantoor en of klant locatie. Binnen het domein transport en logistiek hebben wij dagelijks te maken met uitdagende vraagstukken op onder andere het vlak van Iot. Zo ontwikkelen wij bijvoorbeeld aan een Iot oplossing waar we van ruim 200.000 machines hun telemetrie en events verwerken. Dit komt neer op 200 miljoen berichten per dag. Hierin leggen we de focus op

Bekijk vacature »

Full Stack Java Developer - Infrastructure

Ben jij een ontwikkelaar die wil bijdragen aan de energietransitie? Lees dan verder! Wat ga je doen? Als Full Stack Java Ontwikkelaar draag je verantwoordelijkheid voor het gehele proces van het omzetten van wensen, problemen of vragen naar concrete oplossingen. Integratie, testen, vastleggen van kennis en beslissingen, problem management en automation zijn onderdeel van je takenpakket in SAFE of DevOps gestuurde omgevingen. Als ontwikkelaar krijg je alle mogelijkheden om je technisch verder te ontwikkelen en samen te werken met gedreven collega's. Wat breng je mee? Je hebt gedurende 1 tot 2 jaar een basis opgebouwd in applicatie ontwikkeling met .Net

Bekijk vacature »

Front-end Developer

As a front-end Developer you are responsible for website development and improving customer experience based on data analyze. Do you want to join the new inhouse development team at Nederlandse Loterij? Functie Nederlandse Loterij is on the move and the use of IT and technology is becoming increasingly important. We have a large change agenda and are looking for enthusiastic IT colleagues who want to contribute to this. Nederlandse Loterij is in transition to become a more digital customer-oriented organization, embracing a data-driven way of working, in which we work in multidisciplinary and DevOps teams. You will work in the

Bekijk vacature »

DevOps Engineer

Do you want to fast-track your DevOps career? An opportunity has arisen in Amsterdam for a DevOps Engineer to fast-track their career with full support, as well as own their DevOps function. Here’s why it may interest you: You will own the DevOps space with the freedom to impact their award-winning end-product You will work on new, cloud technologies and learn from highly skilled engineers around you Tech Stack: Python, AWS, Terraform, Ansible, Docker Remote working Salary up to €70.000 with flexibility for the right individual If you would like more information, please reach out for an informal conversation. A

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:12:52
 
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.