source: spip-zone/_plugins_/contacts_et_organisations/trunk/contacts_administrations.php @ 99745

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

Nettoyage des tables spip_contacts_liens et spip_organisations_liens qui contenaient pour des raisons historiques un doublon du champ id_auteur de spip_contacts et spip_organisations

  • Property svn:executable set to *
File size: 15.5 KB
Line 
1<?php
2/**
3 * Fichier gérant l'installation et désinstallation du plugin
4 *
5 * @plugin Contacts & Organisations pour Spip 3.0
6 * @license GPL (c) 2009 - 2013
7 * @author Cyril Marion, Matthieu Marcillaud, Rastapopoulos
8 *
9 * @package SPIP\Contacts\Installation
10**/
11
12// sécurité
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15include_spip('inc/meta');
16include_spip('base/create');
17
18/**
19 * Installation/maj des tables contacts, organisations et leurs liaisons
20 *
21 * @param string $nom_meta_base_version
22 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
23 * @param string $version_cible
24 *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
25 * @return void
26 */
27function contacts_upgrade($nom_meta_base_version, $version_cible) {
28        $maj = array();
29
30        $maj['create'] = array(
31                array('creer_base'),
32        );
33
34        $maj['1.1.0'] = array(
35                array('sql_alter', 'TABLE spip_contacts CHANGE prenom prenom tinytext NOT NULL DEFAULT ""'),
36        );
37
38        $maj['1.1.1'] = array(
39                array('maj_tables', 'spip_contacts'),
40        );
41
42        // Dupliquer pour les jointures automatiques
43        $maj['1.1.2'] = array(
44                array('maj_tables', array('spip_contacts', 'spip_comptes')),
45                array('sql_alter', 'TABLE spip_contacts ADD INDEX (id_contact)'),
46                array('sql_alter', 'TABLE spip_comptes ADD INDEX (id_compte)'),
47                array('sql_alter', 'TABLE spip_comptes_contacts ADD INDEX (id_contact)'),
48                array('sql_update', 'spip_contacts', array('id_contact' => 'id_auteur')),
49                array('sql_update', 'spip_comptes', array('id_compte' => 'id_auteur')),
50        );
51
52        // On passe de compte à organisation
53        $maj['1.2.0'] = array(
54                array('sql_alter', 'TABLE spip_comptes DROP INDEX id_compte'),
55                array('sql_alter', 'TABLE spip_comptes_contacts DROP INDEX id_compte'),
56
57                array('sql_alter', 'TABLE spip_comptes RENAME spip_organisations'),
58                array('sql_alter', 'TABLE spip_comptes_contacts RENAME spip_organisations_contacts'),
59
60                array('sql_alter', 'TABLE spip_organisations CHANGE id_compte id_organisation bigint(21) NOT NULL'),
61                array('sql_alter', 'TABLE spip_organisations_contacts CHANGE id_compte id_organisation bigint(21) NOT NULL'),
62
63                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_organisation)'),
64                array('sql_alter', 'TABLE spip_organisations_contacts ADD INDEX (id_organisation)'),
65        );
66
67        // On modifie quelques champs de la table organisations
68        $maj['1.2.1'] = array(
69                // renomme le champ 'type' en 'statut_juridique'
70                array('sql_alter', "TABLE spip_organisations CHANGE type statut_juridique TINYTEXT NOT NULL DEFAULT ''"),
71                // renomme le champ 'siret' en 'identification'
72                array('sql_alter', "TABLE spip_organisations CHANGE siret identification TINYTEXT NOT NULL DEFAULT ''"),
73                // ajoute le champ 'activite'
74                array('sql_alter', "TABLE spip_organisations ADD activite TINYTEXT NOT NULL DEFAULT '' AFTER identification"),
75        );
76
77        // Les clés primaires des tables contacts et organisations
78        // passent sur le id_contact et id_organisation au lieu du id_auteur
79        // afin de gérer éventuellement des contacts/organisations autonomes.
80        $maj['1.3.0'] = array(
81                array('sql_alter', 'TABLE spip_organisations DROP INDEX id_organisation'),
82                array('sql_alter', 'TABLE spip_organisations DROP PRIMARY KEY'),
83                array('sql_alter', 'TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) NOT NULL'),
84                array('sql_alter', 'TABLE spip_organisations CHANGE id_organisation id_organisation bigint(21) NOT NULL auto_increment PRIMARY KEY'),
85                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_auteur)'),
86
87                array('sql_alter', 'TABLE spip_contacts DROP INDEX id_contact'),
88                array('sql_alter', 'TABLE spip_contacts DROP PRIMARY KEY'),
89                array('sql_alter', 'TABLE spip_contacts CHANGE id_auteur id_auteur bigint(21) NOT NULL'),
90                array('sql_alter', 'TABLE spip_contacts CHANGE id_contact id_contact bigint(21) NOT NULL auto_increment PRIMARY KEY'),
91                array('sql_alter', 'TABLE spip_contacts ADD INDEX (id_auteur)'),
92        );
93
94        $maj['1.3.1'] = array(
95                array('sql_alter', "TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
96                array('sql_alter', "TABLE spip_organisations CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
97        );
98
99        $maj['1.3.3'] = array(
100                array('sql_alter', "TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
101        );
102
103        // le champ id_auteur sur spip_organisations peut ne pas etre unique si une organisation
104        // n'est pas liee a un auteur (id_auteur=0). Plus tard, il faudra certainement mettre une
105        // table de relation spip_organisations_liens pour cela.
106        $maj['1.3.4'] = array(
107                // pas de UNIQUE sur l'index auteur
108                array('sql_alter', "TABLE spip_organisations DROP INDEX id_auteur"),
109                array('sql_alter', "TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) DEFAULT 0 NOT NULL"),
110                array('sql_alter', "TABLE spip_organisations ADD INDEX (id_auteur)"),
111        );
112
113        // Le champ id_parent sur spip_organisations pour définir des hiérarchies d'organisations.
114        $maj['1.3.5'] = array(
115                array('sql_alter', "TABLE spip_organisations ADD COLUMN id_parent bigint(21) DEFAULT 0 NOT NULL"),
116        );
117
118        // Le champ type_liaison sur spip_organisations_contacts pour définir des types de liaisons donc.
119        $maj['1.3.6'] = array(
120                array('sql_alter', "TABLE spip_organisations_contacts ADD COLUMN type_liaison tinytext NOT NULL DEFAULT ''"),
121        );
122
123        // On crée la table spip_organisations_liens
124        $maj['1.3.7'] = array(
125                array('maj_tables', 'spip_organisations_liens'),
126        );
127
128        // Coquille sur la clé de spip_organisations_liens
129        $maj['1.4.1'] = array(
130                array('sql_alter', 'TABLE spip_organisations DROP INDEX id_contact'),
131                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_organisation)'),
132        );
133
134        // Rajout d'un type_liaison dans les liens
135        $maj['1.4.2'] = array(
136                array('maj_tables', array('spip_contacts_liens', 'spip_organisations_liens')),
137                array('sql_alter', 'TABLE `spip_organisations_liens` DROP PRIMARY KEY'),
138                array('sql_alter', 'TABLE `spip_organisations_liens` ADD PRIMARY KEY ( `id_organisation` , `id_objet` , `objet`, `type_liaison`(25)) '),
139                array('sql_alter', 'TABLE `spip_contacts_liens` DROP PRIMARY KEY'),
140                array('sql_alter', 'TABLE `spip_contacts_liens` ADD PRIMARY KEY ( `id_contact` , `id_objet` , `objet`, `type_liaison`(25)) '),
141        );
142
143        /*
144        Il s'agissait de supprimer spip_organisations_contacts
145        pour le mettre dans spip_organisations_liens...
146        ce qui s'est avéré très bugué en spip 2.1...
147        La version 1.6.0 fait l'inverse de 1.5.0 du coup, pour remettre dans l'ordre
148        */
149        $maj['1.6.0'] = array(
150                array('contacts_maj_1_6_0'),
151        );
152
153        $maj['1.7.1'] = array(
154                array('contacts_migrer_liens_auteurs'),
155        );
156
157        // type_liaison en VARCHAR pour que sqlite ET mysql soient contents
158        $maj['1.7.2'] = array(
159                array('sql_alter', 'TABLE spip_organisations_liens DROP PRIMARY KEY'),
160                array('sql_alter', "TABLE spip_organisations_liens CHANGE type_liaison type_liaison VARCHAR(25) NOT NULL DEFAULT ''"),
161                array('sql_alter', 'TABLE spip_organisations_liens ADD PRIMARY KEY ( id_organisation, id_objet, objet, type_liaison)'),
162
163                array('sql_alter', 'TABLE spip_contacts_liens DROP PRIMARY KEY'),
164                array('sql_alter', "TABLE spip_contacts_liens CHANGE type_liaison type_liaison VARCHAR(25) NOT NULL DEFAULT ''"),
165                array('sql_alter', 'TABLE spip_contacts_liens ADD PRIMARY KEY ( id_contact, id_objet, objet, type_liaison)'),
166        );
167
168        // Pour ceux qui ont déjà le plugin installé, on active déjà la gestion de l'arborescence pour garder la compat
169        $maj['1.8.0'] = array(
170                array('include_spip', 'inc/config'),
171                array('ecrire_config', 'contacts_et_organisations/utiliser_organisations_arborescentes', 'on'),
172        );
173
174        // Ajout de la gestion d'annuaires différents
175        $maj['1.9.0'] = array(
176                array('maj_tables', array('spip_annuaires', 'spip_organisations', 'spip_contacts')),
177        );
178
179        // Ajout de la possibilité de lier les fiches à n'importe quels objets, pas juste les rubriques
180        // Il faut donc migrer l'option lier_organisations_rubriques vers une autre plus générique
181        $maj['1.10.0'] = array(
182                array('contacts_maj_1_10_0'),
183        );
184
185        // Index sur les id_objet et objet des tables de liaisons
186        $maj['1.10.1'] = array(
187                array('sql_alter', 'TABLE spip_contacts_liens ADD INDEX (id_objet)'),
188                array('sql_alter', 'TABLE spip_contacts_liens ADD INDEX (objet)'),
189                array('sql_alter', 'TABLE spip_organisations_liens ADD INDEX (id_objet)'),
190                array('sql_alter', 'TABLE spip_organisations_liens ADD INDEX (objet)'),
191        );
192       
193        // Ajouter des champs courants pour des organisations
194        $maj['1.11.0'] = array(
195                array('sql_alter', "TABLE spip_organisations ADD COLUMN ouvertures text not null default ''"),
196                array('sql_alter', "TABLE spip_organisations ADD COLUMN tarifs text not null default ''"),
197                array('sql_alter', "TABLE spip_organisations ADD COLUMN url_site text not null default ''"),
198        );
199
200        $maj['1.12.0'] = array(
201                array('sql_alter', 'TABLE spip_contacts_liens ADD COLUMN tocheck TINYINT NOT NULL default 1'),
202                array('conctacts_maj_1_12_0_step1'),
203                array('sql_alter', 'TABLE spip_contacts_liens DROP COLUMN tocheck'),
204                array('sql_alter', 'TABLE spip_organisations_liens ADD COLUMN tocheck TINYINT NOT NULL default 1'),
205                array('conctacts_maj_1_12_0_step2'),
206                array('sql_alter', 'TABLE spip_organisations_liens DROP COLUMN tocheck'),
207        );
208
209        include_spip('base/upgrade');
210        maj_plugin($nom_meta_base_version, $version_cible, $maj);
211}
212
213
214/**
215 * Désinstallation/suppression des tables contacts, organisations et leurs liaisons
216 *
217 * @param string $nom_meta_base_version
218 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
219 * @return void
220 */
221function contacts_vider_tables($nom_meta_base_version) {
222        sql_drop_table('spip_annuaires');
223        sql_drop_table("spip_organisations");
224        sql_drop_table("spip_contacts");
225        sql_drop_table("spip_contacts_liens");
226        sql_drop_table("spip_organisations_contacts");
227        sql_drop_table("spip_organisations_liens");
228
229        # Nettoyer les versionnages, forums et urls
230        $in = sql_in("objet", array('organisations', 'contacts', 'annuaires'));
231        sql_delete("spip_versions", $in);
232        sql_delete("spip_versions_fragments", $in);
233        sql_delete("spip_forum", $in);
234        sql_delete("spip_urls", sql_in("type", array('organisation', 'contact', 'annuaire')));
235
236        effacer_meta($nom_meta_base_version);
237}
238
239
240/**
241 * Mise à jour 1.6.0 de la structure de base de données du plugin
242 *
243 * L'inverse de la defunte 1.5.0 : remet la table spip_organisations_contacts
244 * pour les liens entre contacts et organisations. Utiliser
245 * spip_organisations_liens pour ça créait des bugs et des confusions.
246**/
247function contacts_maj_1_6_0() {
248        // remettre spip_organisations_contacts si besoin
249        creer_base();
250
251        // repeupler
252        $contacts = sql_allfetsel(
253                array('id_objet AS id_contact', 'id_organisation', 'type_liaison'),
254                'spip_organisations_liens',
255                array('objet='.sql_quote('contact'), 'id_objet > 0')
256        );
257        if ($contacts) {
258                $inserts = array();
259                foreach ($contacts as $r) {
260                        $inserts[] = array(
261                                'id_organisation' => $r['id_organisation'],
262                                'id_contact' => $r['id_contact'],
263                'type_liaison' => $r['type_liaison'],
264                        );
265                }
266                if ($inserts) {
267                        sql_insertq_multi('spip_organisations_contacts', $inserts);
268                }
269        }
270
271        // enlever les contacts de spip_organisations_liens
272        sql_delete('spip_organisations_liens', 'objet='.sql_quote('contact'));
273}
274
275
276/**
277 * Mise à jour 1.7.1 de la structure de base de données du plugin
278 *
279 * Remet la colonne id_auteur sur les tables contacts et organisations.
280**/
281function contacts_migrer_liens_auteurs() {
282        // remettre id_auteur sur spip_contacts et spip_organisations
283        include_spip('base/create');
284        maj_tables(array('spip_contacts', 'spip_organisations'));
285        sql_alter('TABLE spip_contacts ADD INDEX (id_auteur)');
286        sql_alter('TABLE spip_organisations ADD INDEX (id_auteur)');
287
288        // pour chaque table, remettre les petits auteurs dans les tables
289        foreach (array('spip_contacts', 'spip_organisations') as $table) {
290                $_id = id_table_objet($table);
291                $auteurs = sql_allfetsel(
292                        array($_id, 'id_objet AS id_auteur'),
293                        $table . '_liens',
294                        array('objet='.sql_quote('auteur'), 'id_objet > 0'));
295                if ($auteurs) {
296                        // on supprime 1 par 1 en cas de timeout
297                        foreach ($auteurs as $r) {
298                                sql_updateq($table, array('id_auteur' => $r['id_auteur']), $_id . '=' . $r[$_id]);
299                                sql_delete($table . '_liens',
300                                        array('objet='.sql_quote('auteur'), 'id_objet=' . $r['id_auteur'], $_id . '=' . $r[$_id]));
301                        }
302                        $auteurs = sql_allfetsel(
303                                array($_id, 'id_objet AS id_auteur'),
304                                $table . '_liens',
305                                array('objet='.sql_quote('auteur'), 'id_objet > 0'));
306                        if (!$auteurs) {
307                                // enlever eventuellement des id_auteur = 0 ?
308                                sql_delete($table . '_liens', 'objet='.sql_quote('auteur'));
309                        }
310                }
311        }
312}
313
314/**
315 * Mise à jour de la base 1.10.0
316 *
317 * Déplace l'option lier_organisations_rubriques vers lier_organisations_objets plus générique
318 *
319 * @return void
320 */
321function contacts_maj_1_10_0() {
322        include_spip('inc/config');
323        $lier_organisations_rubriques = lire_config('contacts_et_organisations/lier_organisations_rubriques');
324
325        // On supprime l'ancienne option
326        effacer_config('contacts_et_organisations/lier_organisations_rubriques');
327
328        // Si l'option était activée, on la réactive autre part
329        if ($lier_organisations_rubriques){
330                ecrire_config('contacts_et_organisations/lier_organisations_objets', array('spip_rubriques'));
331        }
332}
333
334/**
335 * MAJ 1.12.0 : supprimer les liens contacts-auteur de spip_contacts_liens
336 * lorsqu'ils sont redondants avec le champ id_auteur de spip_contacts
337 */
338function conctacts_maj_1_12_0_step1() {
339
340        $res = sql_select('*','spip_contacts_liens','objet='.sql_quote('auteur').' AND tocheck='.intval(1));
341        $nb = sql_count($res);
342        spip_log($s="conctacts_maj_1_12_0_step1 : $nb restants","maj");
343        echo "$s<br />";
344        while($row = sql_fetch($res)) {
345                $where = 'id_contact=' . intval($row['id_contact'])
346                        . ' AND id_objet=' . intval($row['id_objet'])
347                        . ' AND objet=' . sql_quote($row['objet']);
348
349                // si le id_contact n'existe pas,
350                // ou bien a le id_contact a le meme id_auteur
351                // ou bien id_autur n'existe pas
352                // => on supprime le lien qui ne sert pas
353                if (!$contact = sql_fetsel('id_contact,id_auteur','spip_contacts','id_contact='.intval($row['id_contact']))
354                  or $contact['id_auteur']==$row['id_objet']
355                  or !sql_countsel('spip_auteurs','id_auteur=' . intval($row['id_objet']))){
356                        sql_delete('spip_contacts_liens', $where);
357                }
358                // sinon on marque le lien comme verifie pour ne pas y revenir
359                else {
360                        sql_updateq('spip_contacts_liens', array('tocheck' => 0), $where);
361                }
362                if (time()>_TIME_OUT){
363                        return;
364                }
365        }
366}
367
368/**
369 * MAJ 1.12.0 : supprimer les liens contacts-auteur de spip_organisations_liens
370 * lorsqu'ils sont redondants avec le champ id_auteur de spip_organisations
371 */
372function conctacts_maj_1_12_0_step2() {
373
374        $res = sql_select('*','spip_organisations_liens','objet='.sql_quote('auteur').' AND tocheck='.intval(1));
375        $nb = sql_count($res);
376        spip_log($s="conctacts_maj_1_12_0_step2 : $nb restants","maj");
377        echo "$s<br />";
378        while($row = sql_fetch($res)) {
379                $where = 'id_organisation=' . intval($row['id_organisation'])
380                        . ' AND id_objet=' . intval($row['id_objet'])
381                        . ' AND objet=' . sql_quote($row['objet']);
382
383                // si le id_contact n'existe pas,
384                // ou bien a le id_contact a le meme id_auteur
385                // ou bien id_autur n'existe pas
386                // => on supprime le lien qui ne sert pas
387                if (!$org = sql_fetsel('id_organisation,id_auteur','spip_organisations','id_organisation='.intval($row['id_organisation']))
388                  or $org['id_auteur'] == $row['id_objet']
389                  or !sql_countsel('spip_auteurs','id_auteur=' . intval($row['id_objet']))){
390                        sql_delete('spip_organisations_liens', $where);
391                }
392                // sinon on marque le lien comme verifie pour ne pas y revenir
393                else {
394                        sql_updateq('spip_organisations_liens', array('tocheck' => 0), $where);
395                }
396                if (time()>_TIME_OUT){
397                        return;
398                }
399        }
400}
Note: See TracBrowser for help on using the repository browser.