Changeset 113623 in spip-zone


Ignore:
Timestamp:
Jan 26, 2019, 7:36:54 PM (3 weeks ago)
Author:
eric@…
Message:

Amélioration de l'API page_noizetier_repertorier qui permet d'indexer le tableau de sortie de façon numérique.
Mise en conformité de ieconfig avec cette API et correction dans la foulée de l'importation des compositions virtuelles.

Location:
_plugins_/noizetier/trunk
Files:
3 edited

Legend:

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

    r113610 r113623  
    239239 *        Information spécifique à retourner ou vide pour retourner toute la description. L'information peut être une
    240240 *        chaine correspondant à un champ de la page ou un tableau avec une liste de champs.
    241  * @param array  $filtres
     241 * @param array   $filtres
    242242 *        Tableau associatif `[champ] = valeur` de critères de filtres sur les descriptions de types de noisette.
    243243 *        Le seul opérateur possible est l'égalité.
     244 * @param boolean $indexer_par_page
     245 *      Indique si le tableau doit être indexé par d'identifiant de page ou pas. `true` par défaut.
    244246 *
    245247 * @return array
    246  *        Tableau des descriptions des pages et compositions trouvées indexé par l'identifiant de la page.
    247  */
    248 function page_noizetier_repertorier($information = array(), $filtres = array()) {
     248 *        Tableau des descriptions des pages et compositions trouvées indexé par l'identifiant de la page ou par
     249 *        entier de 0 à n.
     250 */
     251function page_noizetier_repertorier($information = array(), $filtres = array(), $indexer_par_page = true) {
    249252
    250253        // Initialiser la sortie.
     
    278281
    279282                // On ajoute toujours l'identifiant page car il sert à l'indexation du tableau de sortie.
    280                 if ($information_valide and !in_array('page', $select)) {
     283                if ($indexer_par_page
     284                and $information_valide
     285                and !in_array('page', $select)) {
    281286                        $select[] = 'page';
    282287                }
     
    301306                $pages = sql_allfetsel($select, 'spip_noizetier_pages', $where);
    302307
    303                 // On renvoie l'information demandée indexée par page.
    304                 if ($information_unique) {
    305                         $pages = array_column($pages, $information, 'page');
    306                 } else {
    307                         $pages = array_column($pages, null, 'page');
    308                         if ($information and !in_array('page', $information)) {
    309                                 // On supprime le champ 'page' qui n'a pas été demandé
    310                                 foreach ($pages as $_id_page => $_page) {
    311                                         unset($pages[$_id_page]['page']);
     308                // On renvoie l'information demandée indexée par page si demandé ainsi.
     309                if ($indexer_par_page) {
     310                        if ($information_unique) {
     311                                $pages = array_column($pages, $information, 'page');
     312                        } else {
     313                                $pages = array_column($pages, null, 'page');
     314                                if ($information and !in_array('page', $information)) {
     315                                        // On supprime le champ 'page' qui n'a pas été demandé
     316                                        foreach ($pages as $_id_page => $_page) {
     317                                                unset($pages[$_id_page]['page']);
     318                                        }
    312319                                }
    313320                        }
  • _plugins_/noizetier/trunk/noizetier_ieconfig.php

    r113584 r113623  
    7676                // toujours une fusion des blocs exclus sur les pages de la base ayant le même identifiant.
    7777                // On désactive toutefois l'option si aucune page explicite n'est commune entre les deux listes.
     78                include_spip('inc/noizetier_page');
    7879                $disable_pages_explicites = false;
    79                 $select = array('page');
    80                 $where = array('est_virtuelle=' . sql_quote('non'));
    81                 if ($pages_explicites = sql_allfetsel($select,'spip_noizetier_pages', $where)) {
    82                         $pages_explicites = array_map('reset', $pages_explicites);
    83                         if (count(array_intersect($pages_explicites, array_column($import['pages_explicites'], 'page'))) > 0) {
     80                $informations = 'page';
     81                $filtres = array('est_virtuelle' => 'non');
     82                if ($pages_explicites = page_noizetier_repertorier($informations, $filtres)) {
     83                        if (count(array_intersect_key($pages_explicites, $import['pages_explicites'])) > 0) {
    8484                                $explication_pages_explicites = _T('noizetier:import_pages_explicites_explication');
    8585                        } else {
     
    101101                if ($import['contenu']['compositions_virtuelles']) {
    102102                        $data_compositions['ajouter'] = _T('noizetier:import_compositions_virtuelles_ajouter');
    103                         $where = array('est_virtuelle=' . sql_quote('oui'));
    104                         if (!sql_countsel('spip_noizetier_pages', $where)) {
     103                        $filtres = array('est_virtuelle' => 'oui');
     104                        if (count(page_noizetier_repertorier('page', $filtres)) == 0) {
    105105                                $explication_compositions = _T('noizetier:import_compositions_virtuelles_avertissement1');
    106106                        } else {
     
    116116                $data_noisettes = array();
    117117                if ($import['contenu']['noisettes']) {
    118                         $pages_base = sql_allfetsel('page','spip_noizetier_pages');
    119                         $pages_base = array_map('reset', $pages_base);
     118                        $pages_base = page_noizetier_repertorier('page');
    120119
    121120                        include_spip('base/objets');
     
    266265
    267266        // Exportation de la tables spip_noizetier_pages qui contient les pages explicites et compositions virtuelles.
    268         $from ='spip_noizetier_pages';
    269 
     267        include_spip('inc/noizetier_page');
    270268        // -- pour les pages explicites il faut sauvegarder les blocs exclus qui peuvent être modifiés après chargement,
    271269        //    les autres champs n'ont pas d'intérêt à être sauvegardés car ils proviennent du fichier XML/YAML.
    272         $select = array('page', 'blocs_exclus');
    273         $where = array('est_virtuelle=' . sql_quote('non'));
    274         $export['pages_explicites'] = sql_allfetsel($select, $from, $where);
     270        $informations = 'blocs_exclus';
     271        $filtres = array('est_virtuelle' => 'non');
     272        $export['pages_explicites'] = page_noizetier_repertorier($informations, $filtres);
    275273        $export['contenu']['pages_explicites'] = $export['pages_explicites'] ? 'on' : '';
    276274
    277275        // -- pour les compositions virtuelles il faut tout sauvegarder (sauf le timestamp 'maj') car elles sont créées
    278276        //    de zéro.
    279         $trouver_table = charger_fonction('trouver_table', 'base');
    280         $table = $trouver_table($from);
    281         $select = array_diff(array_keys($table['field']), array('maj'));
    282         $where = array('est_virtuelle=' . sql_quote('oui'));
    283         $export['compositions_virtuelles'] = sql_allfetsel($select, $from, $where);
     277        $informations = array();
     278        $filtres = array('est_virtuelle' => 'oui');
     279        $export['compositions_virtuelles'] = page_noizetier_repertorier($informations, $filtres);
    284280        $export['contenu']['compositions_virtuelles'] = $export['compositions_virtuelles'] ? 'on' : '';
    285281
     
    342338
    343339        // Les pages explicites
     340        include_spip('inc/noizetier_page');
    344341        if ($importation['pages_explicites']) {
    345342                // On fusionne les blocs exclus de la configuration avec ceux des pages explicites de la base.
    346343                // -- On récupère toutes les pages de la base avec leur blocs exclus
    347                 $select = array('page', 'blocs_exclus');
    348                 $where = array('est_virtuelle=' . sql_quote('non'));
    349                 $pages_explicites_base = sql_allfetsel($select,'spip_noizetier_pages', $where);
    350                 // -- on structure les blocs exclus du fichier d'import sous la forme [page] = blocs exclus
    351                 $blocs_exclus_import = array_column($contenu_import['pages_explicites'], 'blocs_exclus', 'page');
     344                $informations = 'blocs_exclus';
     345                $filtres = array('est_virtuelle' => 'non');
     346                $pages_explicites_base = page_noizetier_repertorier($informations, $filtres);
    352347                // -- on compare les pages de la base et celles de l'import et on met à jour systématiquement
    353348                //    les pages communes (même identifiant).
    354                 foreach ($pages_explicites_base as $_page_explicite) {
    355                         if (isset($blocs_exclus_import[$_page_explicite['page']])) {
     349                foreach ($pages_explicites_base as $_page => $_blocs_exclus) {
     350                        if (isset($contenu_import['pages_explicites'][$_page])) {
    356351                                // Remplacement des blocs exclus de la page actuelle par ceux du fichier d'import. On filtre
    357352                                // les blocs éventuellement non autorisés sur le site.
    358353                                $blocs_exclus = array_intersect(
    359                                         unserialize($blocs_exclus_import[$_page_explicite['page']]),
     354                                        unserialize($contenu_import['pages_explicites'][$_page]),
    360355                                        $blocs_defaut
    361356                                );
    362357                                $modification = array('blocs_exclus' => serialize($blocs_exclus));
    363                                 $where = array('page=' . sql_quote($_page_explicite['page']));
     358                                $where = array('page=' . sql_quote($_page));
    364359                                sql_updateq('spip_noizetier_pages', $modification, $where);
    365360                        }
     
    379374                if ($retour) {
    380375                        // On collecte les compositions virtuelles actuellement en base.
    381                         $select = array('page');
    382                         $where = array('est_virtuelle=' . sql_quote('oui'));
    383                         $compositions_base = sql_allfetsel($select, 'spip_noizetier_pages', $where);
    384                         if ($compositions_base) {
    385                                 $compositions_base = array_map('reset', $compositions_base);
    386                         }
     376                        $informations = 'page';
     377                        $filtres = array('est_virtuelle' => 'oui');
     378                        $compositions_base = page_noizetier_repertorier($informations, $filtres);
    387379
    388380                        // Suivant le mode d'importation et l'existence ou pas de la composition en base on ajoute ou
    389381                        // on met à jour la composition virtuelle ou on ne fait rien.
    390                         foreach ($contenu_import['compositions_virtuelles'] as $_composition) {
     382                        foreach ($contenu_import['compositions_virtuelles'] as $_page => $_description) {
    391383                                // On filtre les blocs exclus avec la liste des blocs par défaut du site.
    392                                 $composition = $_composition;
    393                                 $composition['blocs_exclus'] = array_intersect($composition['blocs_exclus'], $blocs_defaut);
     384                                $description = $_description;
     385                                $description['blocs_exclus'] = serialize(
     386                                        array_intersect(
     387                                                unserialize($_description['blocs_exclus']),
     388                                                $blocs_defaut
     389                                        )
     390                                );
    394391
    395392                                // On détermine l'opération à faire ou pas.
    396                                 if (in_array($composition['page'], $compositions_base)) {
     393                                if (in_array($_page, $compositions_base)) {
    397394                                        if ($importation['compositions_virtuelles'] == 'fusionner') {
    398                                                 $where = 'page=' . sql_quote($composition['page']);
    399                                                 unset($composition['page']);
    400                                                 sql_updateq('spip_noizetier_pages', $composition, $where);
     395                                                $where = 'page=' . sql_quote($_page);
     396                                                unset($description['page']);
     397                                                sql_updateq('spip_noizetier_pages', $description, $where);
    401398                                        }
    402399                                } else {
    403                                         sql_insertq('spip_noizetier_pages', $composition);
     400                                        sql_insertq('spip_noizetier_pages', $description);
    404401                                }
    405402                        }
     
    419416                if ($retour) {
    420417                        // Liste des pages génériques disponibles dans la base.
    421                         $pages_base = sql_allfetsel('page','spip_noizetier_pages');
    422                         $pages_base = array_map('reset', $pages_base);
     418                        $informations = 'page';
     419                        $filtres = array();
     420                        $pages_base = page_noizetier_repertorier($informations, $filtres);
    423421
    424422                        // Nombre de noisettes par conteneur. On récupère l'ensemble des conteneurs y compris les noisettes
  • _plugins_/noizetier/trunk/paquet.xml

    r113605 r113623  
    22        prefix="noizetier"
    33        categorie="maintenance"
    4         version="3.0.78"
     4        version="3.0.79"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.