source: spip-zone/_core_/plugins/mots/formulaires/administrer_mot.php

Last change on this file was 112030, checked in by marcimat@…, 5 months ago

Utiliser array_column plutôt que array_map + reset / array_shift

File size: 7.7 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function 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
19function 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_column($counts, 'n', 'id_mot');
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
52function 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
101function 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
108function 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
123function 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
131function 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_column($objets, 'objet');
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_column($all, 'id_objet');
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_column($deja, 'id_objet');
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_column($objets, 'objet');
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_column($all, 'id_objet');
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_column($has, 'id_objet');
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}
Note: See TracBrowser for help on using the repository browser.