source: spip-zone/_plugins_/contacts_et_organisations/trunk/contacts_pipelines.php @ 99790

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

completer le nettoyage de base avec les liens morts

  • Property svn:executable set to *
File size: 11.7 KB
Line 
1<?php
2
3/**
4 * Utilisations de pipelines
5 *
6 * @plugin Contacts & Organisations pour Spip 3.0
7 * @license GPL (c) 2009 - 2013
8 * @author Cyril Marion, Matthieu Marcillaud, Rastapopoulos
9 *
10 * @package SPIP\Contacts\Pipelines
11**/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16/*
17 * function contacts_ieconfig_metas
18 *
19 * export de configuration avec le plugin ieconfig
20 *
21 * @param $table
22 */
23
24function contacts_ieconfig_metas($table) {
25    $table['contacts']['titre'] = _T('contacts:contacts');
26    $table['contacts']['icone'] = 'prive/themes/spip/images/contact-16.png';
27    $table['contacts']['metas_serialize'] = 'contacts_et_organisations';
28       
29        return $table;
30}
31
32/**
33 * Ajoute un fil d'ariane sur les auteurs définis comme contacts ou organisation
34 *
35 * @pipeline affiche_hierarchie
36 *
37 * @param array $flux
38 *     Données du pipeline
39 * @return array
40 *     Données du pipeline
41 */
42function contacts_affiche_hierarchie($flux)
43{
44        if ($flux['args']['objet'] == 'auteur'
45          and isset($flux["args"]["id_objet"])
46          and $id = $flux["args"]["id_objet"]) {
47                if (lire_config('contacts_et_organisations/associer_aux_auteurs')) {
48                        $id = intval($flux['args']['id_objet']);
49                        // cherchons un contact
50                        if ($id_contact = sql_getfetsel('id_contact', 'spip_contacts', 'id_auteur ='.intval($id))) {
51                                $flux['data'] .= '<br />' . recuperer_fond('prive/squelettes/hierarchie/contact', array('id_contact' => $id_contact));
52                        // sinon une organisation
53                        } elseif ($id_organisation = sql_getfetsel('id_organisation', 'spip_organisations', 'id_auteur ='.intval($id))) {
54                                $flux['data'] .= '<br />' . recuperer_fond('prive/squelettes/hierarchie/organisation', array('id_organisation' => $id_organisation));
55                        }
56                }
57        }
58
59        return $flux;
60}
61
62
63/**
64 * Utilisation du pipeline afficher_contenu_objet
65 *
66 * - Insertion dans la vue des auteurs des informations relatives aux
67 *   contacts et organisations
68 * - Insertion sur les rubriques du choix des organisations
69 *
70 * @pipeline afficher_contenu_objet
71 *
72 * @param array $flux
73 *     Données du pipeline
74 * @return array
75 *     Données du pipeline
76 */
77function contacts_afficher_contenu_objet($flux) {
78        include_spip('inc/config');
79
80        if ($flux['args']['type'] == 'auteur') {
81                if (lire_config('contacts_et_organisations/associer_aux_auteurs') and
82                        lire_config('contacts_et_organisations/afficher_infos_sur_auteurs')) {
83
84                        $id = intval($flux['args']['id_objet']);
85
86                        // informations sur le contact et ses liens
87                        if ($id_contact = sql_getfetsel('id_contact', 'spip_contacts', 'id_auteur ='.$id))
88                        {
89                                $infos = recuperer_fond('prive/squelettes/contenu/contact_sur_auteur', array('id_contact' => $id_contact));
90                                $flux['data'] .= $infos;
91                        }
92                        // informations sur l'organisation et ses liens
93                        elseif ($id_organisation = sql_getfetsel('id_organisation', 'spip_organisations', 'id_auteur ='.$id))
94                        {
95                                $infos = recuperer_fond('prive/squelettes/contenu/organisation_sur_auteur', array('id_organisation' => $id_organisation));
96                                $flux['data'] .= $infos;
97                        }
98                }
99        }
100
101        // Ajouter un bloc de liaison avec les organisations sur les objets configurés pour ça
102        if ($table = table_objet_sql($flux['args']['type']) and in_array($table, lire_config('contacts_et_organisations/lier_organisations_objets', array()))) {
103                $id = $flux['args']['id_objet'];
104                $infos = recuperer_fond('prive/objets/editer/liens', array(
105                        'table_source' => 'organisations',
106                        'objet' => $flux['args']['type'],
107                        'id_objet' => $id,
108                        'editable' => autoriser('associerorganisation', $flux['args']['type'], $id) ? 'oui':'non'
109                ));
110                $flux['data'] .= $infos;
111        }
112
113        // Ajouter un bloc de liaison avec les contacts sur les objets configurés pour ça
114        if ($table = table_objet_sql($flux['args']['type']) and in_array($table, lire_config('contacts_et_organisations/lier_contacts_objets', array()))) {
115                $id = $flux['args']['id_objet'];
116                $infos = recuperer_fond('prive/objets/editer/liens', array(
117                        'table_source' => 'contacts',
118                        'objet' => $flux['args']['type'],
119                        'id_objet' => $id,
120                        'editable' => autoriser('associercontact', $flux['args']['type'], $id) ? 'oui':'non'
121                ));
122                $flux['data'] .= $infos;
123        }
124
125        return $flux;
126}
127
128/**
129 * Pipeline boite_infos pour afficher clairement quand un auteur est un CONTACT ou une ORGANISATION
130 * @param $flux
131 * @return mixed
132 */
133function contacts_boite_infos($flux){
134        if ($flux['args']['type']=='auteur'
135          and $id_auteur = intval($flux['args']['id'])){
136                $html = recuperer_fond('prive/objets/infos/auteur-contact-organisation', array(
137                                                'id_auteur' => $id_auteur
138                                        ));
139
140                if ($p = strpos($flux['data'], '</p>')
141                  and $p = strpos($flux['data'], '<p>', $p)){
142                        $flux['data'] = substr_replace($flux['data'], $html , $p, 0);
143                }
144                else {
145                        $flux['data'] .= $html;
146                }
147        }
148        return $flux;
149}
150
151
152/**
153 * Utilisation du pipeline affiche gauche
154 *
155 * - Affichage du formulaire de choix Contact/Organisation
156 *   qui permet de creer un contact ou une organisation a partir d'un auteur qui n'est ni l'un ni l'autre
157 *
158 * @pipeline affiche_gauche
159 *
160 * @param array $flux
161 *     Données du pipeline
162 * @return array
163 *     Données du pipeline
164**/
165function contacts_affiche_gauche($flux) {
166        if ($flux['args']['exec'] == 'auteur'){
167                if (lire_config('contacts_et_organisations/associer_aux_auteurs')) {
168                        $flux['data'] .= recuperer_fond('prive/squelettes/extra/selecteur_contacts_organisations', array(
169                                'id_auteur' => $flux['args']['id_auteur']
170                        ));
171                }
172        }
173
174        return $flux;
175}
176
177
178
179/**
180 * Ajoute une feuille de style pour la v-card
181 *
182 * @pipeline insert_head_css
183 *
184 * @param string $flux
185 *     Code HTML de chargement des CSS
186 * @return string
187 *     Code HTML de chargement des CSS
188**/
189function contacts_insert_head_css($flux) {
190        $flux .= '<link rel="stylesheet" type="text/css" href="'.find_in_path('contacts.css').'" media="all" />';
191        return $flux;
192}
193
194
195
196
197/**
198 * Optimiser la base (suppression des contacts et organisations dont les auteurs liés ont disparu)
199 *
200 * Si la configuration du plugin indique que la suppression d'un auteur entraîne la suppression
201 * de la fiche de contact, alors on supprime effectivement ce contact.
202 *
203 * @param array $flux
204 * @return array
205 */
206function contacts_optimiser_base_disparus($flux) {
207
208        // supprimer un contact associé à un auteur disparu si demandé dans la configuration
209        include_spip('inc/config');
210        if (lire_config('contacts_et_organisations/supprimer_reciproquement_auteurs_et_contacts')) {
211                $n = 0;
212
213                # supprimer les contacts dont les auteurs ont disparu
214                $res = sql_select(
215                        "contacts.id_contact",
216                        "spip_contacts AS contacts
217                                LEFT JOIN spip_auteurs AS auteurs
218                                ON contacts.id_auteur=auteurs.id_auteur",
219                        array(
220                                "auteurs.id_auteur IS NULL",
221                                "contacts.id_auteur > 0"
222                        )
223                );
224
225                while ($row = sql_fetch($res)) {
226                        $id_contact = $row['id_contact'];
227                        sql_delete("spip_contacts_liens", "id_contact=" . sql_quote($id_contact));
228                        sql_delete("spip_contacts", "id_contact=" . sql_quote($id_contact));
229                        sql_delete("spip_organisations_liens", "objet=".sql_quote('contact')." AND id_objet=" . sql_quote($id_contact));
230                        $n++;
231                }
232
233                # supprimer les organisations dont les auteurs ont disparu
234                $res = sql_select(
235                        "organisations.id_organisation",
236                        "spip_organisations AS organisations
237                                LEFT JOIN spip_auteurs AS auteurs
238                                ON organisations.id_auteur=auteurs.id_auteur",
239                        array(
240                                "auteurs.id_auteur IS NULL",
241                                "organisations.id_auteur > 0"
242                        )
243                );
244
245                while ($row = sql_fetch($res)) {
246                        $id_organisation = $row['id_organisation'];
247                        sql_delete("spip_organisations_liens", "id_organisation=" . sql_quote($id_organisation));
248                        sql_delete("spip_organisations", "id_organisation=" . sql_quote($id_organisation));
249                        $n++;
250                }
251
252                $flux['data'] += $n;
253        }
254
255        # supprimer les liens contacts_liens dont les contacts ont disparu
256        $res = sql_select(
257                "CL.id_contact",
258                "spip_contacts_liens AS CL
259                        LEFT JOIN spip_contacts AS C
260                        ON CL.id_contact=C.id_contact",
261                "C.id_contact IS NULL"
262        );
263        while ($row = sql_fetch($res)) {
264                $id_contact = $row['id_contact'];
265                sql_delete("spip_contacts_liens", "id_contact=" . sql_quote($id_contact));
266        }
267
268        # supprimer les liens organisations_liens dont les organisations ont disparues
269        $res = sql_select(
270                "OL.id_organisation",
271                "spip_organisations_liens AS OL
272                        LEFT JOIN spip_organisations AS O
273                        ON OL.id_organisation=O.id_organisation",
274                "O.id_organisation IS NULL"
275        );
276        while ($row = sql_fetch($res)) {
277                $id_organisation = $row['id_organisation'];
278                sql_delete("spip_organisations_liens", "id_organisation=" . sql_quote($id_organisation));
279        }
280
281        # supprimer les liens organisations_liens dont les contacts ont disparus
282        $res = sql_select(
283                "OL.id_objet",
284                "spip_organisations_liens AS OL
285                        LEFT JOIN spip_contacts AS C
286                        ON (OL.id_objet=C.id_contact AND OL.objet='contact')",
287                "OL.objet='contact' AND C.id_contact IS NULL"
288        );
289        while ($row = sql_fetch($res)) {
290                $id_contact = $row['id_objet'];
291                sql_delete("spip_organisations_liens", "objet='contact' AND id_objet=" . sql_quote($id_contact));
292        }
293
294
295        return $flux;
296}
297
298
299function contacts_formulaire_fond($flux) {
300        if ($flux['args']['form'] == 'editer_auteur') {
301                if (isset($flux['args']['contexte']['id_contact'])) {
302                        $contexte = $flux['args']['contexte'];
303                        $contexte['prefixe'] = 'contact_';
304                        if (preg_match(",<(li|div)[^>]*editer_bio[^>]*>,Uims", $flux['data'], $m)) {
305                                $contexte['tag'] = $m[1];
306                                $p = strpos($flux['data'], $m[0]);
307                                $ins = recuperer_fond('formulaires/editer_auteur_contact', $contexte);
308                                $flux['data'] = substr_replace($flux['data'], $ins, $p, 0);
309                        }
310                }
311                if (isset($flux['args']['contexte']['id_organisation'])) {
312                        $contexte = $flux['args']['contexte'];
313                        $contexte['prefixe'] = 'organisation_';
314                        if (preg_match(",<(li|div)[^>]*editer_bio[^>]*>,Uims", $flux['data'], $m)) {
315                                $contexte['tag'] = $m[1];
316                                $p = strpos($flux['data'], $m[0]);
317                                $ins = recuperer_fond('formulaires/editer_auteur_organisation', $contexte);
318                                $flux['data'] = substr_replace($flux['data'], $ins, $p, 0);
319                        }
320                }
321        }
322        return $flux;
323}
324
325function contacts_formulaire_charger($flux) {
326        if ($flux['args']['form'] == 'editer_auteur'
327                and isset($flux['data']['id_auteur'])
328                and $id_auteur = intval($flux['data']['id_auteur'])
329          and contacts_edition_integree_auteur()){
330                if ($contact = sql_fetsel('*','spip_contacts','id_auteur='.intval($id_auteur))){
331                        $flux['data']['id_contact'] = $contact['id_contact'];
332                        unset($contact['id_contact']);
333                        foreach($contact as $k=>$v){
334                                $flux['data']['contact_'.$k] = $v;
335                        }
336                }
337                elseif ($organisation = sql_fetsel('*','spip_organisations','id_auteur='.intval($id_auteur))){
338                        $flux['data']['id_organisation'] = $organisation['id_organisation'];
339                        unset($organisation['id_organisation']);
340                        foreach($organisation as $k=>$v){
341                                $flux['data']['organisation_'.$k] = $v;
342                        }
343                }
344        }
345        return $flux;
346}
347function contacts_formulaire_traiter($flux) {
348        if ($flux['args']['form'] == 'editer_auteur'
349          and $id_auteur = intval($flux['data']['id_auteur'])){
350
351                $prefixe = $objet = $id_objet = '';
352                if ($id_contact = intval(_request('id_contact'))
353                  and sql_countsel('spip_contacts','id_auteur='.intval($id_auteur).' AND id_contact='.intval($id_contact))) {
354                        $prefixe = 'contact_';
355                        $objet = 'contact';
356                        $id_objet = $id_contact;
357                }
358                elseif ($id_organisation = intval(_request('id_organisation'))
359                  and sql_countsel('spip_organisations','id_auteur='.intval($id_auteur).' AND id_organisation='.intval($id_organisation))) {
360                        $prefixe = 'organisation_';
361                        $objet = 'organisation';
362                        $id_objet = $id_organisation;
363                }
364                if ($prefixe and $objet and $id_objet){
365                        $l = strlen($prefixe);
366                        foreach ($_REQUEST as $k=>$v) {
367                                if (strncmp($k, $prefixe , $l) !==0
368                                        and strncmp($k, 'var_' , 4) !==0 ){
369                                        set_request($k);
370                                }
371                        }
372                        foreach ($_REQUEST as $k=>$v) {
373                                if (strncmp($k, $prefixe , $l) ==0 ){
374                                        set_request(substr($k,$l), $v);
375                                }
376                        }
377                        formulaires_editer_objet_traiter($objet, $id_objet, 0, 0, '');
378                }
379        }
380        return $flux;
381}
Note: See TracBrowser for help on using the repository browser.