Help me een aangepaste zoekfunctionaliteit maken voor mijn Statamic-website
description
Door een aangepaste zoekfunctionaliteit te creëren, kunt u de gebruikerservaring verbeteren, de vindbaarheid van inhoud vergroten en ervoor zorgen dat gebruikers snel de meest relevante informatie vinden.
prompt
try_prompt
Ik wil een op maat gemaakte zoekfunctie implementeren op mijn Statamic-website die relevante resultaten biedt op basis van gebruikersvragen. De specifieke vereisten voor deze zoekfunct ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je een op maat gemaakte zoekfunctie kunt implementeren op je Statamic 3.0.5-website, inclusief filtering op datum en categorie, en enkele optimalisatietips:
1. Gebruik de ingebouwde zoekmogelijkheden van Statamic:
- Statamic maakt gebruik van de Laravel Scout integratie voor zoekfunctionaliteit. Zorg dat je Scout hebt geïnstalleerd en geconfigureerd met een zoekdriver zoals Algolia of MeiliSearch voor betere prestaties.
2. Configureer de zoekindex:
- Voeg de velden toe die je wilt doorzoeken, zoals titel, inhoud, datum en categorie.
- Bijvoorbeeld in je `search.php` config-bestand of via de Scout instellingen.
3. Bouw een aangepaste zoekinterface:
- Maak een zoekformulier met invoervelden voor de zoekterm, datumbereik en categorie.
- Bijvoorbeeld:
```blade
<form method="GET" action="/zoeken">
<input type="text" name="q" placeholder="Zoek...">
<input type="date" name="start_date">
<input type="date" name="end_date">
<select name="category">
<option value="">Alle categorieën</option>
<!-- Voeg hier je categorieën toe -->
</select>
<button type="submit">Zoeken</button>
</form>
```
4. Verwerk de zoekopdracht op de backend:
- Gebruik een controller of directe Blade-code om de zoekparameters op te vangen en de zoekopdracht uit te voeren met filters:
```php
$query = request('q');
$startDate = request('start_date');
$endDate = request('end_date');
$category = request('category');
$results = \Statamic\Facades\Entry::search($query);
if ($startDate) {
$results = $results->filter(function ($entry) use ($startDate) {
return $entry->get('date') >= $startDate;
});
}
if ($endDate) {
$results = $results->filter(function ($entry) use ($endDate) {
return $entry->get('date') <= $endDate;
});
}
if ($category) {
$results = $results->filter(function ($entry) use ($category) {
return $entry->get('category') == $category;
});
}
```
5. Optimaliseer prestaties en gebruikerservaring:
- Gebruik een zoek-API zoals Algolia of MeiliSearch voor snelle resultaten.
- Cache zoekresultaten waar mogelijk, vooral bij veelgebruikte zoekopdrachten.
- Voeg real-time zoeksuggesties en autocomplete toe om de gebruikerservaring te verbeteren.
- Zorg voor duidelijke filters en een overzichtelijke resultatenpagina.
- Pas paginering toe voor grote resultaatschermen.
6. Test en verfijn:
- Test de zoekfunctie met verschillende zoektermen en filtercombinaties.
- Verzamel gebruikersfeedback om de relevantie en gebruiksvriendelijkheid te verbeteren.
Door deze aanpak te volgen, kun je een efficiënte en gebruiksvriendelijke op maat gemaakte zoekfunctie implementeren die zoekresultaten filtert op datum en categorie. Mocht je verdere hulp nodig hebben bij specifieke implementatiestappen, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Hier is een uitgebreid overzicht voor het implementeren van een aangepaste zoekfunctie in Statamic 3.0.5:
## Basis Zoekimplementatie
### 1. Search Formulier
```blade
<form action="{{ route('search') }}" method="GET">
<input type="text" name="q" value="{{ $query }}" placeholder="Zoek...">
<!-- Datum filter -->
<select name="date">
<option value="">Alle datums</option>
<option value="today">Vandaag</option>
<option value="week">Deze week</option>
<option value="month">Deze maand</option>
<option value="year">Dit jaar</option>
</select>
<!-- Categorie filter -->
<select name="category">
<option value="">Alle categorieën</option>
@foreach($categories as $category)
<option value="{{ $category }}">{{ $category }}</option>
@endforeach
</select>
<button type="submit">Zoeken</button>
</form>
```
### 2. Search Controller
```php
<?php
namespace App\Http\Controllers;
use Statamic\Facades\Entry;
use Statamic\Facades\Term;
class SearchController extends Controller
{
public function index()
{
$query = request('q');
$dateFilter = request('date');
$categoryFilter = request('category');
$entries = Entry::query()
->where('collection', 'pages'); // Pas aan naar jouw collectie
// Zoekterm toepassen
if ($query) {
$entries->where('title', 'like', "%{$query}%")
->orWhere('content', 'like', "%{$query}%");
}
// Datum filter toepassen
if ($dateFilter) {
$entries->whereDate('date', $this->getDateRange($dateFilter));
}
// Categorie filter toepassen
if ($categoryFilter) {
$entries->where('categories', 'like', "%{$categoryFilter}%");
}
$results = $entries->get();
return view('search.results', [
'results' => $results,
'query' => $query,
'categories' => $this->getCategories()
]);
}
private function getDateRange($filter)
{
$today = now();
return match($filter) {
'today' => $today->toDateString(),
'week' => $today->startOfWeek()->toDateString(),
'month' => $today->startOfMonth()->toDateString(),
'year' => $today->startOfYear()->toDateString(),
default => null
};
}
private function getCategories()
{
return Term::query()
->where('taxonomy', 'categories')
->get()
->pluck('title');
}
}
```
## Optimalisaties voor Zoekprestaties
### 1. Database Indexering
```php
// Voeg indexen toe in je migraties
Schema::table('entries', function (Blueprint $table) {
$table->index(['title', 'status']);
$table->index(['date', 'collection']);
$table->index('categories');
});
```
### 2. Caching Strategie
```php
use Illuminate\Support\Facades\Cache;
public function index()
{
$cacheKey = 'search_' . md5(serialize(request()->all()));
return Cache::remember($cacheKey, 3600, function () {
// Je zoeklogica hier
return $results;
});
}
```
### 3. Geavanceerde Zoekoptimalisatie
```php
// Gebruik full-text search voor betere prestaties
$entries->whereFullText(['title', 'content'], $query);
// Limiteer het aantal resultaten
$entries->limit(50);
// Gebruik paginatie
$results = $entries->paginate(10);
```
## Gebruikerservaring Verbeteringen
### 1. Live Search Suggesties
```javascript
// Voeg AJAX live search toe
document.getElementById('search-input').addEventListener('input', function(e) {
if (e.target.value.length > 2) {
fetch(`/api/search-suggestions?q=${e.target.value}`)
.then(response => response.json())
.then(data => this.showSuggestions(data));
}
});
```
### 2. Search Results Template
```blade
{{-- search/results.antlers.html --}}
<div class="search-results">
@if($results->count())
<p>{{ $results->count() }} resultaten gevonden voor "{{ $query }}"</p>
@foreach($results as $result)
<div class="search-result">
<h3><a href="{{ $result->url }}">{{ $result->title }}</a></h3>
<p class="meta">
{{ $result->date->format('d-m-Y') }}
| {{ $result->categories->join(', ') }}
</p>
<p>{{ $result->excerpt ?? Str::limit($result->content, 150) }}</p>
</div>
@endforeach
{{ $results->links() }}
@else
<p>Geen resultaten gevonden voor "{{ $query }}"</p>
<p>Suggesties:
<ul>
<li>Controleer op spelfouten</li>
<li>Probeer andere zoektermen</li>
<li>Verwijder filters</li>
</ul>
</p>
@endif
</div>
```
### 3. Route Configuratie
```php
// routes/web.php
Route::get('/zoeken', [SearchController::class, 'index'])->name('search');
```
## Aanvullende Optimalisatietips
1. **Search Analytics**: Track populaire zoektermen om content te optimaliseren
2. **Synonyms**: Voeg synoniemen toe voor betere resultaten
3. **Stemming**: Implementeer Nederlandse woordstamherkenning
4. **Performance Monitoring**: Meet zoektijden en optimaliseer trage queries
5. **Mobile Optimization**: Zorg voor responsive search interface
Deze implementatie biedt een solide basis voor een aangepaste zoekfunctie die voldoet aan je vereisten voor datum- en categoriefiltering in Statamic 3.0.5.

