source: spip-zone/_plugins_/identifiants/trunk/identifiants_fonctions.php @ 99728

Last change on this file since 99728 was 99728, checked in by tcharlss@…, 3 years ago

v1.1.9 : Autoriser à réattribuer l'identifiant d'un objet qui n'existe plus (guytarr).
On se branche sur le pipeline optimiser_base_disparus pour supprimer les identifiants des objets disparus.
Un tout petit peu de PSR au passage.

File size: 5.8 KB
Line 
1<?php
2/**
3 * fonctions utiles au plugin Identifiants
4 *
5 * @plugin     Identifiants
6 * @copyright  2016
7 * @author     Tcharlss
8 * @licence    GNU/GPL
9 * @package    SPIP\Identifiants\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Retourne l'identifiant d'un objet
18 *
19 * On cherche dans la table de l'objet si une colonne `identifiant` existe,
20 * sinon on va voir dans la table `spip_identifiants`.
21 *
22 * @param string $objet
23 *     Le type de l'objet
24 * @param int $id_objet
25 *     L'identifiant numérique de l'objet
26 * @return string | null
27 */
28function identifiant_objet($objet, $id_objet) {
29
30        include_spip('base/connect_sql');
31        $identifiant = null;
32
33        if ($objet
34                and $id_objet  = intval($id_objet)
35                and $objet     = objet_type($objet)
36                and $table_sql = table_objet_sql($objet)
37                and $cle_objet = id_table_objet($objet)
38        ) {
39                // soit c'est un champ normalisé de la table de l'objet
40                $trouver_table = charger_fonction('trouver_table', 'base');
41                if ($desc = $trouver_table($table_sql)
42                        and isset($desc['field']['identifiant'])
43                ) {
44                        $identifiant = sql_getfetsel('identifiant', $table_sql, $cle_objet.' = '.intval($id_objet));
45                // sinon on cherche dans la table spip_identifiants
46                } else {
47                        $identifiant = sql_getfetsel(
48                                'identifiant',
49                                'spip_identifiants',
50                                'objet = '.sql_quote($objet).' AND id_objet = '.intval($id_objet)
51                        );
52                }
53        }
54
55        return $identifiant;
56}
57
58
59/**
60 * Manipuler l'identifiant d'un objet : créer, mettre à jour, ou supprimer.
61 *
62 * Pour supprimer l'identifiant actuel, appeler la fonction sans 3ème paramètre (ou lui donner valeur vide).
63 *
64 * @param string $objet
65 *     Type d'objet
66 * @param int $id_objet
67 *     Identifiant numérique de l'objet
68 * @return bool | string
69 *     Retour des fonctions sql_insertq(), sql_updateq() ou sql_delete().
70 *     False en cas de problème.
71 */
72function maj_identifiant_objet($objet = '', $id_objet = '', $new_identifiant = '') {
73
74        // valeur retournée par défaut
75        $resultat = false;
76
77        if (
78                $objet
79                and $id_objet = $where_id_objet = intval($id_objet)
80        ) {
81
82                // On récupère l'ancien identifiant éventuel
83                $old_identifiant = sql_getfetsel(
84                        'identifiant',
85                        'spip_identifiants',
86                        array(
87                                'objet = ' . sql_quote($objet),
88                                'id_objet = ' . intval($id_objet),
89                        )
90                );
91
92                // Regardons si le nouvel identifiant est déjà utilisé pour un même type d'objet
93                // Si l'objet qui a déjà l'identifiant n'existe plus, on l'attribue au nouvel objet.
94                $deja_utilise = false;
95                $identifiant_doublon = sql_fetsel(
96                        'objet, id_objet, identifiant',
97                        'spip_identifiants',
98                        array(
99                                'objet = ' . sql_quote($objet),
100                                'id_objet != ' . intval($id_objet),
101                                'identifiant = ' . sql_quote($new_identifiant),
102                                'identifiant != \'\'',
103                        )
104                );
105                if ($identifiant_doublon) {
106                        $table_objet_sql_doublon = table_objet_sql($identifiant_doublon['objet']);
107                        $id_table_objet_doublon  = id_table_objet($identifiant_doublon['objet']);
108                        if (sql_countsel($table_objet_sql_doublon, $id_table_objet_doublon.' = '.$identifiant_doublon['id_objet'])) {
109                                $deja_utilise = true;
110                        } else {
111                                // réattribuer l'identifiant si l'objet en doublon n'existe pas
112                                $where_id_objet  = $identifiant_doublon['id_objet'];
113                                $old_identifiant = $identifiant_doublon['identifiant'];
114                                $deja_utilise    = false;
115                        }
116                }
117
118                // On définit l'action à effectuer : créer, mettre à jour, ou supprimer
119                $action =
120                        (!$old_identifiant and $new_identifiant)  ? 'creer' :
121                        (($old_identifiant and $new_identifiant)  ? 'maj' :
122                        (($old_identifiant and !$new_identifiant) ? 'supprimer' :
123                        ''));
124
125                switch ($action) {
126
127                        case 'creer':
128                                if (
129                                        !$deja_utilise) {
130                                        $resultat = sql_insertq(
131                                                'spip_identifiants',
132                                                array(
133                                                        'objet'       => $objet,
134                                                        'id_objet'    => $id_objet,
135                                                        'identifiant' => $new_identifiant,
136                                                )
137                                        );
138                                }
139                                break;
140
141                        case 'maj':
142                                if (!$deja_utilise) {
143                                        $resultat = sql_updateq(
144                                                'spip_identifiants',
145                                                array(
146                                                        'identifiant' => $new_identifiant,
147                                                        'id_objet'    => intval($id_objet),
148                                                ),
149                                                array(
150                                                        'objet = ' . sql_quote($objet),
151                                                        'id_objet = ' . intval($where_id_objet),
152                                                        'identifiant = ' . sql_quote($old_identifiant),
153                                                )
154                                        );
155                                }
156                                break;
157
158                        case 'supprimer':
159                                $resultat = sql_delete(
160                                        'spip_identifiants',
161                                        array(
162                                                'objet = ' . sql_quote($objet),
163                                                'id_objet = ' . intval($where_id_objet),
164                                                'identifiant = ' . sql_quote($old_identifiant),
165                                        )
166                                );
167                                break;
168
169                        default:
170                                $resultat = false;
171                                break;
172                }
173
174        }
175
176        return $resultat;
177}
178
179
180/**
181 * Retourne une liste de tables possédant une colonne « identifiant »
182 *
183 * @return Array
184 */
185function tables_avec_identifiant() {
186
187        include_spip('base/objets');
188        $tables_avec_identifiant = array();
189
190        if ($tables = lister_tables_objets_sql()) {
191                foreach ($tables as $table => $infos) {
192                        if (isset($infos['field']['identifiant'])) {
193                                $tables_avec_identifiant[] = $table;
194                        }
195                }
196        }
197        return $tables_avec_identifiant;
198}
199
200
201/**
202 * Lister les identifiants utiles qui ne sont pas encore créés
203 */
204function identifiants_utiles() {
205
206        if (
207                $identifiants_utiles = pipeline('identifiants_utiles', array())
208                and is_array($identifiants_utiles)
209        ) {
210                foreach ($identifiants_utiles as $objet => $identifiants) {
211                        // on retire les identifiants existants de la liste
212                        foreach ($identifiants as $identifiant) {
213                                if (sql_countsel(
214                                        'spip_identifiants',
215                                        'objet = '.sql_quote($objet).' AND identifiant = '.sql_quote($identifiant)
216                                )
217                                ) {
218                                        unset($identifiants_utiles[$objet][array_search($identifiant, $identifiants_utiles[$objet])]);
219                                }
220                        }
221                        // on retire l'objet de la liste s'il ne reste plus d'identifiant
222                        if (!count($identifiants_utiles[$objet])) {
223                                unset($identifiants_utiles[$objet]);
224                        }
225                }
226        }
227
228        return $identifiants_utiles;
229}
Note: See TracBrowser for help on using the repository browser.