Implementeer Geavanceerde Zoekfunctionaliteit in Mijn CodeIgniter Toepassing
description
Door het implementeren van geavanceerde zoekfunctionaliteit kunnen gebruikers gemakkelijk relevante inhoud vinden, wat de betrokkenheid en tevredenheid met de toepassing verbetert.
prompt
try_prompt
Help me een geavanceerde zoekfunctionaliteit te creëren voor mijn CodeIgniter toepassing. Beschrijf hoe ik functies zoals trefwoord zoeken, filters en sorteer ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je een geavanceerde zoekfunctionaliteit met trefwoord zoeken, filters en sorteermogelijkheden kunt implementeren in een CodeIgniter 4.1.5 toepassing:
1. Database- en Modelopzet
Maak een tabel (bijvoorbeeld 'artikelen') met velden zoals 'titel', 'inhoud', 'categorie', 'datum', etc.
Definieer een Model (bijvoorbeeld 'ArtikelModel') dat deze tabel beheert:
php
namespace App\Models;
use CodeIgniter\Model;
class ArtikelModel extends Model
{
protected $table = 'artikelen';
protected $allowedFields = ['titel', 'inhoud', 'categorie', 'datum'];
}
2. Controller aanpassen voor zoekfunctionaliteit
Maak een methode in je Controller (bijvoorbeeld 'ArtikelController') die zoekopdrachten verwerkt:
php
namespace App\Controllers;
use App\Models\ArtikelModel;
class ArtikelController extends BaseController
{
public function zoek()
{
$model = new ArtikelModel();
// Ontvang zoekparameters uit GET of POST
$keyword = $this->request->getGet('keyword') ?? '';
$categorie = $this->request->getGet('categorie') ?? '';
$sorteerOp = $this->request->getGet('sorteer') ?? 'datum_desc';
// Begin met een basis query
$builder = $model->builder();
// Trefwoord zoeken in titel en inhoud
if ($keyword !== '') {
$builder->groupStart()
->like('titel', $keyword)
->orLike('inhoud', $keyword)
->groupEnd();
}
// Filters toepassen (bijv. categorie)
if ($categorie !== '') {
$builder->where('categorie', $categorie);
}
// Sorteer opties
switch ($sorteerOp) {
case 'datum_asc':
$builder->orderBy('datum', 'ASC');
break;
case 'titel_asc':
$builder->orderBy('titel', 'ASC');
break;
case 'titel_desc':
$builder->orderBy('titel', 'DESC');
break;
default:
$builder->orderBy('datum', 'DESC');
}
$artikelen = $builder->get()->getResult();
// Data doorgeven aan de view
return view('zoek_resultaten', [
'artikelen' => $artikelen,
'keyword' => $keyword,
'categorie' => $categorie,
'sorteerOp' => $sorteerOp
]);
}
}
3. Zoekformulier in de View
Maak een formulier waarmee gebruikers zoekwoorden, filters en sorteermogelijkheden kunnen instellen:
html
<form method="get" action="<?= site_url('artikel/zoek') ?>">
<input type="text" name="keyword" placeholder="Zoek op titel of inhoud" value="<?= htmlspecialchars($keyword ?? '') ?>">
<select name="categorie">
<option value="">Alle categorieën</option>
<option value="categorie1" <?= ($categorie ?? '') == 'categorie1' ? 'selected' : '' ?>>Categorie 1</option>
<option value="categorie2" <?= ($categorie ?? '') == 'categorie2' ? 'selected' : '' ?>>Categorie 2</option>
<!-- Voeg meer categorieën toe -->
</select>
<select name="sorteer">
<option value="datum_desc" <?= ($sorteerOp ?? '') == 'datum_desc' ? 'selected' : '' ?>>Nieuwste eerst</option>
<option value="datum_asc" <?= ($sorteerOp ?? '') == 'datum_asc' ? 'selected' : '' ?>>Oudste eerst</option>
<option value="titel_asc" <?= ($sorteerOp ?? '') == 'titel_asc' ? 'selected' : '' ?>>Titel A-Z</option>
<option value="titel_desc" <?= ($sorteerOp ?? '') == 'titel_desc' ? 'selected' : '' ?>>Titel Z-A</option>
</select>
<button type="submit">Zoeken</button>
</form>
4. Resultaten weergeven
Toon de zoekresultaten in je view (bijvoorbeeld 'zoek_resultaten.php'):
html
<h2>Zoekresultaten</h2>
<?php if ($artikelen): ?>
<ul>
<?php foreach ($artikelen as $artikel): ?>
<li>
<h3><?= htmlspecialchars($artikel->titel) ?></h3>
<p><?= htmlspecialchars($artikel->inhoud) ?></p>
<small>Categorie: <?= htmlspecialchars($artikel->categorie) ?> | Datum: <?= $artikel->datum ?></small>
</li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>Geen resultaten gevonden.</p>
<?php endif; ?>
5. Samenvatting
- Gebruik de query builder voor dynamische querys met LIKE voor trefwoord zoekingen.
- Voeg filters toe met waar-clausules.
- Implementatie van sorteeropties via orderBy.
- Zorg dat de formulierwaarden persistent blijven bij het zoeken voor gebruiksvriendelijkheid.
Door deze aanpak kunnen gebruikers trefwoorden zoeken, resultaten filteren en sorteren, wat de gebruikerservaring aanzienlijk verbetert.
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide handleiding voor het implementeren van geavanceerde zoekfunctionaliteit in CodeIgniter 4.1.5:
## 1. Database Setup
```sql
-- Voorbeeld tabel structuur
CREATE TABLE artikelen (
id INT PRIMARY KEY AUTO_INCREMENT,
titel VARCHAR(255),
inhoud TEXT,
categorie_id INT,
auteur VARCHAR(100),
aanmaakdatum DATETIME,
status ENUM('actief', 'inactief')
);
```
## 2. Model (App/Models/ZoekModel.php)
```php
<?php
namespace App\Models;
use CodeIgniter\Model;
class ZoekModel extends Model
{
protected $table = 'artikelen';
protected $primaryKey = 'id';
protected $allowedFields = ['titel', 'inhoud', 'categorie_id', 'auteur', 'status'];
public function geavanceerdZoeken($zoekData)
{
$builder = $this->builder();
// Trefwoord zoeken in titel en inhoud
if (!empty($zoekData['trefwoord'])) {
$builder->groupStart()
->like('titel', $zoekData['trefwoord'])
->orLike('inhoud', $zoekData['trefwoord'])
->groupEnd();
}
// Filters toepassen
if (!empty($zoekData['categorie'])) {
$builder->where('categorie_id', $zoekData['categorie']);
}
if (!empty($zoekData['auteur'])) {
$builder->where('auteur', $zoekData['auteur']);
}
if (!empty($zoekData['status'])) {
$builder->where('status', $zoekData['status']);
}
// Datum filter
if (!empty($zoekData['van_datum'])) {
$builder->where('aanmaakdatum >=', $zoekData['van_datum']);
}
if (!empty($zoekData['tot_datum'])) {
$builder->where('aanmaakdatum <=', $zoekData['tot_datum']);
}
// Sortering
$sorteerVeld = $zoekData['sorteer_veld'] ?? 'aanmaakdatum';
$sorteerRichting = $zoekData['sorteer_richting'] ?? 'DESC';
$builder->orderBy($sorteerVeld, $sorteerRichting);
return $builder->get()->getResultArray();
}
public function getUniekeAuteurs()
{
return $this->distinct()->select('auteur')->findAll();
}
}
```
## 3. Controller (App/Controllers/ZoekController.php)
```php
<?php
namespace App\Controllers;
use App\Models\ZoekModel;
use App\Models\CategorieModel;
class ZoekController extends BaseController
{
public function index()
{
$zoekModel = new ZoekModel();
$categorieModel = new CategorieModel();
$data = [
'categorieen' => $categorieModel->findAll(),
'auteurs' => $zoekModel->getUniekeAuteurs()
];
return view('zoek_formulier', $data);
}
public function zoek()
{
$zoekModel = new ZoekModel();
// Valideer invoer
$regels = [
'trefwoord' => 'permit_empty|max_length[100]',
'categorie' => 'permit_empty|numeric',
'auteur' => 'permit_empty|max_length[100]',
'van_datum' => 'permit_empty|valid_date',
'tot_datum' => 'permit_empty|valid_date'
];
if (!$this->validate($regels)) {
return redirect()->back()->with('errors', $this->validator->getErrors());
}
$zoekData = $this->request->getPost();
$resultaten = $zoekModel->geavanceerdZoeken($zoekData);
$data = [
'resultaten' => $resultaten,
'zoekData' => $zoekData,
'pager' => $zoekModel->pager
];
return view('zoek_resultaten', $data);
}
}
```
## 4. Zoekformulier View (app/Views/zoek_formulier.php)
```html
<!DOCTYPE html>
<html>
<head>
<title>Geavanceerd Zoeken</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-4">
<h2>Geavanceerd Zoeken</h2>
<?php if (session()->has('errors')): ?>
<div class="alert alert-danger">
<?php foreach (session('errors') as $error): ?>
<p><?= $error ?></p>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="post" action="<?= site_url('zoek/zoek') ?>">
<?= csrf_field() ?>
<!-- Trefwoord zoeken -->
<div class="row mb-3">
<div class="col-md-6">
<label for="trefwoord" class="form-label">Trefwoord</label>
<input type="text" class="form-control" id="trefwoord" name="trefwoord"
placeholder="Zoek in titel en inhoud..." value="<?= old('trefwoord') ?>">
</div>
</div>
<!-- Filters -->
<div class="row mb-3">
<div class="col-md-3">
<label for="categorie" class="form-label">Categorie</label>
<select class="form-select" id="categorie" name="categorie">
<option value="">Alle categorieën</option>
<?php foreach ($categorieen as $categorie): ?>
<option value="<?= $categorie['id'] ?>"
<?= old('categorie') == $categorie['id'] ? 'selected' : '' ?>>
<?= esc($categorie['naam']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3">
<label for="auteur" class="form-label">Auteur</label>
<select class="form-select" id="auteur" name="auteur">
<option value="">Alle auteurs</option>
<?php foreach ($auteurs as $auteur): ?>
<option value="<?= $auteur['auteur'] ?>"
<?= old('auteur') == $auteur['auteur'] ? 'selected' : '' ?>>
<?= esc($auteur['auteur']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3">
<label for="status" class="form-label">Status</label>
<select class="form-select" id="status" name="status">
<option value="">Alle statussen</option>
<option value="actief" <?= old('status') == 'actief' ? 'selected' : '' ?>>Actief</option>
<option value="inactief" <?= old('status') == 'inactief' ? 'selected' : '' ?>>Inactief</option>
</select>
</div>
</div>
<!-- Datum filters -->
<div class="row mb-3">
<div class="col-md-3">
<label for="van_datum" class="form-label">Van datum</label>
<input type="date" class="form-control" id="van_datum" name="van_datum"
value="<?= old('van_datum') ?>">
</div>
<div class="col-md-3">
<label for="tot_datum" class="form-label">Tot datum</label>
<input type="date" class="form-control" id="tot_datum" name="tot_datum"
value="<?= old('tot_datum') ?>">
</div>
</div>
<!-- Sortering -->
<div class="row mb-3">
<div class="col-md-3">
<label for="sorteer_veld" class="form-label">Sorteer op</label>
<select class="form-select" id="sorteer_veld" name="sorteer_veld">
<option value="aanmaakdatum" <?= old('sorteer_veld') == 'aanmaakdatum' ? 'selected' : '' ?>>Datum</option>
<option value="titel" <?= old('sorteer_veld') == 'titel' ? 'selected' : '' ?>>Titel</option>
<option value="auteur" <?= old('sorteer_veld') == 'auteur' ? 'selected' : '' ?>>Auteur</option>
</select>
</div>
<div class="col-md-3">
<label for="sorteer_richting" class="form-label">Sorteerrichting</label>
<select class="form-select" id="sorteer_richting" name="sorteer_richting">
<option value="DESC" <?= old('sorteer_richting') == 'DESC' ? 'selected' : '' ?>>Aflopend</option>
<option value="ASC" <?= old('sorteer_richting') == 'ASC' ? 'selected' : '' ?>>Oplopend</option>
</select>
</div>
</div>
<button type="submit" class="btn btn-primary">Zoeken</button>
<a href="<?= site_url('zoek') ?>" class="btn btn-secondary">Reset</a>
</form>
</div>
</body>
</html>
```
## 5. Resultaten View (app/Views/zoek_resultaten.php)
```html
<!DOCTYPE html>
<html>
<head>
<title>Zoekresultaten</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-4">
<h2>Zoekresultaten</h2>
<?php if (empty($resultaten)): ?>
<div class="alert alert-info">
Geen resultaten gevonden voor uw zoekopdracht.
</div>
<?php else: ?>
<div class="mb-3">
<strong><?= count($resultaten) ?></strong> resultaten gevonden
</div>
<table class="table table-striped">
<thead>
<tr>
<th>Titel</th>
<th>Auteur</th>
<th>Categorie</th>
<th>Datum</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php foreach ($resultaten as $resultaat): ?>
<tr>
<td><?= esc($resultaat['titel']) ?></td>
<td><?= esc($resultaat['auteur']) ?></td>
<td><?= esc($resultaat['categorie_id']) ?></td>
<td><?= date('d-m-Y', strtotime($resultaat['aanmaakdatum'])) ?></td>
<td>
<span class="badge bg-<?= $resultaat['status'] == 'actief' ? 'success' : 'secondary' ?>">
<?= ucfirst($resultaat['status']) ?>
</span>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<a href="<?= site_url('zoek') ?>" class="btn btn-secondary">Nieuw zoeken</a>
</div>
</body>
</html>
```
## 6. Routes (app/Config/Routes.php)
```php
$routes->get('zoek', 'ZoekController::index');
$routes->post('zoek/zoek', 'ZoekController::zoek');
```
## 7. Verbeteringen voor Gebruikerservaring
### AJAX Zoeken
```javascript
// Voeg dit toe aan je zoekformulier voor real-time zoeken
$(document).ready(function() {
$('#trefwoord').on('input', function() {
var zoekData = {
trefwoord: $(this).val(),
categorie: $('#categorie').val(),
auteur: $('#auteur').val()
};
$.post('<?= site_url('zoek/zoek') ?>', zoekData, function(response) {
$('#resultaten-container').html(response);
});
});
});
```
### Geavanceerde Zoekfuncties
```php
// In ZoekModel - voor full-text zoeken (MySQL)
public function fullTextZoeken($trefwoord)
{
$builder = $this->builder();
// Vereist FULLTEXT index op titel en inhoud
$builder->where("MATCH(titel, inhoud) AGAINST('{$trefwoord}' IN BOOLEAN MODE)", null, false);
return $builder->get()->getResultArray();
}
// Fuzzy zoeken met LIKE en wildcards
public function fuzzyZoeken($trefwoord)
{
$builder = $this->builder();
$woorden = explode(' ', $trefwoord);
foreach ($woorden as $woord) {
$builder->groupStart()
->like('titel', $woord)
->orLike('inhoud', $woord)
->groupEnd();
}
return $builder->get()->getResultArray();
}
```
## 8. Configuratie Tips
- Zorg voor database indexes op vaak gezochte velden
- Implementeer caching voor veelgebruikte zoekopdrachten
- Gebruik paginering voor grote resultatensets
- Valideer alle gebruikersinvoer grondig
Deze implementatie biedt een robuuste zoekfunctionaliteit die eenvoudig kan worden uitgebreid met extra functies zoals faceted search, zoeksuggesties of geolocatie-zoeken.

