source: spip-zone/_plugins_/_stable_/qcm/qcm_pipelines.php @ 7276

Last change on this file since 7276 was 7276, checked in by patfr@…, 13 years ago

introduction d'introduction...
mais cette fonctionnalité doit être revue !

File size: 9.7 KB
Line 
1<?php
2/*
3  Nom du plugin      :  Un QCM dans vos articles
4  Auteur             :  Patrice VANNEUFVILLE
5                                                patfr@ifrance.com
6                                                (sur une idee originale de Mathieu GIANNECCHINI, 2003)
7  Date               :  30 octobre 2006
8  Fonction du plugin :  Parse le code du QCM tape dans SPIP et stocke
9                        les questions, reponses et commentaires
10                        dans un tableau et retourne le code HTML du QCM
11  Mode d'emploi          :      http://www.spip-contrib.net/Un-QCM-dans-vos-articles
12*/
13 
14 define(_QCM_DEBUT, '<qcm>');
15 define(_QCM_FIN, '</qcm>');
16 
17// cette fonction remplit le tableau $qcms sur la question $indexQCM
18function qcm_analyse_le_qcm($qcm, $indexQCM, &$titreQCM) {
19  global $qcms;
20  $lignes = split("\n", $qcm);
21  foreach ($lignes as $ligne) {
22        $li=trim($ligne); 
23    switch($li[0]){
24      case 'T' : 
25                // On extrait le titre
26                $titreQCM=substr($li,1);
27                break;
28
29      case 'Q' : 
30                // On extrait la question
31                $qcms[$indexQCM]['question'] = trim(substr($li, 1));
32                $qcms[$indexQCM]['maxscore'] = 0;
33                $qcms['nbquestions']++;
34        break;
35
36      case 'P' : 
37                // On extrait une proposition
38               
39                // On extrait les precisions de la proposition
40                list($reponse, $precision)=explode("|", $li);
41       
42                // On extrait le numero de la proposition et son contenu
43                ereg("^P([0-9]+)(.*)", $reponse, $eregResult); 
44                $indexProposition = $eregResult[1];
45                $suiteProposition = trim($eregResult[2]);
46                $qcms[$indexQCM]['nbpropositions']++;
47
48        // On extrait les points eventuellement associes a chaque reponse
49        if(ereg("^\.(-?[0-9]+)(.*)", $suiteProposition, $eregResult)){
50          $qcms[$indexQCM]['points'][$indexProposition] = intval($eregResult[1]);
51          $qcms[$indexQCM]['propositions'][$indexProposition] = trim($eregResult[2]);
52        }
53                else {
54          $qcms[$indexQCM]['points'][$indexProposition] = 0;
55          $qcms[$indexQCM]['propositions'][$indexProposition] = $suiteProposition;
56        }     
57               
58                // la precision eventuelle...
59        $qcms[$indexQCM]['precisions'][$indexProposition] = trim($precision);
60                break;
61       
62      case 'R' :
63                // On recupere le numero et les points de la bonne reponse
64                ereg("^R([0-9]+)", $li, $eregResult);   
65                $qcms[$indexQCM]['bonnereponse'] = $eregResult[1];
66
67                // au cas ou les points ne sont pas specifies pour la bonne reponse
68                if ($qcms[$indexQCM]['points'][$eregResult[1]]==0) 
69                  $qcms[$indexQCM]['points'][$eregResult[1]] = 1;
70
71                // total des points des bonnes reponses
72                $qcms[$indexQCM]['maxscore'] = $qcms[$indexQCM]['points'][$eregResult[1]];
73                break;
74
75      default : break;
76    }
77  } // foreach
78} // function
79
80// cette fonction retourne true si un qcm est trouve, false dans le cas contraire
81function qcm_recupere_une_question(&$chaine, &$indexQCM, &$titreQCM) {
82  global $qcms;
83 
84  // si les balises ouvrantes et fermantes ne sont pas presentes
85  if (strpos($chaine, _QCM_DEBUT)===false || strpos($chaine, _QCM_FIN)===false) return false;
86
87  // remplacement des qcm par : <ATTENTE_QCM>ii</ATTENTE_QCM>
88  list($texteAvant, $suite) = explode(_QCM_DEBUT, $chaine, 2); 
89  list($qcm, $texteApres) = explode(_QCM_FIN, $suite, 2); 
90  $chaine = "$texteAvant<ATTENTE_QCM>$indexQCM</ATTENTE_QCM>$texteApres";
91 
92  // On analyse le QCM
93  qcm_analyse_le_qcm($qcm, $indexQCM, $titreQCM);
94 
95  return true;
96}
97
98function qcm_les_points($phrase, $points) {
99    $pointsHTML = '<span class="spip_qcm_point"> ('.$points. _T('qcm:qcm_point'.($points>1?'s':'')).')</span>';
100        if (ereg('^(.*)( ?:)( *)$', $phrase, $eregResult)) $phrase = $eregResult[1].$pointsHTML.$eregResult[2].$eregResult[3];
101          else $phrase .= $pointsHTML;
102        return $phrase; 
103}
104
105function qcm_affiche_la_question($indexQCM, $corrigee, $gestionPoints) {
106  global $qcms, $qcm_score;
107  if ($qcms[$indexQCM]['propositions']==0) return '';
108
109  // Initialisation du code a retourner
110  $nomVarSelect = 'var_Q'.$indexQCM;
111  $question = trim(str_replace('&nbsp;', ' ', $qcms[$indexQCM]['question']));
112 
113  // affichage des points dans la question
114  if ($gestionPoints) {
115    $pointsQ = $qcms[$indexQCM]['maxscore'];
116        $question = qcm_les_points($question, $pointsQ);
117  } else $pointsQ = 1;
118
119  $codeHTML = "<div class=\"spip_qcm_question\">".definir_puce().$question.'</div>';
120  if (!$corrigee){
121    // affichage sans correction :
122     $codeHTML.="\n<div class=\"spip_qcm_proposition\">";
123
124      // Si il ya plus de 5 choix, on utilise une liste
125      if(count($qcms[$indexQCM]['propositions'])>5){
126        $codeHTML.='<select name="'.$nomVarSelect.'" class="spip_qcm_select">';
127                foreach($qcms[$indexQCM]['propositions'] as $i=>$v) $codeHTML.="<option value=\"$i\">$v</option>";
128                $codeHTML.='</select>';
129      }
130      // Sinon des radio boutons
131      else {
132                foreach($qcms[$indexQCM]['propositions'] as $i=>$v)
133          $codeHTML.='<input type="radio" name="'.$nomVarSelect
134                        . '" value="'.$i.'" id="'.$nomVarSelect.$i.'"><label for="'.$nomVarSelect.$i.'">'
135                . $v.'</label><br />';
136       }
137       $codeHTML.="</div><br />";
138       
139    }   //Fin du cas sans correction
140
141  // Sinon on affiche la correction
142  else {
143 
144         if ($_POST[$nomVarSelect]) {
145                // les points de la reponse donnee...
146                $pointsR = $qcms[$indexQCM]['points'][$_POST[$nomVarSelect]];
147               
148                // la reponse donnee & precision des points eventuels de la mauvaise reponse...
149                $codeHTML.='<div class="spip_qcm_reponse">'
150                         .((($pointsR==$pointsQ) || ($pointsR==0))?_T('qcm:qcm_introReponse'):qcm_les_points(_T('qcm:qcm_introReponse'), $pointsR))
151                         .$qcms[$indexQCM]['propositions'][$_POST[$nomVarSelect]].'</div>';
152
153                // on donne les points de la reponse quoiqu'il arrive
154                $qcm_score += $pointsR;
155               
156        if ($qcms[$indexQCM]['bonnereponse']==$_POST[$nomVarSelect])
157        // Si c'est juste
158                        $codeHTML .= '<div class="spip_qcm_correction_juste">'._T('qcm:qcm_reponseJuste').'</div>';
159        // Si c'est faux
160         else $codeHTML .= '<div class="spip_qcm_correction_faux">'._T('qcm:qcm_reponseFausse').'</div>';
161           
162        // les precisions eventuelles
163        if ($qcms[$indexQCM]['precisions'][$_POST[$nomVarSelect]]<>"")
164             $codeHTML.='<div align="center"><div class="spip_qcm_precision">'
165                                 .$qcms[$indexQCM]['precisions'][$_POST[$nomVarSelect]]
166                         .'</div></div>';
167
168        // pas de reponse postee...
169        } else $codeHTML.='<div class="spip_qcm_correction_null">'._T('qcm:qcm_reponseNulle').'</div>';
170           
171        $codeHTML.='<br />';
172     
173  } //Fin du cas avec correction
174  return $codeHTML;
175}
176
177function qcm_inserer_les_qcm(&$chaine, $gestionPoints) {
178  global $qcms;
179  if (ereg('<ATTENTE_QCM>([0-9]+)</ATTENTE_QCM>', $chaine, $eregResult)) {
180        $indexQCM = intval($eregResult[1]);
181        list($texteAvant, $texteApres) = explode($eregResult[0], $chaine, 2);
182        $chaine = "$texteAvant<!-- QCM-DEBUT #$indexQCM -->\n"
183                . qcm_affiche_la_question($indexQCM, isset($_POST["var_correction"]), $gestionPoints)
184                . "<!-- QCM-FIN #$indexQCM -->\n"
185                . qcm_inserer_les_qcm($texteApres, $gestionPoints); 
186  }
187  return $chaine;
188}
189
190function qcm_qcm($chaine) {
191  // premiere verification
192  if (strpos($chaine, _QCM_DEBUT)===false || strpos($chaine, _QCM_FIN)===false) return $chaine;
193
194  // initialisation 
195  global $qcms, $qcm_score;
196  $titreQCM = _T('qcm:qcm_titre');
197  $indexQCM =  $qcm_score = 0;
198  $qcms['nbquestions'] = $qcms['totalscore'] = $qcms['totalpropositions'] = 0;
199 
200  while (qcm_recupere_une_question($chaine, $indexQCM, $titreQCM)) {
201    $qcms['totalpropositions'] +=  count($qcms[$indexQCM]['propositions']);
202    $qcms['totalscore'] +=  $qcms[$indexQCM]['maxscore'];
203        $indexQCM++;
204  }
205 
206  // est-ce certaines questions ne valent pas 1 point ?
207  $gestionPoints = $qcms['totalscore']<>$qcms['nbquestions'];
208
209  // reinserer les qcms mis en forme
210  $chaine = qcm_inserer_les_qcm($chaine, $gestionPoints);
211
212  $tete = '<div class="spip_qcm"><div class="spip_qcm_titre">'.$titreQCM.'<hr /></div>';
213  if (!isset($_POST["var_correction"])) { 
214        $tete .= '<form method="post" action="">';
215        $pied = '<br>
216        <input type="hidden" name="var_correction" value="yes">
217        <div align="center"><input type="submit" value="'._T('qcm:qcm_corriger').'" class="spip_qcm_bouton_corriger"></div>
218        </form>';
219  } else {
220      // On ajoute le score final
221      $pied = '<center><div class="spip_qcm_score">'._T('qcm:qcm_score')
222                                . "&nbsp;$qcm_score&nbsp;/&nbsp;".$qcms['totalscore'].'<br>'
223                                . ($qcm_score==$qcms['totalscore']?_T('qcm:qcm_bravo'):'').'</div></center>'
224                                . '<div class="spip_qcm_bouton_corriger" align="right">[ <a href="'
225                                . parametre_url(self(),'var_mode','recalcul').'">'._T('qcm:qcm_reinitialiser').'</a> ]</div>';
226     // unset($_POST["var_correction"]);
227  }
228  $chaine = str_replace('<!-- QCM-DEBUT #0 -->', $tete.'<!-- QCM-DEBUT #0 -->', $chaine);
229  $chaine = str_replace('<!-- QCM-FIN #'.($indexQCM-1).' -->', $pied.'</div>', $chaine);
230
231  unset($qcms);
232  return $chaine;
233}
234
235function qcm_qcm2($chaine){
236 if (ereg(_QCM_DEBUT, $chaine)) {
237        ob_start();
238        $chaine = qcm($chaine);
239        $data = ob_get_contents();
240        ob_end_clean();
241        $chaine = nl2br(str_replace("\t",'&nbsp;&nbsp;&nbsp;&nbsp;',$data)).$chaine;
242 }
243 return $chaine;
244}
245
246
247function qcm_stylesheet_public($b) {
248 return '<link rel="stylesheet" href="'.find_in_path($b)."\" type=\"text/css\" media=\"projection, screen\" />\n";
249}
250function qcm_stylesheet_prive($b) {
251 return '<link rel="stylesheet" href="'._DIR_PLUGIN_QCM."$b\" type=\"text/css\" media=\"projection, screen\" />\n";
252}
253
254function qcm_header_prive($flux){
255        return $flux . qcm_stylesheet_prive('qcm.css');
256}
257
258function qcm_insert_head($flux){
259        return $flux 
260        . "<!-- CSS QCM -->\n"
261        . qcm_stylesheet_public('qcm.css');
262}
263
264function qcm_pre_typo($texte) {
265        return qcm_qcm($texte);
266}       
267
268?>
Note: See TracBrowser for help on using the repository browser.