[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / mots / formulaires / administrer_mot.php
1 <?php
2
3 if (!defined("_ECRIRE_INC_VERSION")) return;
4
5 function formulaires_administrer_mot_charger_dist($id_mot){
6 $valeurs = array(
7 'associer_objets_mot' => '',
8 'dissocier_objets_mot' => '',
9 'fusionner_mot' => '',
10 'associer_objets_mot_id' => '',
11 'dissocier_objets_mot_id' => '',
12 'fusionner_mot_id' => '',
13 'revert_action' => '',
14 );
15
16 return $valeurs;
17 }
18
19 function afficher_options_mots($id_selected) {
20 static $options;
21 if (is_null($options)){
22 // d'abord les count en 1 coup
23 $counts = sql_allfetsel('id_mot,count(id_objet) as n','spip_mots_liens','','id_mot','id_mot');
24 $counts = array_combine(array_map('reset',$counts), array_map('end',$counts));
25
26 // puis les groupes
27 $groupes = sql_allfetsel('*', 'spip_groupes_mots', '', '', '0+ titre, titre');
28 foreach($groupes as $groupe) {
29 $options['groupeopen-'.$groupe['id_groupe']] = '<optgroup label="'.attribut_html(typo(supprimer_numero($groupe['titre']))).'">';
30 $res = sql_select('id_mot, titre', 'spip_mots', 'id_groupe='.intval($groupe['id_groupe']), '', '0+ titre, titre');
31 while($row = sql_fetch($res)) {
32 $id_mot = $row['id_mot'];
33 if (isset($counts[$id_mot]) and $n = $counts[$id_mot]) {
34 $options[$id_mot] = '<option value="'.$id_mot.'">'.typo(supprimer_numero($row['titre']))." ($n)</option>";
35 }
36 }
37 $options['groupeclose-'.$groupe['id_groupe']] = '</optgroup>';
38 }
39
40 }
41 if ($id_selected and isset($options[$id_selected])) {
42 $options[$id_selected] = inserer_attribut($options[$id_selected], 'selected', 'selected');
43 }
44 $s = implode("\n",$options);
45 if ($id_selected and isset($options[$id_selected])) {
46 $options[$id_selected] = vider_attribut($options[$id_selected], 'selected');
47 }
48 return $s;
49 }
50
51
52 function formulaires_administrer_mot_verifier_dist($id_mot){
53
54 $erreurs = array();
55
56 $check = "";
57 if (_request('associer')){
58 $check = 'associer_objets_mot';
59 }
60 elseif (_request('dissocier')){
61 $check = 'dissocier_objets_mot';
62 }
63 elseif (_request('fusionner')){
64 $check = 'fusionner_mot';
65 }
66
67 if (!$check AND (!_request('revert') OR !_request('revert_action'))){
68 $erreurs['message_erreur'] = _T('adminmots:erreur_admin_mot_action_inconnue');
69 }
70 elseif($check) {
71 $id = admot_recupere_id_mot($check);
72 if (!$id){
73 $erreurs[$check] = _T('adminmots:erreur_selection_id');
74 }
75 elseif($id == $id_mot){
76 $erreurs[$check] = _T('adminmots:erreur_mot_cle_deja');
77 }
78 elseif($check=='fusionner_mot' AND !_request('confirm_fusionner_mot')){
79 $counts = sql_allfetsel("objet,count(id_objet) as N","spip_mots_liens","id_mot=".intval($id_mot),"objet");
80 $detail = array();
81 foreach($counts as $count){
82 $detail [] = objet_afficher_nb($count['N'],$count['objet']);
83 }
84 $detail = implode(", ",$detail);
85 if (!isset($erreurs['message_erreur'])) {
86 $erreurs['message_erreur'] = '';
87 }
88 $erreurs[$check] =
89 _T('adminmots:label_confirm_fusion',array('id_mot'=>$id_mot,'id_mot_new'=>$id))
90 . " <b>$detail</b>" . "<br />\n"
91 . "<input type='checkbox' name='confirm_fusionner_mot' value='1' id='confirm_fusionner_mot' /> "
92 . "<label for='confirm_fusionner_mot'>"
93 . _T('adminmots:label_confirm_fusion_check',array('id_mot'=>$id_mot,'id_mot_new'=>$id))
94 . "</label>";
95 }
96 }
97
98 return $erreurs;
99 }
100
101 function admot_recupere_id_mot($name){
102 if (!$id_mot = intval(_request($name . '_id')))
103 $id_mot = intval(_request($name));
104
105 return $id_mot;
106 }
107
108 function admot_associer_objets_mot($id_mot, $objet, $ids){
109 if (count($ids)){
110 $couples = array();
111 foreach($ids as $id){
112 $couples[] = array(
113 'id_mot' => $id_mot,
114 'id_objet' => $id,
115 'objet' => $objet
116 );
117 }
118 return sql_insertq_multi("spip_mots_liens",$couples);
119 }
120 return false;
121 }
122
123 function admot_dissocier_objets_mot($id_mot, $objet, $ids){
124 if (count($ids)){
125 return sql_delete("spip_mots_liens","id_mot=".intval($id_mot)." AND objet=".sql_quote($objet)." AND ".sql_in('id_objet',$ids));
126 }
127 return false;
128 }
129
130
131 function formulaires_administrer_mot_traiter_dist($id_mot){
132
133 refuser_traiter_formulaire_ajax();
134 if (_request('revert')){
135 $action = _request('revert_action');
136 $action = explode("/",$action);
137 $quoi = array_shift($action);
138 foreach($action as $a) {
139 list($objet, $ids) = explode(':', $a);
140 $ids = explode(',',$ids);
141 if ($objet and $ids) {
142 if ($quoi=="add"){
143 admot_associer_objets_mot($id_mot, $objet, $ids);
144 }
145 if ($quoi=="del"){
146 admot_dissocier_objets_mot($id_mot, $objet, $ids);
147 }
148 }
149 }
150 $res['message_ok'] = _T('adminmots:result_cancel_ok');
151 set_request('revert_action','');
152 }
153 else {
154 $check = '';
155 if (_request('associer')){
156 $check = 'associer_objets_mot';
157 }
158 elseif (_request('dissocier')){
159 $check = 'dissocier_objets_mot';
160 }
161 elseif (_request('fusionner')){
162 $check = 'fusionner_mot';
163 }
164 $id = admot_recupere_id_mot($check);
165
166 $revert = "";
167 $res = array();
168 // associer
169 if ($check=="associer_objets_mot"){
170 $revert = array();
171 $message = array();
172 $objets = sql_allfetsel("distinct objet","spip_mots_liens","id_mot=".intval($id),'','objet');
173 $objets = array_map('reset',$objets);
174 foreach($objets as $objet) {
175 $all = sql_allfetsel("id_objet","spip_mots_liens","id_mot=".intval($id)." AND objet=".sql_quote($objet));
176 $all = array_map('reset',$all);
177 $deja = sql_allfetsel("id_objet","spip_mots_liens","id_mot=".intval($id_mot)." AND objet=".sql_quote($objet)." AND ".sql_in('id_objet',$all));
178 $deja = array_map('reset',$deja);
179 $add = array_diff($all,$deja);
180 if (count($add)){
181 $revert[] = "$objet:".implode(",",$add);
182 admot_associer_objets_mot($id_mot, $objet, $add);
183 $message[] = objet_afficher_nb(count($add), $objet);
184 }
185 }
186 if (count($message)){
187 $revert = "del/".implode("/",$revert);
188 $message = implode(', ', $message);
189 $res['message_ok'] = $message . _T('adminmots:result_associer_nb');
190 }
191 else {
192 $res['message_ok'] = _T('adminmots:result_associer_ras');
193 }
194 }
195 // dissocier
196 if ($check=="dissocier_objets_mot"){
197 $revert = array();
198 $message = array();
199 $objets = sql_allfetsel("distinct objet","spip_mots_liens","id_mot=".intval($id),'','objet');
200 $objets = array_map('reset',$objets);
201 foreach($objets as $objet){
202 $all = sql_allfetsel("id_objet", "spip_mots_liens", "id_mot=" . intval($id) . " AND objet=" . sql_quote($objet));
203 $all = array_map('reset', $all);
204 $has = sql_allfetsel("id_objet", "spip_mots_liens", "id_mot=" . intval($id_mot) . " AND objet=" . sql_quote($objet) . " AND " . sql_in('id_objet', $all));
205 $has = array_map('reset', $has);
206 if (count($has)){
207 $revert[] = "$objet:".implode(",",$has);
208 admot_dissocier_objets_mot($id_mot, $objet, $has);
209 $message[] = objet_afficher_nb(count($has), $objet);
210 }
211 }
212 if (count($message)){
213 $revert = "add/".implode("/",$revert);
214 $message = implode(', ', $message);
215 $res['message_ok'] = $message . _T('adminmots:result_dissocier_nb');
216 }
217 else {
218 $res['message_ok'] = _T('adminmots:result_dissocier_ras');
219 }
220 }
221
222 // fusionner
223 if ($check=="fusionner_mot"){
224 $all = sql_allfetsel("id_objet,objet,id_mot","spip_mots_liens","id_mot=".intval($id_mot));
225 $mot = sql_fetsel("*","spip_mots","id_mot=".intval($id_mot));
226 $dump = var_export($mot,true) . "\n\n". var_export($all,true);
227 ecrire_fichier(_DIR_LOG."fusion_mot_{$id_mot}_vers_{$id}_".date('Y-m-d-His').".dump",$dump);
228 foreach($all as $a){
229 $a['id_mot'] = $id;
230 sql_insertq('spip_mots_liens',$a);
231 }
232 sql_delete("spip_mots_liens","id_mot=".$id_mot);
233 $link = "<a href='".generer_url_entite($id,'mot')."'>".objet_info('mot','texte_objet')." #$id</a>";
234 $res['message_ok'] = _T('adminmots:result_fusionner_ok',array('mot'=>$link));
235 }
236
237 if ($revert)
238 set_request('revert_action',$revert);
239 }
240 set_request('administrer','oui');
241
242 return $res;
243 }