Browse Source

mieux tolérer les déviances de l'argument de suivre_invalideur + suivre php

master
JLuc 9 months ago
parent
commit
076255c27b
  1. 15
      inc/cachelab.php
  2. 36
      inc/cachelab_utils.php

15
inc/cachelab.php

@ -91,18 +91,18 @@ static $len_prefix;
*/
function cachelab_prepare_conditions(array $conditions) {
// filtrage
$session = (isset($conditions['session']) ? $conditions['session'] : null);
$session = ($conditions['session'] ?? null);
if ($session=='courante') {
$session = spip_session();
}
$chemin = (isset($conditions['chemin']) ? $conditions['chemin'] : null);
$chemin = ($conditions['chemin'] ?? null);
$chemins = ($chemin ? explode('|', $chemin) : null); // sert seulement pour methode_chemin == strpos
$cle_objet = (isset($conditions['cle_objet']) ? $conditions['cle_objet'] : null);
$id_objet = (isset($conditions['id_objet']) ? $conditions['id_objet'] : null);
$cle_objet = ($conditions['cle_objet'] ?? null);
$id_objet = ($conditions['id_objet'] ?? null);
if ($cle_objet and !$id_objet) {
spip_log("cachelab_cibler : $cle_objet inconnu\n".print_r(debug_backtrace(), 1), 'ERREUR_cachelab');
spip_log("cachelab_cibler : $cle_objet inconnu càd bad conditions=".print_r($conditions, 1)."\nPile=\n".print_r(debug_backtrace(), 1), 'ERREUR_cachelab');
$cle_objet=null;
}
@ -163,7 +163,7 @@ function cachelab_cibler(string $action, array $conditions = array(), array $opt
$return = $session = $chemin = $chemins = $cle_objet = $id_objet = $plusfunc = null;
// Prise en compte des 'OU' ('OR', alternatives de conditions)
$l_conditions = (isset($conditions['ou']) ? $conditions['ou'] : '') or (isset($conditions['or']) ? $conditions['or'] : '');
$l_conditions = ($conditions['ou'] ?? '') or ($conditions['or'] ?? '');
if (!$l_conditions) {
$l_conditions = array($conditions);
}
@ -171,9 +171,6 @@ function cachelab_cibler(string $action, array $conditions = array(), array $opt
spip_log ("La condition OU ou OR pour cachelab_cibler($action,...) n'est pas un tableau : " . print_r ($conditions, 1), 'ERREUR_cachelab');
return null;
}
else {
spip_log("OU liste operandes = ".print_r($l_conditions,1), "cachelab_ou");
}
// $l_conditions est un tableau de conditions élémentaires
// La condition globale est satisfaite si l'une des condition est satisfaite (OR)

36
inc/cachelab_utils.php

@ -60,31 +60,39 @@ function slug_chemin($chemin, $sep = '_') {
/**
* @param string $cond signal d'invalidation
* typiquement de la forme : "id='id_document/1234'"
* @param string $cle_objet_attendue id_objet attendu
* @param string &$objet objet effectivement signalé
* typiquement de la forme : "id='document/1234'" ou "id='article/567'"
* @param string $objet_attendu id_objet attendu : 'id_document' ou 'id_article'
* @param string &$objet objet effectivement signalé : 'document' ou 'article'
* @return int|null
*
*
* renvoie l'id_objet ciblé par le signal
* Fenvoie l'id_objet ciblé par le signal
*
* Fonction utilitaire pour les fonctions cachelab_suivre_invalideur_xxx user-squelette-définies
* Exemple :
* function cachelab_suivre_invalideur_document($cond, $modif) {
* include_spip('inc/cachelab');
* $id_doc = decoder_invalideur($cond, 'document');
* cachelab_cibler('del', array ('chemin'=>'documents', 'cle_objet'=>'id_document', 'id_objet'=>$id_doc));
* return false;
* }
*/
function decoder_invalideur($cond, $cle_objet_attendue = '', &$objet='') {
function decoder_invalideur($cond, $objet_attendu = '', &$objet='') {
if (!preg_match(',["\']([a-z_]+)[/"\'](.*)[/"\'],', $cond, $r)) {
spip_log("Signal non conforme pour decode_signal_invalideur ($cond, $cle_objet_attendue)", 'ERREUR_cachelab');
spip_log("Signal non conforme pour decode_signal_invalideur ($cond, $objet_attendu)", 'ERREUR_cachelab', 1);
return null;
}
// ignorer [0] = match total
list (, $objet, $id_objet) = $r;
if ($cle_objet_attendue and ($objet!=$cle_objet_attendue)) {
list (, $objet, $id_objet) = $r; // [0] est le match total
// On vérifie 'objet' et 'id_objet' car il arrive que le signal soit mal formé
if ($objet_attendu and ($objet!=$objet_attendu) and ($objet!="id_$objet_attendu")) {
spip_log(
"decoder_invalideur($cond,) ne reçoit pas un '$cle_objet_attendue' mais un '$objet'",
'ERREUR_cachelab'
"decoder_invalideur($cond,) ne reçoit pas un '$objet_attendu' mais un '$objet' (avec id_objet='$id_objet'). Signal non conforme ?",
'ERREUR_cachelab', 1
);
return null;
};
}
if (!$id_objet) {
spip_log(
"decoder_invalideur($cond,) reçoit un $objet nul",
"decoder_invalideur($cond, $objet_attendu) ne reçoit pas l'id pour '$objet'",
'ERREUR_cachelab'
);
return null;

Loading…
Cancel
Save