Browse Source

Une version complète qui fonctionne de l'API noisette et des services N-Core.

svn/attic/tags/v010/106508
eric@smellup.net 5 years ago
parent
commit
23cf62b0ef
  1. 50
      inc/ncore_noisette.php
  2. 48
      ncore/ncore.php

50
inc/ncore_noisette.php

@ -73,10 +73,10 @@ function noisette_ajouter($plugin, $type_noisette, $squelette, $rang = 0, $stock
// On récupère les noisettes déjà affectées au squelette sous la forme d'un tableau indexé par l'identifiant
// de la noisette stocké dans l'index 'id_noisette'.
$noisettes = ncore_noisette_lister($plugin, $squelette, '', $stockage);
$noisettes = ncore_noisette_lister($plugin, $squelette, '', 'rang', $stockage);
// On calcule le rang max déjà utilisé.
$rang_max = $noisettes ? max(array_column($noisettes, 'rang')) : 0;
$rang_max = $noisettes ? max(array_keys($noisettes)) : 0;
if (!$rang or ($rang and ($rang > $rang_max))) {
// Si, le rang est nul ou si il est strictement supérieur au rang_max, on positionne la noisette
@ -89,9 +89,10 @@ function noisette_ajouter($plugin, $type_noisette, $squelette, $rang = 0, $stock
// Si le rang est non nul c'est qu'on insère la noisette dans la liste existante.
// Il faut décaler les noisettes de rang supérieur ou égal si elle existent.
if ($rang <= $rang_max) {
foreach ($noisettes as $_id_noisette => $_description) {
if ($_description['rang'] >= $rang) {
ncore_noisette_ranger($plugin, $_description, $_description['rang'] + 1, $stockage);
krsort($noisettes);
foreach ($noisettes as $_rang => $_description) {
if ($_rang >= $rang) {
ncore_noisette_ranger($plugin, $_description, $_rang + 1, $stockage);
}
}
}
@ -150,12 +151,13 @@ function noisette_supprimer($plugin, $noisette, $stockage = '') {
// On récupère les noisettes restant affectées au squelette sous la forme d'un tableau indexé par l'identifiant
// de la noisette stocké dans l'index 'id_noisette' mais toujours trié de façon à ce que les rangs soient croissants.
$autres_noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', $stockage);
$autres_noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', 'rang', $stockage);
// Si il reste des noisettes, on tasse d'un rang les noisettes qui suivaient la noisette supprimée.
if ($autres_noisettes) {
foreach ($autres_noisettes as $_id_noisette => $_autre_description) {
if ($_autre_description['rang'] > $description['rang']) {
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);
}
}
@ -292,25 +294,35 @@ function noisette_deplacer($plugin, $noisette, $rang_destination, $stockage = ''
// Si les rangs origine et destination sont identiques on ne fait rien !
if ($rang_destination != $rang_origine) {
// On efface le rang de la noisette à déplacer pour permettre son affectation à une autre noisette.
ncore_noisette_ranger($plugin, $description, 0, $stockage);
// On récupère les noisettes affectées au même squelette sous la forme d'un tableau indexé par le rang
// et on déplace les noisettes impactées.
$noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', 'rang', $stockage);
// On récupère les noisettes affectées au même squelette sous la forme d'un tableau indexé par l'identifiant
// de la noisette stocké dans l'index 'id_noisette' et on déplace les noisettes impactées.
$noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', $stockage);
// On vérifie que le rang destination soit bien compris entre 1 et le rang max, sinon on le force à une
// des bornes.
$rang_destination = max(1, $rang_destination);
$rang_max = $noisettes ? max(array_keys($noisettes)) : 0;
$rang_destination = min($rang_max, $rang_destination);
// Suivant la position d'origine et de destination de la noisette déplacée on renumérote les noisettes
// Suivant la position d'origine et de destination de la noisette déplacée on trie les noisettes
// du squelette.
foreach ($noisettes as $_id_noisette => $_description) {
if ($rang_destination < $rang_origine) {
krsort($noisettes);
} else {
ksort($noisettes);
}
// On déplace les noisettes impactées.
foreach ($noisettes as $_rang => $_description) {
if ($rang_destination < $rang_origine) {
// On "descend" les noisettes du rang destination au rang origine non compris.
if (($_description['rang'] >= $rang_destination) and ($_description['rang'] < $rang_origine)) {
ncore_noisette_ranger($plugin, $_description, $_description['rang'] + 1, $stockage);
if (($_rang >= $rang_destination) and ($_rang < $rang_origine)) {
ncore_noisette_ranger($plugin, $_description, $_rang + 1, $stockage);
}
} else {
// On "remonte" les noisettes du rang destination au rang origine non compris.
if (($_description['rang'] <= $rang_destination) and ($_description['rang'] > $rang_origine)) {
ncore_noisette_ranger($plugin, $_description, $_description['rang'] - 1, $stockage);
if (($_rang <= $rang_destination) and ($_rang > $rang_origine)) {
ncore_noisette_ranger($plugin, $_description, $_rang - 1, $stockage);
}
}
}

48
ncore/ncore.php

@ -321,23 +321,15 @@ function ncore_noisette_ranger($plugin, $description, $rang, $stockage = '') {
// Le tableau est au format [squelette][rang] = description.
$noisettes = lire_config("${plugin}_noisettes", array());
// Modification de la noisette :
// La description est complète et comprends donc l'identifiant de la noisette et le rang actuellement
// occupé.
if (!isset($noisettes[$description['squelette']][$description['rang']])) {
// On supprime la noisette du rang qu'elle occupe.
unset($noisettes[$description['squelette']]['rang']);
// On ajoute la noisette au rang choisi
if (!isset($noisettes[$description['squelette']][$rang])) {
$description['rang'] = $rang;
$noisettes[$description['squelette']][$rang] = $description;
// On met à jour la meta
ecrire_config("${plugin}_noisettes", $noisettes);
$retour = true;
}
}
// 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.
// De même, l'ancien rang de la noisette n'est pas supprimé, cela est aussi à gérer en amont.
$description['rang'] = $rang;
$noisettes[$description['squelette']][$rang] = $description;
// On met à jour la meta
ecrire_config("${plugin}_noisettes", $noisettes);
$retour = true;
}
return $retour;
@ -392,7 +384,7 @@ function ncore_noisette_destocker($plugin, $description, $stockage = '') {
*
* @return array|mixed
*/
function ncore_noisette_lister($plugin, $squelette = '', $information = '', $stockage = '') {
function ncore_noisette_lister($plugin, $squelette = '', $information = '', $cle = 'rang', $stockage = '') {
// Initialisation du tableau de sortie.
$noisettes = array();
@ -404,7 +396,7 @@ function ncore_noisette_lister($plugin, $squelette = '', $information = '', $sto
include_spip('inc/ncore_utils');
if ($lister = ncore_chercher_service($plugin, 'noisette_lister', $stockage)) {
// On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
$noisettes = $lister($plugin, $squelette, $information);
$noisettes = $lister($plugin, $squelette, $information, $cle);
} else {
// Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
// -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
@ -416,15 +408,19 @@ function ncore_noisette_lister($plugin, $squelette = '', $information = '', $sto
if (!empty($meta_noisettes[$squelette])) {
$noisettes = $meta_noisettes[$squelette];
$noisettes = $information
? array_column($noisettes, $information, 'id_noisette')
: array_column($noisettes, null, 'id_noisette');
? array_column($noisettes, $information, $cle)
: array_column($noisettes, null, $cle);
}
} elseif ($meta_noisettes) {
foreach ($meta_noisettes as $_squelette => $_descriptions) {
$noisettes_squelette = $information
? array_column($_descriptions, $information, 'id_noisette')
: array_column($_descriptions, null, 'id_noisette');
$noisettes = array_merge($noisettes, $noisettes_squelette);
if ($cle == 'rang') {
$noisettes = $meta_noisettes;
} else {
foreach ($meta_noisettes as $_squelette => $_descriptions) {
$noisettes_squelette = $information
? array_column($_descriptions, $information, $cle)
: array_column($_descriptions, null, $cle);
$noisettes = array_merge($noisettes, $noisettes_squelette);
}
}
}
}

Loading…
Cancel
Save