Filtrage sur métadonnées du cache ou par son contenu html
Situation
Une noisette navigation
qui calcule l'id_article suivant et précédent pour présenter des flèches de navigation.
Un cache de cette noisette doit être raffraichi si le statut de l'article précédent change ou si le statut de l'article suivant change
C'est à dire que le formulaire ou l'action qui change le statut de cet article ne doit pas raffraichir les caches ayant cet id_article dans son environnement, mais les caches de 2 autres articles, dont les valeurs calculées id_article_prec et id_article_next ont comme valeur l'id_article_courant.
Il semble qu'aucun des filtrages standards actuels ne permet cela, mais on peut créer une fonction de ciblage sur mesure (argument condition 'func')... ou proposer dans le plugin une nouvelle condition adaptée.
2 pistes : filtrage par le contenu du cache + filtrage par les métadonnées.
filtrage sur contenu du cache
Fournir un nouveau filtrage sur le contenu du cache, en ne cherchant qu'au début du cache.
return strpos(substr($html_cache, 0, $max_len), $str_cible) !== false
Le squelette devrait alors mettre ses data calculées en commentaire au début du cache.
<!-- id_voisin=#GET{id_prec_calculed} id_voisin=#GET{id_suiv_calculed} -->
Et ainsi, on pourrait cibler ces caches devant être raffraîchis par
cachelab_cibler(
'del',
'contenu',
['partie'=>'debut', 'max_pos'=>20,
'str_cible'=>"id_voisin=$id_article"]
);
Rq : De manière plus polyvalente on pourrait vouloir chercher un ensemble de valeurs possibles "str1|
str2|$str3..." comme pour la condition 'chemin'.
filtrage par meta_données du cache
Fournir un filtre (ou une macro ? non je crois pas) (utilisable dans un squelette) et permettant de créer, modifier ou lire une meta_donnée du cache (et non son contenu html).
[(#REM|cachelab_set_metadata{id_voisins,#LISTE{#GET{id_voisin_prec},#GET{id_voisin_suiv}}})]
Et fournir un nouveau filtrage sur les valeurs des meta_données du cache :
cachelab_cibler(
'del',
'metadata',
[ 'test_func'=>'in_array',
'metadata'=>'id_voisins',
'val'=>$id_article_courant ]
);
D'autres test_func seraient potentiellement utiles : in_str, ==, >, <, etc.