Admin searches : filtre de période (7 j / 14 j) #61

Closed
opened 2026-05-13 21:29:33 +00:00 by cedricAbonnel · 1 comment
Owner

Problème

L'onglet /admin/searches analyse toujours exactement 14 jours de logs (hardcodé dans SearchLogParser::logFiles() : for ($i = 1; $i <= 14; $i++)). Il est impossible de restreindre à 7 jours pour voir les tendances récentes.

Comportement souhaité

Deux boutons dans l'interface : 7 jours et 14 jours (défaut actuel). L'URL reflète le choix : /admin/searches?days=7.


Analyse technique

État actuel

SearchLogParser::logFiles() itère de 1 à 14 en dur. Le cache est un fichier unique _cache/search_terms.json — si on change la période, l'ancien cache (mauvaise période) est retourné.

Implémentation

1. SearchLogParser : paramètre $days

// Constructeur : ajouter $days
public function __construct(
    string $logDir    = '/var/log/apache2',
    string $vhostBase = 'lan.acegrp.varlog-access.log',
    string $cacheFile = '',
    int    $cacheTtl  = 600,
    int    $days      = 14   // ← nouveau
) {
    $this->days = max(1, min(30, $days));
    // cache distinct par période
    $this->cacheFile = $cacheFile !== ''
        ? $cacheFile
        : dirname(__DIR__) . '/_cache/search_terms_' . $this->days . 'd.json';
    // ...
}

Dans logFiles() :

for ($i = 1; $i <= $this->days; $i++) {

2. public/index.php : lire ?days=

if ($tab === 'searches') {
    $days   = in_array((int)($_GET['days'] ?? 14), [7, 14], true) ? (int)$_GET['days'] : 14;
    $parser = new SearchLogParser(days: $days);
    $adminData['search_terms']       = $parser->topTerms(100);
    $adminData['search_log_readable'] = $parser->isReadable();
    $adminData['search_days']        = $days;
}

3. templates/admin.php : boutons de période

Dans l'onglet searches, sous le titre, ajouter à côté du badge existant :

<div class="btn-group btn-group-sm" role="group">
    <a href="/admin/searches?days=7"
       class="btn <?= ($adminData['search_days'] ?? 14) === 7 ? 'btn-primary' : 'btn-outline-secondary' ?>">
        7 jours
    </a>
    <a href="/admin/searches"
       class="btn <?= ($adminData['search_days'] ?? 14) === 14 ? 'btn-primary' : 'btn-outline-secondary' ?>">
        14 jours
    </a>
</div>

Cache par période

Chaque période a son propre fichier cache (search_terms_7d.json, search_terms_14d.json), évitant toute collision. Les deux TTL restent à 10 minutes.


Fichiers concernés

  • src/SearchLogParser.php — paramètre $days, nom de cache dynamique, boucle logFiles() (~10 lignes)
  • public/index.php — lecture de ?days= + passage à SearchLogParser (~5 lignes)
  • templates/admin.php — boutons de période dans l'onglet searches (~10 lignes)
## Problème L'onglet `/admin/searches` analyse toujours exactement 14 jours de logs (hardcodé dans `SearchLogParser::logFiles()` : `for ($i = 1; $i <= 14; $i++)`). Il est impossible de restreindre à 7 jours pour voir les tendances récentes. ## Comportement souhaité Deux boutons dans l'interface : **7 jours** et **14 jours** (défaut actuel). L'URL reflète le choix : `/admin/searches?days=7`. --- ## Analyse technique ### État actuel `SearchLogParser::logFiles()` itère de `1` à `14` en dur. Le cache est un fichier unique `_cache/search_terms.json` — si on change la période, l'ancien cache (mauvaise période) est retourné. ### Implémentation **1. `SearchLogParser` : paramètre `$days`** ```php // Constructeur : ajouter $days public function __construct( string $logDir = '/var/log/apache2', string $vhostBase = 'lan.acegrp.varlog-access.log', string $cacheFile = '', int $cacheTtl = 600, int $days = 14 // ← nouveau ) { $this->days = max(1, min(30, $days)); // cache distinct par période $this->cacheFile = $cacheFile !== '' ? $cacheFile : dirname(__DIR__) . '/_cache/search_terms_' . $this->days . 'd.json'; // ... } ``` Dans `logFiles()` : ```php for ($i = 1; $i <= $this->days; $i++) { ``` **2. `public/index.php` : lire `?days=`** ```php if ($tab === 'searches') { $days = in_array((int)($_GET['days'] ?? 14), [7, 14], true) ? (int)$_GET['days'] : 14; $parser = new SearchLogParser(days: $days); $adminData['search_terms'] = $parser->topTerms(100); $adminData['search_log_readable'] = $parser->isReadable(); $adminData['search_days'] = $days; } ``` **3. `templates/admin.php` : boutons de période** Dans l'onglet searches, sous le titre, ajouter à côté du badge existant : ```php <div class="btn-group btn-group-sm" role="group"> <a href="/admin/searches?days=7" class="btn <?= ($adminData['search_days'] ?? 14) === 7 ? 'btn-primary' : 'btn-outline-secondary' ?>"> 7 jours </a> <a href="/admin/searches" class="btn <?= ($adminData['search_days'] ?? 14) === 14 ? 'btn-primary' : 'btn-outline-secondary' ?>"> 14 jours </a> </div> ``` ### Cache par période Chaque période a son propre fichier cache (`search_terms_7d.json`, `search_terms_14d.json`), évitant toute collision. Les deux TTL restent à 10 minutes. --- ## Fichiers concernés - `src/SearchLogParser.php` — paramètre `$days`, nom de cache dynamique, boucle `logFiles()` (~10 lignes) - `public/index.php` — lecture de `?days=` + passage à `SearchLogParser` (~5 lignes) - `templates/admin.php` — boutons de période dans l'onglet searches (~10 lignes)
Author
Owner

Ticket migré vers le dépôt Folio : cedricAbonnel/folio#46

Ticket migré vers le dépôt Folio : https://git.abonnel.fr/cedricAbonnel/folio/issues/46
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/varlog#61