geen submenu

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Medior Java developer (fullstack)

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 »

Junior Software developer

Functie Als junior .NET ontwikkelaar start jij in een compact team met drie ervaren .NET ontwikkelaars. Wij werken op projectbasis en begeleiden zelf het hele traject van A tot Z. Wij bieden jou dan ook een brede functie aan met veel technische uitdaging! Ons traject ziet er als volgt uit: 1) Wij analyseren de behoefte van onze klant 2) Wij werken de behoefte uit en vertalen dit naar technische werkzaamheden en maken een uren/kosten schatting; 3) Wij gaan aan de slag met het ontwikkelen van het product met directe feedback van de klant, zodat datgene gerealiseerd wordt, wat gewenst is;

Bekijk vacature »

Applicatiebeheerder/ Ontwikkelaar

Dit ga je doen - Verantwoordelijkheid dragen voor het complexe applicatielandschap; - Schakelen met eindgebruikers en leveranciers; - Verdeling in werkzaamheden tussen dagelijks beheer ontwikkelen; - Het analyseren van de behoeften van gebruikers en het vertalen hiervan naar functionele specificaties voor de applicaties; - Actief bijdragen aan het leveren van passende oplossingen voor het applicatielandschap. Hier ga je werken Deze organisatie, gevestigd in de regio van Amsterdam is een van de meest toonaangevende mediaorganisaties in Nederland. Door de organisatiecultuur krijg jij veel ruimte om initiatief te nemen en zelfstandig aan het werk te gaan. Samen met het IT team zorg

Bekijk vacature »

Medior Front end developer React

Functie Voor deze functie ben ik op zoek naar een enthousiaste front end developer die communicatief vaardig is. Jij wordt onderdeel van een enthousiast jong team dat werkt aan grote websites. Binnen jouw rol ben jij diegene die de vertaling maakt van design naar functionele code en zorg jij voor goede experience op meerdere platformen. Dit doe je natuurlijk door gebruik te maken van Javascript, HTML, CSS en React. Daarnaast wordt er gebruik gemaakt van Webcomponents en verschillende authenticatie tools. Doordat er hier gestreefd wordt naar de beste gebruikerservaringen, wordt het product constant doorontwikkeld. Hierdoor blijven ze voor op de

Bekijk vacature »

Front-end (Angular) developer

Functie Om bovenstaande ambities waar te kunnen maken zijn ze op zoek naar een Front-end (Angular) developer. Het it-team bestaat momenteel uit de IT Manager, 2 back-end developers, 1 fullstack developer, 1 designer en een DevOps engineer. Ze zijn dus op zoek naar professionals die autonoom en gedisciplineerd aan de slag gaan, en bij aanvang als enige developer met hun Front-end applicaties aan de slag gaat. Wel hebben ze de ambitie om hier snel een 2e developer bij te vinden die jij dan ook zal kunnen aansturen/begeleiden. Je zult aan de slag gaan met het doorontwikkelen van hun bestaande UI

Bekijk vacature »

Software Developer

Bij een bedrijf in de machinebouw, regio Roosendaal, zijn we op zoek naar een: Software Developer Waar ga je werken? Onze opdrachtgever is gespecialiseerd in de grondverzetmachines. Al meer dan 50 jaar leveren ze zowel nationaal als internationaal diverse machines. Het is een familiebedrijf met een informele werksfeer. Wat ga je doen? Als Software Developer je verantwoordelijk voor: - Je werkt voortdurend aan oplossingen voor het op afstand bewaken en besturen van oogstmachines; - Het visualiseren van gegevens in rapporten, apps of andere formaten; - Voorspellend machineonderhoud; - Taakplanning; - Je schrijft aangepaste plug-ins om gegevens te importeren of exporteren

Bekijk vacature »

Software Ontwikkelaar

Functie omschrijving Voor een echt familiebedrijf in de omgeving van 's-Hertogenbosch ben ik op zoek naar een Software Developer. Jij gaat in de functie van Software Developer werken met C# en .NET framework Jij gaat maatwerk software ontwikkelen en softwareoplossingen creëren. Daarnaast optimaliseer je de bestaande software. Oplossingen waar de klant echt iets aan heeft, jij krijgt er energie van op dit te realiseren. Je gaat werken in een Microsoft omgeving(ASP.NET) en gebruikt daarnaast C# en MVC. Samen met het huidige IT team binnen deze organisatie verwerk je de wensen van de klant tot een (eind)product. Bedrijfsprofiel Deze organisatie is

Bekijk vacature »

C# developer

Functie Als ervaren Software Engineer wordt jij verantwoordelijk voor het bedenken en ontwikkelen van technische (maatwerk) oplossingen voor onze klanten en dit samen met de klant af te stemmen. Jij wordt o.a. verantwoordelijk voor de doorontwikkeling het software pakket welke voor ons enorm belangrijk is. Dit pakket zorgt er namelijk voor dat wij complete productielijnen kunnen aansturen en monitoren. Daarnaast heb jij actief contact met onze hoofdvestiging om het software achter een van onze systemen te verbeteren en te herschrijven. Momenteel zijn onze C# applicaties geschreven met o.a. Winforms. Echter hebben wij de actieve ambitie om dit te gaan herschrijven

Bekijk vacature »

Database Developer

Functieomschrijving Heb jij ongeveer 3 jaar ervaring als Database Developer met MS SQL of een vergelijkbare database? Wil jij werken voor een gewaardeerde werkgever in regio Tilburg waar jij de tijd en ruimte krijgt jezelf te ontwikkelen? Lees dan snel verder! Hoe ziet jouw takenpakket eruit? Je houdt je bezig met het creëren en bouwen van MS SQL server databases; Je gaat projecten vanaf het begin tot het eind begeleiden. Je sluit aan bij meetings met klanten om hun processen in kaart te brengen. Vervolgens voer jij het project uit en zorgt dat dit zo goed mogelijk verloopt; Je werkt

Bekijk vacature »

.Net Front-end Ontwikkelaar

Wij zoeken een .Net Front-end Ontwikkelaar! Omschrijving Kun jij snel schakelen en ben je stressbestendig? Dan zoeken wij jou! Als .Net Front-end Ontwikkelaar help je mee aan de webapplicatie die over de hele wereld door allerlei bedrijven wordt gebruikt. Je werkt daarnaast mee aan nieuwe en verbeterde functionaliteiten en helpt met het oplossen van bugs. Over de opdrachtgever Je komt te werken in een ambitieus team dat zich blijft ontwikkelen. Dit is alle informatie die we nu kunnen delen over de werkplek. Als jij de .Net Front-end Ontwikkelaar bent voor deze job, vertellen we je snel nóg meer. Eisen Heb

Bekijk vacature »

C#.NET/Unity Developer

Functieomschrijving Voor een gewaardeerde werkgever in de omgeving van Breda zijn wij op zoek naar een software ontwikkelaar. Dit bedrijf houdt zich bezig met de ontwikkeling van WMS Software (C#/Unity & SQL). Past dit bij jou? Lees snel verder! Jouw werkzaamheden zullen er als volgt uitzien: Je werkt aan innovatieve softwareoplossingen voor het verbeteren en/of vernieuwen van processen; Samen met 6 applicatieontwikkelaars hebben jullie de verantwoordelijkheid voor de uitbreiding en ontwikkeling van de webapplicaties; Het uitvoeren van updates/aanpassingen aan de huidig draaiende applicaties; Je bent een luisterend oor naar klanten en vertaalt hun wensen door naar bruikbare software. Bedrijfsprofiel Wie

Bekijk vacature »

Randstad - Freelance Backend Developer/ Data Engin

Starting date: 10.05.2023 Salary range: €67,00 - €77,00 Duration: 6 months Hours: 40 Working model: Hybrid* MUST be NL based Job description: Our vision is to have a consistent and data driven experience for all sales across all our operating companies. Our mission is to enable our salespeople to be able to reach out to the right company at the right time. We do this by creating data driven micro services and solutions. We mainly focus on implementation in the Google Cloud but also integrate with local systems and other cloud solutions. A typical day: As a back-end developer you

Bekijk vacature »

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Traineeship IT regio Amsterdam/Utrecht

Wat ga je doen? Het traineeship begint met een fulltime maand cursussen en praktijkdagen, waarin je de basis van het IT-vak leert op de Shared Servicedesk (SSD). Daarnaast ga je meteen aan de slag voor je eerste certificering! (ITILv4). Je start in een groep met 4 tot 10 deelnemers, waarmee jij gedurende die maand optrekt en je kennis kunt delen. Na het voltooien van de eerste maand ga je direct voor een langere periode aan de slag bij één van onze klanten of blijf je intern bij ons op de Shared Servicedesk. Je bent het eerste aanspreekpunt van de eindgebruikers

Bekijk vacature »

Back-End Developer in Laravel / PHP

Functie omschrijving Wij zijn op zoek naar een Medior PHP Laravel Developer voor een gaaf bedrijf in de omgeving van Amsterdam! Voor een enthousiast team die zich graag bezig houdt met softwareontwikkeling zijn wij op zoek naar versterking. Je werkt in een klein ontwikkelteam en bent zeer betrokken bij alle aspecten van de softwareoplossingen. Van het ontwerpen tot de oplevering. Binnen deze functie ga je aan de slag met het aanpassen, verbeteren en vernieuwen van de logistieke oplossingen. Je krijgt veel te maken met koppelingen naar systemen en de verzoeken van de klant. Je komt terecht in een team, waarbij

Bekijk vacature »

Pagina: 1 2 volgende »

Frits van Leeuwen

Frits van Leeuwen

24/01/2020 14:02:19
Quote Anchor link
Hallo allemaal,
Ik ben een code aan het omzetten van een HTML code naar een PHP die alles uit een database haalt.
De code bevat een stukje de het menu moet tonen. Met behulp van <li> en <lu>
Nu lukt het mij niet om de submenu's er in te krijgen.
Hieronder staan eerst de HTML code zoals die is, dan hoe die door de PHP code wordt gemaakt en als derde de php code die de html code moet maken.

Wie weet er wat ik fout doe?

html-code moet ongeveer dit zijn
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<li><a href="inkomsten-uitgaven.html" class="active">inkomsten &amp; uitgaven</a></li>
<li><a href="beheer.html">beheer</a>
     <ul>
          <li><a href="b-t-w.html">b.t.w.</a></li>
     </ul>
</li>
<li><a href="administraties.php">administraties</a>
     <ul>
      <li><a href="administratie.php">nieuwe administratie</a></li>
     </ul>
</li>


Deze html-code wordt genereerd!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<li><a href="inkomsten-uitgaven.html" class="active">inkomsten &amp; uitgaven</a></li>
<li><a href="beheer.html">beheer</a></li>
<li><a href="administraties.php">administraties</a></li>


Hier onder volgt mijn php code
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
<?php     // *** menu ****
        // menu ombouwen naar database menu

    $menu_query1 = "SELECT * FROM tabel_menu WHERE menu_sub_van = 0 ORDER BY menu_waarde ASC";
    $menu_result1 = mysqli_query($connect, $menu_query1);
    $menu_count1 = mysqli_num_rows($menu_result1);
    $num_row = 0;
    while ($menu_row1 = mysqli_fetch_array($menu_result1, MYSQLI_ASSOC)) {

        $num_row ++;
        $menu_plaatsen[$num_row] = "<li><a href='" . $menu_row1['menu_link'] . "' class='active'>" . $menu_row1['menu_tekst'] . "</a>";
        
        $menu_query2 = "SELECT * FROM tabel_menu WHERE menu_waarde = " . $menu_row1['menu_sub_van'] . " ORDER BY menu_waarde ASC";
        $menu_result2 = mysqli_query($connect, $menu_query2);
        $menu_count2 = mysqli_num_rows($menu_result2);
        
        if ($menu_count2 == 0) {
            $num_row ++;
            $menu_plaatsen[$num_row] = "</li>";
        }
else { //$menu_count2 >> 0 dus er zijn geen submenu's
        
            $num_row ++;
            $menu_plaatsen[$num_row] = "<ul>";
            while ($menu_row2 = mysqli_fetch_array($menu_result2, MYSQLI_ASSOC)) {
                $num_row ++;
                $menu_plaatsen[$num_row] = "<li><a href='" . $menu_row2['menu_link'] . ">" . $menu_row2['menu_tekst'] . "</a></li>";
                $num_row ++;
            }

            $menu_plaatsen[$num_row] = "</ul>";
            mysqli_free_result($menu_result2);
            
            $num_row ++;
            $menu_plaatsen[$num_row] = "</li>";        
        }
    }
            
    mysqli_free_result($menu_result1);

        
?>


<nav class="art-nav">
    <ul class="art-hmenu">
        <?php
            foreach ($menu_plaatsen as $plaatsen){
                echo($plaatsen);
            }

        ?>

    </ul>
</nav>

<?php // *** einde menu ****
?>
 
PHP hulp

PHP hulp

08/11/2024 12:35:40
 
- Ariën  -
Beheerder

- Ariën -

24/01/2020 15:08:12
Quote Anchor link
Oef, dit is een flinke toren van query's (want ze worden massaal vermenigvuldigd met loopjes in loopjes) waar op zijn minst gezegd niet echt zuinig mee wordt omgegaan. ;-)

Ik weet zeker dat je hier beter naar recursie kan kijken, en een minimalisatie van het aantal queries.

Laten we dit voorbeeld van structuur eens aanhouden, om je menu's mee op te stellen, waarbij feitelijk oneindig veel levels kan maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
id    parentId    name
1    0    Auto's
2    0    Fietsen
3    0    Vrachtwagens
4    1    Audi
5    1    BMW
6    5    Z3


Dan loont het om de boel met een enkele query op te halen, de array samen te stellen, en met een aparte functie de recursie toe te passen:

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
<?php
// get all menuitems with 1 query
$result = $conn->query("
    SELECT
        id, parentId, name
    FROM
        menu
    ORDER BY
        parentId, name
"
);

// prepare special array with parent-child relations
$menuData = array(
    'items' => array(),
    'parents' => array()
);


while ($menuItem = $result->fetch_assoc())
{

    $menuData['items'][$menuItem['id']] = $menuItem;
    $menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}



// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData)
{

    $html = '';

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

        $html = '<ul>';
        foreach ($menuData['parents'][$parentId] as $itemId)
        {

            $html .= '<li>' . $menuData['items'][$itemId]['name'];

            // find childitems recursively
            $html .= buildMenu($itemId, $menuData);

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

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


    return $html;
}


// output the menu
echo buildMenu(0, $menuData);
?>


Bron: Crisp's Tweakblog
Gewijzigd op 24/01/2020 15:15:34 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/01/2020 18:13:08
Quote Anchor link
+1 voor Ariën er van uitgaande dat de code werkt :-)
 
- Ariën  -
Beheerder

- Ariën -

24/01/2020 18:49:28
Quote Anchor link
Die code werkt perfect. Ik zou dit niet bedacht hebben.

Thnx to Crisp ;-)
 
Thomas van den Heuvel

Thomas van den Heuvel

24/01/2020 20:00:05
Quote Anchor link
Hmm, het zou misschien nog handig zijn om een volgorde toe te voegen, zodat je zelf kunt bepalen op welke positie een item staat. Mogelijk is het afdoende dat je op naam sorteert, maar daarmee offer je configureerbaarheid op. Deze extra functionaliteit is makkelijk toe te voegen.

Mogelijke andere optimalisaties: output escaping, en output buffering i.p.v. HTML breien.
 
Frits van Leeuwen

Frits van Leeuwen

29/01/2020 18:54:09
Quote Anchor link
Heel erg bedankt voor het meedenken, maar ik kom er toch nog niet uit.
Bij mij werkte het niet direct, en ik moest dus vogelen om het wel werkend te krijgen. Ik kwam daar niet uit.

Ik begin niet met <ul> omdat die afwijkt van alle <ul>s die ik verder nog heb.
Dus ik moet beginnen met <li> en dan later als er een sub is moet ik de </li> uitstellen tot na de zoveelste </ul>

Ik heb aan het begin wel bedacht dat ik de volgorde in sql kan bepalen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$menu_result = $connect->query("SELECT * FROM tabel_menu ORDER BY menu_sub_van, menu_waarde");


Van daar uit zal ik het denk ik naar een array moeten zetten, om de verschillende niveaus van de menu's te onderscheiden van elkaar. Ik ben niet zo thuis in het gebruik van foreach(...){...}

Hoeveel kan ik in een variabele stoppen?
Want ik dacht een array te moeten gebruiken om iedere regel in een eigen (array-)variabele te zetten. Maar als ik de code van -Ariën- bekijk, dan denk ik dat ik zie dat de variabele html gevuld wordt, en dat die vervolgens in het html deel getoond kan worden.
 
Michael -

Michael -

29/01/2020 19:39:57
Quote Anchor link
Quote:
Ik begin niet met <ul> omdat die afwijkt van alle <ul>s die ik verder nog heb.
Dus ik moet beginnen met <li> en dan later als er een sub is moet ik de </li> uitstellen tot na de zoveelste </ul>

Je bedoelt dat de styling afwijkt? Dan moet je de styling aanpassen. een <li> hoort gewoon in een <ul>.

Een foreach is niks meer dan een loop, waarmee je door een array kan wandelen.
Hoe je zo'n array genereert uit database resultaten kan met mysqli_fetch_array of als je hier zelf controle over wilt moet je deze zelf opbouwen, zoals in het voorbeeld van Arien regel 18 tm 22.
Gewijzigd op 29/01/2020 19:41:20 door Michael -
 
Frits van Leeuwen

Frits van Leeuwen

29/01/2020 20:35:38
Quote Anchor link
Het was nog even verder vogelen, maar het is uiteindelijk wel gelukt. Bedankt.

Met deze code lukt het me nu wel.

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
// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData)
{
    $html = '';

    if (isset($menuData['parents'][$parentId]))
    {
        if ($parentId==0)
        {
            $html = '<ul class="art-hmenu">';
        }
        else
        {    
            $html = '<ul>';
        }
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $html .= '<li><a href="">' . $menuData['items'][$itemId]['menu_tekst'] . '</a>';

            // find childitems recursively
            $html .= buildMenu($itemId, $menuData);

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

    return $html;
}
 
- Ariën  -
Beheerder

- Ariën -

29/01/2020 20:45:54
Quote Anchor link
Met een lege href komt de bezoeker niet echt ver ;-)
 
Frits van Leeuwen

Frits van Leeuwen

29/01/2020 23:46:59
Quote Anchor link
hahaha nee dat snap ik. Daar werk ik later wel aan. Het ging hier om de werking van het menu.
Nogmaals Heel erg bedankt. Vooral voor het inzicht wat je me gaf.
Gewijzigd op 29/01/2020 23:48:33 door Frits van Leeuwen
 
Frits van Leeuwen

Frits van Leeuwen

01/02/2020 19:12:18
Quote Anchor link
Nu dacht ik het voor elkaar te hebben, maar helaas.
Ik had 3 items in het hoofmenu. Alleen de tweede had een submenu. Ik zet verander ook de derde naar een menu-item met submenu, en nu verschijnt alleen het hoofdmenu-item.
Als ik er een vierde hoofdmenu-item aan toevoeg, werkt dat wel.

Ik zie nu niet wat ik fout heb gedaan.

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
<?php     // *** menu ****
$result = $connect->query("SELECT * FROM tabel_menu ORDER BY menu_sub_van, menu_waarde");

// prepare special array with parent-child relations
$menuData = array(
    'items' => array(),
    'parents' => array()
);


while ($menuItem = $result->fetch_assoc())
{

    $menuData['items'][$menuItem['menu_id']] = $menuItem;
    $menuData['parents'][$menuItem['menu_sub_van']][] = $menuItem['menu_id'];
}



// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData)
{

    $html = '';

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

        if ($parentId==0)
        {

            $html = '<ul class="art-hmenu">';
        }

        else
        {    
            $html = '<ul>';
        }

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

            $html .= '<li><a href="">' . $menuData['items'][$itemId]['menu_tekst'] . '</a>';

            // find childitems recursively
            $html .= buildMenu($itemId, $menuData);

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

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


    return $html;
}


// output the menu

?>


<nav class="art-nav">
    
        <?php
            echo buildMenu(0, $menuData);
        ?>

    </ul>
</nav>

<?php // *** einde menu ****
?>
 
- Ariën  -
Beheerder

- Ariën -

01/02/2020 20:03:37
Quote Anchor link
Hoezo half Engels en half Nederlands?
Parent en ParentID lijkt mij toch juist logische benamingen? In mijn ogen is dit juist vragen om om problemen.
Gewijzigd op 01/02/2020 20:03:59 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

01/02/2020 20:48:49
Quote Anchor link
Je hoeft geen onderscheid te maken tussen de UL's als de buitenste een class moet hebben, immers:
- je zou dit altijd als argument mee kunnen geven aan de functie ($class=''), en als deze parameter niet-leeg is zou je een bijbehorende property weg kunnen schrijven naar de (buitenste) UL-tag
- je zou de buitenste UL-tag buiten de functie kunnen trekken, je hoeft eigenlijk alleen maar een UL-tag te openen als je de recursie induikt (een element children / subelementen heeft)
- je zou een omvattende div kunnen maken die een class heeft en op die manier alles stylen; en dit doe je in het bovenstaande fragment al, dus waarom heb je dan die art-hmenu nodig?

We kunnen ook niet echt zien wat er misgaat, omdat we de inhoud van $menuData niet kennen.

En mogelijk:
- zit er iets in de verbanden van de records mis zodat het geen goede boomstructuur betreft
- gaat er iets mis met de HTML-output (hoe ziet de uiteindelijke HTML code er uit?)
- zit er iets mis in de CSS-opmaak zodat niet alles goed weergegeven wordt?

Voor het oplossen van deze puzzel hebben we meer informatie nodig, zodat we kunnen nabootsen wat er misgaat.

Een iets andere aanpak lost al het bovenstaande op: start enkel een UL als je subitems hebt, en duik dan de recursie in. Dus bijvoorbeeld als volgt:
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
<?php
// items uit database - parent 0 = root van de te bouwen boom
$myItems = array(
    1 => array('parent' => 0, 'data' => '1 een'),
    2 => array('parent' => 1, 'data' => '1.1 een punt een'),
    3 => array('parent' => 2, 'data' => '1.1.1 een punt een punt een'),
    4 => array('parent' => 1, 'data' => '1.2 een punt twee'),
    5 => array('parent' => 0, 'data' => '2 twee'),
    6 => array('parent' => 5, 'data' => '2.1 twee punt een'),
    7 => array('parent' => 0, 'data' => '3 drie'),
);


// initiele boom
$myTree = array(
    0 => array(
        'data'      => 'root',
        'children'  => array(),
    ),
);


// bouw boom mbv items
foreach ($myItems as $id => $data) {
    $myTree[$id] = array(
        'data'      => $data['data'],
        'children'  => array(),
    );

    $myTree[$data['parent']]['children'][] = $id;
}


// weergavefunctie
function displayTree($tree, $index=0) {
    foreach ($tree[$index]['children'] as $child) {
        ?>
<li><?php echo $tree[$child]['data']; ?><?php
            if (count($tree[$child]['children']) > 0) {
                ?>
<ul><?php
                    displayTree($tree, $child);
                ?>
</ul><?php
            }
        ?>
</li><?php
    }
}


// weergave
if (count($myItems) > 0) {
    ?>
<ul class="whatever"><?php
        displayTree($myTree);
    ?>
</ul><?php
}
?>

Dit levert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<ul class="whatever">
    <li>1 een<ul>
        <li>1.1 een punt een<ul>
            <li>1.1.1 een punt een punt een</li>
        </ul></li>
        <li>1.2 een punt twee</li>
    </ul></li>
    <li>2 twee<ul>
        <li>2.1 twee punt een</li>
    </ul></li>
    <li>3 drie</li>
</ul>
Gewijzigd op 01/02/2020 23:21:00 door Thomas van den Heuvel
 
Frits van Leeuwen

Frits van Leeuwen

02/02/2020 00:12:49
Quote Anchor link
Thomas van den Heuvel, bedankt voor je reactie.
Maar vooral bedankt voor de uitleg. En voor het nieuwe alternatief dat je mij gaf.
Ik vroeg me alleen af, of dat ik door het begin niet gelijk gelimiteerd ben.
(zie de code onderaan)
Want ik wil juist zo open mogelijk blijven.
Ik heb bewust het menu in een database gezet om niet steeds in de code het menu aan te moeten passen. Dit biedt mij in de toekomst meer vrijheid.

-Arieën-
Half Engels half Nederlands komt door dat ik in het Nederlands ben begonnen met het opzetten van de database. Ik heb al wel meer code die met de database te maken heeft, en ik had geen zien om ook die code aan te passen. Gewoon om het werkende deel werkend te houden en me te kunnen focussen op dit onderdeel.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// items uit database - parent 0 = root van de te bouwen boom
$myItems = array(
    1 => array('parent' => 0, 'data' => '1 een'),
    2 => array('parent' => 1, 'data' => '1.1 een punt een'),
    3 => array('parent' => 2, 'data' => '1.1.1 een punt een punt een'),
    4 => array('parent' => 1, 'data' => '1.2 een punt twee'),
    5 => array('parent' => 0, 'data' => '2 twee'),
    6 => array('parent' => 5, 'data' => '2.1 twee punt een'),
    7 => array('parent' => 0, 'data' => '3 drie'),
);
[
/code]
Gewijzigd op 02/02/2020 00:15:43 door Frits van Leeuwen
 
Thomas van den Heuvel

Thomas van den Heuvel

02/02/2020 00:22:31
Quote Anchor link
Uiteraard trek je de data uit je database voor het bouwen van $myItems, het bovenstaande was enkel een test-set om de werking te illustreren :).

Als je tijdens het bouwen van deze set het stramien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$myItems[<record id>] = array(
    'parent' => <parent id>,
    'data'   => '<label tekst>',
    // en wat je hier nog meer wilt toevoegen, of breng dit in 'data' onder
);

hanteert dan werkt de rest "vanzelf".
Gewijzigd op 02/02/2020 00:29:40 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

02/02/2020 00:37:43
Quote Anchor link
Frits van Leeuwen op 02/02/2020 00:12:49:
Half Engels half Nederlands komt door dat ik in het Nederlands ben begonnen met het opzetten van de database. Ik heb al wel meer code die met de database te maken heeft, en ik had geen zien om ook die code aan te passen. Gewoon om het werkende deel werkend te houden en me te kunnen focussen op dit onderdeel.

Het kan geen kwaad om in hetzelfde stramien te werken qua naamgevingen. Dan kunnen andere mensen ook direct aan je code sleutelen of mee-debuggen zonder de hele applicatie door te worstelen. Het ergste voorbeeld wat ik ooit tegen kwam was iemand die zijn code in het Esperanto had benoemd. Als je dat niet kent, en dingen lijken op elkaar, dan ga je ze echt door elkaar halen.
 
Frits van Leeuwen

Frits van Leeuwen

06/02/2020 09:54:42
Quote Anchor link
Thoma's van den Heuvel, Ik probeer jouw code nu, maar daarvoor moet ik deze code om te zetten naar wat ik nodig heb. Maar ik kom er niet uit. Wat doe ik fout?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
// items uit database - parent 0 = root van de te bouwen boom
$myItems = array(
    1 => array('parent' => 0, 'data' => '1 een'),
    2 => array('parent' => 1, 'data' => '1.1 een punt een'),
    3 => array('parent' => 2, 'data' => '1.1.1 een punt een punt een'),
    4 => array('parent' => 1, 'data' => '1.2 een punt twee'),
    5 => array('parent' => 0, 'data' => '2 twee'),
    6 => array('parent' => 5, 'data' => '2.1 twee punt een'),
    7 => array('parent' => 0, 'data' => '3 drie'),
);


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
$query="SELECT menu_id, menu_tekst, menu_waarde, menu_sub_van, menu_link, menu_reg_date FROM tabel_menu ORDER BY menu_sub_van, menu_waarde";
$result = mysqli_query($connect, $query);

$myItems = array(
    'parent' => array(),
    'data' => array()
);

foreach ( mysqli_fetch_assoc($result) as $row )
{
   $myItems = array (
        $row['menu_id'] => array(
            'parent' => $row['menu_sub_van'],
            'data' => $row['menu_tekst'],
        ),
    );
}
 
- Ariën  -
Beheerder

- Ariën -

06/02/2020 09:59:24
Quote Anchor link
Die hardcoded array moet je overigens wel vertalen naar een set data uit je database. Nu overschrijf je met de array voor je structuur je bestaande data.
 
Frits van Leeuwen

Frits van Leeuwen

06/02/2020 14:50:11
Quote Anchor link
- Arien - Ik snap je niet helemaal.
De array die Thomas van den Hoeven in zijn code had geplaatst moet natuurlijk worden omgebouwd naar mijn database en informatie. Daarom heb ik bij de query geen * gebruikt, maar alle velden genoemd die ik heb.
De query is goed, en die wil ik gebruiken voor het opbouwen van een menu. Maar deze code gaat gewoon fout.
Ik krijg een aantal regels die dit zeggen:
Warning: Illegal string offset 'menu_sub_van' in /.../menu.php on line 13
Warning: Illegal string offset 'menu_tekst' in /.../menu.php on line 14
 
- Ariën  -
Beheerder

- Ariën -

06/02/2020 14:56:28
Quote Anchor link
Je kan moeilijk een database in een praktisch werkend voorbeeld plaatsen. Dus daarom heeft Thomas wat data hardcoded in een array geplaatst. Maar in de echte praktijk is een database natuurlijk veel handiger ;-)

Dus vergeet die array $myItems uiteindelijk, en haal alles uit de database op.

Trouwens, je zit nu wel zijn voorbeeld nog eens volledig de vernieling in te helpen. Want hij heeft de als voorbeeld gemaakte $myItem, en de vaste $myTree, en die laatste noem jij ook vrolijk $myItems. Dan kan je verwachten dat de code opeens heel vreemd gaat doen.
Gewijzigd op 06/02/2020 14:57:38 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2020 16:29:40
Quote Anchor link
Er is in ieder geval een verschil tussen myItems en myTree.

myItems zijn in wezen de records uit je database die je tijdelijk in een array onderbrengt.
myTree is vervolgens de structuur die je bouwt door het doorlopen van myItems.

Je zou de twee natuurlijk ook kunnen combineren door on-the-fly de boom te bouwen en enkel hierin de informatie weg te schrijven die je uit de database opvraagt. Daarin ben je helemaal vrij. Maar het kan in sommige gevallen handig zijn om data en structuur gescheiden te houden. Stel dat je de data wilt (her)gebruiken om meer bomen te kunnen bouwen oid.

Anyway, ik ben nog nooit de vorm "foreach ( mysqli_fetch_assoc($result) as $row )" tegengekomen en weet ook niet zeker of dat gaat werken.

Een overweging om mee te nemen in je ontwerp is de volgende: normaal gesproken zullen items op volgorde aangemaakt worden. Dus het kan dan nooit voorkomen dat een child id een lager nummer heeft dan de parent. Maar dit zou dus over tijd kunnen veranderen op het moment dat je met elementen in de boom gaat schuiven. Bij het bouwen van de boom is het in ieder geval belangrijk dat je een zodanige volgorde hanteert dat je altijd de parents ophaalt voor de children, anders wordt het bouwen van de boom nogal problematisch :p. Daartoe wordt meestal extra "meta data" opgeslagen over de boom. Hiertoe wordt meestal een redundant veld "depth" of "level" of wat dan ook opgeslagen. Als je in je query je resultaten sorteert op dit veld dan garandeert dit dat de items voldoende op volgorde staan om de boom te kunnen bouwen. Daarnaast komt het ook voor dat je kunt schuiven met elementen op een zeker niveau in de boom, dus ook een volgorde veld, "order" ofzo, kan (zeer) handig zijn.

Anyhow, als dit allemaal (nog) niet op jouw situatie van toepassing is (maar het is nog steeds verstandig om te overwegen om zoiets in te bouwen), dan zou je gewoon met een while-loop je boom kunnen bouwen zoals je nu doet, zonder al deze sorteer-criteria (maar expliciet een ORDER BY toevoegen kan natuurlijk nooit kwaad). Kijk hierbij goed naar de opbouw van myTree. Twee onderdelen zijn redelijk cruciaal:
- bij het aanmaken van elk element maak je bij dit element ook een children array aan, dit zit niet in jouw bovenstaande loop?
- tegelijkertijd voeg je het huidige element toe als child van de parent, laat dit even bezinken :p, op deze manier klik je de elementen aan elkaar als boom en om deze reden is het dus belangrijk dat je de items in de goede volgorde ophaalt, anders bestaan parents mogelijk nog niet in myTree

Met enige aanpassingen in jouw code zou je met behulp van mijn voorbeeld dit alles redelijk eenvoudig aan de praat moeten krijgen.
Gewijzigd op 06/02/2020 16:31:54 door Thomas van den Heuvel
 

Pagina: 1 2 volgende »



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.