Changeset 113134 in spip-zone


Ignore:
Timestamp:
Dec 27, 2018, 1:40:03 PM (3 weeks ago)
Author:
eric@…
Message:

Finalisation de l'importation des noisettes.
C'est assez compliqué mais ça semble bien fonctionner.
Attention, l'import/export est totalement nouveau et n'est donc plus compatible avec ni la v2 ni les versions v3 inférieures à 3.0.45

Location:
_plugins_/noizetier/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/noizetier/trunk/noizetier_ieconfig.php

    r113120 r113134  
    389389
    390390        // Les noisettes
    391         $importation['noisettes'] = array();
    392391        if ($importation['noisettes']) {
    393392                if ($importation['noisettes'] == 'remplacer') {
     
    404403                        $pages_base = array_map('reset', $pages_base);
    405404
     405                        // Nombre de noisettes par conteneur. On récupère l'ensemble des conteneurs y compris les noisettes
     406                        // conteneur mais seuls les blocs Z du noiZetier sont utiles.
     407                        $select = array('id_conteneur', 'count(*) as nb_noisettes');
     408                        $where = array('plugin=' . sql_quote('noizetier'));
     409                        $group_by = array('id_conteneur');
     410                        $nb_noisettes_base = sql_allfetsel($select, 'spip_noisettes', $where, $group_by);
     411                        $nb_noisettes_base = array_column($nb_noisettes_base, 'nb_noisettes', 'id_conteneur');
     412
     413                        // On insère les noisettes du fichier d'import appartenant à des pages ou des objets disponibles dans la
     414                        // base. Cette opération se fait en deux passes pour gérer le fait que les noisettes conteneur vont
     415                        // changer d'id ce qui change leur identifiant de conteneur :
     416                        // - Passe 1 : si la noisette est à insérer on l'ajoute dans le conteneur sans se préoccuper du changement
     417                        //             d'id de conteneur pour les noisettes conteneur. On stocke toutes les informations nécessaires
     418                        //             à la passe 2 comme le nouvel id des noisettes conteneur.
     419                        include_spip('base/objets');
     420                        include_spip('inc/ncore_conteneur');
     421                        include_spip('inc/ncore_noisette');
     422                        $noisettes_conteneur = $noisettes_imbriquees = array();
    406423                        $champs_modifiables = array_flip(array('parametres', 'encapsulation', 'css'));
    407                         foreach ($contenu_import['noisettes'] as $_noisette) {
    408                                 $page_noisette = $_noisette['type']
    409                                         ? ($_noisette['composition'] ? $_noisette['type'] . '-' . $_noisette['composition'] : $_noisette['type'])
    410                                         : $_noisette['objet'] . $_noisette['id_objet'];
    411                                 if (!$_noisette['objet'] and in_array($page_noisette, $pages_base)) {
    412                                         // La noisette à importer est bien associée à une page présente dans la base.
    413                                         // On la rajoute en fin du bloc concerné.
    414                                         $id_noisette = noisette_ajouter(
     424                        foreach ($contenu_import['noisettes'] as $_id_noisette_ancien => $_noisette) {
     425                                // On vérifie qu'il faut bien importer la noisette
     426                                $noisette_a_importer = false;
     427                                if ($_noisette['type']) {
     428                                        $page_import = $_noisette['composition']
     429                                                ? $_noisette['type'] . '-' . $_noisette['composition']
     430                                                : $_noisette['type'];
     431                                        if (in_array($page_import, $pages_base)) {
     432                                                $noisette_a_importer = true;
     433                                        }
     434                                } else {
     435                                        $table_objet = table_objet_sql($_noisette['objet']);
     436                                        $id_table_objet = id_table_objet($_noisette['objet']);
     437                                        $where = array($id_table_objet. '=' . intval($_noisette['id_objet']));
     438                                        if (sql_countsel($table_objet, $where)) {
     439                                                $noisette_a_importer = true;
     440                                        }
     441                                }
     442
     443                                if ($noisette_a_importer) {
     444                                        // La noisette à importer est bien associée à une page ou un objet de la base.
     445                                        // Les noisettes ne sont pas triées dans l'ordre d'insertion, il faut donc se baser sur le rang
     446                                        // dans le fichier d'import. Pour une noisette appartenant à un conteneur noisette on reprend le
     447                                        // rang tel que mais pour une noisette incluse dans un bloc Z il faut recalculer le rang en tenant
     448                                        // compte des noisettes déjà incluses dans la base.
     449                                        $rang = $_noisette['rang_noisette'];
     450                                        $conteneur = unserialize($_noisette['conteneur']);
     451                                        $conteneur_est_noisette = conteneur_est_noisette('noizetier', $conteneur);
     452                                        if (!$conteneur_est_noisette) {
     453                                                $rang = $nb_noisettes_base[$_noisette['id_conteneur']] + $_noisette['rang_noisette'];
     454                                        }
     455                                        $id_noisette_nouveau = noisette_ajouter(
    415456                                                'noizetier',
    416457                                                $_noisette['type_noisette'],
    417                                                 unserialize($_noisette['conteneur']),
    418                                                 0);
    419                                         // La noisette a été ajoutée de façon générique. Pour terminer l'importation il faut aussi
    420                                         // mettre à jour les données paramétrables : parametres, encapsulation et css.
    421                                         if ($id_noisette) {
     458                                                $conteneur,
     459                                                $rang);
     460                                        // La noisette a été ajoutée de façon générique (paramètres par défaut). Pour finaliser l'importation
     461                                        // il faut aussi mettre à jour les données paramétrables : parametres, encapsulation et css.
     462                                        if ($id_noisette_nouveau) {
    422463                                                $modifications = array_intersect_key($_noisette, $champs_modifiables);
    423                                                 noisette_parametrer('noizetier', $id_noisette, $modifications);
    424                                         }
     464                                                noisette_parametrer('noizetier', $id_noisette_nouveau, $modifications);
     465                                        }
     466
     467                                        // Pour conclure il faut stocker les informations nécessaires à la passe suivante:
     468                                        // - les noisettes imbriquées dans un conteneur noisette et les référence de ce conteneur
     469                                        // - la nouvelle valeur de l'id_noisette des noisettes conteneur
     470                                        if ($conteneur_est_noisette) {
     471                                                // Il faut se rappeler de la noisette car il faudra changer son conteneur (2 champs) lors de la
     472                                                // deuxième passe. On stocke
     473                                                $noisettes_imbriquees[$id_noisette_nouveau] = array(
     474                                                        'type_noisette' => $conteneur['type_noisette'],
     475                                                        'id_noisette' => $conteneur['id_noisette']
     476                                                );
     477                                        }
     478                                        if ($_noisette['est_conteneur'] == 'oui') {
     479                                                // La noisette est un conteneur. On constitue un tableau permettant de calculer son nouvel
     480                                                // identifiant induit par son nouvel id de noisette. Le tableau est indexé par son ancien id.
     481                                                $noisettes_conteneur[$_id_noisette_ancien] = $id_noisette_nouveau;
     482                                        }
     483                                }
     484                        }
     485
     486                        // - Passe 2 : On reprend les noisettes venant d'être insérées dans une noisette conteneur et
     487                        //             on rétablit le bon conteneur (id et tableau sérialisé).
     488                        if ($noisettes_imbriquees) {
     489                                foreach ($noisettes_imbriquees as $_id_noisette_nouveau => $_conteneur_ancien) {
     490                                        $where = array('plugin=' . sql_quote('noizetier'), 'id_noisette=' . intval($_id_noisette_nouveau));
     491                                        $nouveau_conteneur = $_conteneur_ancien;
     492                                        $nouveau_conteneur['id_noisette'] = $noisettes_conteneur[$_conteneur_ancien['id_noisette']];
     493                                        $modifications = array(
     494                                                'conteneur' => serialize($nouveau_conteneur),
     495                                                'id_conteneur' => conteneur_identifier('noizetier', $nouveau_conteneur)
     496                                        );
     497                                        sql_updateq('spip_noisettes', $modifications, $where);
    425498                                }
    426499                        }
  • _plugins_/noizetier/trunk/paquet.xml

    r113106 r113134  
    22        prefix="noizetier"
    33        categorie="maintenance"
    4         version="3.0.44"
     4        version="3.0.45"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
     
    4040        <pipeline nom="insert_head" action="insert_head_css" inclure="noizetier_pipelines.php" />
    4141
    42         <necessite nom="ncore" compatibilite="[0.5.12;[" />
     42        <necessite nom="ncore" compatibilite="[0.5.14;[" />
    4343        <necessite nom="saisies" compatibilite="[2.28.0;[" />
    4444        <necessite nom="verifier" compatibilite="[1.6.3;[" />
Note: See TracChangeset for help on using the changeset viewer.