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

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

Formattage

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