Recursief menuscript uitbreiden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Oracle Product Owner

Vacancy: Oracle Product Owner Looking to work in an international company with more than 35 different nationalities where collaboration and innovative ideas are key to drive future success? Seeking a role where you can add value and have the opportunity to develop and grow? Office Depot Europe has an exciting opportunity for an Oracle Product Owner to join our European headquarters in Venlo, the Netherlands. The role is a fulltime, permanent position offering an excellent salary and benefits package. Your role as an Oracle Product Owner Office Depot Europe is transforming itself to meet changing customer expectations and be competitive

Bekijk vacature »

Database Administrator

Assai is growing rapidly, resulting in more and extra work, such as implementations and training requests from our clients all over the world. We are therefore seeking an experienced consultant to join us in supporting this growth and helping to implement our software system and train the end-users worldwide. Our ideal candidate would be an experienced in document control, system implementations and in providing trainings. Responsibilities DBA Skills: Oracle 12c based; Create and manage multiple (standardized) databases (nearing 50 this year) in different servers (VM’s); Create and manage reliable backup strategies for all databases; Create and manage reliable and fast

Bekijk vacature »

Medior C# developer / ERP software /

Op een steenworp afstand van het Veluwe meer werken op een van de mooiste locaties van Nederland? In de pauze met je collega’s een visje halen in de haven of een wandeling langs het water maken? Alles is hier mogelijk! Houd jij van een uitdaging en ben jij een communicatieve programmeur die maatwerk levert en altijd streeft naar het beste resultaat? Denk je vaak out-of-the-box en krijg je energie van het maken van klant specifieke oplossingen? En heb je het gevoel dat je stagneert in je huidige werkzaamheden? Dan is dit de baan die je zoekt! Deze organisatie is gespecialiseerd

Bekijk vacature »

.NET developer worden bij onze leukste klant?

Functieomschrijving Er is daarom altijd behoefte aan nieuwe collega's op gebied van .NET Development, maar ook binnen andere takken van ontwikkeling. Daarnaast is het verloop van medewerkers heel laag: Wanneer je hier eenmaal werkt, zul je niet snel meer weg willen. De doorgroeimogelijkheden zijn onbeperkt, de opdrachten altijd uitdagend en interessant en daar bovenop zijn de arbeidsvoorwaarden ook nog eens uitstekend. Neem contact met mij op, dan plan ik op korte termijn een gesprek en dan zul je het mij je eigen ogen zien! In jouw nieuwe leasewagen rijd je straks naar de klant toe, waarbij je zelden langer dan

Bekijk vacature »

PHP developer gezocht in de regio Westland

Vacature Omschrijving Een snelgroeiende en ambitieuze organisatie is op zoek naar een gedreven PHP developer. Het bedrijf bestaat sinds 5 jaar en ze hebben zich gespecialiseerd in het ontwikkelen van e-commerce. Ook maken zij mooie webshops en heerst er een informele sfeer. Ze zijn druk bezig om een enorme groei te realiseren en willen daarom ook nieuwe markten gaan aanboren. Functieomschrijving Je zult continue in contact staan met je team en gaat individueel of in team verband aan de slag. Er heerst een open door policy waardoor er een goede sfeer hangt op de werkvloer. Op het moment zitten ze

Bekijk vacature »

Medior Back End C# Developer

Bedrijfsinfo Deze jonge organisatie timmert nu al een tijdje aan de weg en is in een korte tijd gegroeid tot 10 medewerkers. Ze zijn nu hard op zoek naar een uitbreiding van het development team waarin nu zo’n 5 ontwikkelaars actief zijn. Dus wat doen ze nou precies? Dit bedrijf heeft een specialisme ontwikkeld in een bepaalde niché binnen de commerciële sector. Hierin willen zij door middel van een high tech oplossing zorgen voor automatisering op grote schaal. Ze zijn gevestigd in de omgeving van Delft in een gezellig pand. Binnen het kleine team heerst een gezellige, informele sfeer en

Bekijk vacature »

Medior ASP.NET Developer

Vacature Omschrijving Dit bedrijf is 15 jaar geleden opgericht en hun doel is bedrijven te helpen om beter te worden in wat ze doen. Hoe doen ze dit? Door zich te richten op de communicatie, online en offline events. Zij nemen deze zorgen uit de handen van hun opdrachtgevers en geven de opdrachtgevers de ruimte om zich te focussen op de corebusiness. Momenteel bestaat dit bedrijf uit ruim 50 medewerkers en drie filialen, maar ze zijn superhard aan het groeien. Er heerst een no-nonsense mentaliteit en zijn grenzeloos nieuwsgierig. Functieomschrijving Je zult je als ASP.NET Developer vooral bezighouden met het

Bekijk vacature »

Scrum Master

For an accomplished Scrum Master, we have the perfect opportunity. Bring us your skills for mentoring and facilitation, and we’ll give you every chance to grow your talent and stretch your technical and professional skills. Where you fit We’re seeking a Scrum Master to support a dynamic new development team, joining one of our exciting new innovation hubs at Shell. This is a role where you’ll be actively encouraged to take pride in doing things differently – to take a unique approach of balancing human-centred and digital design with an agile technology capability in order to tackle complex problems in

Bekijk vacature »

Fullstack .NET Programmeur

Organisatie Het bedrijf is namelijk gevestigd in het centrum van Den Haag, op loopafstand van het centraal station. Ze zitten een groot kantoorpand met een moderne en strakke inrichting van binnen. Het bedrijf is een van grootste creatieve bureaus van Nederland. Je word daarom door je klanten ook echt als partner gezien! Er word dan ook verwacht dat jij mee kunt denken over complexe problemen en je partners hierin adviseert. Jij gaat dus op projectbasis, 6 tot 12 maanden per klus, samen werken met je SCRUM-team. Dit betekent niet dat je altijd bij de klant zit. Nee hoor, je zit

Bekijk vacature »

Medior/Senior PHP developer (Starters/Junioren zij

Organisatie Voor een van onze partners in de regio van Zaltbommel ben ik momenteel op zoek naar een Medior PHP Developer welke niet alleen beschikt over kennis en ervaring in het programmeren maar ook de behoefte heeft met zijn kwaliteiten anderen te helpen met hun kwakkelende gezondheid. Deze organisatie is gespecialiseerd in het maken van eigen maar ook hele specifieke maatwerk software voor de zorg en overige overheden als de politie en de brandweer, daarnaast werken zij door het hele land met verschillende universiteiten samen om techniek en zorg zo goed mogelijk met elkaar te combineren. Wanneer iemand van 24

Bekijk vacature »

Medior .NET Developer regio Den Bosch

Organisatie Voor dit toffe familiebedrijf ben ik op zoek naar een Medior .NET Developer in de regio Den Bosch. Het is een echt IT bedrijf, die inmiddels al meer dan 30 jaar bestaat. Ze maken hun eigen software en hier zal jij je dan ook volledig op focussen! Het bedrijf kenmerkt zich door een platte organisatiestructuur, waarbij de werkruimte voor programmeurs informeel is ingericht en waarbij er in scrum teams wordt gewerkt, in teams van 5 personen. Aan de voorkant van het bedrijf is het strakker. Aangezien de overheid een van de grootste klanten is, is de voorkant zakelijker ingericht.

Bekijk vacature »

PHP Ontwikkelaar gezocht in Tilburg

Organisatie Deze grote organisatie in Tilburg is een grote speler binnen haar niche. Er werken meer dan 250 medewerkers aan B2B oplossingen en interne systemen. Hierbij is het grootste project het hervormen van alle interne systemen naar één groot allesomvattend systeem. Deze gigantische organisatie is, ondanks haar formaat, niet hiërarchisch ingericht en de lijnen zijn kort. Het is gewoon mogelijk om bij de directie binnen te stappen om jouw ideeën te bespreken en het leuke is dat er vervolgens ook echt wat mee wordt gedaan. Wegens de omvang van deze organisatie is er natuurlijk veel mogelijk op het gebied van

Bekijk vacature »

Junior / Medior PHP developer / Leiden

Organisatie Je komt binnen in een prachtig pand op steenworp afstand van het station in Leiden. Dit full service internetbedrijf bestaat sinds 1989 en bouwt vanaf dag 1 al innovatieve oplossingen van hoge kwaliteit op het gebied van ICT. Samen met een team van felxibele en oplossingsgerichte professionals spannen zij zich dagelijks in voor hun klanten. Er wordt hier gebouwd aan krachtige websites, innovatieve apps, CMS systemen, communities, e-commerce, e-mail marketing en software voor zowel grote en kleinere organisaties. Ze beschikken over hun eigen hostingomgeving, zodat de klant zijn website of software altijd online beschikbaar is! Zij zijn een kleine

Bekijk vacature »

Medior C# Developer

Vacature Omschrijving De financiële wereld is absoluut saai en de verzekeringswereld ook, maar niet bij dit bedrijf. Geloof je het niet? Let them prove it. Dit bedrijf is in 2010 begonnen in een kelderkamertje en zijn nu al met ruim 100 man. Zij houden zich bezig met pensioenen en vermogens. Dit klinkt natuurlijk saai, maar gelukkig niet bij hun. Zij doen het op hun eigen manier. Zij zijn van mening dat het anders moet met lage kosten, begrijpelijke producten en lekker hard rennen voor je klant. Ze hanteren een open en frisse cultuur, lekker informeel. Met dit bedrijf krijg je

Bekijk vacature »

Traineeship junior software developer

Zoek jij een stevige uitdaging en de mogelijkheid om veel nieuwe dingen te leren in een dynamisch vakgebied? Doe mee aan ons IT Professional Program en ontwikkel jezelf tot software engineer! Je begint met een opleidingstraject van 2-4 maanden. Hierin ga je aan de slag met verschillende technieken die je op conceptueel niveau leert te overzien en interpreteren. Onderwerpen die aan bod komen zijn o.a. programmeren (Java/C#/Python), Object Oriëntatie, Databases, Webservices & webtechnologieën, Domain Driven Design en Continuous Integration/Continuous Delivery. Sommige van deze onderdelen sluit je af met een examen en bijbehorende certificering. Het opleidingstraject zelf sluit je af met

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

18/09/2019 04:10: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.