๐ Componenten 2: navbar, forms en tabellen
โฑ Geschatte leestijd: 35 minuten ยท 7 stappen
In deze les leer je drie componenten die je in vrijwel elk webproject tegenkomt: een responsive navigatiebalk, Bootstrap-formulieren en gestijlde tabellen. Bovendien: hoe het Symfony Bootstrap-formulierthema werkt en wat dat voor jou als ontwikkelaar betekent.
1 Navbar โ responsive navigatiebalk
Wat betekent dit?
Een Bootstrap navbar klapt op mobiel automatisch in tot een hamburgermenu. Dat gedrag is ingebouwd via data-bs-toggle en Bootstrap JS โ je hoeft geen JavaScript te schrijven.
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<!-- Logo / merknaam -->
<a class="navbar-brand" href="/">MijnSite</a>
<!-- Hamburgerknop (zichtbaar op mobiel) -->
<button class="navbar-toggler" type="button"
data-bs-toggle="collapse"
data-bs-target="#navMenu">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Links die inklappen op mobiel -->
<div class="collapse navbar-collapse" id="navMenu">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link active" href="/">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/over">Over ons</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact">Contact</a>
</li>
</ul>
<a href="/login" class="btn btn-outline-light ms-3">Inloggen</a>
</div>
</div>
</nav>
Kleurthema's
bg-dark navbar-dark โ donker met witte links
bg-light navbar-light โ licht met donkere links
bg-primary navbar-dark โ blauw
Inklapmoment
navbar-expand-sm โ klapt uit vanaf 576px
navbar-expand-md โ vanaf 768px
navbar-expand-lg โ vanaf 992px
2 Formulieren โ form-control en form-label
Bootstrap stijlt formulieren met drie klassen: form-label (label), form-control (input/textarea/select) en mb-3 (ruimte tussen velden). De wrapper form-group bestaat niet meer in Bootstrap 5 โ je gebruikt gewoon mb-3.
<label>Naam</label>
<input type="text">
<label>E-mail</label>
<input type="email">
<button>Verzenden</button>
<div class="mb-3">
<label class="form-label">Naam</label>
<input type="text" class="form-control">
</div>
<div class="mb-3">
<label class="form-label">E-mail</label>
<input type="email" class="form-control">
</div>
<button class="btn btn-primary">Verzenden</button>
<!-- Tekstveld -->
<input type="text" class="form-control" placeholder="Voer tekst in">
<!-- Select -->
<select class="form-select">
<option>Kies een optie</option>
<option>Optie A</option>
</select>
<!-- Textarea -->
<textarea class="form-control" rows="3"></textarea>
<!-- Checkbox -->
<div class="form-check">
<input class="form-check-input" type="checkbox" id="akkoord">
<label class="form-check-label" for="akkoord">Ik ga akkoord</label>
</div>
<!-- Foutmelding bij een veld -->
<input type="email" class="form-control is-invalid">
<div class="invalid-feedback">Voer een geldig e-mailadres in.</div>
<!-- Help-tekst -->
<div class="form-text text-muted">We delen je e-mail niet.</div>
3 Input groups โ prefix en suffix aan velden
Met input-group plak je tekst of knoppen voor of achter een invoerveld โ ideaal voor valuta, eenheden, zoekbalken of URL-prefixen.
<!-- Prefix -->
<div class="input-group mb-3">
<span class="input-group-text">โฌ</span>
<input type="number" class="form-control" placeholder="Prijs">
</div>
<!-- Suffix -->
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Gebruikersnaam">
<span class="input-group-text">@mijnsite.nl</span>
</div>
<!-- Met zoekknop -->
<div class="input-group">
<input type="text" class="form-control" placeholder="Zoeken...">
<button class="btn btn-primary">Zoeken</button>
</div>
4 โก De Symfony Bootstrap-brug
โก Komt terug in Symfony
Symfony genereert formulier-HTML via Twig met form_row(), form_label() en form_widget(). Standaard genereert dit kale HTML zonder opmaak. Maar met het Bootstrap 5-formulierthema voegt Symfony automatisch de juiste Bootstrap-klassen toe โ zonder dat jij dat hoeft te doen.
Wat form_row(form.naam) met het Bootstrap-thema genereert:
{{ form_start(form) }}
{{ form_row(form.naam) }}
{{ form_row(form.email) }}
{{ form_row(form.bericht) }}
<button class="btn btn-primary">
Verzenden
</button>
{{ form_end(form) }}
<div class="mb-3">
<label class="form-label">
Naam
</label>
<input type="text"
class="form-control"
name="naam">
</div>
<!-- idem voor email, bericht -->
Het thema activeer je met รฉรฉn regel in je Twig-template of globaal in config/packages/twig.yaml:
{% comment %}Manier 1: bovenaan รฉรฉn Twig-template{% endcomment %}
{% form_theme form 'bootstrap_5_layout.html.twig' %}
{# Manier 2: globaal in config/packages/twig.yaml #}
twig:
form_themes: ['bootstrap_5_layout.html.twig']
Validatiefouten verschijnen automatisch als is-invalid + invalid-feedback โ precies de Bootstrap-klassen die je in stap 2 hebt geleerd. Nu begrijp je wat Symfony onder de motorkap doet.
<!-- Wat Symfony genereert bij een validatiefout -->
<div class="mb-3">
<label class="form-label">E-mail</label>
<input type="email"
class="form-control is-invalid"
value="geen-email">
<div class="invalid-feedback">
Voer een geldig e-mailadres in.
</div>
</div>
๐ก Samenvatting: je hoeft in Symfony geen Bootstrap-klassen op formuliervelden te zetten โ het thema doet dat. Maar je moet Bootstrap wel zelf inladen in je Twig-basistemplate (via CDN of asset). Wat je in deze les geleerd hebt over form-control, form-label en is-invalid is precies wat Symfony voor je genereert.
5 Tabellen โ gestijlde datatabellen
<!-- Basis Bootstrap tabel -->
<table class="table">
<thead>
<tr><th>Naam</th><th>Status</th><th>Prijs</th></tr>
</thead>
<tbody>
<tr><td>Product A</td><td>Actief</td><td>โฌ 29,99</td></tr>
</tbody>
</table>
<!-- Varianten (combineerbaar) -->
<table class="table table-striped"> <!-- afwisselend grijs -->
<table class="table table-hover"> <!-- rij oplichten bij hover -->
<table class="table table-bordered"> <!-- borders overal -->
<table class="table table-sm"> <!-- compacte weergave -->
<table class="table table-dark"> <!-- donker thema -->
<!-- Responsief (horizontaal scrollen op mobiel) -->
<div class="table-responsive">
<table class="table">...</table>
</div>
6 Oefening 1: Registratieformulier
Opdracht: bouw een registratieformulier
โ Drie velden: naam (text), e-mail (email), wachtwoord (password)
โ Elk veld: form-label + form-control + omsloten door mb-3
โ Een form-check checkbox "Ik ga akkoord met de voorwaarden"
โ Een submit-knop: btn btn-primary w-100
7 Oefening 2: Navbar + tabel pagina
Opdracht: bouw een beheerpagina met navbar en tabel
โ Navbar met navbar navbar-expand-lg bg-dark navbar-dark
โ Merknaam en drie navigatielinks
โ Tabel met table table-striped table-hover
โ Tabel heeft minimaal 3 rijen met data
โ Minstens รฉรฉn badge (bg-success of bg-warning) in de tabel
Kennischeck
4 vragen โ inclusief de Symfony Bootstrap-brug.
๐
Les 5 voltooid!
Je kent navbars, formulieren, tabellen รฉn hoe Symfony's Bootstrap-formulierthema werkt. In les 6 leer je interactieve componenten met Bootstrap JS.
Bootstrap-track ยท Cheatsheet