Changeset 110826 in spip-zone for _plugins_/noizetier/trunk/inc


Ignore:
Timestamp:
Jun 23, 2018, 9:00:07 PM (13 months ago)
Author:
eric@…
Message:

Sauvegarder et restituer les blocs exclus quand on recharge les pages du noiZetier (bug remonté par real3t)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/noizetier/trunk/inc/noizetier_page.php

    r110817 r110826  
    4242        if ($fichiers = find_all_in_path($options['repertoire_pages'], '.+[.]html$')) {
    4343                $pages_nouvelles = $pages_modifiees = $pages_obsoletes = array();
    44                 // Récupération des signatures md5 des pages déjà enregistrées.
    45                 // Si on force le rechargement il est inutile de gérer les signatures et les pages modifiées ou obsolètes.
    46                 $signatures = array();
    47                 if (!$forcer_chargement) {
    48                         $select = array('page', 'signature');
    49                         if ($signatures = sql_allfetsel($select, $from, $where)) {
    50                                 $signatures = array_column($signatures, 'signature', 'page');
    51                         }
    52                         // On initialise la liste des pages à supprimer avec l'ensemble des pages non virtuelles
    53                         $pages_obsoletes = $signatures ? array_keys($signatures) : array();
    54                 }
    55 
    56                 foreach ($fichiers as $_squelette => $_chemin) {
    57                         $page = basename($_squelette, '.html');
    58                         $dossier = dirname($_chemin);
    59                         $est_composition = (noizetier_page_extraire_composition($page) != '');
    60                         // Exclure certaines pages :
    61                         // -- celles du privé situes dans prive/contenu
    62                         // -- page liée au plugin Zpip en v1
    63                         // -- z_apl liée aux plugins Zpip v1 et Zcore
    64                         // -- les compositions explicites si le plugin Compositions n'est pas activé
    65                         if ((substr($dossier, -13) != 'prive/contenu')
    66                         and (($page != 'page') or !defined('_DIR_PLUGIN_Z'))
    67                         and (($page != 'z_apl') or (!defined('_DIR_PLUGIN_Z') and !defined('_DIR_PLUGIN_ZCORE')))
    68                         and (!$est_composition or ($est_composition     and defined('_DIR_PLUGIN_COMPOSITIONS')))) {
    69                                 // On passe le md5 de la page si il existe sinon la chaîne vide. Cela permet de déterminer
    70                                 // si on doit ajouter la page ou la mettre à jour.
    71                                 // Si le md5 est le même et qu'il n'est donc pas utile de recharger la page, la configuration
    72                                 // retournée est vide.
    73                                 $options['md5'] = isset($signatures[$page]) ? $signatures[$page] : '';
    74                                 $options['recharger'] = $forcer_chargement;
    75                                 if ($configuration = page_phraser_fichier($page, $options)) {
    76                                         if (empty($configuration['identique'])) {
    77                                                 // La page a été chargée (nouvelle) ou rechargée (modifiée).
    78                                                 // Néanmoins, on n'inclue cette page que si les plugins qu'elle nécessite explicitement dans son
    79                                                 // fichier de configuration sont bien tous activés.
    80                                                 // Rappel: si une page est incluse dans un plugin non actif elle ne sera pas détectée
    81                                                 //         lors du find_all_in_path() puisque le plugin n'est pas dans le path SPIP.
    82                                                 //         Ce n'est pas ce cas qui est traité ici.
    83                                                 $page_a_garder = true;
    84                                                 $necessite = unserialize($configuration['necessite']);
    85                                                 if (!empty($necessite)) {
    86                                                         foreach ($necessite as $plugin) {
    87                                                                 if (!defined('_DIR_PLUGIN_'.strtoupper($plugin))) {
    88                                                                         $page_a_garder = false;
    89                                                                         break;
     44                // Récupération des signatures md5 des pages déjà enregistrées et des blocs exclus qui peuvent être
     45                // modifiés après chargement: il faut donc conserver les modifications éventuelles.
     46                $select = array('page', 'signature', 'blocs_exclus');
     47                if ($pages = sql_allfetsel($select, $from, $where)) {
     48                        // On construit le tableau des blocs exclus de chaque page déjà enregistrée en base.
     49                        $blocs_exclus = array_column($pages, 'blocs_exclus', 'page');
     50
     51                        // Si on force le rechargement il est inutile de gérer les signatures et les pages modifiées ou obsolètes.
     52                        $signatures = array();
     53                        if (!$forcer_chargement) {
     54                                $signatures = array_column($pages, 'signature', 'page');
     55                                // On initialise la liste des pages à supprimer avec l'ensemble des pages non virtuelles
     56                                $pages_obsoletes = $signatures ? array_keys($signatures) : array();
     57                        }
     58
     59                        foreach ($fichiers as $_squelette => $_chemin) {
     60                                $page = basename($_squelette, '.html');
     61                                $dossier = dirname($_chemin);
     62                                $est_composition = (noizetier_page_extraire_composition($page) != '');
     63                                // Exclure certaines pages :
     64                                // -- celles du privé situes dans prive/contenu
     65                                // -- page liée au plugin Zpip en v1
     66                                // -- z_apl liée aux plugins Zpip v1 et Zcore
     67                                // -- les compositions explicites si le plugin Compositions n'est pas activé
     68                                if ((substr($dossier, -13) != 'prive/contenu')
     69                                and (($page != 'page') or !defined('_DIR_PLUGIN_Z'))
     70                                and (($page != 'z_apl') or (!defined('_DIR_PLUGIN_Z') and !defined('_DIR_PLUGIN_ZCORE')))
     71                                and (!$est_composition or ($est_composition     and defined('_DIR_PLUGIN_COMPOSITIONS')))) {
     72                                        // On passe le md5 de la page si il existe sinon la chaîne vide. Cela permet de déterminer
     73                                        // si on doit ajouter la page ou la mettre à jour.
     74                                        // Si le md5 est le même et qu'il n'est donc pas utile de recharger la page, la configuration
     75                                        // retournée est vide.
     76                                        $options['md5'] = isset($signatures[$page]) ? $signatures[$page] : '';
     77                                        $options['recharger'] = $forcer_chargement;
     78                                        if ($configuration = page_phraser_fichier($page, $options)) {
     79                                                if (empty($configuration['identique'])) {
     80                                                        // La page a été chargée (nouvelle) ou rechargée (modifiée).
     81                                                        // Néanmoins, on n'inclue cette page que si les plugins qu'elle nécessite explicitement dans son
     82                                                        // fichier de configuration sont bien tous activés.
     83                                                        // Rappel: si une page est incluse dans un plugin non actif elle ne sera pas détectée
     84                                                        //         lors du find_all_in_path() puisque le plugin n'est pas dans le path SPIP.
     85                                                        //         Ce n'est pas ce cas qui est traité ici.
     86                                                        $page_a_garder = true;
     87                                                        $necessite = unserialize($configuration['necessite']);
     88                                                        if (!empty($necessite)) {
     89                                                                foreach ($necessite as $plugin) {
     90                                                                        if (!defined('_DIR_PLUGIN_'.strtoupper($plugin))) {
     91                                                                                $page_a_garder = false;
     92                                                                                break;
     93                                                                        }
    9094                                                                }
    9195                                                        }
    92                                                 }
    93 
    94                                                 // Si la page est à garder on détermine si elle est nouvelle ou modifiée.
    95                                                 // En mode rechargement forcé toute page est considérée comme nouvelle.
    96                                                 // Sinon, la page doit être retirée de la base car un plugin qu'elle nécessite a été désactivée:
    97                                                 // => il suffit pour cela de la laisser dans la liste des pages obsolètes.
    98                                                 if ($page_a_garder) {
    99                                                         if (!$options['md5'] or $forcer_chargement) {
    100                                                                 // La page est soit nouvelle soit on est en mode rechargement forcé:
    101                                                                 // => il faut la rajouter dans la table.
    102                                                                 $pages_nouvelles[] = $configuration;
    103                                                         } else {
    104                                                                 // La configuration stockée dans la table a été modifiée et le mode ne force pas le rechargement:
    105                                                                 // => il faut mettre à jour la page dans la table.
    106                                                                 $pages_modifiees[] = $configuration;
    107                                                                 // => il faut donc la supprimer de la liste des pages obsolètes
    108                                                                 $pages_obsoletes = array_diff($pages_obsoletes, array($page));
     96
     97                                                        // Si la page est à garder on met à jour les blocs exclus avec la sauvegarde effectuée
     98                                                        // au préalable et on détermine si la page est nouvelle ou modifiée.
     99                                                        // En mode rechargement forcé toute page est considérée comme nouvelle.
     100                                                        // Sinon, la page doit être retirée de la base car un plugin qu'elle nécessite a été désactivée:
     101                                                        // => il suffit pour cela de la laisser dans la liste des pages obsolètes.
     102                                                        if ($page_a_garder) {
     103                                                                // Mise à jour des blocs exclus : on écrase la valeur du YAML par celle de la base si
     104                                                                // elle existe
     105                                                                if (isset($blocs_exclus[$page])) {
     106                                                                        $configuration['blocs_exclus'] = $blocs_exclus[$page];
     107                                                                }
     108                                                                if (!$options['md5'] or $forcer_chargement) {
     109                                                                        // La page est soit nouvelle soit on est en mode rechargement forcé:
     110                                                                        // => il faut la rajouter dans la table.
     111                                                                        $pages_nouvelles[] = $configuration;
     112                                                                } else {
     113                                                                        // La configuration stockée dans la table a été modifiée et le mode ne force pas le rechargement:
     114                                                                        // => il faut mettre à jour la page dans la table.
     115                                                                        $pages_modifiees[] = $configuration;
     116                                                                        // => il faut donc la supprimer de la liste des pages obsolètes
     117                                                                        $pages_obsoletes = array_diff($pages_obsoletes, array($page));
     118                                                                }
    109119                                                        }
     120                                                } else {
     121                                                        // La page n'a pas changée et n'a donc pas été réchargée:
     122                                                        // => Il faut donc juste indiquer qu'elle n'est pas obsolète.
     123                                                        $pages_obsoletes = array_diff($pages_obsoletes, array($page));
    110124                                                }
    111125                                        } else {
    112                                                 // La page n'a pas changée et n'a donc pas été réchargée:
    113                                                 // => Il faut donc juste indiquer qu'elle n'est pas obsolète.
    114                                                 $pages_obsoletes = array_diff($pages_obsoletes, array($page));
     126                                                // Il y a eu une erreur sur lors du rechargement de la page.
     127                                                // Ce peut être en particulier le cas où une page HTML sans XML n'est plus détectée car le
     128                                                // paramètre _NOIZETIER_LISTER_PAGES_SANS_XML a été positionné de true à false.
     129                                                // => il faut donc ne rien faire pour laisser la page dans les obsolètes
     130                                                continue;
    115131                                        }
    116                                 } else {
    117                                         // Il y a eu une erreur sur lors du rechargement de la page.
    118                                         // Ce peut être en particulier le cas où une page HTML sans XML n'est plus détectée car le
    119                                         // paramètre _NOIZETIER_LISTER_PAGES_SANS_XML a été positionné de true à false.
    120                                         // => il faut donc ne rien faire pour laisser la page dans les obsolètes
    121                                         continue;
    122                                 }
    123                         }
    124                 }
    125 
    126                 // Mise à jour de la table des pages
    127                 // -- Suppression des pages obsolètes ou de toute les pages non virtuelles si on est en mode
    128                 //    rechargement forcé.
    129                 if (sql_preferer_transaction()) {
    130                         sql_demarrer_transaction();
    131                 }
    132                 if ($pages_obsoletes) {
    133                         sql_delete($from, sql_in('page', $pages_obsoletes));
    134                 } elseif ($forcer_chargement) {
    135                         sql_delete($from, $where);
    136                 }
    137                 // -- Update des pages modifiées
    138                 if ($pages_modifiees) {
    139                         sql_replace_multi($from, $pages_modifiees);
    140                 }
    141                 // -- Insertion des nouvelles pages
    142                 if ($pages_nouvelles) {
    143                         sql_insertq_multi($from, $pages_nouvelles);
    144                 }
    145                 if (sql_preferer_transaction()) {
    146                         sql_terminer_transaction();
    147                 }
    148 
    149                 $retour = true;
     132                                }
     133                        }
     134
     135                        // Mise à jour de la table des pages
     136                        // -- Suppression des pages obsolètes ou de toute les pages non virtuelles si on est en mode
     137                        //    rechargement forcé.
     138                        if (sql_preferer_transaction()) {
     139                                sql_demarrer_transaction();
     140                        }
     141                        if ($pages_obsoletes) {
     142                                sql_delete($from, sql_in('page', $pages_obsoletes));
     143                        } elseif ($forcer_chargement) {
     144                                sql_delete($from, $where);
     145                        }
     146                        // -- Update des pages modifiées
     147                        if ($pages_modifiees) {
     148                                sql_replace_multi($from, $pages_modifiees);
     149                        }
     150                        // -- Insertion des nouvelles pages
     151                        if ($pages_nouvelles) {
     152                                sql_insertq_multi($from, $pages_nouvelles);
     153                        }
     154                        if (sql_preferer_transaction()) {
     155                                sql_terminer_transaction();
     156                        }
     157
     158                        $retour = true;
     159                }
    150160        }
    151161
     
    397407        }
    398408
    399         // Initialiser le contexte de chargment
     409        // Initialiser le contexte de chargement
    400410        if (!isset($options['recharger'])) {
    401411                $options['recharger'] = false;
Note: See TracChangeset for help on using the changeset viewer.