source: spip-zone/_plugins_/editer_liens_simples/formulaires/editer_liens_simples.php @ 58270

Last change on this file since 58270 was 58270, checked in by marcimat@…, 9 years ago

Les squelettes de vue et d'association sont renommés d'après la table de liaison, puis l'objet cherché, soit 'xxx_yyy_xxx_lies' ou 'xxx_yyy_yyy_lies'.

File size: 6.9 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2012                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15/**
16 * La différence avec #FORMULAIRE_EDITER_LIENS
17 * est que ce formulaire #FORMULAIRE_EDITER_LIENS_SIMPLES
18 * porte sur des tables de liaisons 'spip_x_y' et non 'spip_x_liens'
19 *
20**/
21include_spip('formulaires/editer_liens');
22
23
24
25/**
26 * #FORMULAIRE_EDITER_LIENS_SIMPLES{auteurs,article,23}
27 *   pour associer des auteurs à l'article 23, sur la table pivot spip_auteurs_articles
28 * #FORMULAIRE_EDITER_LIENS_SIMPLES{article,23,auteurs}
29 *   pour associer des auteurs à l'article 23, sur la table pivot spip_articles_auteurs
30 * #FORMULAIRE_EDITER_LIENS_SIMPLES{articles,auteur,12}
31 *   pour associer des articles à l'auteur 12, sur la table pivot spip_articles_auteurs
32 * #FORMULAIRE_EDITER_LIENS_SIMPLES{auteur,12,articles}
33 *   pour associer des articles à l'auteur 12, sur la table pivot spip_auteurs_articles
34 *
35 * @param string $a
36 * @param string|int $b
37 * @param int|string $c
38 * @param bool $editable
39 * @return array
40 */
41function formulaires_editer_liens_simples_charger_dist($a,$b,$c,$editable=true){
42
43        list($table_source,$objet,$id_objet,$objet_lien) = determine_source_lien_objet($a,$b,$c);
44        if (!$table_source OR !$objet OR !$objet_lien OR !$id_objet)
45                return false;
46
47        $objet_source = objet_type($table_source);
48        $table_sql_source = table_objet_sql($objet_source);
49
50
51        // verifier existence de la table xxx_yyy
52        include_spip('action/editer_liens_simples');
53        $objet_dest = ($objet_lien==$objet_source ? $objet : $objet_source);
54        if (!$table_liaison = objet_associable_simple($objet_lien, $objet_dest))
55                return false;
56
57        if (!$editable AND !count(objet_trouver_liens_simples(array($objet_lien=>'*'),array($objet_dest=>'*'))))
58                return false;
59
60        $skel = table_objet($objet_lien) . '_' . table_objet($objet_dest) . '_' . table_objet($objet_source);
61        $valeurs = array(
62                'id'=>"$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
63                '_vue_liee' =>  $skel . "_lies",
64                '_vue_ajout' =>  $skel . "_associer",
65                '_objet_lien' => $objet_lien,
66                'id_lien_ajoute'=>_request('id_lien_ajoute'),
67                'objet'=>$objet,
68                'id_objet'=>$id_objet,
69                // mauvaise idee parce que 'action' s'en supprimerait ensuite dans balise_FORMULAIRE__contexte()
70                #id_table_objet($objet) => $id_objet, // id_organisation => 8
71                'objet_source'=>$objet_source,
72                'recherche'=>'',
73                'visible'=>0,
74                'editable'=>autoriser('modifier',$objet,$id_objet),
75                'ajouter_lien'=>'',
76                'supprimer_lien'=>'',
77                '_oups' => _request('_oups'),
78                'editable' => $editable?true:false,
79        );
80
81        return $valeurs;
82}
83
84/**
85 * Traiter le post des informations d'edition de liens
86 * Les formulaires postent dans trois variables ajouter_lien et supprimer_lien
87 * et remplacer_lien
88 *
89 * Les deux premieres peuvent etre de trois formes differentes :
90 * ajouter_lien[]="objet1-id1-objet2-id2"
91 * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi"
92 * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2"
93 * Dans ce dernier cas, la valeur ne sera prise en compte
94 * que si _request('clenonnumerique') est vrai (submit associe a l'input)
95 *
96 * remplacer_lien doit etre de la forme
97 * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2"
98 * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute
99 *
100 * @param string $a
101 * @param string|int $b
102 * @param int|string $c
103 * @param bool $editable
104 * @return array
105 */
106function formulaires_editer_liens_simples_traiter_dist($a,$b,$c,$editable=true){
107        $res = array('editable'=>$editable?true:false);
108       
109        list($table_source,$objet,$id_objet,$objet_lien) = determine_source_lien_objet($a,$b,$c);
110        if (!$table_source OR !$objet OR !$objet_lien)
111                return $res;
112
113
114        if (_request('tout_voir'))
115                set_request('recherche','');
116
117
118        if (autoriser('modifier',$objet,$id_objet)) {
119                // annuler les suppressions du coup d'avant !
120                if (_request('annuler_oups')
121                        AND $oups = _request('_oups')
122                        AND $oups = unserialize($oups)){
123                        $objet_source = objet_type($table_source);
124                        include_spip('action/editer_liens_simples');
125                        foreach($oups as $oup) {
126                                if ($objet_lien==$objet_source)
127                                        objet_associer_simples(array($objet_source=>$oup[$objet_source]), array($objet=>$oup[$objet]),$oup);
128                                else
129                                        objet_associer_simples(array($objet=>$oup[$objet]), array($objet_source=>$oup[$objet_source]),$oup);
130                        }
131                        # oups ne persiste que pour la derniere action, si suppression
132                        set_request('_oups');
133                }
134
135                $supprimer = _request('supprimer_lien');
136                $ajouter = _request('ajouter_lien');
137
138                // il est possible de preciser dans une seule variable un remplacement :
139                // remplacer_lien[old][new]
140                if ($remplacer = _request('remplacer_lien')){
141                        foreach($remplacer as $k=>$v){
142                                if ($old = lien_verifier_action($k,'')){
143                                        foreach(is_array($v)?$v:array($v) as $kn=>$vn)
144                                                if ($new = lien_verifier_action($kn,$vn)){
145                                                        $supprimer[$old] = 'x';
146                                                        $ajouter[$new] = '+';
147                                                }
148                                }
149                        }
150                }
151
152                if ($supprimer){
153                        include_spip('action/editer_liens_simples');
154                        $oups = array();
155
156                        foreach($supprimer as $k=>$v) {
157                                if ($lien = lien_verifier_action($k,$v)){
158                                        $lien = explode("-",$lien);
159                                        list($objet_source,$ids,$objet_lie,$idl) = $lien;
160                                        if ($objet_lien==$objet_source){
161                                                $oups = array_merge($oups,  objet_trouver_liens_simples(array($objet_source=>$ids), array($objet_lie=>$idl)));
162                                                objet_dissocier_simples(array($objet_source=>$ids), array($objet_lie=>$idl));
163                                        }
164                                        else{
165                                                $oups = array_merge($oups,  objet_trouver_liens_simples(array($objet_lie=>$idl), array($objet_source=>$ids)));
166                                                objet_dissocier_simples(array($objet_lie=>$idl), array($objet_source=>$ids));
167                                        }
168                                }
169                        }
170                        set_request('_oups',$oups?serialize($oups):null);
171                }
172               
173                if ($ajouter){
174                        $ajout_ok = false;
175                        include_spip('action/editer_liens_simples');
176                        foreach($ajouter as $k=>$v){
177                                if ($lien = lien_verifier_action($k,$v)){
178                                        $ajout_ok = true;
179                                        list($objet1,$ids,$objet2,$idl) = explode("-",$lien);
180                                        if ($objet_lien==$objet1)
181                                                objet_associer_simples(array($objet1=>$ids), array($objet2=>$idl));
182                                        else
183                                                objet_associer_simples(array($objet2=>$idl), array($objet1=>$ids));
184                                        set_request('id_lien_ajoute',$ids);
185                                }
186                        }
187                        # oups ne persiste que pour la derniere action, si suppression
188                        # une suppression suivie d'un ajout dans le meme hit est un remplacement
189                        # non annulable !
190                        if ($ajout_ok)
191                                set_request('_oups');
192                }
193        }
194       
195        return $res;
196}
197
198?>
Note: See TracBrowser for help on using the repository browser.