Als je zoekt naar iets zijn we tegenwoordig gewend om de resultaten direct te krijgen terwijl we aan het typen zijn. Dit kan niet met een eenvoudig formulier met submit button.
We gaan nu stap voor stap een dynamisch zoekveld maken. We gebruiken voor deze code de tabel 'users' en we gaan er vanuit dat de kolommen email en name bestaan.
Zorg ervoor dat je /app/views/parts/header.view.php in de <head> de volgende scripts toevoegt. Waarschijnlijk is dit al gedaan. Alpine is voor het interactieve, axios is voor het dataverkeer tussen de browser en de webserver.
<script defer src="/scripts/alpine.min.js"></script> <script src="/scripts/axios.min.js"></script>
/app/views/parts/header.view.php
In de map controllers maken we een nieuw map met de naam 'api' en een bestand /app/controllers/api/users.php met de volgende inhoud.
<?php $request->validate([ 'name' => 'required' ]); //gebruik van database object $db = new Database(); //users opzoeken die aan onze zoek query voldoen en deze in $users zetten $users = $db->query( "SELECT id, name, email FROM users WHERE name LIKE :name LIMIT 10", [ "name" => "%" . $request->name . "%" //zoeken naar alles wat er op lijkt ] //we hebben twee plekken waar we $name in moeten vullen )->fetchAll(); // het resultaat geven we terug in json formaat echo json_encode($users);
Aan onze router.php voegen we twee nieuwe routes toe
if (hasRole('admin')) { //hier komen de routes die alleen toegankelijk zijn voor een admin $route->get('api/users', "controllers/api/users.php"); $route->get('users', "views/users.view.php"); }
Maak één of meerdere gebruikers admin, door in de database (HeidiSQL) bij veld 'role' admin in te voeren.

We maken een bestand /app/views/users.view.php
<?php view("parts/header", ['title' => 'Gebruikers']); view("parts/navigatie-menu"); ?> <h1 class="font-2xl font-bold m-10">Zoek users</h1> <div x-data="searchUsers()" class="m-10"> Zoek gebruikers: <input type="text" @keyup="fetchUsers()" x-model="searchfield" class="border border-gray-300 rounded p-1"> <!-- indien er resultaten gevonden zijn dan tonen --> <template x-if="users.length"> <table class="w-1/2"> <tr> <td class="font-bold">Email</td> <td class="font-bold">Naam</td> </tr> <!-- Loop door alle gevonden users --> <template x-for="user in users"> <tr @click="goto(user.id)" class="hover:cursor-pointer hover:bg-blue-50"> <td x-text="user.email"></td> <td x-text="user.name"></td> </tr> </template> </table> </template> <!-- Geen resultaten --> <template x-if="!users.length"> <div class="mt-10">Geen gebruikers gevonden</div> </template> </div> <script> function searchUsers() { return { searchfield: '', //inhoud van het zoekveld users: [], //dit wordt gevuld met de resultaten afkomstig van api/users.search.php ok: false, //gaat alles goed? fetchUsers() { axios.get('/api/users?name=' + this.searchfield) .then((response) => { this.ok = true; this.users = response.data; setTimeout(() => { this.ok = false; }, 5000); }).catch((e) => { console.log(e); }) }, goto(id) { //Deze url bestaat nog niet maar kan je zelf aanmaken: $router->get('users-show/{id}', 'controllers/users-show.php'); location.href = '/users-show/' + id; } } } </script> <?php view("parts/footer");
Je kan nu naar http://localhost/users navigeren en uitproberen.
Door gebruik van axios en alpinejs wordt ons zoekveld dynamisch. Lees de documentatie van alpinejs om de code beter te begrijpen. Of kijk een in een video hoe het werkt.