Recursief menuscript uitbreiden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ervaren C# .NET developer gezocht, hardware interf

Je bent een ervaren .NET C# developer woonachtig in de regio Sliedrecht en op zoek naar een nieuwe uitdaging? Binnen een leuke, kleine en informele club van enthousiaste mensen? En het bouwen van Windows Services en de communicatie tussen software en hardware interfaces spreken je aan? Wellicht dat dit bedrijf dan iets voor jou is. Voor een organisatie in Sliedrecht zijn we op zoek naar een .NET C# developer. Het bedrijf richt zich op een specifieke branche binnen de logistieke sector. Dit doen ze inmiddels ruim 15 jaar en momenteel werken er ruim 50 mensen. Door het succes van hun

Bekijk vacature »

Technisch Applicatiebeheerder

FunctiebeschrijvingTechnisch Applicatiebeheerder: Ben jij een bevlogen specialist die applicaties tot in het diepste weet te doorgronden en die snel en adequaat reageert bij verstoringen? Wat ga je doen? Als Technisch Applicatiebeheerder zorg je voor het continue beschikbaar zijn van applicaties. Je houdt je bezig met het inrichten, monitoren, analyseren en verbeteren van de technische infrastructuur en de procedures rondom de beheerde applicaties. Je test de werking van de aangeboden wijzigingen en lost problemen en verstoringen op. Daarnaast analyseer je de risico’s en impact van nieuwe applicaties of wijzigingen. Je zorgt daarbij altijd dat de systeemdocumentatie op orde is. Samen met

Bekijk vacature »

(assistent) Applicatiebeheerder - ontwikkelaar

Ben jij een kandidaat met enige ervaring in de ICT? Zoek jij een bedrijf waarin je je eigen verantwoordelijkheid krijgt? Lees dan verder! Dit bedrijf zorgt voor ondersteuning in verkoop van banden voor de landelijke bandenafnemers. Ze verzorgen de automatisering en marketing voor deze grossiers. Zo hebben zij een online en custom-made verkoopcatalogus voor hun klanten ter verkoopondersteuning. Jij bent binnen het bedrijf dus een erg belangrijke schakel in het team! Het bedrijf is jarenlang gegroeid. De markt waarin ze zitten is uitdagend en erg in ontwikkeling. Hun specialiteit is de dag levering van honderdduizenden verschillende bandensoorten. Wat ga jij

Bekijk vacature »

Inhouse Junior Java developer (agile) positie

Functieomschrijving Het mooie aan de functie van Junior Java Developer is dat je met alle nieuwe technieken mag gaan werken en inhouse bezig mag zijn met vernieuwende producten/projecten. Deze Java Developer functie is een hele mooie functie voor Developers die van afwisseling houden, maar niet van reizen! Je komt in een van Development teams te werken die DevOps- Agile werken en je hebt naast goed contact met je collega's ook veel contact met je klanten. Zo krijg je directe feedback van klanten over je werk en dat werkt wel zo fijn. Er wordt gewerkt met CI en CD, met AWS

Bekijk vacature »

SAP HANA Developer

SAP HANA Developer Utrecht Technology 13th month pay & Holiday allowance Bonus Program 26 holidays Training & Learning opportunities Laptop & Smartphone 32-40 hours p.w. Are you looking for the opportunity to become "the expert" when it comes to Business Intelligence, Data Analysis, Data Visualization and Data Management within a SAP environment? Then a role as a SAP HANA Developer is the job for you!Your jobYou contribute to the development, delivery and maintenance of business intelligence solutions based on the latest SAP technology. You improve the HANA platform for customers and you work on innovative applications that organizations are keen

Bekijk vacature »

.NET C# web developer met focus op gebruiksvriende

Ben je op zoek naar een baan binnen een klein softwarebedrijf? Een bedrijf met een informele, persoonlijke en familiaire sfeer? Waar je je als developer zowel richt op de back- als frontend? Wellicht dat deze vacature dan iets voor jou is. Voor een softwarebedrijf, gevestigd in het centrum van Rotterdam, zijn we momenteel op zoek naar .NET C# web developer. Dit mag iemand zijn die net van school komt, maar ook iemand die al behoorlijk wat ervaring heeft. Het bedrijf bestaat inmiddels ruim 10 jaar en en door de aanhoudende groei zijn ze opzoek naar versterking van 1 a 2

Bekijk vacature »

Ervaren Front-end developer? Reageer hier direct!

Functieomschrijving In de functie van senior Front-end developer werk je aan complexe software die vernieuwend is. Innovatie en kwaliteit zijn 2 kernpunten die je kunt terug vinden in de projecten. Je werkt hier binnen een Scrum team op de Front-end waar je zowel zelfstandig als samen met team de projecten tot een succes gaat maken. Ze werken ze hier met Angular, React of Vue.js en daarnaast met TypeScript dus kennis van één of meerdere libraries/frameworks is toch wel een must. Functie-eisen - Minimaal een afgeronde HBO diploma en bij voorkeur richting IT; - Je werkt al minimaal 5 jaar als

Bekijk vacature »

Java Developer / Overheid / Complexiteit

Functieomschrijving Wil jij als Java Developer een bijdrage leveren aan een veiliger Nederland en je als Java Developer bezig houden met zeer complexe bedrijfskritische applicaties? Lees dan snel verder! Doorontwikkelen bedrijfskritische applicaties; Aanpassingen maken in de bestaande applicatie; Vertalen van jouw visie op continuous integration en continuous delivery; Debuggen van de applicatie; In gesprek gaan met eindgebruikers om verbetervoorstellen op te halen. Functie-eisen Minimaal HBO-werk en denkniveau; Minimaal 5 jaar werkervaring als Java Developer; Je bent minimaal OCP-Java SE 6 gercertificeerd; Je hebt kennis van Webservices en Continuous Integration; Je bent analytisch sterk en zowel klant- als resultaatgericht. Bedrijfsomschrijving Binnen

Bekijk vacature »

IoT Start-up embedded C developer

Functieomschrijving Onze API stelt grote bedrijven als PostNL in staat om pakketten en boodschappen te bezorgen wanneer u niet thuis bent en zorgt ervoor dat u persoonlijk wordt ontvangen. We zijn op zoek naar een embedded software engineer die verantwoordelijk is voor het ontwerpen en bouwen van een veilige firmware voor onze IoT producten. Je werkt in nauwe samenwerking met drie collega's: een mobiele iOS-ontwikkelaar, een mobile ontwikkelaar voor Android en een ontwikkelaar van elektronica / embedded. Een aantal taken die jij als embedded C developer gaat uitvoeren: - Ontwerp en ontwikkeling van de firmware; - Bouwen van betrouwbare communicatie

Bekijk vacature »

Mobile App Developer

Ons Mobile ontwikkelteam zoekt een fanatieke Mobile App Developer. Ben jij creatief en heb je passie voor het ontwikkelen van apps? Dan zijn wij op zoek naar jou! Jouw baan ChipSoft heeft al diverse apps uitgebracht en het aantal gebruikers hiervan neemt snel toe. De apps doen het erg goed bij de zorginstellingen. Je kunt hierbij denken aan apps verpleegkundigen, thuiszorgmedewerkers, de logistieke dienst en - natuurlijk - de artsen zelf. Door jouw hands-on mentaliteit, eigenwijsheid en technisch inzicht kun je nauwkeurig herbruikbare software schrijven. Die software sluit naadloos aan op onze ‘back end’ (HiX, onze ICT-totaaloplossing voor de zorg).

Bekijk vacature »

SQL Developer / BI / Miljoenen eindgebruikers

Functieomschrijving Altijd al aan de slag willen gaan als Senior SQL Developer bij één van de meest vooraanstaande verzekeraars in Nederland? Wil jij je richten op het bedenken, ontwerpen, bouwen en implementeren van uiteenlopende BI oplossingen vanuit data van miljoenen gebruikers met de Microsoft BI Stack, T-SQL, PowerShell en Datawarehousing? Lees dan nu verder! Analyseren, ontwerpen, ontwikkelen en documenteren van BI oplossingen en complexe BI applicaties (met tools als T-SQL, PowerShell, SAS, SSIS, BIML BODS en BOXI) Maken van technische ontwerpen, data analyses en adviseren over de datawarehouse; Ontwerpen van functionele specificaties voor de dashboards en rapportages; Schakelen met stakeholders

Bekijk vacature »

.NET Developer / C# / Financiele sector

Functieomschrijving Ga jij aan de slag als .NET Developer bij een van de grotere spelers binnen de financiele dienstverlening? Wil jij graag werken met onder andere C#, SQL, MVC, en WCF binnen een grote organisatie om de applicaties binnen de organisatie verder te ontwikkelen en te onderhouden? Lees dan verder! De ontwikkeling, uitbreiding en onderhouden van applicaties binnen de organisatie; Waarborgen van de veiligheid en consistentie van de applicaties; Zorgen dat de eindgebruiker de applicaties effectief kunnen gebruiken; Documenteren van de systemen, op zowel gebruikers niveau, als technisch niveau; Het adviseren van de directie over technische kwesties. Functie-eisen Minimaal HBO

Bekijk vacature »

.NET Developer Zorg-ICT

Wil jij met ChipSoft impact maken in de zorg met jouw technische kennis als Software Developer? En lijkt het jou uitdagend om innovatieve software te ontwikkelen met de laatste Microsoft-tools en technieken? Wat doe jij als Software Developer? Je bent verantwoordelijk voor het ontwerpen, ontwikkelen, ondersteunen en onderhouden van jouw eigen module. Dit gaat om complexe ICT-producten die feilloos moeten functioneren binnen de complexe omgeving van een zorgorganisatie. Je werkt zelfstandig of in teamverband. ChipSoft maakt gebruik van een zelf ontwikkeld multi-tier framework. Tijdens een interne opleiding brengen wij je snel bij hoe je binnen deze architectuur je ontwikkelkunsten kunt

Bekijk vacature »

Full stack software .NET C# developer, domotica me

Voor een bedrijf in de regio Hendrik Ido Ambacht zijn we op zoek naar een fullstack .NET C#developer. Het gaat hier om een bedrijf dat systemen ontwikkeld die via domotica oplossing bieden voor maatschappelijke instellingen. Zo verwerken hun systemen meldingen waarover ze rapporteren, maar ook zorgen ze voor de automatisering van toezicht. Het systeem bestaat uit apps, web interfaces, backend en BI rapportage tools. Het gaat het hier om een MKB bedrijf van circa 70 mensen met een team van 5 developers. Bestaande uit hardware, embedded en backend developers. Momenteel is er daarom sterke behoefte aan iemand die zowel back-

Bekijk vacature »

Front-End Ontwikkelaar

Ben jij een kei in jouw vakgebied en wil je die kennis en ervaring graag inzetten om het aankoopproces van keukens voor onze klanten makkelijker en leuker te maken? Dan zijn wij op zoek naar jou! Wie zijn wij? DKG is de groep achter de succesvolle Nederlandse keuken merken Bruynzeel Keukens en Keller Keukens. We maken onze merken letterlijk zelf. Dat doen we in DKG De Keukenfabriek in Bergen op Zoom. Dat is het kloppend hart van DKG. Vanuit de twee merken ontwikkelen, ontwerpen, verkopen en plaatsen we keukens. Voor particuliere en zakelijke klanten, zowel nationaal als internationaal. En dat

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

30/05/2020 17:55:27
 
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.