Changeset 106470 in spip-zone


Ignore:
Timestamp:
Sep 30, 2017, 5:31:29 PM (3 years ago)
Author:
eric@…
Message:

Pour généraliser la notion de squelette associé à des noisettes on ajoute un contexte d'utilisation pour le squelette. Le squelette et son contexte est nommé squelette contextualisé mais ce vocable n'est pas très important.
Les noisettes sont donc affectées à un couple (squelette, contexte) et on peut calculer un identifiant unique pour ce couple ce qui permet de conserver les stockages au format [squelette_contextualisé][rang].
On rajoute pour les plugins qui le nécessitent une fonction de service squelette_identifier() qui retourne cet identifiant unique.
Maintenant place aux tests mais a priori cette modification devrait permettre de remplir tous les besoins envisagés.

Location:
_plugins_/n-core/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/n-core/trunk/inc/ncore_noisette.php

    r106438 r106470  
    1212
    1313/**
    14  * Ajoute à un squelette, à un rang donné ou en dernier rang, une noisette d'un type donné.
     14 * Ajoute à un squelette contextualisé, à un rang donné ou en dernier rang, une noisette d'un type donné.
    1515 *
    1616 * @api
     
    2727 * @param string        $squelette
    2828 *              Chemin relatif du squelette où ajouter la noisette.
     29 * @param array     $contexte
     30 *              Tableau éventuellement vide matérialisant le contexte d'utilisation du squelette.
    2931 * @param int           $rang
    3032 *              Rang dans le squelette où insérer la noisette. Si l'argument n'est pas fourni ou est égal à 0 on insère la
     
    3840 *              Retourne l'identifiant de la nouvelle instance de noisette créée ou `false` en cas d'erreur.
    3941 **/
    40 function noisette_ajouter($plugin, $type_noisette, $squelette, $rang = 0, $stockage = '') {
     42function noisette_ajouter($plugin, $type_noisette, $squelette, $contexte, $rang = 0, $stockage = '') {
    4143
    4244        // Initialisation de la valeur de sortie.
     
    6264                        'noisette'   => $type_noisette,
    6365                        'squelette'  => $squelette,
     66                        'contexte'   => serialize($contexte),
    6467                        'rang'       => intval($rang),
    6568                        'parametres' => serialize($parametres),
     
    7275                include_spip("ncore/ncore");
    7376
    74                 // On récupère les noisettes déjà affectées au squelette sous la forme d'un tableau indexé par l'identifiant
    75                 // de la noisette stocké dans l'index 'id_noisette'.
    76                 $noisettes = ncore_noisette_lister($plugin, $squelette, '', 'rang',  $stockage);
     77                // On récupère les noisettes déjà affectées au squelette contextualisé sous la forme d'un tableau indexé
     78                // par le rang de chaque noisette.
     79                $noisettes = ncore_noisette_lister($plugin, $squelette, $contexte, '', 'rang',  $stockage);
    7780
    7881                // On calcule le rang max déjà utilisé.
     
    107110
    108111/**
    109  * Supprime un noisette donnée d’un squelette.
     112 * Supprime une noisette donnée du squelette contextualisé auquel elle est associée.
    110113 * La fonction met à jour les rangs des autres noisettes si nécessaire.
    111114 *
     
    121124 * @param mixed         $noisette
    122125 *        Identifiant de la noisette qui peut prendre soit la forme d'un entier ou d'une chaine unique, soit la forme
    123  *        d'un couple (squelette, rang).
     126 *        d'un triplet (squelette, contexte, rang).
    124127 * @param string        $stockage
    125128 *      Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
     
    152155                // On récupère les noisettes restant affectées au squelette sous la forme d'un tableau indexé par l'identifiant
    153156                // de la noisette stocké dans l'index 'id_noisette' mais toujours trié de façon à ce que les rangs soient croissants.
    154                 $autres_noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', 'rang', $stockage);
     157                $autres_noisettes = ncore_noisette_lister($plugin, $description['squelette'], $description['contexte'], '', 'rang', $stockage);
    155158
    156159                // Si il reste des noisettes, on tasse d'un rang les noisettes qui suivaient la noisette supprimée.
     
    254257
    255258/**
    256  * Supprime un noisette donnée d’un squelette.
     259 * Déplace une noisette donnée au sein d’un squelette contextualisé.
    257260 * La fonction met à jour les rangs des autres noisettes si nécessaire.
    258261 *
     
    297300                        // On récupère les noisettes affectées au même squelette sous la forme d'un tableau indexé par le rang
    298301                        // et on déplace les noisettes impactées.
    299                         $noisettes = ncore_noisette_lister($plugin, $description['squelette'], '', 'rang', $stockage);
     302                        $noisettes = ncore_noisette_lister($plugin, $description['squelette'], $description['contexte'], '', 'rang', $stockage);
    300303
    301304                        // On vérifie que le rang destination soit bien compris entre 1 et le rang max, sinon on le force à une
     
    338341
    339342/**
    340  * Supprime toutes les noisettes d’un squelette.
     343 * Supprime toutes les noisettes d’un squelette contextualisé.
    341344 *
    342345 * @api
     
    355358 * @return bool
    356359 */
    357 function noisette_vider_squelette($plugin, $squelette, $stockage = '') {
     360function noisette_vider($plugin, $squelette, $contexte, $stockage = '') {
    358361
    359362        // Initialisation du retour
     
    365368
    366369        if ($squelette) {
    367                 // Suppression de la noisette. On passe la description complète ce qui permet à la fonction de
    368                 // destockage de choisir la méthode pour identifier la noisette.
    369                 $retour = ncore_noisette_destocker($plugin, $squelette, $stockage);
     370                // On construit un tableau avec le squelette et son contexte et on le passe à la fonction.
     371                $description = array('squelette' => $squelette, 'contexte' => $contexte);
     372                $retour = ncore_noisette_destocker($plugin, $description, $stockage);
    370373        }
    371374
  • _plugins_/n-core/trunk/ncore/ncore.php

    r106438 r106470  
    247247                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    248248                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    249                 //    [squelette][rang] = description
     249                //    [squelette contextualisé][rang] = description
    250250                //    N-Core calcule un identifiant unique pour la noisette qui sera stocké à l'index 'id_noisette' et qui
    251251                //    vaudra uniqid() avec comme préfixe le plugin appelant.
     
    256256                $noisettes = lire_config("${plugin}_noisettes", array());
    257257
     258                // Détermination de l'identifiant du squelette contextualisé.
     259                $squelette_contextualise = ncore_squelette_identifier(
     260                        $plugin,
     261                        $description['squelette'],
     262                        $description['contexte'],
     263                        $stockage);
     264
    258265                if (empty($description['id_noisette'])) {
    259266                        // Ajout de la noisette :
    260267                        // -- la description est complète à l'exception de l'id unique qui est créé à la volée
    261                         // -- et on range la noisette avec les noisettes affectées au même squelette en fonction de son rang.
     268                        // -- et on range la noisette avec les noisettes affectées au même squelette contextualisé
     269                        //    en fonction de son rang.
    262270                        $description['id_noisette'] = uniqid("${plugin}_");
    263                         $noisettes[$description['squelette']][$description['rang']] = $description;
     271                        $noisettes[$squelette_contextualise][$description['rang']] = $description;
    264272                } else {
    265273                        // Modification de la noisette :
     
    268276                        // -- Les modifications ne concernent que les paramètres d'affichage, cette fonction n'est jamais utilisée
    269277                        //    pour le changement de rang.
    270                         if (isset($noisettes[$description['squelette']][$description['rang']])) {
    271                                 $noisettes[$description['squelette']][$description['rang']] = array_merge(
    272                                         $noisettes[$description['squelette']][$description['rang']],
     278                        if (isset($noisettes[$squelette_contextualise][$description['rang']])) {
     279                                $noisettes[$squelette_contextualise][$description['rang']] = array_merge(
     280                                        $noisettes[$squelette_contextualise][$description['rang']],
    273281                                        $description);
    274282                        }
     
    313321                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    314322                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    315                 //    [squelette][rang] = description
     323                //    [squelette contextualisé][rang] = description
    316324                //    N-Core calcule un identifiant unique pour la noisette qui sera stocké à l'index 'id_noisette' et qui
    317325                //    vaudra uniqid() avec comme préfixe le plugin appelant.
     
    321329                // Le tableau est au format [squelette][rang] = description.
    322330                $noisettes = lire_config("${plugin}_noisettes", array());
     331
     332                // Détermination de l'identifiant du squelette contextualisé.
     333                $squelette_contextualise = ncore_squelette_identifier(
     334                        $plugin,
     335                        $description['squelette'],
     336                        $description['contexte'],
     337                        $stockage);
    323338
    324339                // On ajoute la noisette au rang choisi même si on doit écraser un index existant.
     
    326341                // De même, l'ancien rang de la noisette n'est pas supprimé, cela est aussi à gérer en amont.
    327342                $description['rang'] = $rang_destination;
    328                 $noisettes[$description['squelette']][$rang_destination] = $description;
     343                $noisettes[$squelette_contextualise][$rang_destination] = $description;
    329344
    330345                // On met à jour la meta
     
    362377                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    363378                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    364                 //    [squelette][rang] = description
    365                 // -- $description est soit le tableau descriptif de la noisette, soit une chaine représentant le nom du
    366                 //    squelette et dans ce cas, il faut supprimer toutes les noisettes du squelette.
     379                //    [squelette contextualisé][rang] = description
     380                // -- $description est soit le tableau descriptif de la noisette, soit une chaine représentant l'identifiant du
     381                //    squelette contextualisé et dans ce cas, il faut supprimer toutes les noisettes du squelette contextualisé.
    367382                include_spip('inc/config');
    368383                $meta_noisettes = lire_config("${plugin}_noisettes", array());
    369384
    370                 if (is_array($description) and isset($meta_noisettes[$description['squelette']][$description['rang']])) {
    371                         unset($meta_noisettes[$description['squelette']][$description['rang']]);
     385                // Détermination de l'identifiant du squelette contextualisé.
     386                $squelette_contextualise = ncore_squelette_identifier(
     387                        $plugin,
     388                        $description['squelette'],
     389                        $description['contexte'],
     390                        $stockage);
     391
     392                if (!empty($description['id_noisette']) and isset($meta_noisettes[$squelette_contextualise][$description['rang']])) {
     393                        // On supprime une noisette donnée.
     394                        unset($meta_noisettes[$squelette_contextualise][$description['rang']]);
    372395                        ecrire_config("${plugin}_noisettes", $meta_noisettes);
    373396                        $retour = true;
    374                 } else if (is_string($description) and isset($meta_noisettes[$description['squelette']])) {
    375                         unset($meta_noisettes[$description['squelette']]);
     397                } elseif (isset($meta_noisettes[$squelette_contextualise])) {
     398                        unset($meta_noisettes[$squelette_contextualise]);
    376399                        ecrire_config("${plugin}_noisettes", $meta_noisettes);
    377400                        $retour = true;
     
    387410 * @package SPIP\NCORE\SERVICE\NOISETTE
    388411 *
    389  * @param        $plugin
    390  * @param string $squelette
    391  * @param string $information
    392  * @param string $stockage
     412 * @param string        $plugin
     413 *      Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
     414 *      un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     415 * @param string        $squelette
     416 *              Chemin relatif du squelette où ajouter la noisette.
     417 * @param array     $contexte
     418 *              Tableau éventuellement vide matérialisant le contexte d'utilisation du squelette.
     419 * @param string    $information
     420 * @param string    $cle
     421 * @param string        $stockage
     422 *      Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
     423 *      ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
     424 *              fournissant le service de stockage souhaité.
    393425 *
    394426 * @return array|mixed
    395427 */
    396 function ncore_noisette_lister($plugin, $squelette = '', $information = '', $cle = 'rang', $stockage = '') {
     428function ncore_noisette_lister($plugin, $squelette = '', $contexte = array(), $information = '', $cle = 'rang', $stockage = '') {
    397429
    398430        // Initialisation du tableau de sortie.
     
    406438        if ($lister = ncore_chercher_service($plugin, 'noisette_lister', $stockage)) {
    407439                // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
    408                 $noisettes = $lister($plugin, $squelette, $information, $cle);
     440                $noisettes = $lister($plugin, $squelette, $contexte, $information, $cle);
    409441        } else {
    410442                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    411443                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    412                 //    [squelette][rang] = description
     444                //    [squelette contextualisé][rang] = description
    413445                include_spip('inc/config');
    414446                $meta_noisettes = lire_config("${plugin}_noisettes", array());
    415447
    416448                if ($squelette) {
    417                         if (!empty($meta_noisettes[$squelette])) {
    418                                 $noisettes = $meta_noisettes[$squelette];
     449                        // Détermination de l'identifiant du squelette contextualisé.
     450                        $squelette_contextualise = ncore_squelette_identifier($plugin, $squelette, $contexte, $stockage);
     451                        if (!empty($meta_noisettes[$squelette_contextualise])) {
     452                                $noisettes = $meta_noisettes[$squelette_contextualise];
    419453                                $noisettes = $information
    420454                                        ? array_column($noisettes, $information, $cle)
     
    454488 * @param mixed  $noisette
    455489 *        Identifiant de la noisette qui peut prendre soit la forme d'un entier ou d'une chaine unique, soit la forme
    456  *        d'un couple (squelette, rang).
     490 *        d'un triplet (squelette, contexte, rang).
    457491 * @param string $stockage
    458492 *        Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
     
    479513                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    480514                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    481                 //    [squelette][rang] = description
     515                //    [squelette contextualisé][rang] = description
    482516                include_spip('inc/config');
    483517                $meta_noisettes = lire_config("${plugin}_noisettes", array());
     
    502536                                        }
    503537                                }
    504                         } elseif (isset($noisette['squelette']) and isset($noisette['rang']) and !empty($meta_noisettes[$noisette['squelette']][$noisette['rang']])) {
    505                                 // L'identifiant est un tableau associatif fournissant le squelette et le rang.
    506                                 // Comme la meta de N-Core est structurée ainsi c'est la méthode la plus adaptée pour adresser
    507                                 // le stockage de N-Core.
    508                                 $description = $meta_noisettes[$noisette['squelette']][$noisette['rang']];
     538                        } else {
     539                                if (isset($noisette['squelette']) and isset($noisette['contexte']) and isset($noisette['rang'])) {
     540                                        // Détermination de l'identifiant du squelette contextualisé.
     541                                        $squelette_contextualise = ncore_squelette_identifier(
     542                                                $plugin,
     543                                                $noisette['squelette'],
     544                                                $noisette['contexte'],
     545                                                $stockage);
     546                                        if (!empty($meta_noisettes[$squelette_contextualise][$noisette['rang']])) {
     547                                        // L'identifiant est un tableau associatif fournissant le squelette contextualisé et le rang.
     548                                        // Comme la meta de N-Core est structurée ainsi c'est la méthode la plus adaptée pour adresser
     549                                        // le stockage de N-Core.
     550                                        $description = $meta_noisettes[$squelette_contextualise][$noisette['rang']];
     551                                        }
     552                                }
    509553                        }
    510554                }
     
    513557        return $description;
    514558}
     559
     560/**
     561 * Construit un identifiant unique pour le squelette et son contexte sous forme de chaine.
     562 * Cette fonction est juste un aiguillage vers la fonction éventuelle du plugin utilisateur
     563 * car N-Core ne fournit pas de calcul par défaut.
     564 *
     565 * @package SPIP\NCORE\SERVICE\NOISETTE
     566 *
     567 * @param string        $plugin
     568 *      Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
     569 *      un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     570 * @param string        $squelette
     571 *              Chemin relatif du squelette où ajouter la noisette.
     572 * @param array     $contexte
     573 *              Tableau éventuellement vide matérialisant le contexte d'utilisation du squelette.
     574 * @param string        $stockage
     575 *      Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
     576 *      ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
     577 *              fournissant le service de stockage souhaité.
     578 *
     579 * @return array|mixed
     580 */
     581function ncore_squelette_identifier($plugin, $squelette, $contexte, $stockage) {
     582
     583        // Il faut calculer l'identifiant du squelette contextualisé pour accéder à la bonne liste
     584        // de noisettes. N-Core ne propose pas de fonction par défaut car l'élaboration de l'identifiant
     585        // en fonction du contexte est totalement spécifique au plugin utilisateur.
     586        // Il est donc indispensable que le plugin qui nécessite l'utilise d'un contexte propose la
     587        // fonction de calcul associée sinon le contexte ne sera pas pris en compte et seul l'identifiant
     588        // du squelette sera retourné.
     589        $squelette_contextualise = $squelette;
     590        if ($contexte) {
     591                if ($identifier = ncore_chercher_service($plugin, 'squelette_identifier', $stockage)) {
     592                        // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
     593                        $squelette_contextualise = $identifier($plugin, $squelette, $contexte);
     594                }
     595        }
     596
     597        return $squelette_contextualise;
     598}
Note: See TracChangeset for help on using the changeset viewer.