Changeset 125435 in spip-zone
- Timestamp:
- Oct 6, 2020, 8:45:44 AM (6 months ago)
- Location:
- _plugins_/declarerparent/branches/issue_3
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/declarerparent/branches/issue_3/base/objets_parents.php
r125160 r125435 9 9 10 10 /** 11 * Cherche le contenu parent d'un contenu précis 12 * 11 * Cherche le contenu parent d'un contenu précis. Cette version permet de gérer un parent trouvé dans une table de lien 12 * comme : 13 * ``` 14 * $tables['spip_auteurs']['parent'] = array( 15 * 'type' => 'organisation', 16 * 'champ' => 'id_organisation', 17 * 'table' => 'spip_organisations_liens', 18 * 'table_condition' => 'role="parent"', 19 * 'source_champ' => 'id_objet', 20 * 'champ_type' => 'objet' 21 * ); 22 * ``` 23 * 24 * 13 25 * @api 14 26 * @param $objet … … 18 30 * @return array|false 19 31 * Retourne un tableau décrivant le parent trouvé, ou false sinon 20 * 32 * 21 33 */ 22 34 function objet_trouver_parent($objet, $id_objet) { 23 35 $parent = false; 24 36 25 37 // Si on trouve une ou des méthodes de parent 26 38 if ($parent_methodes = type_objet_info_parent($objet)) { 27 39 40 // On identifie les informations sur l'objet source dont on cherche le parent. 28 41 include_spip('base/abstract_sql'); 29 $table = table_objet_sql($objet);42 $table_objet = table_objet_sql($objet); 30 43 $cle_objet = id_table_objet($objet); 31 44 $id_objet = intval($id_objet); 32 45 33 34 46 // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête 35 foreach ($parent_methodes as $parent_methode) { 36 $where = array("$cle_objet = $id_objet"); 37 38 // Détermination d'une condition sur la détection du parent 39 if (isset($parent_methode['condition'])) { 40 $where[] = $parent_methode['condition']; 41 } 42 47 foreach ($parent_methodes as $_parent_methode) { 48 // Champ identifiant le parent (id et éventuellement le type) 49 // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente 50 // de celle de l'objet source 43 51 $select = array(); 44 if (isset($parent_methode['champ'])) { 45 $select[] = $parent_methode['champ']; 46 } 47 if (isset($parent_methode['champ_type'])) { 48 $select[] = $parent_methode['champ_type']; 49 } 50 51 // On lance la requête 52 if ($ligne = sql_fetsel($select, $table, $where)) { 53 52 if (isset($_parent_methode['champ'])) { 53 $select[] = $_parent_methode['champ']; 54 } 55 if (isset($_parent_methode['champ_type'])) { 56 $select[] = $_parent_methode['champ_type']; 57 } 58 59 // Détermination de la table du parent et des conditions sur l'objet source et le parent. 60 $condition_objet_invalide = false; 61 $where = array(); 62 if (!isset($_parent_methode['table'])) { 63 // Le parent est stocké dans la même table que l'objet source : 64 // -- toutes les conditions s'appliquent à la table source. 65 $table = $table_objet; 66 $where = array("$cle_objet = $id_objet"); 67 // -- Condition supplémentaire sur la détection du parent 68 if (isset($_parent_methode['condition'])) { 69 $where[] = $_parent_methode['condition']; 70 } 71 } else { 72 // Le parent est stocké dans une table différente de l'objet source. 73 // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée 74 // Si non, on peut arrêter le traitement. 75 if (isset($_parent_methode['condition'])) { 76 $where = array( 77 "$cle_objet = $id_objet", 78 $_parent_methode['condition'] 79 ); 80 if (!sql_countsel($table_objet, $where)) { 81 $condition_objet_invalide = true; 82 } 83 } 84 85 // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire 86 // la requête sur la table qui accueille le parent. 87 if (!$condition_objet_invalide) { 88 $table = $_parent_methode['table']; 89 // On construit les conditions en fonction de l'identification de l'objet source 90 $where = array(); 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); 98 } 99 // -- Condition supplémentaire sur la détection du parent 100 if (isset($_parent_methode['table_condition'])) { 101 $where[] = $_parent_methode['table_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 ) { 54 112 // Si le type est fixe 55 if (isset($ parent_methode['type'])) {113 if (isset($_parent_methode['type'])) { 56 114 $parent = array( 57 'objet' => $ parent_methode['type'],58 'id_objet' => intval($ligne[$ parent_methode['champ']]),59 'champ' => $ parent_methode['champ'],115 'objet' => $_parent_methode['type'], 116 'id_objet' => intval($ligne[$_parent_methode['champ']]), 117 'champ' => $_parent_methode['champ'], 60 118 ); 61 119 } 62 elseif (isset($ parent_methode['champ_type'])) {120 elseif (isset($_parent_methode['champ_type'])) { 63 121 $parent = array( 64 'objet' => $ligne[$ parent_methode['champ_type']],65 'id_objet' => intval($ligne[$ parent_methode['champ']]),66 'champ' => $ parent_methode['champ'],67 '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'], 68 126 ); 69 127 } 70 71 if ($parent) { 72 break; 73 } 128 break; 74 129 } 75 130 } 76 131 } 77 132 78 133 // On passe par un pipeline avant de retourner 79 134 $parent = pipeline( … … 87 142 ) 88 143 ); 89 144 90 145 return $parent; 91 146 } … … 112 167 113 168 // On parcourt tous les types d'enfants trouvés 114 foreach ($enfants_methodes as $objet_enfant => $methode) { 115 $table_enfant = table_objet_sql($objet_enfant); 116 $cle_objet_enfant = id_table_objet($objet_enfant); 117 169 foreach ($enfants_methodes as $objet_enfant => $_methode_parent) { 170 // On construit les conditions d'identification du parent 118 171 $where = array(); 119 // L'identifiant du parent 120 if (isset($methode['champ'])) { 121 $where[] = $methode['champ'] . ' = ' . $id_objet; 122 } 123 // Si le parent est variable 124 if (isset($methode['champ_type'])) { 125 $where[] = $methode['champ_type'] . ' = ' . sql_quote($objet); 126 } 127 // S'il y a une condition supplémentaire 128 if (isset($methode['condition'])) { 129 $where[] = $methode['condition']; 130 } 131 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 132 204 // On lance la requête 133 205 if ($ids = sql_allfetsel($cle_objet_enfant, $table_enfant, $where)) { 134 206 $ids = array_map('reset', $ids); 135 $enfants[$objet_enfant] = $ids; 207 $enfants[$objet_enfant] = isset($enfants[$objet_enfant]) 208 ? array_merge($enfants[$objet_enfant], $ids) 209 : $ids; 136 210 } 137 211 } … … 172 246 // Si on trouve bien la description de cet objet 173 247 if ($infos = lister_tables_objets_sql($table)) { 174 // S'il y a une description explicite de parent, c'est prioritaire175 248 if (isset($infos['parent']) and is_array($infos['parent'])) { 176 if (count($infos['parent']) === count($infos['parent'], COUNT_RECURSIVE)) { 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 252 if (!isset($infos['parent'][0])) { 177 253 $parents[$objet] = array($infos['parent']); 178 254 } else { 179 255 $parents[$objet] = $infos['parent']; 180 256 } 181 } 182 // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique 183 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 184 259 $parents[$objet] = array(array('type' => 'rubrique', 'champ' => 'id_rubrique')); 185 } 186 // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même 187 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 188 262 $parents[$objet] = array(array('type' => $objet, 'champ' => 'id_parent')); 189 263 } 190 //~ // 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 objet191 //~ // comme c'est le cas pour les forums de premier niveau192 //~ elseif (isset($infos['field']['objet']) and isset($infos['field']['id_objet'])) {193 //~ $parents[$objet] = array(array('champ_type' => 'objet', 'champ' => 'id_objet'));194 //~ }195 264 } 196 265 } … … 223 292 if ($parent_methodes = type_objet_info_parent($objet_enfant)) { 224 293 // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé 225 foreach ($parent_methodes as $ parent_methode) {294 foreach ($parent_methodes as $_parent_methode) { 226 295 // Si la méthode qu'on teste n'exclut pas le parent demandé 227 if (!isset($ parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) {296 if (!isset($_parent_methode['exclus']) or !in_array($objet, $_parent_methode['exclus'])) { 228 297 // Si le type du parent est fixe et directement l'objet demandé 229 if (isset($ parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) {230 $enfants[$objet][$objet_enfant] = $ parent_methode;298 if (isset($_parent_methode['type']) and isset($_parent_methode['champ']) and $_parent_methode['type'] == $objet) { 299 $enfants[$objet][$objet_enfant] = $_parent_methode; 231 300 } 232 301 // Si le type est variable, alors l'objet demandé peut forcément être parent 233 elseif (isset($ parent_methode['champ_type']) and isset($parent_methode['champ'])) {234 $enfants[$objet][$objet_enfant] = $ parent_methode;302 elseif (isset($_parent_methode['champ_type']) and isset($_parent_methode['champ'])) { 303 $enfants[$objet][$objet_enfant] = $_parent_methode; 235 304 } 236 305 }
Note: See TracChangeset
for help on using the changeset viewer.