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


Ignore:
Timestamp:
May 5, 2018, 7:17:37 PM (15 months ago)
Author:
eric@…
Message:

Refactoring des API pour les pages, objets et blocs.
Un premier lot pas fianalisé.
Attention le drag'n drop pour l'ajout et le déplacement des noisettes a été désactivé en attendant de trouver une solution fonctionnelle. Par contre, toutes les actions via les boutons sont opérationnelles.

Location:
_plugins_/noizetier/trunk/inc
Files:
4 added
1 edited
1 moved

Legend:

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

    r110076 r110110  
    11<?php
    22/**
    3  * Ce fichier contient l'API N-Core de gestion des conteneurs.
     3 * Ce fichier contient l'API complémentaire spécifique au noiZetier de gestion des conteneurs.
    44 *
    55 * @package SPIP\NOIZETIER\CONTENEUR\API
     
    1616 *
    1717 * @api
    18  * @filtre
    1918 *
    2019 * @uses noizetier_conteneur_identifier()
     
    6665 *
    6766 * @api
    68  * @filtre
    6967 *
    7068 * @uses noizetier_page_type()
     
    9492                $conteneur['page'] = $page;
    9593                // -- Type et composition
    96                 include_spip('noizetier_fonctions');
     94                include_spip('inc/noizetier_page');
    9795                $conteneur['type'] = noizetier_page_type($conteneur['page']);
    9896                $conteneur['composition'] = noizetier_page_composition($conteneur['page']);
     
    104102                        $conteneur['id_noisette'] = intval($elements[2]);
    105103                        // -- le squelette
    106                         include_spip('ncore/ncore');
    107                         $conteneur['squelette'] = ncore_type_noisette_initialiser_dossier('noizetier') . $conteneur['type_noisette'];
     104                        include_spip('ncore/noizetier');
     105                        $conteneur['squelette'] = noizetier_type_noisette_initialiser_dossier('noizetier') . $conteneur['type_noisette'];
    108106                        // -- les éléments du conteneur de la noisette parent utiles pour les autorisations
    109107                        $select = array('type', 'composition', 'objet', 'id_objet', 'bloc');
  • _plugins_/noizetier/trunk/inc/noizetier_page.php

    r110109 r110110  
    11<?php
    2 
     2/**
     3 * Ce fichier contient l'API de gestion des pages et compositions configurables par le noiZetier.
     4 *
     5 * @package SPIP\NOIZETIER\PAGE\API
     6 */
    37if (!defined('_ECRIRE_INC_VERSION')) {
    48        return;
    59}
    610
    7 function phraser_page($page, $options = array()) {
     11
     12/**
     13 *
     14 * @api
     15 *
     16 * @param bool $recharger
     17 *
     18 * @return bool
     19 */
     20function noizetier_page_charger($recharger = false) {
     21
     22        // Retour de la fonction
     23        $retour = false;
     24
     25        // Initialiser les blocs par défaut
     26        include_spip('inc/noizetier_bloc');
     27        $options['blocs_defaut'] = noizetier_bloc_defaut();
     28
     29        // Choisir le bon répertoire des pages
     30        $options['repertoire_pages'] = noizetier_page_repertoire();
     31
     32        // Initialiser le contexte de rechargement
     33        // TODO : en attente de voir si on rajoute un var_mode=vider_noizetier
     34        $forcer_chargement = $recharger;
     35
     36        // Initaliser la table et le where des pages non virtuelles qui sont utilisés plusieurs fois.
     37        $from ='spip_noizetier_pages';
     38        $where = array('est_virtuelle=' . sql_quote('non'));
     39
     40        // On recherche les pages et les compositions explicites par le fichier HTML en premier
     41        // Si on le trouve, on récupère la configuration du fichier XML ou YAML.
     42        if ($fichiers = find_all_in_path($options['repertoire_pages'], '.+[.]html$')) {
     43                $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_est_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 chaine 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;
     90                                                                }
     91                                                        }
     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));
     109                                                        }
     110                                                }
     111                                        } 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));
     115                                        }
     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;
     150        }
     151
     152        return $retour;
     153}
     154
     155/**
     156 * Retourne la configuration de la page, de la composition explicite ou de la composition virtuelle demandée.
     157 * La configuration est stockée en base de données, certains champs sont recalculés avant d'être fournis.
     158 *
     159 * @api
     160 * @filtre
     161 *
     162 * @uses noizetier_bloc_defaut()
     163 *
     164 * @param string        $page
     165 *              Identifiant de la page ou de la composition.
     166 * @param boolean       $traitement_typo
     167 *      Indique si les données textuelles doivent être retournées brutes ou si elles doivent être traitées
     168 *      en utilisant la fonction _T_ou_typo.
     169 *              Les champs sérialisés sont toujours désérialisés.
     170 *
     171 * @return array
     172 */
     173function noizetier_page_informer($page, $traitement_typo = true) {
     174
     175        static $description_page = array();
     176
     177        if (!isset($description_page[$traitement_typo][$page])) {
     178                // Chargement de toute la configuration de la page en base de données.
     179                $description = sql_fetsel('*', 'spip_noizetier_pages', array('page=' . sql_quote($page)));
     180
     181                // Sauvegarde de la description de la page pour une consultation ultérieure dans le même hit.
     182                if ($description) {
     183                        // Traitements des champs textuels
     184                        if ($traitement_typo) {
     185                                $description['nom'] = _T_ou_typo($description['nom']);
     186                                if (isset($description['description'])) {
     187                                        $description['description'] = _T_ou_typo($description['description']);
     188                                }
     189                        }
     190                        // Traitements des champs tableaux sérialisés
     191                        $description['blocs_exclus'] = unserialize($description['blocs_exclus']);
     192                        $description['necessite'] = unserialize($description['necessite']);
     193                        $description['branche'] = unserialize($description['branche']);
     194                        // Calcul des blocs
     195                        include_spip('inc/noizetier_bloc');
     196                        $description['blocs'] = noizetier_bloc_lister($page, $description['blocs_exclus']);
     197                        $description_page[$traitement_typo][$page] = $description;
     198                } else {
     199                        $description_page[$traitement_typo][$page] = array();
     200                }
     201        }
     202
     203        return $description_page[$traitement_typo][$page];
     204}
     205
     206/**
     207 * Renvoie le type d'une page à partir de son identifiant.
     208 *
     209 * @api
     210 * @filtre
     211 *
     212 * @param string $page
     213 *              L'identifiant de la page.
     214 *
     215 * @return string
     216 *              Le type de la page choisie, c'est-à-dire:
     217 *              - soit l'identifiant complet de la page,
     218 *              - soit le mot précédent le tiret dans le cas d'une composition.
     219 */
     220function noizetier_page_type($page) {
     221        $type = explode('-', $page, 2);
     222
     223        return $type[0];
     224}
     225
     226/**
     227 * Détermine, à partir de son identifiant, la composition d'une page si elle existe.
     228 *
     229 * @api
     230 * @filtre
     231 *
     232 * @param string $page
     233 *              L'identifiant de la page.
     234 *
     235 * @return string
     236 *      La composition de la page choisie, à savoir, le mot suivant le tiret,
     237 *              ou la chaine vide sinon.
     238 */
     239function noizetier_page_composition($page) {
     240        $composition = explode('-', $page, 2);
     241        $composition = isset($composition[1]) ? $composition[1] : '';
     242
     243        return $composition;
     244}
     245
     246/**
     247 * Détermine, à partir de son identifiant, si la page est une composition.
     248 *
     249 * @api
     250 *
     251 * @param string $page
     252 *              L'identifiant de la page.
     253 *
     254 * @return boolean
     255 *      `true` si la page est une composition, `false` sinon.
     256 */
     257function noizetier_page_est_composition($page) {
     258        $est_composition = false;
     259        if (strpos($page, '-') !== false) {
     260                $est_composition = true;
     261        }
     262
     263        return $est_composition;
     264}
     265
     266/**
     267 * Détermine si les compositions sont possibles sur un type de page.
     268 *
     269 * @api
     270 *
     271 * @param string $type
     272 *              Identifiant du type de page.
     273 *
     274 * @return boolean
     275 *              True si les compositions sont autorisées, false sinon.
     276 */
     277function noizetier_page_composition_activee($type) {
     278
     279        $est_activee = false;
     280
     281        if (defined('_DIR_PLUGIN_COMPOSITIONS')) {
     282                include_spip('compositions_fonctions');
     283                if (in_array($type, compositions_objets_actives())) {
     284                        $est_activee = true;
     285                }
     286        }
     287
     288        return $est_activee;
     289}
     290
     291/**
     292 * Déterminer le répertoire dans lequel le NoiZetier peut lister les pages pouvant supporter
     293 * l'insertion de noisettes.
     294 *
     295 * @package SPIP\NOIZETIER\API\PAGE
     296 * @api
     297 *
     298 * @return string
     299 *              Le répertoire des pages sous la forme dossier/.
     300 */
     301function noizetier_page_repertoire() {
     302
     303        if (defined('_NOIZETIER_REPERTOIRE_PAGES')) {
     304                $repertoire_pages = _NOIZETIER_REPERTOIRE_PAGES;
     305        } elseif (isset($GLOBALS['z_blocs'])) {
     306                $premier_bloc = reset($GLOBALS['z_blocs']);
     307                $repertoire_pages = "$premier_bloc/";
     308        } else {
     309                $repertoire_pages = 'contenu/';
     310        }
     311
     312        return $repertoire_pages;
     313}
     314
     315/**
     316 * Phrase le fichier XML ou YAML des pages et compositions configurables par le noiZetier et renvoie
     317 * un tableau des caractéristiques complètes.
     318 *
     319 * @internal
     320 *
     321 * @uses noizetier_page_repertoire()
     322 * @uses noizetier_bloc_defaut()
     323 *
     324 * @param       $page
     325 * @param array $options
     326 *
     327 * @return array
     328 */
     329function page_phraser_fichier($page, $options = array()) {
    8330
    9331        // Initialisation de la description
     
    17339        // Initialiser les blocs par défaut
    18340        if (empty($options['blocs_defaut'])) {
     341                include_spip('inc/noizetier_bloc');
    19342                $options['blocs_defaut'] = noizetier_bloc_defaut();
    20343        }
Note: See TracChangeset for help on using the changeset viewer.