source: spip-zone/_plugins_/elearning/trunk/inc/elearning_zones.php @ 99366

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

du nettoyage

File size: 8.7 KB
Line 
1<?php
2#---------------------------------------------------#
3#  Plugin  : E-Learning                             #
4#  Auteur  : RastaPopoulos                          #
5#  Licence : GPL                                    #
6#--------------------------------------------------------------- -#
7#  Documentation : http://www.spip-contrib.net/Plugin-E-learning  #
8#-----------------------------------------------------------------#
9
10// Sécurité
11if (!defined('_ECRIRE_INC_VERSION')) {
12        return;
13}
14
15include_spip('inc/config');
16include_spip('inc/cfg_config');
17
18// Met à jour les accès restreint lorsque l'on modifie la configuration CFG du plugin E-Learning
19function elearning_mettre_a_jour_les_zones($id_nouvelle_rubrique){
20
21        $id_nouvelle_rubrique = intval($id_nouvelle_rubrique);
22        $id_zone = elearning_verifier_la_zone();
23       
24        // Si la nouvelle rubrique n'était pas dans la zone
25        // ou si la nouvelle rubrique est différente de celle de la config
26        // alors il faut nettoyer
27        if (!elearning_verifier_le_lien($id_nouvelle_rubrique, $id_zone)
28        or $id_nouvelle_rubrique != intval(lire_config('elearning/rubrique_elearning')))
29                elearning_nettoyer_les_zones_modules();
30       
31        // On peut maintenant définir la nouvelle rubrique comme celle du e-learning
32        $ok = elearning_definir_la_rubrique_elearning($id_nouvelle_rubrique);
33       
34        return _T('elearning:configuration_ok');
35
36}
37
38
39// Vérifie qu'il y a une zone dédiée au e-learning et la crée si nécessaire
40// Retourne l'id_zone
41function elearning_verifier_la_zone(){
42
43        find_in_path('abstract_sql.php', 'base/', true);
44       
45        // On vérifie s'il y a une zone déjà enregistrée
46        $id_zone = intval(lire_config('elearning/zone_elearning'));
47       
48        // Si oui, on vérifie qu'elle existe toujours
49        if ($id_zone)
50                $id_zone = intval(sql_getfetsel(
51                        'id_zone',
52                        'spip_zones',
53                        'id_zone = '.$id_zone
54                ));
55       
56        // Si elle n'existe pas, on la crée
57        if (!$id_zone){
58       
59                $id_zone = sql_insertq(
60                        'spip_zones',
61                        array(
62                                'titre' => 'Zone de la formation',
63                                'descriptif' => 'Cette zone contient la rubrique-mère de la formation.',
64                                'publique' => 'oui',
65                                'privee' => 'oui'
66                        )
67                );
68                ecrire_config('elearning/zone_elearning',$id_zone);
69       
70        }
71       
72        return $id_zone;
73
74}
75
76
77// Vérifie si une rubrique est dans une zone
78// dont on considère qu'elle ne doit contenir qu'une rubrique
79// Retourne si vrai ou pas
80function elearning_verifier_le_lien($id_nouvelle_rubrique, $id_zone){
81
82        find_in_path('abstract_sql.php', 'base/', true);
83       
84        // On vérifie si la rubrique choisie est déjà dans la bonne zone
85        $id_rubrique_test = intval(sql_getfetsel(
86                'id_rubrique',
87                'spip_zones_rubriques',
88                array(
89                        'id_zone = '.$id_zone
90                )
91        ));
92       
93        if (!$id_rubrique_test or $id_rubrique_test != $id_nouvelle_rubrique)
94                return false;
95        else
96                return true;
97
98}
99
100
101// Définit une rubrique comme étant celle du e-learning :
102// - lie la rubrique à sa zone dédiée
103// - crée une zone pour chaque sous-rubrique c-à-d chaque module
104// - lie chaque module à sa zone
105function elearning_definir_la_rubrique_elearning($id_rubrique){
106
107        // On vérifie le paramètre
108        if (!$id_rubrique or $id_rubrique <= 0)
109                return false;
110       
111        find_in_path('abstract_sql.php', 'base/', true);
112       
113        // On récupère la zone e-learning
114        $id_zone = intval(lire_config('elearning/zone_elearning'));
115       
116        // On lie la rubrique à sa zone
117        sql_insertq(
118                'spip_zones_rubriques',
119                array(
120                        'id_zone' => $id_zone,
121                        'id_rubrique' => $id_rubrique
122                )
123        );
124       
125        // On récupère les rubriques de modules
126        $modules = sql_select(
127                array('id_rubrique', 'titre'),
128                'spip_rubriques',
129                array(
130                        'id_parent = '.$id_rubrique
131                )
132        );
133       
134        // On crée une zone pour chaque module et on les lie ensemble
135        while ($module = sql_fetch($modules)){
136
137                // Création de la zone
138                $id_zone_module = sql_insertq(
139                        'spip_zones',
140                        array(
141                                'titre' => 'Restriction du module "'.supprimer_numero($module['titre']).'"',
142                                'publique' => 'oui',
143                                'privee' => 'oui'
144                        )
145                );
146       
147                // Création du lien si ça a marché
148                if ($id_zone_module)
149                        sql_insertq(
150                                'spip_zones_rubriques',
151                                array(
152                                        'id_zone' => $id_zone_module,
153                                        'id_rubrique' => intval($module['id_rubrique'])
154                                )
155                        );
156               
157                // Enregistrement de la zone dans la config de la rubrique, pour accès rapide
158                ecrire_config('tablepack::rubrique@extra:'.intval($module['id_rubrique']).'/elearning/zone',$id_zone_module);
159
160        }
161       
162        return true;
163
164}
165
166
167// Nettoie les zones de modules créées automatiquement par le plugin, ainsi que tous les liens qui vont avec
168function elearning_nettoyer_les_zones_modules(){
169
170        find_in_path('abstract_sql.php', 'base/', true);
171       
172        // On récupère la zone contenant le e-learning
173        $id_zone = intval(lire_config('elearning/zone_elearning'));
174       
175        // On récupère l'ancienne rubrique choisie pour le e-learning
176        $id_rubrique = intval(lire_config('elearning/rubrique_elearning'));
177       
178        // On supprime le lien entre les deux
179        sql_delete(
180                'spip_zones_rubriques',
181                'id_zone = '.$id_zone.' AND id_rubrique = '.$id_rubrique
182        );
183       
184        // On récupère les anciennes rubriques de modules
185        $modules = sql_allfetsel(
186                'id_rubrique',
187                'spip_rubriques',
188                array(
189                        'id_parent = '.$id_rubrique
190                )
191        );
192        $modules = array_map('reset', $modules);
193       
194        // Seulement s'il y a bien des modules
195        if (count($modules) > 0){
196       
197                // On récupère toutes les zones afférentes
198                $zones_modules = sql_allfetsel(
199                        'distinct id_zone',
200                        'spip_zones_rubriques',
201                        'id_rubrique IN ('.join(', ', $modules).')'
202                );
203                $zones_modules = array_map('reset', $zones_modules);
204       
205                // Seulement s'il y a des zones
206                if (count($zones_modules) > 0){
207               
208                        // On supprime toutes ces zones
209                        sql_delete(
210                                'spip_zones',
211                                'id_zone IN ('.join(', ', $zones_modules).')'
212                        );
213       
214                        // On supprime les liens de ces zones avec des rubriques
215                        sql_delete(
216                                'spip_zones_rubriques',
217                                'id_zone IN ('.join(', ', $zones_modules).')'
218                        );
219       
220                        /*// On supprime les liens de ces zones avec des auteurs
221                        sql_delete(
222                                'spip_zones_auteurs',
223                                'id_zone IN ('.join(', ', $zones_modules).')'
224                        );*/
225               
226                }
227       
228        }
229
230}
231
232
233// Pipeline des zones autorisées, renvoie une liste à virgule
234function elearning_liste_zones_autorisees($zones='', $id_auteur=NULL) {
235        $id = NULL;
236        if (!is_null($id_auteur))
237                $id = $id_auteur;
238       
239        $new = elearning_liste_zones_autorisees_auteur($id);
240        if ($zones AND $new) {
241                $zones = array_unique(array_merge(explode(',',$zones),$new));
242                sort($zones);
243                $zones = join(',', $zones);
244        } else if ($new) {
245                $zones = join(',', $new);
246        }
247       
248        return $zones;
249}
250
251
252// Renvoie un tableau listant les zones de module autorisées pour un auteur
253function elearning_liste_zones_autorisees_auteur($id_auteur=null){
254
255        // On va remplir petit à petit ce tableau
256        $zones_modules = array();
257       
258        find_in_path('abstract_sql.php', 'base/', true);
259       
260        // On récupère la rubrique e-learning
261        $id_rubrique = intval(lire_config('elearning/rubrique_elearning'));
262       
263        // On récupère tous les modules
264        $modules = sql_allfetsel(
265                'id_rubrique',
266                'spip_rubriques',
267                array(
268                        'id_parent = '.$id_rubrique
269                )
270        );
271        $modules = array_map('reset', $modules);
272       
273        // Si $id_auteur est nul, l'auteur est celui de la session, sinon on récupère dans la base
274        if (is_null($id_auteur) or $id_auteur <= 0)
275                $auteur = $GLOBALS['visiteur_session'];
276        else
277                $auteur = sql_fetsel(
278                        '*',
279                        'spip_auteurs',
280                        array(
281                                'id_auteur = '.$id_auteur
282                        )
283                );
284       
285        // Si la personne est au moins rédacteur elle accède à tous les modules
286        if ($auteur['statut'] <= '1comite'){
287       
288                // On récupère les zones de chaque modules
289                foreach ($modules as $module){
290       
291                        $module = intval($module);
292                        $zones_modules[] = intval(lire_config('tablepack::rubrique@extra:'.$module.'/elearning/zone'));
293       
294                }
295       
296        }
297        // Sinon on teste les résultats des jeux associés aux rubriques
298        else{
299       
300                foreach ($modules as $module){
301               
302                        $module = intval($module);
303                        $jeu = intval(lire_config('tablepack::rubrique@extra:'.$module.'/elearning/jeu'));
304                        $score_a_atteindre = intval(lire_config('tablepack::rubrique@extra:'.$module.'/elearning/score'));
305                       
306                        // Si ya pas de jeu ou un score de 0, on ne teste rien et on autorise
307                        if (!$jeu or !$score_a_atteindre)
308                                $zones_modules[] = intval(lire_config('tablepack::rubrique@extra:'.$module.'/elearning/zone'));
309                        else{
310                       
311                                // On récupère le dernier résultat de jeu de la personne
312                                $resultat = sql_fetsel(
313                                        array(
314                                                'resultat_court',
315                                                'total'
316                                        ),
317                                        'spip_jeux_resultats',
318                                        array(
319                                                'id_jeu = '.$jeu,
320                                                'id_auteur = '.$auteur['id_auteur']
321                                        ),
322                                        '',
323                                        'date desc'
324                                );
325                                if ($resultat)
326                                        $score = 100 * $resultat['resultat_court'] / $resultat['total'];
327                                else
328                                        $score = 0;
329                               
330                                // Si le score est bon, on autorise
331                                if ($score >= $score_a_atteindre)
332                                        $zones_modules[] = intval(lire_config('tablepack::rubrique@extra:'.$module.'/elearning/zone'));
333                       
334                        }
335               
336                }
337       
338        }
339       
340        return $zones_modules;
341
342}
Note: See TracBrowser for help on using the repository browser.