Changeset 125251 in spip-zone


Ignore:
Timestamp:
Jun 19, 2020, 1:47:14 PM (7 months ago)
Author:
Eric Lupinacci
Message:

Prise en compte d'une table de liens pour le calcul du parent.
Mise au point des fonctions de localisation du parent (aps les enfants)

Location:
_plugins_/declarerparent/branches/table_lien
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/declarerparent/branches/table_lien

    • Property subgit:lock:cc891f6bcffef0523ba12c459d087f99dce8068b deleted
    • Property subgit:lock:f6706d8eed94273a98be8f6b852d95a63e856d55 set to 2020-06-19T15:47:41.793
  • _plugins_/declarerparent/branches/table_lien/base/objets_parents.php

    r125250 r125251  
    1212 * comme :
    1313 * ```
    14  *      $tables['spip_auteurs']['parent']  = array(
    15  *              'type' => 'organisation',
    16  *              'champ' => 'id_organisation',
    17  *              'table_lien' => 'spip_organisations_liens',
    18  *              'role_lien' => 'parent'
    19  *      );
     14 * $tables['spip_auteurs']['parent']  = array(
     15 *     'type' => 'organisation',
     16 *     'champ' => 'id_organisation',
     17 *     'parent_lien' => array(
     18 *         'table' => 'spip_organisations_liens',
     19 *         'source' => array('champ' => 'id_objet', 'champ_type' => 'objet'),
     20 *         'condition' => 'role="parent"',
     21 *     )
     22 * );
    2023 * ```
    2124 *
     
    3740        if ($parent_methodes = type_objet_info_parent($objet)) {
    3841
     42                // On identifie les informations sur l'objet source dont on cherche le parent.
    3943                include_spip('base/abstract_sql');
    4044                $table_objet = table_objet_sql($objet);
     
    4347
    4448                // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête
    45                 foreach ($parent_methodes as $parent_methode) {
     49                foreach ($parent_methodes as $_parent_methode) {
    4650                        // Champ identifiant le parent (id et éventuellement le type)
     51                        // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente
     52                        //    de celle de l'objet source
    4753                        $select = array();
    48                         if (isset($parent_methode['champ'])) {
    49                                 $select[] = $parent_methode['champ'];
    50                         }
    51                         if (isset($parent_methode['champ_type'])) {
    52                                 $select[] = $parent_methode['champ_type'];
    53                         }
    54 
    55                         // Détermination de la table et de la condition.
    56                         // - Si le parent est connu via une table de lien alors il faut adapter la table et le where
    57                         $role = '';
    58                         if (isset($parent_methode['table_lien'])) {
    59                                 $table = $parent_methode['table_lien'];
    60                                 $role = isset($parent_methode['role_lien']) ? $parent_methode['role_lien'] : 'parent';
    61                                 $where = array(
    62                                         'objet = ' . sql_quote($objet),
    63                                         "id_objet = $id_objet",
    64                                         'role = ' . sql_quote($role)
    65                                 );
    66                         } else {
     54                        if (isset($_parent_methode['champ'])) {
     55                                $select[] = $_parent_methode['champ'];
     56                        }
     57                        if (isset($_parent_methode['champ_type'])) {
     58                                $select[] = $_parent_methode['champ_type'];
     59                        }
     60
     61                        // Détermination de la table du parent et des conditions sur l'objet source et le parent.
     62                        $condition_objet_invalide = false;
     63                        $where = array();
     64                        if (!isset($_parent_methode['parent_lien'])) {
     65                                // Le parent est stocké dans la même table que l'objet source :
     66                                // -- toutes les conditions s'appliquent à la table source.
    6767                                $table = $table_objet;
    6868                                $where = array("$cle_objet = $id_objet");
    69                         }
    70 
    71                         // - Condition supplémentaire sur la détection du parent
    72                         if (isset($parent_methode['condition'])) {
    73                                 $where[] = $parent_methode['condition'];
    74                         }
    75 
    76                         // On lance la requête
    77                         if ($ligne = sql_fetsel($select, $table, $where)) {
    78 
     69                                // -- Condition supplémentaire sur la détection du parent
     70                                if (isset($_parent_methode['condition'])) {
     71                                        $where[] = $_parent_methode['condition'];
     72                                }
     73                        } else {
     74                                // Le parent est stocké dans une table différente de l'objet source.
     75                                // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée
     76                                //    Si non, on peut arrêter le traitement.
     77                                if (isset($_parent_methode['condition'])) {
     78                                        $where = array(
     79                                                "$cle_objet = $id_objet",
     80                                                $_parent_methode['condition']
     81                                        );
     82                                        if (!sql_countsel($table_objet, $where)) {
     83                                                $condition_objet_invalide = true;
     84                                        }
     85                                }
     86
     87                                // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire
     88                                // la requête sur la table qui accueille le parent.
     89                                if (!$condition_objet_invalide) {
     90                                        $table = $_parent_methode['parent_lien']['table'];
     91                                        // -- On construit les conditions en fonction de l'identification de l'objet source
     92                                        $where = array();
     93                                        if (isset($_parent_methode['parent_lien']['source']['champ'])) {
     94                                                $where[] = "{$_parent_methode['parent_lien']['source']['champ']} = $id_objet";
     95                                        }
     96                                        if (isset($_parent_methode['parent_lien']['source']['champ_type'])) {
     97                                                $where[] = "{$_parent_methode['parent_lien']['source']['champ_type']} = " . sql_quote($objet);
     98                                        }
     99                                        // -- Condition supplémentaire sur la détection du parent
     100                                        if (isset($_parent_methode['parent_lien']['condition'])) {
     101                                                $where[] = $_parent_methode['parent_lien']['condition'];
     102                                        }
     103                                }
     104                        }
     105
     106                        // On lance la requête de récupération du parent
     107                        if (
     108                                !$condition_objet_invalide
     109                                and $where
     110                                and ($ligne = sql_fetsel($select, $table, $where))
     111                        ) {
    79112                                // Si le type est fixe
    80                                 if (isset($parent_methode['type'])) {
     113                                if (isset($_parent_methode['type'])) {
    81114                                        $parent = array(
    82                                                 'objet'         => $parent_methode['type'],
    83                                                 'id_objet'      => intval($ligne[$parent_methode['champ']]),
    84                                                 'champ'         => $parent_methode['champ'],
     115                                                'objet'         => $_parent_methode['type'],
     116                                                'id_objet'      => intval($ligne[$_parent_methode['champ']]),
     117                                                'champ'         => $_parent_methode['champ'],
    85118                                        );
    86119                                }
    87                                 elseif (isset($parent_methode['champ_type'])) {
     120                                elseif (isset($_parent_methode['champ_type'])) {
    88121                                        $parent = array(
    89                                                 'objet'          => $ligne[$parent_methode['champ_type']],
    90                                                 'id_objet'       => intval($ligne[$parent_methode['champ']]),
    91                                                 'champ'          => $parent_methode['champ'],
    92                                                 'champ_type' => $parent_methode['champ_type'],
     122                                                'objet'          => $ligne[$_parent_methode['champ_type']],
     123                                                'id_objet'       => intval($ligne[$_parent_methode['champ']]),
     124                                                'champ'          => $_parent_methode['champ'],
     125                                                'champ_type' => $_parent_methode['champ_type'],
    93126                                        );
    94127                                }
    95 
    96                                 if ($parent) {
    97                                         // Si on passe par une table de liens
    98                                         if (isset($parent_methode['table_lien'])) {
    99                                                 $parent['table_lien'] = $parent_methode['table_lien'];
    100                                                 $parent['role_lien'] = $role;
    101                                         }
    102                                         break;
    103                                 }
     128                                break;
    104129                        }
    105130                }
     
    204229                        // S'il y a une description explicite de parent, c'est prioritaire
    205230                        if (isset($infos['parent']) and is_array($infos['parent'])) {
    206                                 if (count($infos['parent']) === count($infos['parent'], COUNT_RECURSIVE)) {
     231                                if (!isset($infos['parent'][0])) {
    207232                                        $parents[$objet] = array($infos['parent']);
    208233                                } else {
     
    253278                        if ($parent_methodes = type_objet_info_parent($objet_enfant)) {
    254279                                // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé
    255                                 foreach ($parent_methodes as $parent_methode) {
     280                                foreach ($parent_methodes as $_parent_methode) {
    256281                                        // Si la méthode qu'on teste n'exclut pas le parent demandé
    257                                         if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {
     282                                        if (!isset($_parent_methode['exclus']) or !in_array($objet, $_parent_methode['exclus'])) {
    258283                                                // Si le type du parent est fixe et directement l'objet demandé
    259                                                 if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {
    260                                                         $enfants[$objet][$objet_enfant] = $parent_methode;
     284                                                if (isset($_parent_methode['type']) and isset($_parent_methode['champ']) and $_parent_methode['type'] == $objet) {
     285                                                        $enfants[$objet][$objet_enfant] = $_parent_methode;
    261286                                                }
    262287                                                // Si le type est variable, alors l'objet demandé peut forcément être parent
    263                                                 elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) {
    264                                                         $enfants[$objet][$objet_enfant] = $parent_methode;
     288                                                elseif (isset($_parent_methode['champ_type']) and isset($_parent_methode['champ'])) {
     289                                                        $enfants[$objet][$objet_enfant] = $_parent_methode;
    265290                                                }
    266291                                        }
Note: See TracChangeset for help on using the changeset viewer.