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


Ignore:
Timestamp:
Jun 24, 2018, 5:35:47 PM (13 months ago)
Author:
eric@…
Message:

Correction et amélioration de la fonction de chargement des pages.
On évite de forcer le rechargement complet pour uniquement mettre à jour l'indicateur d'activité de la page.

File:
1 edited

Legend:

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

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