Changeset 112847 in spip-zone


Ignore:
Timestamp:
Dec 16, 2018, 8:47:04 PM (3 months ago)
Author:
eric@…
Message:

Evolution de la fonction noisette_deplacer() pour prendre en compte le déplacement dans un conteneur différent.
Demande la création de la nouvelle fonction de service ncore_noisette_changer_conteneur().

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

Legend:

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

    r112835 r112847  
    217217
    218218        // Initialisation du retour
    219         $retour = false;
     219        $retour = true;
    220220
    221221        // On charge les services de N-Core.
     
    243243                // Suppression de la noisette. On passe la description complète ce qui permet à la fonction de
    244244                // destockage de choisir la méthode d'identification la plus adaptée.
    245                 $retour = ncore_noisette_destocker($plugin, $description, $stockage);
     245                ncore_noisette_destocker($plugin, $description, $stockage);
    246246
    247247                // On récupère les noisettes restant affectées au conteneur sous la forme d'un tableau indexé par rang.
     
    371371
    372372/**
    373  * Déplace une noisette donnée au sein d’un conteneur.
     373 * Déplace une noisette donnée au sein d’un même conteneur ou dans un autre conteneur.
    374374 * La fonction met à jour les rangs des autres noisettes si nécessaire.
    375375 *
    376376 * @api
     377 *
    377378 * @uses ncore_noisette_decrire()
     379 * @uses ncore_conteneur_verifier()
     380 * @uses ncore_conteneur_identifier()
    378381 * @uses ncore_noisette_lister()
     382 * @uses ncore_noisette_changer_conteneur()
    379383 * @uses ncore_noisette_ranger()
    380384 *
    381  * @param string $plugin
     385 * @param string       $plugin
    382386 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
    383387 *        un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
    384  * @param mixed  $noisette
     388 * @param mixed        $noisette
    385389 *        Identifiant de la noisette qui peut prendre soit la forme d'un entier ou d'une chaine unique, soit la forme
    386390 *        d'un couple (id conteneur, rang).
    387  * @param int    $rang_destination
     391 * @param array|string $conteneur_destination
     392 *        Identifiant du conteneur destination qui prend soit la forme d'un tableau soit celui d'un id.
     393 * @param int          $rang_destination
    388394 *        Entier représentant le rang où repositionner la noisette dans le squelette contextualisé.
    389  * @param string $stockage
    390  *        Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin
    391  *        ni celui de N-Core ne seront utilisés. En général, cet identifiant est le préfixe d'un plugin
    392  *        fournissant le service de stockage souhaité.
     395 * @param string       $stockage
     396 *        Identifiant du service de stockage à utiliser si précisé.
    393397 *
    394398 * @return bool
    395399 */
    396 function noisette_deplacer($plugin, $noisette, $rang_destination, $stockage = '') {
     400function noisette_deplacer($plugin, $noisette, $conteneur_destination, $rang_destination, $stockage = '') {
    397401
    398402        // Initialisation du retour
    399         $retour = false;
     403        $retour = true;
    400404
    401405        // On charge les services de N-Core.
     
    409413        //   (qui est unique pour un conteneur donné).
    410414        if (!empty($noisette) and (is_string($noisette) or is_numeric($noisette) or is_array($noisette))) {
    411                 // Avant de deplacer la noisette on sauvegarde sa description et son rang origine.
     415                // Avant de déplacer la noisette on sauvegarde sa description, son id conteneur et son rang.
    412416                $description = ncore_noisette_decrire($plugin, $noisette, $stockage);
     417                $id_conteneur_origine = $description['id_conteneur'];
    413418                $rang_origine = $description['rang_noisette'];
    414419
     420                // On détermine l'id du conteneur destination en fonction du mode d'identification fourni par l'argument.
     421                if (is_array($conteneur_destination)) {
     422                        $id_conteneur_destination = ncore_conteneur_identifier(
     423                                $plugin,
     424                                ncore_conteneur_verifier($plugin, $conteneur_destination, $stockage),
     425                                $stockage
     426                        );
     427                } else {
     428                        $id_conteneur_destination = $conteneur_destination;
     429                }
     430
     431                // Si le conteneur destination est différent du conteneur origine, la première opération consiste à
     432                // transférer la noisette en fin du conteneur destination, ce qui est toujours possible.
     433                // Ensuite on tasse le conteneur d'origine.
     434                if ($id_conteneur_destination != $id_conteneur_origine) {
     435                        // On recherche le dernier rang utilisé dans le conteneur destination et on se positionne après.
     436                        $rangs = ncore_noisette_lister(
     437                                $plugin,
     438                                $id_conteneur_destination,
     439                                'rang_noisette',
     440                                'id_noisette',
     441                                $stockage
     442                        );
     443                        $rang_conteneur_destination = $rangs ? max($rangs) + 1 : 1;
     444
     445                        // On transfère la noisette vers le conteneur destination à la position calculée (max + 1).
     446                        $description = ncore_noisette_changer_conteneur(
     447                                $plugin,
     448                                $description,
     449                                $id_conteneur_destination,
     450                                $rang_conteneur_destination,
     451                                $stockage
     452                        );
     453
     454                        // Il faut maintenant tasser les noisettes du conteneur d'origine qui a perdu une noisette.
     455                        // -- On récupère les noisettes restant affectées au conteneur origine sous la forme d'un tableau
     456                        //    indexé par rang.
     457                        $autres_noisettes = ncore_noisette_lister(
     458                                $plugin,
     459                                $id_conteneur_origine,
     460                                '',
     461                                'rang_noisette',
     462                                $stockage
     463                        );
     464
     465                        // Si il reste des noisettes, on tasse d'un rang les noisettes qui suivaient la noisette supprimée.
     466                        if ($autres_noisettes) {
     467                                // On lit les noisettes restantes dans l'ordre décroissant pour éviter d'écraser une noisette.
     468                                ksort($autres_noisettes);
     469                                foreach ($autres_noisettes as $_rang => $_autre_description) {
     470                                        if ($_rang > $description['rang_noisette']) {
     471                                                ncore_noisette_ranger($plugin, $_autre_description, $_autre_description['rang_noisette'] - 1, $stockage);
     472                                        }
     473                                }
     474                        }
     475
     476                        // Le rang origine devient donc le nouveau rang de la noisette dans le conteneur destination.
     477                        $rang_origine = $description['rang_noisette'];
     478                }
     479
     480                // A partir de là, le déplacement est un déplacement à l'intérieur d'un conteneur.
    415481                // Si les rangs origine et destination sont identiques on ne fait rien !
    416482                if ($rang_destination != $rang_origine) {
  • _plugins_/n-core/trunk/ncore/ncore.php

    r112838 r112847  
    372372                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    373373                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    374                 //    [conteneur][rang] = description
     374                //    [id_conteneur][rang] = description
    375375                //    N-Core calcule un identifiant unique pour la noisette qui sera stocké à l'index 'id_noisette' de sa
    376376                //    description et qui vaudra uniqid() avec comme préfixe le plugin appelant.
     
    418418}
    419419
     420/**
     421 * Transfère une noisette d'un conteneur vers un autre à un rang donné.
     422 * Le rang destination n'est pas vérifié lors du rangement dans le conteneur destination. Il convient
     423 * à l'appelant de vérifier que le rang est libre.
     424 *
     425 * @param string $plugin
     426 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
     427 *        un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     428 * @param array  $description
     429 *        Description de la noisette. Soit la description ne contient pas l'id de la noisette et c'est un ajout,
     430 *        soit la description contient l'id et c'est une mise à jour.
     431 * @param string $id_conteneur
     432 * @param int    $rang
     433 * @param string $stockage
     434 *        Identifiant du service de stockage à utiliser si précisé.
     435 *
     436 * @return array
     437 */
     438function ncore_noisette_changer_conteneur($plugin, $description, $id_conteneur, $rang, $stockage = '') {
     439
     440        // On cherche le service de stockage à utiliser selon la logique suivante :
     441        // - si le service de stockage est non vide on l'utilise en considérant que la fonction existe forcément;
     442        // - sinon, on utilise la fonction du plugin appelant si elle existe;
     443        // - et sinon, on utilise la fonction de N-Core.
     444        include_spip('inc/ncore_utils');
     445        if ($changer = ncore_chercher_service($plugin, 'noisette_changer_conteneur', $stockage)) {
     446                // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
     447                $description = $changer($plugin, $description, $id_conteneur, $rang);
     448        } else {
     449                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
     450                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
     451                //    [id_conteneur][rang] = description
     452
     453                // On supprime la noisette de son emplacement actuel en utilisant la description.
     454                ncore_noisette_destocker('ncore', $description, $stockage);
     455
     456                // On lit la meta de stockage des noisettes pour le plugin appelant.
     457                include_spip('inc/config');
     458                $noisettes = lire_config("${plugin}_noisettes", array());
     459
     460                // On rajoute la description à son emplacement destination en prenant soin de modifier les index id_conteneur,
     461                // conteneur et rang_noisette qui doivent représenter le conteneur destination.
     462                $description['id_conteneur'] = $id_conteneur;
     463                $description['conteneur'] = ncore_conteneur_construire($plugin, $id_conteneur, $stockage);
     464                $description['rang_noisette'] = $rang;
     465                $noisettes[$id_conteneur][$rang] = $description;
     466
     467                // On met à jour la meta
     468                ecrire_config("${plugin}_noisettes", $noisettes);
     469        }
     470
     471        return $description;
     472}
    420473
    421474/**
     
    491544                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    492545                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    493                 //    [conteneur][rang] = description
     546                //    [id_conteneur][rang] = description
    494547
    495548                // Initialisation de la sortie.
     
    553606                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    554607                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    555                 //    [conteneur][rang] = description
     608                //    [id_conteneur][rang] = description
    556609                // -- $description est soit le tableau descriptif de la noisette, soit le conteneur, et dans ce cas, il faut
    557610                //    supprimer toutes les noisettes du conteneur.
     
    621674                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    622675                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    623                 //    [conteneur][rang] = description
     676                //    [id_conteneur][rang] = description
    624677
    625678                // Initialisation du tableau de sortie.
     
    694747                // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé.
    695748                // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format
    696                 //    [conteneur][rang] = description
     749                //    [id_conteneur][rang] = description
    697750
    698751                // Initialisation de la description à retourner.
  • _plugins_/n-core/trunk/paquet.xml

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