Changeset 112835 in spip-zone


Ignore:
Timestamp:
Dec 16, 2018, 1:59:07 PM (3 months ago)
Author:
root
Message:

On robustifie la gestion des conteneurs:

  • le tableau fourni en entrée est vérifié à l'ajout de la noisette et débarassé des index inutiles si besoin
  • N-Core calcule maintenant l'identifiant des noisettes conteneur
  • et vérifie aussi le conteneur si celui-ci est une noisette (les index sont toujours le type et id de la noisette)

Cela amène à rajouter une fonction de service ncore_conteneur_verifier().

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

Legend:

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

    r112825 r112835  
    6767                include_spip('ncore/ncore');
    6868
    69                 // On initialise la description de la noisette à ajouter et en particulier on stocke l'id du conteneur
    70                 // pour simplifier les traitements par la suite.
    71                 $description = array(
    72                         'plugin'        => $plugin,
    73                         'type_noisette' => $type_noisette,
    74                         'conteneur'     => serialize($conteneur),
    75                         'id_conteneur'  => ncore_conteneur_identifier($plugin, $conteneur, $stockage),
    76                         'rang_noisette' => intval($rang),
    77                         'est_conteneur' => type_noisette_lire($plugin, $type_noisette, 'conteneur', false, $stockage),
    78                         'parametres'    => serialize($parametres),
    79                         'encapsulation' => 'defaut',
    80                         'css'           => ''
    81                 );
    82 
    83                 // Mise à jour de la description pour les noisettes conteneur:
    84                 // -- pas de div englobante.
    85                 if ($description['est_conteneur'] == 'oui') {
    86                         $description['encapsulation'] = 'non';
    87                 }
    88 
    89                 // Complément à la description par défaut, spécifique au plugin utilisateur, si nécessaire.
    90                 $description = ncore_noisette_completer($plugin, $description, $stockage);
    91 
    92                 // On récupère les noisettes déjà affectées au conteneur sous la forme d'un tableau indexé
    93                 // par le rang de chaque noisette.
    94                 $noisettes = ncore_noisette_lister($plugin, $conteneur, '', 'rang_noisette', $stockage);
    95 
    96                 // On calcule le rang max déjà utilisé.
    97                 $rang_max = $noisettes ? max(array_keys($noisettes)) : 0;
    98 
    99                 if (!$rang or ($rang and ($rang > $rang_max))) {
    100                         // Si, le rang est nul ou si il est strictement supérieur au rang_max, on positionne la noisette
    101                         // à ajouter au rang max + 1.
    102                         // En effet, si le rang est supérieur au rang max c'est que la nouvelle noisette est ajoutée
    103                         // après les noisettes existantes, donc cela revient à insérer la noisette en fin de liste.
    104                         // Postionner le rang à max + 1 permet d'éviter d'avoir des trous dans la liste des rangs.
    105                         $description['rang_noisette'] = $rang_max + 1;
    106                 } else {
    107                         // 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
    108                         // existante : il faut décaler d'un rang les noisettes de rang supérieur ou égal si elle existent pour
    109                         // libérer la position de la nouvelle noisette.
    110                         if ($rang <= $rang_max) {
    111                                 krsort($noisettes);
    112                                 foreach ($noisettes as $_rang => $_description) {
    113                                         if ($_rang >= $rang) {
    114                                                 ncore_noisette_ranger($plugin, $_description, $_rang + 1, $stockage);
     69                // On initialise la description de la noisette à ajouter et en particulier on stocke le tableau et l'id du
     70                // conteneur pour simplifier les traitements par la suite.
     71                // -- Vérification des index du conteneur.
     72                $conteneur = ncore_conteneur_verifier($plugin, $conteneur, $stockage);
     73                if ($conteneur) {
     74                        // -- Calculer l'identifiant du conteneur
     75                        $id_conteneur = ncore_conteneur_identifier($plugin, $conteneur, $stockage);
     76                        // -- Initialisation par défaut
     77                        $description = array(
     78                                'plugin'        => $plugin,
     79                                'type_noisette' => $type_noisette,
     80                                'conteneur'     => serialize($conteneur),
     81                                'id_conteneur'  => $id_conteneur,
     82                                'rang_noisette' => intval($rang),
     83                                'est_conteneur' => type_noisette_lire($plugin, $type_noisette, 'conteneur', false, $stockage),
     84                                'parametres'    => serialize($parametres),
     85                                'encapsulation' => 'defaut',
     86                                'css'           => ''
     87                        );
     88                        // -- Pour les noisettes conteneur pas de capsule englobante.
     89                        if ($description['est_conteneur'] == 'oui') {
     90                                $description['encapsulation'] = 'non';
     91                        }
     92
     93                        // Complément à la description par défaut, spécifique au plugin utilisateur, si nécessaire.
     94                        $description = ncore_noisette_completer($plugin, $description, $stockage);
     95
     96                        // On récupère les noisettes déjà affectées au conteneur sous la forme d'un tableau indexé
     97                        // par le rang de chaque noisette.
     98                        $noisettes = ncore_noisette_lister($plugin, $id_conteneur, '', 'rang_noisette', $stockage);
     99
     100                        // On calcule le rang max déjà utilisé.
     101                        $rang_max = $noisettes ? max(array_keys($noisettes)) : 0;
     102
     103                        if (!$rang or ($rang and ($rang > $rang_max))) {
     104                                // Si, le rang est nul ou si il est strictement supérieur au rang_max, on positionne la noisette
     105                                // à ajouter au rang max + 1.
     106                                // En effet, si le rang est supérieur au rang max c'est que la nouvelle noisette est ajoutée
     107                                // après les noisettes existantes, donc cela revient à insérer la noisette en fin de liste.
     108                                // Postionner le rang à max + 1 permet d'éviter d'avoir des trous dans la liste des rangs.
     109                                $description['rang_noisette'] = $rang_max + 1;
     110                        } else {
     111                                // 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
     112                                // existante : il faut décaler d'un rang les noisettes de rang supérieur ou égal si elle existent pour
     113                                // libérer la position de la nouvelle noisette.
     114                                if ($rang <= $rang_max) {
     115                                        krsort($noisettes);
     116                                        foreach ($noisettes as $_rang => $_description) {
     117                                                if ($_rang >= $rang) {
     118                                                        ncore_noisette_ranger($plugin, $_description, $_rang + 1, $stockage);
     119                                                }
    115120                                        }
    116121                                }
    117122                        }
    118                 }
    119 
    120                 // La description de la nouvelle noisette est prête à être stockée à sa position.
    121                 $noisette_ajoutee = ncore_noisette_stocker($plugin, $description, $stockage);
     123
     124                        // La description de la nouvelle noisette est prête à être stockée à sa position.
     125                        $noisette_ajoutee = ncore_noisette_stocker($plugin, $description, $stockage);
     126                }
    122127        }
    123128
  • _plugins_/n-core/trunk/ncore/ncore.php

    r112830 r112835  
    782782
    783783/**
     784 * Vérifier la conformité des index du tableau représentant le conteneur et les adapte éventuellement.
     785 * N-Core vérifie que pour les noisettes conteneur les seuls index sont le type et l'id de la noisette.
     786 * Pour les autres conteneurs, c'est au plugin utilisateur de vérifier le conteneur.
     787 *
     788 * @package SPIP\NCORE\CONTENEUR\SERVICE
     789 *
     790 * @uses ncore_chercher_service()
     791 *
     792 * @param string $plugin
     793 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
     794 *        un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     795 * @param array  $conteneur
     796 *        Tableau associatif descriptif du conteneur dont les index doivent être vérifiés.
     797 * @param string $stockage
     798 *        Identifiant du service de stockage à utiliser si précisé.
     799 *
     800 * @return array
     801 *        Tableau du conteneur dont tous les index sont conformes ou tableau vide si non conforme.
     802 */
     803function ncore_conteneur_verifier($plugin, $conteneur, $stockage = '') {
     804
     805        static $index_conteneur_noisette = array('type_noisette', 'id_noisette');
     806
     807        // N-Core ne vérifie pas les conteneurs spécifiques aux plugins utilisateur
     808        // sauf pour les noisettes conteneur qui ne sont déterminées que par leur type et leur id.
     809        // Il est donc indispensable que le plugin utilisateur propose toujours une fonction de vérification
     810        // pour les conteneurs hors noisette conteneur.
     811        $conteneur_verifie = array();
     812        if ($conteneur) {
     813                if (isset($conteneur['type_noisette'], $conteneur['id_noisette'])
     814                and $conteneur['type_noisette']
     815                and intval($conteneur['id_noisette'])) {
     816                        // Le conteneur est une noisette, N-Core effectue le filtre des index.
     817                        $conteneur = array_intersect_key($conteneur, array_flip($index_conteneur_noisette));
     818                        if (count($conteneur) == 2) {
     819                                $conteneur_verifie = $conteneur;
     820                        }
     821                } else {
     822                        // Le conteneur est spécifique au plugin utilisateur, c'est donc au plugin faire la vérification des index.
     823                        include_spip('inc/ncore_utils');
     824                        if ($verifier = ncore_chercher_service($plugin, 'conteneur_verifier', $stockage)) {
     825                                $conteneur_verifie = $verifier($plugin, $conteneur);
     826                        }
     827                }
     828        }
     829
     830        return $conteneur_verifie;
     831}
     832
     833/**
    784834 * Construit un identifiant unique pour le conteneur sous forme de chaine.
    785  * Cette fonction est juste un aiguillage vers la fonction éventuelle du plugin utilisateur
    786  * car N-Core ne fournit pas de calcul par défaut.
     835 * N-Core ne fournit d'identifiant que pour les noisettes conteneur.
     836 * Pour les autres conteneurs, c'est au plugin utilisateur de calculer l'identifiant.
    787837 *
    788838 * @package SPIP\NCORE\CONTENEUR\SERVICE
     
    794844 *        un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
    795845 * @param array  $conteneur
    796  *        Tableau associatif descriptif du conteneur accueillant la noisette. Un conteneur peut-être un squelette seul
    797  *        ou associé à un contexte d'utilisation et dans ce cas il possède un index `squelette` ou un objet quelconque
    798  *        sans lien avec un squelette. Dans tous les cas, les index, à l'exception de `squelette`, sont spécifiques
    799  *        à l'utilisation qui en est faite par le plugin.
     846 *        Tableau associatif descriptif du conteneur. Les index sont spécifiques à l'utilisation qui en est faite
     847 *        par le plugin utilisateur. Néanmoins, pour une noisette conteneur, le tableau est limité aux index
     848 *        type de noisette et id de noisette.
    800849 * @param string $stockage
    801850 *        Identifiant du service de stockage à utiliser si précisé.
     
    807856
    808857        // Il faut calculer l'identifiant du conteneur pour accéder à la bonne liste de noisettes.
    809         // N-Core ne propose pas de fonction par défaut car l'élaboration de l'identifiant est totalement spécifique
    810         // au plugin utilisateur.
    811         // Il est donc indispensable que le plugin utilisateur propose toujours une fonction de calcul de l'identifiant.
    812         // TODO : ne faudrait-il pas calculer automatiquement l'id pour une noisette conteneur ?
     858        // N-Core ne propose pas de fonction par défaut pour les conteneurs spécifiques aux plugins utilisateur
     859        // sauf pour les noisettes conteneur car elles ne sont déterminées que par leur type et leur id.
     860        // Il est donc indispensable que le plugin utilisateur propose toujours une fonction de calcul de l'identifiant
     861        // pour les conteneurs hors noisette conteneur.
    813862        $id_conteneur = '';
    814863        if ($conteneur) {
    815                 include_spip('inc/ncore_utils');
    816                 if ($identifier = ncore_chercher_service($plugin, 'conteneur_identifier', $stockage)) {
    817                         // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
    818                         $id_conteneur = $identifier($plugin, $conteneur);
     864                if (isset($conteneur['type_noisette'], $conteneur['id_noisette'])
     865                and $conteneur['type_noisette']
     866                and intval($conteneur['id_noisette'])) {
     867                        // Le conteneur est une noisette, N-Core effectue le calcul de l'id.
     868                        $id_conteneur = $conteneur['type_noisette'] . '|noisette|' . $conteneur['id_noisette'];
     869                } else {
     870                        // Le conteneur est spécifique au plugin utilisateur, c'est donc au plugin de le calculer.
     871                        include_spip('inc/ncore_utils');
     872                        if ($identifier = ncore_chercher_service($plugin, 'conteneur_identifier', $stockage)) {
     873                                $id_conteneur = $identifier($plugin, $conteneur);
     874                        }
    819875                }
    820876        }
  • _plugins_/n-core/trunk/paquet.xml

    r112829 r112835  
    22        prefix="ncore"
    33        categorie="outil"
    4         version="0.5.6"
     4        version="0.5.7"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.