Première implémentation pour le plugin :

- la fonction de chargement des noisettes à partir des YAML.
svn/attic/tags/v010/106508
eric@smellup.net 6 years ago
parent 8d76ddc38d
commit c63ca97982

@ -0,0 +1,95 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param $noisette
* @param array $options
*
* @return array
*/
function noisette_phraser($noisette, $options = array()) {
// Initialisation de la description
$description = array();
// Initialiser le contexte de chargement
if (!isset($options['dossier'])) {
$options['dossier'] = 'noisettes/';
}
if (!isset($options['recharger'])) {
$options['recharger'] = false;
}
if (!isset($options['md5']) or $options['recharger']) {
$options['md5'] = '';
}
// Initialiser les composants de l'identifiant de la noisette:
// - type-noisette si la noisette est dédiée uniquement à une page
// - type-composition-noisette si la noisette est dédiée uniquement à une composition
// - noisette sinon
$type = '';
$composition = '';
$identifiants = explode('-', $noisette);
if (isset($identifiants[1])) {
$type = $identifiants[0];
}
if (isset($identifiants[2])) {
$composition = $identifiants[1];
}
// Initialisation de la description par défaut de la page
$description_defaut = array(
'noisette' => $noisette,
'type' => $type,
'composition' => $composition,
'nom' => $noisette,
'description' => '',
'icon' => 'noisette-24.png',
'necessite' => array(),
'contexte' => array(),
'ajax' => 'defaut',
'inclusion' => 'statique',
'parametres' => array(),
'signature' => '',
);
// Recherche des noisettes par leur fichier YAML uniquement.
$md5 = '';
$fichier = isset($options['yaml']) ? $options['yaml'] : find_in_path("{$options['dossier']}${noisette}.yaml");
if ($fichier) {
// il y a un fichier YAML de configuration, on vérifie le md5 avant de charger le contenu.
$md5 = md5_file($fichier);
if ($md5 != $options['md5']) {
include_spip('inc/yaml');
$description = yaml_charger_inclusions(yaml_decode_file($fichier));
// Traitements des champs pouvant être soit une chaine soit un tableau
if (!empty($description['necessite']) and is_string($description['necessite'])) {
$description['necessite'] = array($description['necessite']);
}
if (!empty($description['contexte']) and is_string($description['contexte'])) {
$description['contexte'] = array($description['contexte']);
}
}
}
// Si la description est remplie c'est que le chargement a correctement eu lieu.
// Sinon, si la noisette n'a pas changée on renvoie une description limitée à un indicateur d'identité pour
// distinguer ce cas avec une erreur de chargement qui renvoie une description vide.
if ($description) {
// Mise à jour du md5
$description['signature'] = $md5;
// Complétude de la description avec les valeurs par défaut
$description = array_merge($description_defaut, $description);
// Sérialisation des champs necessite, contexte et parametres qui sont des tableaux
$description['necessite'] = serialize($description['necessite']);
$description['contexte'] = serialize($description['contexte']);
$description['parametres'] = serialize($description['parametres']);
} elseif ($md5 == $options['md5']) {
$description['identique'] = true;
}
return $description;
}

@ -0,0 +1,12 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// N
'ncore_description' => 'Framework de gestion de noisettes. Ce plugin fournit les mécanismes permettant de lister et de compiler les noisettes.',
'ncore_slogan' => 'Un cœur fondant aux noisettes',
);
?>

@ -0,0 +1,312 @@
<?php
// Securite
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
define('_NCORE_CACHE_AJAX_NOISETTES', _DIR_CACHE . 'noisettes_ajax.php');
define('_NCORE_CACHE_CONTEXTE_NOISETTES', _DIR_CACHE . 'noisettes_contexte.php');
define('_NCORE_CACHE_INCLUSION_NOISETTES', _DIR_CACHE . 'noisettes_inclusion.php');
define('_NCORE_NOISETTE_CACHE_MD5', _DIR_CACHE . 'noisettes_md5.php');
define('_NCORE_NOISETTE_CACHE_DESCRIPTION', _DIR_CACHE . 'noisettes_description.php');
// -------------------------------------------------------------------
// ------------------------- API NOISETTES ---------------------------
// -------------------------------------------------------------------
/**
* Chargement ou rechargement de descriptions de noisettes à partir de leurs fichiers YAML.
* Les noisettes sont recherchées dans un répertoire relatif fourni en argument.
* La fonction optimise le chargement en effectuant uniquement les traitements nécessaires
* en fonction des modifications, ajouts et suppressions de noisettes identifiés en comparant les md5
* des fichiers YAML.
*
* @param string $service
* Le service permet de distinguer l'appelant qui peut-être un plugin comme le noiZetier ou
* un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
* La fonction utilisera les fonctions de lecture des md5 et de stockage des descriptions de noisettes
* spécifiques au service.
* @param string $dossier
* Chemin relatif (avec un `/` final) dans lequel chercher les fichiers YAML de description des noisettes.
* Par défaut, les noisettes seront recherchées dans le dossier `noisettes/`.
* @param bool $recharger
* Si `true` forcer le rechargement de toutes les noisettes, sinon le traitement se base sur
* le md5 des fichiers YAML.
*
* @return bool
* `false` si une erreur s'est produite, `true` sinon.
*/
function ncore_noisette_charger($service, $dossier = 'noisettes/', $recharger = false) {
// Retour de la fonction
$retour = false;
// Initialiser le contexte de rechargement
// -- TODO : en attente de voir si on rajoute un var_mode=recalcul_noisettes
$options['recharger'] = $recharger;
// On recherche les noisettes directement par leur fichier YAML de configuration car il est obligatoire
// -- la recherche s'effectue dans
if ($fichiers = find_all_in_path($dossier, '.+[.]yaml$')) {
// On charge l'API du service appelant
include_spip("ncore/${service}");
// Initialisation des tableaux de noisettes
$noisettes_nouvelles = $noisettes_modifiees = $noisettes_obsoletes = array();
// Récupération des signatures md5 des noisettes déjà enregistrées.
// Si on force le rechargement il est inutile de gérer les signatures et les noisettes modifiées ou obsolètes.
$signatures = array();
if (!$options['recharger']) {
$lire_md5 = "${service}_noisette_lire_signature";
$signatures = $lire_md5();
// On initialise la liste des noisettes à supprimer avec l'ensemble des noisettes en base de données.
$noisettes_obsoletes = $signatures ? array_keys($signatures) : array();
}
include_spip('inc/ncore_noisette');
foreach ($fichiers as $_squelette => $_chemin) {
$noisette = basename($_squelette, '.yaml');
// On passe le md5 de la page si il existe sinon la chaine vide. Cela permet de déterminer
// si on doit ajouter la page ou la mettre à jour.
// Si le md5 est le même et qu'il n'est donc pas utile de recharger la page, la configuration
// retournée est vide.
$options['md5'] = isset($signatures[$noisette]) ? $signatures[$noisette] : '';
$options['yaml'] = $_chemin;
if ($configuration = noisette_phraser($noisette, $options)) {
if (empty($configuration['identique'])) {
// La noisette a été chargée (nouvelle) ou rechargée (modifiée).
// Néanmoins, on n'inclue cette noisette que si les plugins qu'elle nécessite explicitement dans son
// fichier de configuration sont bien tous activés.
// Rappel: si une noisette est incluse dans un plugin non actif elle ne sera pas détectée
// lors du find_all_in_path() puisque le plugin n'est pas dans le path SPIP.
// Ce n'est pas ce cas qui est traité ici.
$noisette_a_garder = true;
$necessite = unserialize($configuration['necessite']);
if (!empty($necessite)) {
foreach ($necessite as $plugin) {
if (!defined('_DIR_PLUGIN_'.strtoupper($plugin))) {
$noisette_a_garder = false;
break;
}
}
}
// Si la noisette est à garder on détermine si elle est nouvelle ou modifiée.
// En mode rechargement forcé toute noisette est considérée comme nouvelle.
// Sinon, la noisette doit être retirée de la base car un plugin qu'elle nécessite a été désactivée:
// => il suffit pour cela de la laisser dans la liste des noisettes obsolètes.
if ($noisette_a_garder) {
if (!$options['md5'] or $options['recharger']) {
// La noisette est soit nouvelle soit on est en mode rechargement forcé:
// => il faut la rajouter dans la table.
$noisettes_nouvelles[] = $configuration;
} else {
// La configuration stockée dans la table a été modifiée et le mode ne force pas le rechargement:
// => il faut mettre à jour la noisette dans la table.
$noisettes_modifiees[] = $configuration;
// => il faut donc la supprimer de la liste des noisettes obsolètes
$noisettes_obsoletes = array_diff($noisettes_obsoletes, array($noisette));
}
}
} else {
// La noisette n'a pas changée et n'a donc pas été réchargée:
// => Il faut donc juste indiquer qu'elle n'est pas obsolète.
$noisettes_obsoletes = array_diff($noisettes_obsoletes, array($noisette));
}
} else {
// Il y a eu une erreur sur lors du rechargement de la noisette.
// => il faut donc ne rien faire pour laisser la noisette dans les obsolètes
continue;
}
}
// Mise à jour du stockage des noisettes:
// -- Suppression des noisettes obsolètes ou de toutes les noisettes si on est en mode rechargement forcé.
// Pour permettre une optimisation du traitement en mode rechargement forcé on passe toujours le mode.
// -- Update des pages modifiées
// -- Insertion des nouvelles pages
$noisettes = array('nouvelles' => $noisettes_nouvelles);
if (!$options['recharger']) {
$noisettes['obsoletes'] = $noisettes_obsoletes;
$noisettes['modifiees'] = $noisettes_modifiees;
}
$stocker = "${service}_noisette_stocker_description";
$retour = $stocker($noisettes, $options['recharger']);
}
return $retour;
}
/**
* Retourne la configuration de la noisette demandée.
* La configuration est stockée en base de données, certains champs sont recalculés avant d'être fournis.
*
* @package SPIP\NOIZETIER\API\NOISETTE
* @api
* @filtre
*
* @param string $noisette
* Identifiant de la $noisette.
* @param boolean $traitement_typo
* Indique si les données textuelles doivent être retournées brutes ou si elles doivent être traitées
* en utilisant la fonction _T_ou_typo.
* Les champs sérialisés sont toujours désérialisés.
*
* @return array
*/
function ncore_noisette_informer($noisette, $traitement_typo = true) {
static $description_noisette = array();
if (!isset($description_noisette[$traitement_typo][$noisette])) {
// Chargement de toute la configuration de la noisette en base de données.
$description = sql_fetsel('*', 'spip_noizetier_noisettes', array('noisette=' . sql_quote($noisette)));
// Sauvegarde de la description de la page pour une consultation ultérieure dans le même hit.
if ($description) {
// Traitements des champs textuels
if ($traitement_typo) {
$description['nom'] = _T_ou_typo($description['nom']);
if (isset($description['description'])) {
$description['description'] = _T_ou_typo($description['description']);
}
}
// Traitements des champs tableaux sérialisés
$description['contexte'] = unserialize($description['contexte']);
$description['necessite'] = unserialize($description['necessite']);
$description['parametres'] = unserialize($description['parametres']);
// Stockage de la description
$description_noisette[$traitement_typo][$noisette] = $description;
} else {
$description_noisette[$traitement_typo][$noisette] = array();
}
}
return $description_noisette[$traitement_typo][$noisette];
}
function ncore_noisette_ajax($noisette) {
static $est_ajax = array();
if (!isset($est_ajax[$noisette])) {
// On détermine l'existence et le contenu du cache.
if (lire_fichier_securise(_CACHE_AJAX_NOISETTES, $contenu)) {
$est_ajax = unserialize($contenu);
}
// On doit recalculer le cache.
if (!$est_ajax
or (_request('var_mode') == 'recalcul')
or (defined('_NO_CACHE') and (_NO_CACHE != 0))) {
// On détermine la valeur par défaut de l'ajax des noisettes
include_spip('inc/config');
$defaut_ajax = lire_config('noizetier/ajax_noisette') == 'on' ? true : false;
// On repertorie toutes les noisettes disponibles et on compare
// avec la valeur par défaut configurée pour le noiZetier.
if ($noisettes = sql_allfetsel('noisette, ajax', 'spip_noizetier_noisettes')) {
$noisettes = array_column($noisettes, 'ajax', 'noisette');
foreach ($noisettes as $_noisette => $_ajax) {
$est_ajax[$_noisette] = ($_ajax == 'defaut')
? $defaut_ajax
: ($_ajax == 'non' ? false : true);
}
}
// On vérifie que la noisette demandée est bien dans la liste.
// Si non, on la rajoute en utilisant la valeur ajax par défaut afin de toujours renvoyer
// quelque chose.
if (!isset($est_ajax[$noisette])) {
$est_ajax[$noisette] = $defaut_ajax;
}
// On met à jour in fine le cache
if ($est_ajax) {
ecrire_fichier_securise(_CACHE_AJAX_NOISETTES, serialize($est_ajax));
}
}
}
return $est_ajax[$noisette];
}
function ncore_noisette_dynamique($noisette) {
static $est_dynamique = array();
if (!isset($est_dynamique[$noisette])) {
// On détermine l'existence et le contenu du cache.
if (lire_fichier_securise(_CACHE_INCLUSIONS_NOISETTES, $contenu)) {
$est_dynamique = unserialize($contenu);
}
// On doit recalculer le cache.
if (!$est_dynamique
or (_request('var_mode') == 'recalcul')
or (defined('_NO_CACHE') and (_NO_CACHE != 0))) {
// On repertorie toutes les types de noisettes disponibles et on compare la valeur
// du champ inclusion.
if ($noisettes = sql_allfetsel('noisette, inclusion', 'spip_noizetier_noisettes')) {
$noisettes = array_column($noisettes, 'inclusion', 'noisette');
foreach ($noisettes as $_noisette => $_inclusion) {
$est_dynamique[$_noisette] = ($_inclusion == 'dynamique') ? true : false;
}
}
// On vérifie que la noisette demandée est bien dans la liste.
// Si non, on la rajoute en utilisant en positionnant l'inclusion dynamique à false.
if (!isset($est_dynamique[$noisette])) {
$est_dynamique[$noisette] = false;
}
// On met à jour in fine le cache
if ($est_dynamique) {
ecrire_fichier_securise(_CACHE_INCLUSIONS_NOISETTES, serialize($est_dynamique));
}
}
}
return $est_dynamique[$noisette];
}
function ncore_noisette_contexte($noisette) {
static $contexte = array();
if (!isset($contexte[$noisette])) {
// On détermine l'existence et le contenu du cache.
if (lire_fichier_securise(_CACHE_CONTEXTE_NOISETTES, $contenu)) {
$contexte = unserialize($contenu);
}
// On doit recalculer le cache.
if (!$contexte
or (_request('var_mode') == 'recalcul')
or (defined('_NO_CACHE') and (_NO_CACHE != 0))) {
// On repertorie toutes les types de noisettes disponibles et on compare la valeur
// du champ inclusion.
if ($noisettes = sql_allfetsel('noisette, contexte', 'spip_noizetier_noisettes')) {
$noisettes = array_column($noisettes, 'contexte', 'noisette');
$contexte = array_map('unserialize', $noisettes);
}
// On vérifie que la noisette demandée est bien dans la liste.
// Si non, on la rajoute en utilisant en positionnant le contexte à tableau vide.
if (!isset($contexte[$noisette])) {
$contexte[$noisette] = array();
}
// On met à jour in fine le cache
if ($contexte) {
ecrire_fichier_securise(_CACHE_CONTEXTE_NOISETTES, serialize($contexte));
}
}
}
return $contexte[$noisette];
}

@ -0,0 +1,22 @@
<paquet
prefix="Ncore"
categorie="outil"
version="0.1.0"
etat="dev"
compatibilite="[3.0.0;3.1.*]"
logo="ncore_logo-32.png"
>
<nom>N-Core</nom>
<!-- Un coeur fondant aux noisettes -->
<auteur lien="http://blog.smellup.net">Eric Lupinacci</auteur>
<licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
<pipeline nom="recuperer_fond" inclure="noizetier_pipelines.php" />
<necessite nom="yaml" compatibilite="[1.5.2;[" />
<necessite nom="saisies" compatibilite="[2.2.3;[" />
<utilise nom="Z" compatibilite="[1.7.15;1.9.*]" />
</paquet>
Loading…
Cancel
Save