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

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

Suppression de la table spip_organisations_contacts et basculement sur spip_organisations_liens. Suppression de la dependance au plugin editer_liens_simples

  • Property svn:executable set to *
File size: 16.4 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        /*
210        On supprime enfin spip_organisations_contacts pour le mettre dans spip_organisations_liens
211        ce qui est fonctionnel en SPIP 3.x+
212        */
213        $maj['1.13.0'] = array(
214                array('conctacts_maj_1_13_0'),
215                array('sql_drop_table','spip_organisations_contacts'),
216        );
217
218        include_spip('base/upgrade');
219        maj_plugin($nom_meta_base_version, $version_cible, $maj);
220}
221
222
223/**
224 * Désinstallation/suppression des tables contacts, organisations et leurs liaisons
225 *
226 * @param string $nom_meta_base_version
227 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
228 * @return void
229 */
230function contacts_vider_tables($nom_meta_base_version) {
231        sql_drop_table('spip_annuaires');
232        sql_drop_table("spip_organisations");
233        sql_drop_table("spip_contacts");
234        sql_drop_table("spip_contacts_liens");
235        sql_drop_table("spip_organisations_liens");
236
237        # Nettoyer les versionnages, forums et urls
238        $in = sql_in("objet", array('organisations', 'contacts', 'annuaires'));
239        sql_delete("spip_versions", $in);
240        sql_delete("spip_versions_fragments", $in);
241        sql_delete("spip_forum", $in);
242        sql_delete("spip_urls", sql_in("type", array('organisation', 'contact', 'annuaire')));
243
244        effacer_meta($nom_meta_base_version);
245}
246
247
248/**
249 * Mise à jour 1.6.0 de la structure de base de données du plugin
250 *
251 * L'inverse de la defunte 1.5.0 : remet la table spip_organisations_contacts
252 * pour les liens entre contacts et organisations. Utiliser
253 * spip_organisations_liens pour ça créait des bugs et des confusions.
254**/
255function contacts_maj_1_6_0() {
256        // remettre spip_organisations_contacts si besoin
257        creer_base();
258
259        // repeupler
260        $contacts = sql_allfetsel(
261                array('id_objet AS id_contact', 'id_organisation', 'type_liaison'),
262                'spip_organisations_liens',
263                array('objet='.sql_quote('contact'), 'id_objet > 0')
264        );
265        if ($contacts) {
266                $inserts = array();
267                foreach ($contacts as $r) {
268                        $inserts[] = array(
269                                'id_organisation' => $r['id_organisation'],
270                                'id_contact' => $r['id_contact'],
271                'type_liaison' => $r['type_liaison'],
272                        );
273                }
274                if ($inserts) {
275                        sql_insertq_multi('spip_organisations_contacts', $inserts);
276                }
277        }
278
279        // enlever les contacts de spip_organisations_liens
280        sql_delete('spip_organisations_liens', 'objet='.sql_quote('contact'));
281}
282
283
284/**
285 * Mise à jour 1.7.1 de la structure de base de données du plugin
286 *
287 * Remet la colonne id_auteur sur les tables contacts et organisations.
288**/
289function contacts_migrer_liens_auteurs() {
290        // remettre id_auteur sur spip_contacts et spip_organisations
291        include_spip('base/create');
292        maj_tables(array('spip_contacts', 'spip_organisations'));
293        sql_alter('TABLE spip_contacts ADD INDEX (id_auteur)');
294        sql_alter('TABLE spip_organisations ADD INDEX (id_auteur)');
295
296        // pour chaque table, remettre les petits auteurs dans les tables
297        foreach (array('spip_contacts', 'spip_organisations') as $table) {
298                $_id = id_table_objet($table);
299                $auteurs = sql_allfetsel(
300                        array($_id, 'id_objet AS id_auteur'),
301                        $table . '_liens',
302                        array('objet='.sql_quote('auteur'), 'id_objet > 0'));
303                if ($auteurs) {
304                        // on supprime 1 par 1 en cas de timeout
305                        foreach ($auteurs as $r) {
306                                sql_updateq($table, array('id_auteur' => $r['id_auteur']), $_id . '=' . $r[$_id]);
307                                sql_delete($table . '_liens',
308                                        array('objet='.sql_quote('auteur'), 'id_objet=' . $r['id_auteur'], $_id . '=' . $r[$_id]));
309                        }
310                        $auteurs = sql_allfetsel(
311                                array($_id, 'id_objet AS id_auteur'),
312                                $table . '_liens',
313                                array('objet='.sql_quote('auteur'), 'id_objet > 0'));
314                        if (!$auteurs) {
315                                // enlever eventuellement des id_auteur = 0 ?
316                                sql_delete($table . '_liens', 'objet='.sql_quote('auteur'));
317                        }
318                }
319        }
320}
321
322/**
323 * Mise à jour de la base 1.10.0
324 *
325 * Déplace l'option lier_organisations_rubriques vers lier_organisations_objets plus générique
326 *
327 * @return void
328 */
329function contacts_maj_1_10_0() {
330        include_spip('inc/config');
331        $lier_organisations_rubriques = lire_config('contacts_et_organisations/lier_organisations_rubriques');
332
333        // On supprime l'ancienne option
334        effacer_config('contacts_et_organisations/lier_organisations_rubriques');
335
336        // Si l'option était activée, on la réactive autre part
337        if ($lier_organisations_rubriques){
338                ecrire_config('contacts_et_organisations/lier_organisations_objets', array('spip_rubriques'));
339        }
340}
341
342/**
343 * MAJ 1.12.0 : supprimer les liens contacts-auteur de spip_contacts_liens
344 * lorsqu'ils sont redondants avec le champ id_auteur de spip_contacts
345 */
346function conctacts_maj_1_12_0_step1() {
347
348        $res = sql_select('*','spip_contacts_liens','objet='.sql_quote('auteur').' AND tocheck='.intval(1));
349        $nb = sql_count($res);
350        spip_log($s="conctacts_maj_1_12_0_step1 : $nb restants","maj");
351        echo "$s<br />";
352        while($row = sql_fetch($res)) {
353                $where = 'id_contact=' . intval($row['id_contact'])
354                        . ' AND id_objet=' . intval($row['id_objet'])
355                        . ' AND objet=' . sql_quote($row['objet']);
356
357                // si le id_contact n'existe pas,
358                // ou bien a le id_contact a le meme id_auteur
359                // ou bien id_autur n'existe pas
360                // => on supprime le lien qui ne sert pas
361                if (!$contact = sql_fetsel('id_contact,id_auteur','spip_contacts','id_contact='.intval($row['id_contact']))
362                  or $contact['id_auteur']==$row['id_objet']
363                  or !sql_countsel('spip_auteurs','id_auteur=' . intval($row['id_objet']))){
364                        sql_delete('spip_contacts_liens', $where);
365                }
366                // sinon on marque le lien comme verifie pour ne pas y revenir
367                else {
368                        sql_updateq('spip_contacts_liens', array('tocheck' => 0), $where);
369                }
370                if (time()>_TIME_OUT){
371                        return;
372                }
373        }
374}
375
376/**
377 * MAJ 1.12.0 : supprimer les liens contacts-auteur de spip_organisations_liens
378 * lorsqu'ils sont redondants avec le champ id_auteur de spip_organisations
379 */
380function conctacts_maj_1_12_0_step2() {
381
382        $res = sql_select('*','spip_organisations_liens','objet='.sql_quote('auteur').' AND tocheck='.intval(1));
383        $nb = sql_count($res);
384        spip_log($s="conctacts_maj_1_12_0_step2 : $nb restants","maj");
385        echo "$s<br />";
386        while($row = sql_fetch($res)) {
387                $where = 'id_organisation=' . intval($row['id_organisation'])
388                        . ' AND id_objet=' . intval($row['id_objet'])
389                        . ' AND objet=' . sql_quote($row['objet']);
390
391                // si le id_contact n'existe pas,
392                // ou bien a le id_contact a le meme id_auteur
393                // ou bien id_autur n'existe pas
394                // => on supprime le lien qui ne sert pas
395                if (!$org = sql_fetsel('id_organisation,id_auteur','spip_organisations','id_organisation='.intval($row['id_organisation']))
396                  or $org['id_auteur'] == $row['id_objet']
397                  or !sql_countsel('spip_auteurs','id_auteur=' . intval($row['id_objet']))){
398                        sql_delete('spip_organisations_liens', $where);
399                }
400                // sinon on marque le lien comme verifie pour ne pas y revenir
401                else {
402                        sql_updateq('spip_organisations_liens', array('tocheck' => 0), $where);
403                }
404                if (time()>_TIME_OUT){
405                        return;
406                }
407        }
408}
409
410/**
411 * MAJ 1.13.0 : transferer de spip_organisations_contacts dans spip_organisations_liens
412 */
413function conctacts_maj_1_13_0() {
414
415        $res = sql_select('*','spip_organisations_contacts');
416        $nb = sql_count($res);
417        spip_log($s="conctacts_maj_1_13_0 : $nb restants","maj");
418        echo "$s<br />";
419        while($row = sql_fetch($res)) {
420                $where = 'id_organisation=' . intval($row['id_organisation'])
421                        . ' AND id_contact=' . intval($row['id_contact'])
422                  . ' AND type_liaison=' . sql_quote($row['type_liaison']);
423
424                $ins = $row;
425                $ins['id_objet'] = $row['id_contact'];
426                $ins['objet'] = 'contact';
427                unset($ins['id_contact']);
428                sql_insertq('spip_organisations_liens', $ins);
429                sql_delete('spip_organisations_contacts', $where);
430
431                if (time()>_TIME_OUT){
432                        return;
433                }
434        }
435}
436
Note: See TracBrowser for help on using the repository browser.