@ -28,7 +28,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @param string $plugin Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
* un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
*
* @return array Tableau des configurations complétée des caches d'un plugin venant d'être enregistrée.
* @return array< string , mixed > Tableau des configurations complétée des caches d'un plugin venant d'être enregistrée.
*/
function ezcache_cache_configurer($plugin) {
@ -37,17 +37,18 @@ function ezcache_cache_configurer($plugin) {
// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Cache.
$configuration_defaut = array(
'racine' => '_DIR_CACHE', // Emplacement de base du répertoire des caches. Attention c'est la chaine de la constante SPIP
'sous_dossier' => false, // Indicateur d'utilisation d'un sous-dossier
'nom_prefixe' => '', // Préfixe du nom du cache : si non vide devient le premier composant obligatoire.
'nom_obligatoire' => array(), // Composants obligatoires ordonnés de gauche à droite.
'nom_facultatif' => array(), // Composants facultatifs
'separateur' => '', // Caractère de séparation des composants du nom '_' ou '-' ou '' si un seul composant est utilisé
'extension' => '.txt', // Extension du fichier cache (vaut .php si cache sécurisé)
'securisation' => false, // Indicateur de sécurisation du fichier
'serialisation' => true, // Indicateur de sérialisation
'decodage' => false, // Permet d'appliquer une fonction de décodage à la lecture qui dépend de l'extension
'conservation' => 0 // Durée de conservation du cache en secondes. 0 pour permanent
'racine' => '_DIR_CACHE', // Emplacement de base du répertoire des caches. Attention c'est la chaine de la constante SPIP
'sous_dossier' => false, // Indicateur d'utilisation d'un sous-dossier
'sous_dossier_auto' => false, // Indique que la valeur par défaut du sous-dossier est le type de cache
'nom_prefixe' => '', // Préfixe du nom du cache : si non vide devient le premier composant obligatoire.
'nom_obligatoire' => array(), // Composants obligatoires ordonnés de gauche à droite.
'nom_facultatif' => array(), // Composants facultatifs
'separateur' => '', // Caractère de séparation des composants du nom '_' ou '-' ou '' si un seul composant est utilisé
'extension' => '.txt', // Extension du fichier cache (vaut .php si cache sécurisé)
'securisation' => false, // Indicateur de sécurisation du fichier
'serialisation' => true, // Indicateur de sérialisation
'decodage' => false, // Permet d'appliquer une fonction de décodage à la lecture qui dépend de l'extension
'conservation' => 0 // Durée de conservation du cache en secondes. 0 pour permanent
);
// Le plugin utilisateur doit fournir un service propre pour la ou les configurations de ses caches.
@ -106,6 +107,10 @@ function ezcache_cache_configurer($plugin) {
}
// -- Sous-dossier spécifique au plugin
$configuration['dossier_plugin'] = ($configuration['racine'] == '_DIR_VAR') ? "cache-${plugin}/" : "${plugin}/";
// -- Si le type sert de sous-dossier on force l'indicateur sous-dossier à vrai
if ($configuration['sous_dossier_auto']) {
$configuration['sous_dossier'] = true;
}
// Construction du tableau des composants du nom : dans l'ordre on a toujours les composants obligatoires
// suivis des composants facultatifs.
@ -148,56 +153,66 @@ function ezcache_cache_configurer($plugin) {
return $configurations;
}
/**
* Vérifie l'identifiant relatif du cache et le complète le cas échéant si le plugin utilise un sous-dossier ou
* un préfixe.
*
* @param string $plugin Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
* ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
* @param array $cache Tableau identifiant le cache pour lequel on veut construire le nom.
* @param array $configuration Configuration complète des caches du plugin utlisateur lue à partir de la meta de stockage.
* @param string $plugin Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
* ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
* @param array< string , mixed > $cache Tableau identifiant le cache pour lequel on veut construire le nom.
* @param array< string , mixed > $configuration Configuration complète des caches du plugin utlisateur lue à partir de la meta de stockage.
*
* @return array L'identifiant relatif du cache vérifié et éventuellement complété ou tableau vide si erreur.
* @return array< string , mixed > L'identifiant relatif du cache vérifié et éventuellement complété ou tableau vide si erreur.
*/
function ezcache_cache_verifier($plugin, $cache, $configuration) {
// Cache avec sous-dossier: si la configuration impose un sous-dossier et que l'identifiant relatif $cache
// ne fournit pas cet index, c'est que le type de cache doit être utilisé comme nom de sous-dossier.
// -> on l'ajoute pour assurer un traitement standard.
// Vérifications :
// -- on vérifie la configuration du sous-dossier
if (
$configuration['sous_dossier']
and !$configuration['sous_dossier_auto']
and empty($cache['sous_dossier'])
) {
$cache['sous_dossier'] = $configuration ['type_cache' ];
$cache = [];
}
// Cache avec préfixe: si il existe on le rajoute dans le tableau $cache pour assurer un
// traitement standard.
if ($configuration['nom_prefixe']) {
$cache['_prefixe_nom'] = $configuration['nom_prefixe'];
// -- on vérifie la présence de tous les composants obligatoires du nom
if ($cache) {
foreach ($configuration['nom_obligatoire'] as $_composant) {
if (empty($cache[$_composant])) {
$cache = [];
break;
}
}
}
// On vérifie la présence de tous les composants obligatoires du nom
foreach ($configuration['nom_obligatoire'] as $_composant) {
if (empty($cache[$_composant])) {
$cache = [];
break;
// Compléments :
// -- Cache avec sous-dossier: si la configuration impose un sous-dossier auto et que l'identifiant relatif $cache
// ne fournit pas cet index, c'est que le type de cache doit être utilisé comme nom de sous-dossier.
// -> on l'ajoute pour assurer un traitement standard.
if ($cache) {
if (
$configuration['sous_dossier']
and $configuration['sous_dossier_auto']
and empty($cache['sous_dossier'])
) {
$cache['sous_dossier'] = $configuration['type_cache'];
}
}
// On passe la main à un service spécifique si aucune erreur n'a été détectée.
if (
$cache
and ($verifier = service_cache_chercher($plugin, $configuration['type_cache'], 'cache_composer'))
) {
$cache = $verifier($plugin, $cache, $configuration);
// Cache avec préfixe: si il existe on le rajoute dans le tableau $cache pour assurer un
// traitement standard.
if ($configuration['nom_prefixe']) {
$cache['_prefixe_nom'] = $configuration['nom_prefixe'];
}
// On passe la main à un service spécifique si aucune erreur n'a été détectée.
if ($verifier = service_cache_chercher($plugin, $configuration['type_cache'], 'cache_composer')) {
$cache = $verifier($plugin, $cache, $configuration);
}
}
return $cache;
}
/**
* Construit le chemin complet du fichier cache.
*
@ -246,10 +261,7 @@ function ezcache_cache_composer($plugin, $cache, $configuration) {
$nom_cache .= $cache[$_composant];
} elseif (
$cache[$_composant]
or (
!$cache[$_composant]
and in_array($_composant, $configuration['nom_obligatoire'])
)
or in_array($_composant, $configuration['nom_obligatoire'])
) {
// Le composant est à ajouter : non vide ou vide mais obligatoire (cas bizarre!)
$nom_cache .= $configuration['separateur'] . $cache[$_composant];
@ -333,7 +345,6 @@ function ezcache_cache_decomposer($plugin, $fichier_cache, $configuration) {
return $cache;
}
/**
* Complète la description d'un cache issue du service `cache_decomposer()`.
*
@ -424,7 +435,6 @@ function ezcache_cache_decoder($plugin, $contenu, $configuration) {
return $contenu;
}
/**
* Vérifie la validité du fichier cache.
*
@ -487,7 +497,7 @@ function ezcache_cache_valider($plugin, $fichier_cache, $cache, $configuration)
* un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
* @param string $type_cache Type de cache identifiant la configuration dans la liste des configurations de cache du plugin.
* Si on veut forcer un service plugin uniquement il faut passer la chaine vide.
* @param bool $fonction Nom de la fonction de service à chercher.
* @param string $fonction Nom de la fonction de service à chercher.
*
* @return string Nom complet de la fonction si trouvée ou chaine vide sinon.
*/