Recursief menuscript uitbreiden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front-end .NET developer Internationaal software p

Bedrijfsomschrijving Mijn klant maakt software om vele processen binnen bedrijven te digitaliseren. Ze ontwikkelen een cloud-based platform die dit allemaal regelt. Dit platform is divers, maar het kan onder andere ook de communicatie tussen bedrijven een stuk makkelijker maken op meerdere fronten. Zo kan er makkelijk verschillende vormen van data uitgewisseld worden om zo de administratie goed op orde te houden. Ze hebben duizenden klanten en zijn actief in tientallen landen, ze zijn al een goed gevestigde naam! Functieomschrijving Als .NET developer zal je breed inzetbaar zijn. Het grootste gedeelte van je werk zal zitten in de front-end, maar back-end

Bekijk vacature »

Oracle PL/SQL developer

Wat je gaat doen: In de functie van Oracle Developer werk je zelfstandig of in teamverband mee aan projecten bij onze opdrachtgevers. Je bent verantwoordelijk voor de bouw en implementatie van bedrijfskritische applicaties. Daarnaast adviseer je de opdrachtgever over de inzet van verschillende technologieën tot aan de implementatie van de diverse systemen. Je hebt brede interesse en naast projectervaring met Oracle, heb je veel kennis opgedaan met de traditionele Oracle systemen zoals PL/SQL, Forms en Designer. Via trainingen en opleidingen kunnen we je bijvoorbeeld ook ondersteunen om kennis van APEX te krijgen of te vergroten. Wat we vragen: Minimaal 5

Bekijk vacature »

Low Code Developer

Heb jij passie voor software ontwikkeling en vind je het leuk om eindgebruikers snel te helpen door het realiseren van web en mobiele applicaties? Wil jij ervaring opdoen om van beginnend developer door te ontwikkelen naar een Full Stack ontwikkelaar? Dan is dit jouw topbaan! Met meer dan 100 bedrijven in verschillende product-marktcombinaties is geen dag hetzelfde bij VDL. Wat ga je doen? Als Low Code Developer ga je aan de slag om nieuwe applicaties te ontwikkelen op het gebied van web en mobiele applicaties die onder andere een Make To Order platform ondersteunen. Met behulp van bestaande bouwstenen ben

Bekijk vacature »

Senior Azure Developer

DO - Be passionate, work hard and make it happen! Als Senior Developer maak je deel uit van een enthousiast en gedreven development team, bestaande uit 4 personen. Jij bent de Developer met ervaring die daarbij ook de collega’s weet mee te nemen op een innovatieve reis van nieuwe technologie. De werkzaamheden waar we jouw kennis en ervaring graag voor inzetten zijn met name: Het begeleiden van de transitie naar een volledig Azure landschap met componenten zoals Function Apps, ServiceBus en CosmosDB en de projecten die hieruit voortvloeien Het vormgeven van de integratie architectuur binnen de Microservices omgeving Het bewaken

Bekijk vacature »

Robot Programmeur

Bedrijfsomschrijving: Locatie: regio Harlingen Deze dochteronderneming is gevestigd in Harlingen en al sinds 1999 een specialist op het gebied van productieautomatisering, robotisering en metaalbewerking. Met speciaalmachines, robotisering en productmechanisatie als belangrijkste werkgebieden gaan ze de strijd aan met de meest uitdagende vraagstukken, die de efficiency van de productieprocessen moet verbeteren. Daarin speelt innovatie en nieuwe technologieën een grote rol en dit merk jij als Robot Programmeur zeker. Kortom; zij maken producten die nog niet bestaan! Sinds 2018 is dit bedrijf onderdeel van een internationale groep met zeven productielocaties in Maleisië, China, Singapore, de USA, Tsjechië en Nederland. Duik jij als

Bekijk vacature »

Junior .NET developer

Functie Wij zijn bezig met het ontwikkelen van een nieuw product en wij hebben jouw hulp hierbij nodig! Als junior .NET ontwikkelaar krijg jij de kans om samen met ons deze nieuwe uitdaging aan te gaan! Momenteel bestaat ons team uit drie interim Software Engineers. Twee hiervan zijn zeer ervaren .NET specialisten die inmiddels hun strepen in dit vakgebied al hebben behaald. Ook hebben wij een junior als onderdeel van ons team die zich op dit moment nog bezig houdt met de Front-end (Angular/TypeScript), maar zich nu ook meer gaat verdiepen in de backend. Wij willen ons team graag verder

Bekijk vacature »

Team Lead/ Lead developer gezocht (Hands-on, PHP,

Functie Als Team Lead ben je de leider van één van de ontwikkelteams binnen de organisatie. Je leidt als lead developer een goed draaiend team dat werkt aan complexe en duurzame applicaties en API’s. Vanuit je kennis en ervaring ben je in staat het grote plaatje te blijven overzien, en kritisch mee te denken over bijvoorbeeld de architectuur, maar ook de algehele aanpak binnen het project. Je laat je team niet alleen technisch goed functioneren maar ben ook betrokken bij het menselijke aspect. Zo weet jij je collega’s te motiveren en begeleiden in hun dagelijkse werk. Buiten het team ben

Bekijk vacature »

PHP Developer

Dit ga je doen Professionaliseren van het plaform Bouwen aan mooie innovaties Testen van het plaform Werken in een Scrumteam Hier ga je werken Je komt als PHP ontwikkelaar te werken in een jonge, innovatieve én snel groeiende scale-up die een gespecialiseerde verkoopplatform heeft opgebouwd. De organisatie is in eerste instantie begonnen in de bouw. Het moederbedrijf bestaat nog steeds en heeft nu ruim 300 medewerkers. De organisatie waarvoor je komt te werken heeft nu 20 man in dienst, waarvan 8 man in het IT-team. Zij zoeken versterking in het IT-team, omdat ze de ambitie hebben om steeds meer te

Bekijk vacature »

Junior Front end developer

Functie Het huidige team bestaat uit 2 UX/UI designers, 2 back-end developer waarvan één de Teamlead is, 2 front-end developers, een supportmedewerker en (heel belangrijk) de kantoorhond (Morale Officer). Vangwege de groei binnen de organisatie gaan ze naar 2 scrum teams toe. 1 product team en 1 delivery team. Elk team zal volledig multidisciplinair werken met ieder een eigen Scrum master. Jij komt te werken in het Delivery team. Het delivery team houdt zich voornamelijk bezig met de implementatie van het SAAS product bij klanten. Binnen jouw rol als front end developer ben je dus bezig met het maken van

Bekijk vacature »

Front-End React Developer

As a Front-End React Developer you improve the user-experience of our web applications for your colleagues in Coolblue. How do I become a Front-End React Developer at Coolblue? As a Front-End React Developer you are responsible for developing user interface components and implementing them using React.js concepts and workflows. You work with the UX Designer and get energy from coming up with creative solutions and present these within the team. During the day you gather and welcome feedback on your technical and soft skills. Would you like to become a Front-End React Developer at Coolblue? Read below if the job

Bekijk vacature »

Python Developer

Dit ga je doen Jij gaat je als Python Developer voornamelijk bezighouden met: Het importeren en combineren van data(sets); Het schakelen met verschillende onderzoekers en collega's; Het ontwikkelen, testen en implementeren van applicaties en het uitvoeren van controles (Python, JSON); Het ontsluiten van data middels API's; Het maken van koppelingen middels Python en het meedenken over de inzet van Artificial Intelligence/Machine Learning. Hier ga je werken Wat ga je doen? Als Python Developer zul jij je voornamelijk bezig houden met het ontwikkelen, testen en implementeren van applicaties en ligt jouw focus op het combineren van data en slimme oplossingen. De

Bekijk vacature »

Developer Delphi C++ / C++ / 3.000 - 4.700

Samengevat: Deze werkgever levert industriële besturingssystemen, software en kennis. Ben jij een enthousiaste PC programmeur? Heb je kennis van C++? Vaste baan: PC Programmeur Delphi C++ 3.000 - 4.700 PC Programmeur Deze werkgever is specialist op gebied van vision en ontwikkelen wereldwijd speciale machines. Wij verzorgen zelf de besturingstechniek. Deze werkgever is sterk in GPS systemen en leveren ook complete lijnen voor de verpakkingsindustrie. Wij streven naar verbetering, innovatie van complete machinelijnen. Wij hebben op gebied van engineering veel kennis in huis. Een gezond en prettig werkklimaat, waar jij je vaardigheden snel kunt laten groeien. Zij werken voor grote klanten.

Bekijk vacature »

Senior Java developer (backend)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Full-stack Developer

Vacature .Net Full-stack Web Developer Voor onze opdrachtgever Eclipse zijn wij zoek naar een .Net developer. Eclipse is een jonge snelgroeiende en dynamische ICT-organisatie gevestigd in ’s-Hertogenbosch. Haar missie: het bieden van intelligente multimediale marketingcommunicatie op maat om bedrijven in de schijnwerpers te zetten. Klinkt leuk toch? Vinden wij ook! Kom jij het team van Eclipse versterken als .Net Full-stack Web Developer? Functieomschrijving Op dit moment werken er ongeveer 20 mensen heel hard samen aan het ontwikkelen van communicatieoplossingen voor hun klanten. In deze oplossingen staat het verrijken en verwerken van klantdata uit verschillende omgevingen via workflow gestuurde processen centraal.

Bekijk vacature »

Robot Programmeur

Bedrijfsomschrijving: Locatie: regio Almelo Deze dochteronderneming is gevestigd in Almelo en al sinds 1999 een specialist op het gebied van productieautomatisering, robotisering en metaalbewerking. Met speciaalmachines, robotisering en productmechanisatie als belangrijkste werkgebieden gaan ze de strijd aan met de meest uitdagende vraagstukken, die de efficiency van de productieprocessen moet verbeteren. Daarin speelt innovatie en nieuwe technologieën een grote rol en dit merk jij als Robot Programmeur zeker. Kortom; zij maken producten die nog niet bestaan! Sinds 2018 is dit bedrijf onderdeel van een internationale groep met zeven productielocaties in Maleisië, China, Singapore, de USA, Tsjechië en Nederland. Duik jij als

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

07/10/2022 13:01:48
 
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.