Changeset 125392 in spip-zone


Ignore:
Timestamp:
Aug 9, 2020, 12:32:29 PM (8 months ago)
Author:
Eric Lupinacci
Message:

Mise en place de la dernière proposition de la déclaration du parent tout à plat y compris pour le cas de la table de lien

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

Legend:

Unmodified
Added
Removed
  • _plugins_/declarerparent/branches/table_lien

    • Property subgit:lock:c75d45078602e9e10e89419ebad9d4b3456e188e deleted
    • Property subgit:lock:7348de1f29fabc7071636a1ba64a6d1466b9c987 set to 2020-08-09T14:38:13.384
  • _plugins_/declarerparent/branches/table_lien/base/objets_parents.php

    r125341 r125392  
    1515 *     'type' => 'organisation',
    1616 *     '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  *     )
     17 *     'table' => 'spip_organisations_liens',
     18 *     'table_condition' => 'role="parent"',
     19 *     'source_champ' => 'id_objet',
     20 *     'champ_type' => 'objet'
    2221 * );
    2322 * ```
    2423 *
    25  * La table de liens est forcément de structure (id_organisation, objet, id_objet, role).
    2624 *
    2725 * @api
     
    6260                        $condition_objet_invalide = false;
    6361                        $where = array();
    64                         if (!isset($_parent_methode['parent_lien'])) {
     62                        if (!isset($_parent_methode['table'])) {
    6563                                // Le parent est stocké dans la même table que l'objet source :
    6664                                // -- toutes les conditions s'appliquent à la table source.
     
    8886                                // la requête sur la table qui accueille le parent.
    8987                                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
     88                                        $table = $_parent_methode['table'];
     89                                        // On construit les conditions en fonction de l'identification de l'objet source
    9290                                        $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);
     91                                        // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est
     92                                        //    le même que celui de l'objet source.
     93                                        $where[] = isset($_parent_methode['source_champ'])
     94                                                ? "{$_parent_methode['source_champ']} = $id_objet"
     95                                                : "${cle_objet} = $id_objet";
     96                                        if (isset($_parent_methode['source_champ_type'])) {
     97                                                $where[] = "{$_parent_methode['source_champ_type']} = " . sql_quote($objet);
    9898                                        }
    9999                                        // -- Condition supplémentaire sur la détection du parent
    100                                         if (isset($_parent_methode['parent_lien']['condition'])) {
    101                                                 $where[] = $_parent_methode['parent_lien']['condition'];
     100                                        if (isset($_parent_methode['table_condition'])) {
     101                                                $where[] = $_parent_methode['table_condition'];
    102102                                        }
    103103                                }
     
    167167               
    168168                // On parcourt tous les types d'enfants trouvés
    169                 foreach ($enfants_methodes as $objet_enfant => $_methodes_parent) {
    170                         foreach ($_methodes_parent as $_methode_parent) {
    171                                 // On construit les conditions d'identification du parent
    172                                 $where = array();
    173                                 // -- L'identifiant du parent
    174                                 if (isset($_methode_parent['champ'])) {
    175                                         $where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
    176                                 }
    177                                 // -- Si le parent est variable
    178                                 if (isset($_methode_parent['champ_type'])) {
    179                                         $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
    180                                 }
    181 
    182                                 // On détermine la table, le champ id des enfants et on complète éventuellement les conditions
    183                                 if (!isset($_methode_parent['parent_lien'])) {
    184                                         // Les enfants sont stockés dans la même table que l'objet parent :
    185                                         $table_enfant = table_objet_sql($objet_enfant);
    186                                         $cle_objet_enfant = id_table_objet($objet_enfant);
    187 
    188                                         // S'il y a une condition supplémentaire
    189                                         if (isset($_methode_parent['condition'])) {
    190                                                 $where[] = $_methode_parent['condition'];
    191                                         }
    192                                 } else {
    193                                         // Les enfants sont stockés dans une table différente de l'objet parent.
    194                                         $table_enfant = $_methode_parent['parent_lien']['table'];
    195                                         $cle_objet_enfant = $_methode_parent['parent_lien']['source']['champ'];
    196 
    197                                         // S'il y a une condition supplémentaire
    198                                         if (isset($_methode_parent['parent_lien']['condition'])) {
    199                                                 $where[] = $_methode_parent['parent_lien']['condition'];
    200                                         }
    201                                 }
    202 
    203                                 // On lance la requête
    204                                 if ($ids = sql_allfetsel($cle_objet_enfant, $table_enfant, $where)) {
    205                                         $ids = array_map('reset', $ids);
    206                                         $enfants[$objet_enfant] = isset($enfants[$objet_enfant])
    207                                                 ? array_merge($enfants[$objet_enfant], $ids)
    208                                                 : $ids;
    209                                 }
     169                foreach ($enfants_methodes as $objet_enfant => $_methode_parent) {
     170                        // On construit les conditions d'identification du parent
     171                        $where = array();
     172                        // -- L'identifiant du parent
     173                        if (isset($_methode_parent['champ'])) {
     174                                $where[] = $_methode_parent['champ'] . ' = ' . $id_objet;
     175                        }
     176                        // -- Si le parent est variable
     177                        if (isset($_methode_parent['champ_type'])) {
     178                                $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet);
     179                        }
     180
     181                        // On détermine la table, le champ id des enfants et on complète éventuellement les conditions
     182                        if (!isset($_methode_parent['table'])) {
     183                                // Les enfants sont stockés dans la même table que l'objet parent :
     184                                $table_enfant = table_objet_sql($objet_enfant);
     185                                $cle_objet_enfant = id_table_objet($objet_enfant);
     186
     187                                // S'il y a une condition supplémentaire
     188                                if (isset($_methode_parent['condition'])) {
     189                                        $where[] = $_methode_parent['condition'];
     190                                }
     191                        } else {
     192                                // Les enfants sont stockés dans une table différente de l'objet parent.
     193                                $table_enfant = $_methode_parent['table'];
     194                                $cle_objet_enfant = isset($_methode_parent['source_champ'])
     195                                        ? $_methode_parent['source_champ']
     196                                        : id_table_objet($objet_enfant);
     197
     198                                // S'il y a une condition supplémentaire
     199                                if (isset($_methode_parent['table_condition'])) {
     200                                        $where[] = $_methode_parent['table_condition'];
     201                                }
     202                        }
     203
     204                        // On lance la requête
     205                        if ($ids = sql_allfetsel($cle_objet_enfant, $table_enfant, $where)) {
     206                                $ids = array_map('reset', $ids);
     207                                $enfants[$objet_enfant] = isset($enfants[$objet_enfant])
     208                                        ? array_merge($enfants[$objet_enfant], $ids)
     209                                        : $ids;
    210210                        }
    211211                }
     
    246246                // Si on trouve bien la description de cet objet
    247247                if ($infos = lister_tables_objets_sql($table)) {
    248                         // S'il y a une description explicite de parent, c'est prioritaire
    249248                        if (isset($infos['parent']) and is_array($infos['parent'])) {
     249                                // S'il y a une description explicite de parent, c'est prioritaire
     250                                // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau
     251                                //    de description
    250252                                if (!isset($infos['parent'][0])) {
    251253                                        $parents[$objet] = array($infos['parent']);
     
    253255                                        $parents[$objet] = $infos['parent'];
    254256                                }
    255                         }
    256                         // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
    257                         elseif (isset($infos['field']['id_rubrique'])) {
     257                        } elseif (isset($infos['field']['id_rubrique'])) {
     258                                // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique
    258259                                $parents[$objet] = array(array('type' => 'rubrique', 'champ' => 'id_rubrique'));
    259                         }
    260                         // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
    261                         elseif (isset($infos['field']['id_parent'])) {
     260                        } elseif (isset($infos['field']['id_parent'])) {
     261                                // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même
    262262                                $parents[$objet] = array(array('type' => $objet, 'champ' => 'id_parent'));
    263263                        }
    264                         //~ // Sinon on cherche s'il y a objet et id_objet dans la table, ce qui signifie que le parent peut-être n'importe quel objet
    265                         //~ // comme c'est le cas pour les forums de premier niveau
    266                         //~ elseif (isset($infos['field']['objet']) and isset($infos['field']['id_objet'])) {
    267                                 //~ $parents[$objet] = array(array('champ_type' => 'objet', 'champ' => 'id_objet'));
    268                         //~ }
    269264                }
    270265        }
Note: See TracChangeset for help on using the changeset viewer.