Bootstrap Les 5: Navbar, forms & tabellen
Homeโ€บBootstrap-trackโ€บLes 5

๐Ÿ“‹ 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.

Standaard responsive navbar
<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.

โœ— Kale HTML โ€” ongestijld
<label>Naam</label>
<input type="text">

<label>E-mail</label>
<input type="email">

<button>Verzenden</button>
โœ“ Met Bootstrap-klassen
<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>
Alle formulierelementen
<!-- 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.

Input group voorbeelden
<!-- 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:

Twig โ€” jij schrijft dit
{{ 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) }}
Bootstrap-thema genereert dit
<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:

Activeren โ€” twee manieren
{% 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.

Validatiefout โ€” Symfony + Bootstrap thema
<!-- 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

Tabel-klassen
<!-- 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

editor
Live preview

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

editor
Live preview

Kennischeck

4 vragen โ€” inclusief de Symfony Bootstrap-brug.

Bootstrap-track ยท Cheatsheet