Browse Source

Changement des noms noisette et rang en type_noisette et rang_noisette pour éviter toute confusion.

svn/root/tags/v0.10.0
eric@smellup.net 5 years ago
parent
commit
ed1076a41b
  1. 22
      compiler_conteneur.html
  2. 25
      compiler_noisettes.html
  3. 103
      inc/ncore_noisette.php
  4. 22
      inc/ncore_type_noisette.php
  5. 44
      ncore/ncore.php
  6. 46
      public/noisette_compiler.php

22
compiler_conteneur.html

@ -0,0 +1,22 @@
[(#REM) <!-- COMPILER_CONTENEUR
Compile la liste des noisettes d'un conteneur fourni en paramètre de l'inclusion.
@api
@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 noisettes
Liste des descriptions de noisette à compiler dans l'ordre des rangs
@param string stockage
Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
fournissant le service de stockage souhaité.
-->]
<BOUCLE_compilation_conteneur(DATA){source table, #ENV{noisettes}}{par rang}>
#SET{avec_div, #VALEUR{balise}|=={defaut}|?{#CONFIG{ncore/balise_noisette}, #VALEUR{balise}}}
[[(#GET{avec_div}|oui)<div class="noisette noisette_#NOISETTE[ (#VALEUR{css})]">]
(#NOISETTE_COMPILER{#ENV{plugin}, #ENV{stockage}})
[(#GET{avec_div}|oui)</div>]]
</BOUCLE_compilation_conteneur>

25
compiler_noisettes.html

@ -1,6 +1,23 @@
<BOUCLE_compilation_noisettes(DATA){source table, #ENV{liste}}{par rang}>
#SET{avec_div, #CHAMP_SQL{balise}|=={defaut}|?{#CONFIG{noizetier/balise_noisette}, #CHAMP_SQL{balise}}}
[[(#GET{avec_div}|oui)<div class="noisette noisette_#NOISETTE[ (#CHAMP_SQL{css})]">]
(#NOIZETIER_AFFICHER_NOISETTE)
[(#REM) <!-- COMPILER_NOISETTES
Compile une liste de noisettes fournies en paramètres de l'inclusion. C'est l'appelant qui décide si cette liste
est contenue ou pas dans un conteneur.
@api
@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 noisettes
Liste des descriptions de noisette à compiler dans l'ordre des rangs
@param string stockage
Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
fournissant le service de stockage souhaité.
-->]
<BOUCLE_compilation_noisettes(DATA){source table, #ENV{noisettes}}{par rang}>
#SET{avec_div, #VALEUR{balise}|=={defaut}|?{#CONFIG{ncore/balise_noisette}, #VALEUR{balise}}}
[[(#GET{avec_div}|oui)<div class="noisette noisette_#NOISETTE[ (#VALEUR{css})]">]
(#NOISETTE_COMPILER{#ENV{plugin}, #ENV{stockage}})
[(#GET{avec_div}|oui)</div>]]
</BOUCLE_compilation_noisettes>

103
inc/ncore_noisette.php

@ -68,14 +68,14 @@ function noisette_ajouter($plugin, $type_noisette, $conteneur, $rang = 0, $stock
// On initialise la description de la noisette à ajouter et en particulier on stocke l'id du conteneur
// pour simplifier les traitements par la suite.
$description = array(
'plugin' => $plugin,
'noisette' => $type_noisette,
'conteneur' => serialize($conteneur),
'id_conteneur' => ncore_conteneur_identifier($plugin, $conteneur, $stockage),
'rang' => intval($rang),
'parametres' => serialize($parametres),
'balise' => 'defaut',
'css' => ''
'plugin' => $plugin,
'type_noisette' => $type_noisette,
'conteneur' => serialize($conteneur),
'id_conteneur' => ncore_conteneur_identifier($plugin, $conteneur, $stockage),
'rang_noisette' => intval($rang),
'parametres' => serialize($parametres),
'balise' => 'defaut',
'css' => ''
);
// Complément à la description par défaut, spécifique au plugin utilisateur, si nécessaire.
@ -83,7 +83,7 @@ function noisette_ajouter($plugin, $type_noisette, $conteneur, $rang = 0, $stock
// On récupère les noisettes déjà affectées au conteneur sous la forme d'un tableau indexé
// par le rang de chaque noisette.
$noisettes = ncore_noisette_lister($plugin, $conteneur, '', 'rang', $stockage);
$noisettes = ncore_noisette_lister($plugin, $conteneur, '', 'rang_noisette', $stockage);
// On calcule le rang max déjà utilisé.
$rang_max = $noisettes ? max(array_keys($noisettes)) : 0;
@ -94,7 +94,7 @@ function noisette_ajouter($plugin, $type_noisette, $conteneur, $rang = 0, $stock
// En effet, si le rang est supérieur au rang max c'est que la nouvelle noisette est ajoutée
// après les noisettes existantes, donc cela revient à insérer la noisette en fin de liste.
// Postionner le rang à max + 1 permet d'éviter d'avoir des trous dans la liste des rangs.
$description['rang'] = $rang_max + 1;
$description['rang_noisette'] = $rang_max + 1;
} else {
// Si le rang est non nul et inférieur ou égal au rang max c'est qu'on insère la noisette dans la liste
// existante : il faut décaler d'un rang les noisettes de rang supérieur ou égal si elle existent pour
@ -168,7 +168,7 @@ function noisette_supprimer($plugin, $noisette, $stockage = '') {
$plugin,
$description['id_conteneur'],
'',
'rang',
'rang_noisette',
$stockage
);
@ -177,8 +177,8 @@ function noisette_supprimer($plugin, $noisette, $stockage = '') {
// On lit les noisettes restantes dans l'ordre décroissant pour éviter d'écraser une noisette.
ksort($autres_noisettes);
foreach ($autres_noisettes as $_rang => $_autre_description) {
if ($_rang > $description['rang']) {
ncore_noisette_ranger($plugin, $_autre_description, $_autre_description['rang'] - 1, $stockage);
if ($_rang > $description['rang_noisette']) {
ncore_noisette_ranger($plugin, $_autre_description, $_autre_description['rang_noisette'] - 1, $stockage);
}
}
}
@ -236,8 +236,8 @@ function noisette_lire($plugin, $noisette, $information = '', $traiter_typo = fa
$noisette_invalide = false;
if (!is_array($noisette)) {
$description_existe = isset($description_noisette_par_id[$plugin][$noisette]) ? true : false;
} elseif (isset($noisette['id_conteneur'], $noisette['rang'])) {
$description_existe = isset($description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang']])
} elseif (isset($noisette['id_conteneur'], $noisette['rang_noisette'])) {
$description_existe = isset($description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang_noisette']])
? true
: false;
} else {
@ -264,23 +264,23 @@ function noisette_lire($plugin, $noisette, $information = '', $traiter_typo = fa
if (!is_array($noisette)) {
$description_noisette_par_id[$plugin][$noisette] = $description;
} else {
$description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang']] = $description;
$description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang_noisette']] = $description;
}
}
if ($information) {
if ((!is_array($noisette) and isset($description_noisette_par_id[$plugin][$noisette][$information]))
or (is_array($noisette)
and isset($description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang']][$information]))) {
and isset($description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang_noisette']][$information]))) {
$retour = is_array($noisette)
? $description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang']][$information]
? $description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang_noisette']][$information]
: $description_noisette_par_id[$plugin][$noisette][$information];
} else {
$retour = '';
}
} else {
$retour = is_array($noisette)
? $description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang']]
? $description_noisette_par_rang[$plugin][$noisette['id_conteneur']][$noisette['rang_noisette']]
: $description_noisette_par_id[$plugin][$noisette];
}
}
@ -330,7 +330,7 @@ function noisette_deplacer($plugin, $noisette, $rang_destination, $stockage = ''
if (!empty($noisette) and (is_string($noisette) or is_numeric($noisette) or is_array($noisette))) {
// Avant de deplacer la noisette on sauvegarde sa description et son rang origine.
$description = ncore_noisette_decrire($plugin, $noisette, $stockage);
$rang_origine = $description['rang'];
$rang_origine = $description['rang_noisette'];
// Si les rangs origine et destination sont identiques on ne fait rien !
if ($rang_destination != $rang_origine) {
@ -339,7 +339,7 @@ function noisette_deplacer($plugin, $noisette, $rang_destination, $stockage = ''
$plugin,
$description['id_conteneur'],
'',
'rang',
'rang_noisette',
$stockage
);
@ -376,10 +376,69 @@ function noisette_deplacer($plugin, $noisette, $rang_destination, $stockage = ''
// On positionne le rang de la noisette à déplacer au rang destination.
// On met le rang à zéro pour indiquer que l'emplacement d'origine n'est plus occupé par la
// noisette et qu'il ne faut pas le supprimer lors du rangement.
$description['rang'] = 0;
$description['rang_noisette'] = 0;
ncore_noisette_ranger($plugin, $description, $rang_destination, $stockage);
}
}
return $retour;
}
/**
* Renvoie une liste de descriptions de noisettes appartenant à un conteneur donné ou pas et éventuellement filtrée
* sur certains champs.
* Le tableau retourné est indexé soit par identifiant de noisette soit par identifiant du conteneur et rang.
*
* @api
* @uses ncore_noisette_lister()
*
* @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 $conteneur
* Tableau descriptif du conteneur ou identifiant du conteneur ou vide si on souhaite adresser tous les
* conteneurs.
* @param string $cle
* Champ de la description d'une noisette servant d'index du tableau. En général on utilisera soit `id_noisette`
* soit `rang`.
* @param array $filtres
* Tableau associatif `[champ] = valeur` de critères de filtres sur les descriptions de types de noisette.
* Le seul opérateur possible est l'égalité.
* @param string $stockage
* Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
* ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
* fournissant le service de stockage souhaité.
*
* @return array
* Tableau des descriptions des types de noisette trouvés indexé par le type de noisette.
*/
function noisette_repertorier($plugin, $conteneur, $cle = 'rang_noisette', $filtres = array(), $stockage = '') {
// On indexe le tableau des noisettes par le plugin appelant en cas d'appel sur le même hit
// par deux plugins différents.
static $noisettes = array();
if (!isset($noisettes[$plugin])) {
// On charge l'API de N-Core.
// Ce sont ces fonctions qui aiguillent ou pas vers une fonction spécifique du service.
include_spip("ncore/ncore");
// On récupère la description complète de tous les types de noisettes détectés par le plugin appelant
$noisettes[$plugin] = ncore_noisette_lister($plugin, $conteneur, '', $cle, $stockage);
}
// Application des filtres éventuellement demandés en argument de la fonction
$noisettes_filtrees = $noisettes[$plugin];
if ($filtres) {
foreach ($noisettes_filtrees as $_noisette => $_description) {
foreach ($filtres as $_critere => $_valeur) {
if (isset($_description[$_critere]) and ($_description[$_critere] != $_valeur)) {
unset($noisettes_filtrees[$_noisette]);
break;
}
}
}
}
return $noisettes_filtrees;
}

22
inc/ncore_type_noisette.php

@ -76,17 +76,17 @@ function type_noisette_charger($plugin, $dossier = 'noisettes/', $recharger = fa
// Initialisation de la description par défaut du type de noisette
// -- on y inclut le plugin appelant et la signature
$description_defaut = array(
'noisette' => $type_noisette,
'nom' => $type_noisette,
'description' => '',
'icon' => 'noisette-24.png',
'necessite' => array(),
'contexte' => array(),
'ajax' => 'defaut',
'inclusion' => 'statique',
'parametres' => array(),
'plugin' => $plugin,
'signature' => '',
'type_noisette' => $type_noisette,
'nom' => $type_noisette,
'description' => '',
'icon' => 'noisette-24.png',
'necessite' => array(),
'contexte' => array(),
'ajax' => 'defaut',
'inclusion' => 'statique',
'parametres' => array(),
'plugin' => $plugin,
'signature' => '',
);
// On vérifie que le md5 du fichier YAML est bien différent de celui stocké avant de charger

44
ncore/ncore.php

@ -74,10 +74,10 @@ function ncore_type_noisette_stocker($plugin, $types_noisette, $recharger, $stoc
if ($recharger) {
// Si le rechargement est forcé, tous les types de noisette sont nouveaux, on peut donc écraser les caches
// existants sans s'en préoccuper.
$descriptions = array_column($types_noisette['a_ajouter'], null, 'noisette');
$descriptions = array_column($types_noisette['a_ajouter'], null, 'type_noisette');
cache_ecrire($plugin, _NCORE_NOMCACHE_TYPE_NOISETTE_DESCRIPTION, $descriptions);
$signatures = array_column($types_noisette['a_ajouter'], 'signature', 'noisette');
$signatures = array_column($types_noisette['a_ajouter'], 'signature', 'type_noisette');
cache_ecrire($plugin, _NCORE_NOMCACHE_TYPE_NOISETTE_SIGNATURE, $signatures);
} else {
// On lit les cache existants et on applique les modifications.
@ -86,22 +86,22 @@ function ncore_type_noisette_stocker($plugin, $types_noisette, $recharger, $stoc
// On supprime les noisettes obsolètes
if (!empty($types_noisette['a_effacer'])) {
$descriptions_obsoletes = array_column($types_noisette['a_effacer'], null, 'noisette');
$descriptions_obsoletes = array_column($types_noisette['a_effacer'], null, 'type_noisette');
$descriptions = array_diff($descriptions, $descriptions_obsoletes);
$signatures_obsoletes = array_column($types_noisette['a_effacer'], 'signature', 'noisette');
$signatures_obsoletes = array_column($types_noisette['a_effacer'], 'signature', 'type_noisette');
$signatures = array_diff($signatures, $signatures_obsoletes);
}
// On remplace les noisettes modifiées et on ajoute les noisettes nouvelles. Cette opération peut-être
// réalisée en une action avec la fonction array_merge.
if (!empty($types_noisette['a_changer']) or !empty($types_noisette['a_ajouter'])) {
$descriptions_modifiees = array_column($types_noisette['a_changer'], null, 'noisette');
$descriptions_nouvelles = array_column($types_noisette['a_ajouter'], null, 'noisette');
$descriptions_modifiees = array_column($types_noisette['a_changer'], null, 'type_noisette');
$descriptions_nouvelles = array_column($types_noisette['a_ajouter'], null, 'type_noisette');
$descriptions = array_merge($descriptions, $descriptions_modifiees, $descriptions_nouvelles);
$signatures_modifiees = array_column($types_noisette['a_changer'], 'signature', 'noisette');
$signatures_nouvelles = array_column($types_noisette['a_ajouter'], 'signature', 'noisette');
$signatures_modifiees = array_column($types_noisette['a_changer'], 'signature', 'type_noisette');
$signatures_nouvelles = array_column($types_noisette['a_ajouter'], 'signature', 'type_noisette');
$signatures = array_merge($signatures, $signatures_modifiees, $signatures_nouvelles);
}
@ -250,7 +250,7 @@ function ncore_type_noisette_lister($plugin, $information = '', $stockage = '')
} elseif ($descriptions = cache_lire($plugin, _NCORE_NOMCACHE_TYPE_NOISETTE_DESCRIPTION)) {
if ($information) {
// Si $information n'est pas une colonne valide array_column retournera un tableau vide.
$types_noisettes = array_column($descriptions, $information, 'noisette');
$types_noisettes = array_column($descriptions, $information, 'type_noisette');
} else {
$types_noisettes = $descriptions;
}
@ -321,16 +321,16 @@ function ncore_noisette_stocker($plugin, $description, $stockage = '') {
// -- la description est complète à l'exception de l'id unique qui est créé à la volée
// -- et on range la noisette avec les noisettes affectées au même conteneur en fonction de son rang.
$description['id_noisette'] = uniqid("${plugin}_");
$noisettes[$id_conteneur][$description['rang']] = $description;
$noisettes[$id_conteneur][$description['rang_noisette']] = $description;
} else {
// Modification de la noisette :
// -- les identifiants de la noisette sont toujours fournies, à savoir, l'id, le conteneur et le rang.
// -- on utilise le conteneur et le rang pour se positionner sur la noisette concernée.
// -- Les modifications ne concernent que les paramètres d'affichage, cette fonction n'est jamais utilisée
// pour le changement de rang.
if (isset($noisettes[$id_conteneur][$description['rang']])) {
$noisettes[$id_conteneur][$description['rang']] = array_merge(
$noisettes[$id_conteneur][$description['rang']],
if (isset($noisettes[$id_conteneur][$description['rang_noisette']])) {
$noisettes[$id_conteneur][$description['rang_noisette']] = array_merge(
$noisettes[$id_conteneur][$description['rang_noisette']],
$description
);
}
@ -437,8 +437,8 @@ function ncore_noisette_ranger($plugin, $description, $rang_destination, $stocka
// On ajoute la noisette au rang choisi même si on doit écraser un index existant:
// -- Il est donc nécessaire de gérer la collision en amont de cette fonction.
// -- Par contre, l'ancien rang de la noisette est supprimé sauf si celui-ci est à zéro.
$rang_source = $description['rang'];
$description['rang'] = $rang_destination;
$rang_source = $description['rang_noisette'];
$description['rang_noisette'] = $rang_destination;
$noisettes[$id_conteneur][$rang_destination] = $description;
if ($rang_source != 0) {
unset($noisettes[$id_conteneur][$rang_source]);
@ -495,9 +495,9 @@ function ncore_noisette_destocker($plugin, $description, $stockage = '') {
include_spip('inc/config');
$meta_noisettes = lire_config("${plugin}_noisettes", array());
if (isset($meta_noisettes[$description['id_conteneur']][$description['rang']])) {
if (isset($meta_noisettes[$description['id_conteneur']][$description['rang_noisette']])) {
// On supprime une noisette donnée.
unset($meta_noisettes[$description['id_conteneur']][$description['rang']]);
unset($meta_noisettes[$description['id_conteneur']][$description['rang_noisette']]);
// Si c'est la dernière noisette du conteneur il faut aussi supprimer l'index correspondant au conteneur.
if (!$meta_noisettes[$description['id_conteneur']]) {
unset($meta_noisettes[$description['id_conteneur']]);
@ -540,7 +540,7 @@ function ncore_noisette_destocker($plugin, $description, $stockage = '') {
* @return array
* Tableau de la liste des informations demandées indexé par identifiant de noisette ou par rang.
*/
function ncore_noisette_lister($plugin, $conteneur = array(), $information = '', $cle = 'rang', $stockage = '') {
function ncore_noisette_lister($plugin, $conteneur = array(), $information = '', $cle = 'rang_noisette', $stockage = '') {
// On cherche le service de stockage à utiliser selon la logique suivante :
// - si le service de stockage est non vide on l'utilise en considérant que la fonction existe forcément;
@ -575,7 +575,7 @@ function ncore_noisette_lister($plugin, $conteneur = array(), $information = '',
: array_column($noisettes, null, $cle);
}
} elseif ($meta_noisettes) {
if ($cle == 'rang') {
if ($cle == 'rang_noisette') {
$noisettes = $meta_noisettes;
} else {
foreach ($meta_noisettes as $_squelette => $_descriptions) {
@ -655,14 +655,14 @@ function ncore_noisette_decrire($plugin, $noisette, $stockage = '') {
}
}
} else {
if (isset($noisette['squelette'], $noisette['contexte'], $noisette['rang'])) {
if (isset($noisette['id_conteneur'], $noisette['rang_noisette'])) {
// Détermination de l'identifiant du conteneur.
$id_conteneur = $noisette['id_conteneur'];
if (!empty($meta_noisettes[$id_conteneur][$noisette['rang']])) {
if (!empty($meta_noisettes[$id_conteneur][$noisette['rang_noisette']])) {
// L'identifiant est un tableau associatif fournissant le conteneur et le rang.
// Comme la meta de N-Core est structurée ainsi c'est la méthode la plus adaptée pour adresser
// le stockage de N-Core.
$description = $meta_noisettes[$id_conteneur][$noisette['rang']];
$description = $meta_noisettes[$id_conteneur][$noisette['rang_noisette']];
}
}
}

46
public/noisette_compiler.php

@ -0,0 +1,46 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function balise_NOISETTE_COMPILER_dist($p)
{
// TODO : il faudrait appeler une fonction de service du plugin pour choisir si on passe l'id_noisette ou le couple
// (id_conteneur, rang)
$id_noisette = champ_sql('id_noisette', $p);
$type_noisette = champ_sql('type_noisette', $p);
$parametres = champ_sql('parametres', $p);
$plugin = champ_sql('plugin', $p);
// A-t-on demandé un stockage spécifique
$stockage = interprete_argument_balise(1, $p);
$stockage = isset($stockage) ? str_replace('\'', '"', $stockage) : '""';
// si pas de contexte attribuer, on passe tout le contexte que l'on recoit
// sinon, on regarde si 'aucun' ou 'env' est indique :
// si 'aucun' => aucun contexte
// si 'env' => tout le contexte recu.
// $id_noisette est toujours transmis dans l'environnement
$environnement = "array_merge(\$Pile[0],array('id_noisette' => $id_noisette))";
$inclusion_dynamique = "\"<?php echo recuperer_fond(
'noisettes/\".$type_noisette.\"',
\".var_export(array_merge(unserialize($parametres), noizetier_choisir_contexte($type_noisette, $environnement, $id_noisette)),true).\",
\".var_export(array('ajax'=>($_ajax && noizetier_noisette_ajax($type_noisette))),true).\"
);?>\"";
$inclusion_statique = "recuperer_fond(
'noisettes/'.$type_noisette,
array_merge(unserialize($parametres), noisette_contextualiser($plugin, $id_noisette, $type_noisette, $environnement, $stockage)),
array('ajax'=>($_ajax && noizetier_noisette_ajax($type_noisette)))
)";
$code = "((noizetier_noisette_dynamique($type_noisette)) ? $inclusion_dynamique : $inclusion_statique)";
$p->code = "((!$id_noisette) ? _T('zbug_champ_hors_motif', array('champ'=>'ID_NOISETTE', 'motif'=>'NOISETTES')) : $code)";
$p->interdire_scripts = false;
return $p;
}
Loading…
Cancel
Save