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

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

Petit plugin pour SPIP 3 mal nommé «Éditer liens simples» pour permettre de lier des objets sur les vieilles tables spip_xxx_yyy tel que «spip_organisations_contacts» (et non spip_xxx_liens).

On reprend le même fonctionnement que l'API editer_liens de SPIP 3, mais en préfixant de _simples.

On a #FORMULAIRE_EDITER_LIENS_SIMPLES (mêmes arguments que #FORMULAIRE_EDITER_LIENS)
qui appele des squelettes prive/objets/liste/xxx_yyy_lies et xxx_yyy_associer (et non xxx_lies et xxx_associer).

Dans la même veine, action/editer_liens_simples fourni l'API un peu identique (tout n'est pas terminé, mais cela est suffisant pour faire fonctionner le formulaire d'édition de liens).

Ceux qui en ont besoin pourront paufiner les fonctions manquantes (dupliquer_liens_simples notamment).

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        if (!$table_liaison = objet_associable_simple($objet_lien, $objet_source))
54                return false;
55
56
57        if (!$editable AND !count(objet_trouver_liens_simples(array($objet_lien=>'*'),array(($objet_lien==$objet_source?$objet:$objet_source)=>'*'))))
58                return false;
59       
60        $valeurs = array(
61                'id'=>"$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
62                '_vue_liee' => $table_source . '_' . table_objet($objet_lien) . "_lies",
63                '_vue_ajout' => $table_source . '_' . table_objet($objet_lien) . "_associer",
64                '_objet_lien' => $objet_lien,
65                'id_lien_ajoute'=>_request('id_lien_ajoute'),
66                'objet'=>$objet,
67                'id_objet'=>$id_objet,
68                // mauvaise idee parce que 'action' s'en supprimerait ensuite dans balise_FORMULAIRE__contexte()
69                #id_table_objet($objet) => $id_objet, // id_organisation => 8
70                'objet_source'=>$objet_source,
71                'recherche'=>'',
72                'visible'=>0,
73                'editable'=>autoriser('modifier',$objet,$id_objet),
74                'ajouter_lien'=>'',
75                'supprimer_lien'=>'',
76                '_oups' => _request('_oups'),
77                'editable' => $editable?true:false,
78        );
79
80        return $valeurs;
81}
82
83/**
84 * Traiter le post des informations d'edition de liens
85 * Les formulaires postent dans trois variables ajouter_lien et supprimer_lien
86 * et remplacer_lien
87 *
88 * Les deux premieres peuvent etre de trois formes differentes :
89 * ajouter_lien[]="objet1-id1-objet2-id2"
90 * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi"
91 * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2"
92 * Dans ce dernier cas, la valeur ne sera prise en compte
93 * que si _request('clenonnumerique') est vrai (submit associe a l'input)
94 *
95 * remplacer_lien doit etre de la forme
96 * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2"
97 * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute
98 *
99 * @param string $a
100 * @param string|int $b
101 * @param int|string $c
102 * @param bool $editable
103 * @return array
104 */
105function formulaires_editer_liens_simples_traiter_dist($a,$b,$c,$editable=true){
106        $res = array('editable'=>$editable?true:false);
107       
108        list($table_source,$objet,$id_objet,$objet_lien) = determine_source_lien_objet($a,$b,$c);
109        if (!$table_source OR !$objet OR !$objet_lien)
110                return $res;
111
112
113        if (_request('tout_voir'))
114                set_request('recherche','');
115
116
117        if (autoriser('modifier',$objet,$id_objet)) {
118                // annuler les suppressions du coup d'avant !
119                if (_request('annuler_oups')
120                        AND $oups = _request('_oups')
121                        AND $oups = unserialize($oups)){
122                        $objet_source = objet_type($table_source);
123                        include_spip('action/editer_liens_simples');
124                        foreach($oups as $oup) {
125                                if ($objet_lien==$objet_source)
126                                        objet_associer_simples(array($objet_source=>$oup[$objet_source]), array($objet=>$oup[$objet]),$oup);
127                                else
128                                        objet_associer_simples(array($objet=>$oup[$objet]), array($objet_source=>$oup[$objet_source]),$oup);
129                        }
130                        # oups ne persiste que pour la derniere action, si suppression
131                        set_request('_oups');
132                }
133
134                $supprimer = _request('supprimer_lien');
135                $ajouter = _request('ajouter_lien');
136
137                // il est possible de preciser dans une seule variable un remplacement :
138                // remplacer_lien[old][new]
139                if ($remplacer = _request('remplacer_lien')){
140                        foreach($remplacer as $k=>$v){
141                                if ($old = lien_verifier_action($k,'')){
142                                        foreach(is_array($v)?$v:array($v) as $kn=>$vn)
143                                                if ($new = lien_verifier_action($kn,$vn)){
144                                                        $supprimer[$old] = 'x';
145                                                        $ajouter[$new] = '+';
146                                                }
147                                }
148                        }
149                }
150
151                if ($supprimer){
152                        include_spip('action/editer_liens_simples');
153                        $oups = array();
154
155                        foreach($supprimer as $k=>$v) {
156                                if ($lien = lien_verifier_action($k,$v)){
157                                        $lien = explode("-",$lien);
158                                        list($objet_source,$ids,$objet_lie,$idl) = $lien;
159                                        if ($objet_lien==$objet_source){
160                                                $oups = array_merge($oups,  objet_trouver_liens_simples(array($objet_source=>$ids), array($objet_lie=>$idl)));
161                                                objet_dissocier_simples(array($objet_source=>$ids), array($objet_lie=>$idl));
162                                        }
163                                        else{
164                                                $oups = array_merge($oups,  objet_trouver_liens_simples(array($objet_lie=>$idl), array($objet_source=>$ids)));
165                                                objet_dissocier_simples(array($objet_lie=>$idl), array($objet_source=>$ids));
166                                        }
167                                }
168                        }
169                        set_request('_oups',$oups?serialize($oups):null);
170                }
171               
172                if ($ajouter){
173                        $ajout_ok = false;
174                        include_spip('action/editer_liens_simples');
175                        foreach($ajouter as $k=>$v){
176                                if ($lien = lien_verifier_action($k,$v)){
177                                        $ajout_ok = true;
178                                        list($objet1,$ids,$objet2,$idl) = explode("-",$lien);
179                                        if ($objet_lien==$objet1)
180                                                objet_associer_simples(array($objet1=>$ids), array($objet2=>$idl));
181                                        else
182                                                objet_associer_simples(array($objet2=>$idl), array($objet1=>$ids));
183                                        set_request('id_lien_ajoute',$ids);
184                                }
185                        }
186                        # oups ne persiste que pour la derniere action, si suppression
187                        # une suppression suivie d'un ajout dans le meme hit est un remplacement
188                        # non annulable !
189                        if ($ajout_ok)
190                                set_request('_oups');
191                }
192        }
193       
194        return $res;
195}
196
197?>
Note: See TracBrowser for help on using the repository browser.