MDL-14493 First checkin of Feedback module into HEAD.
[moodle.git] / mod / feedback / item / radiorated / lib.php
1 <?php  // $Id$
2 defined('FEEDBACK_INCLUDE_TEST') OR die('not allowed');
3 require_once($CFG->dirroot.'/mod/feedback/item/feedback_item_class.php');
5 define('FEEDBACK_RADIORATED_MAXCOUNT', 10); //count of possible items
6 define('FEEDBACK_RADIORATED_LINE_SEP', '|');
7 define('FEEDBACK_RADIORATED_VALUE_SEP', '####');
8 define('FEEDBACK_RADIORATED_ADJUST_SEP', '<<<<<');
10 class feedback_item_radiorated extends feedback_item_base {
11     var $type = "radiorated";
12     function init() {
13     
14     }
15     
16     function show_edit($item, $usehtmleditor = false) {
18         $item->presentation = empty($item->presentation) ? '' : $item->presentation;
20         //check, whether the buttons are vertical or horizontal
21         $presentation = $horizontal = '';
22         @list($presentation, $horizontal) = explode(FEEDBACK_RADIO_ADJUST_SEP, $item->presentation);
23         if(isset($horizontal) AND $horizontal == 1) {
24             $horizontal = true;
25         }else {
26             $horizontal = false;
27         }
28     ?>
29         <table>
30             <tr>
31                 <th colspan="2"><?php print_string('radiorated', 'feedback');?>
32                     &nbsp;(<input type="checkbox" name="required" value="1" <?php
33                     $item->required=isset($item->required)?$item->required:0;
34                     echo ($item->required == 1?'checked="checked"':'');
35                     ?> />&nbsp;<?php print_string('required', 'feedback');?>)
36                 </th>
37             </tr>
38             <tr>
39                 <td colspan="2">
40                     <?php print_string('adjustment', 'feedback');?>:
41                     &nbsp;<?php print_string('vertical', 'feedback');?><input type="radio" name="horizontal" value="0" <?php echo $horizontal ? '' : 'checked="checked"';?> />
42                     &nbsp;<?php print_string('horizontal', 'feedback');?><input type="radio" name="horizontal" value="1" <?php echo $horizontal ? 'checked="checked"' : '';?> />
43                 </td>
44             </tr>
45             <tr>
46                 <td><?php print_string('item_name', 'feedback');?></td>
47                 <td><input type="text" id="itemname" name="itemname" size="40" maxlength="255" value="<?php echo isset($item->name)?htmlspecialchars(stripslashes_safe($item->name)):'';?>" /></td>
48             </tr>
49             <tr>
50                 <td>
51                     <?php print_string('radio_values', 'feedback');?>
52                 </td>
53                 <td>
54     <?php
55                     //$itemvalues = str_replace('|', "\n", stripslashes_safe($item->presentation));
56                     if($itemvalues = explode(FEEDBACK_RADIORATED_LINE_SEP, stripslashes_safe($presentation), FEEDBACK_RADIORATED_MAXCOUNT)){
57                         echo '<table>';
58                         echo '<tr>';
59                         echo '<td><b>'.get_string('line_values', 'feedback').'</b></td><td><b>'.get_string('line_labels', 'feedback').'</b></td>';
60                         echo '</tr>';
61                         for ($i = 0; $i < FEEDBACK_RADIORATED_MAXCOUNT; $i++) {
62                             if(count($itemvalues) > $i) {
63                                 $value = explode(FEEDBACK_RADIORATED_VALUE_SEP, $itemvalues[$i]);
64                                 if(count($value) <= 1) {
65                                     $value[0] = ''; $value[1] = '';
66                                 }
67                             }else {
68                                 $value[0] = ''; $value[1] = '';
69                             }
70                             echo '<tr>';
71                             echo '<td><input type="text" name="fr_val[]" size="4" maxlength="4" value="'.$value[0].'" /></td>';
72                             echo '<td><input type="text" name="fr_label[]" size="40" maxlength="255" value="'.$value[1].'" /></td>';
73                             echo '</tr>';
74                         }
75                         echo '</table>';
76                     }
77                     
78     ?>
79                 </td>
80             </tr>
81         </table>
82     <?php
83     }
85     //liefert ein eindimensionales Array mit drei Werten(typ, name, XXX)
86     //XXX ist ein eindimensionales Array (Mittelwert der Werte der Antworten bei Typ Radio_rated) Jedes Element ist eine Struktur (answertext, avg)
87     function get_analysed($item, $groupid = false, $courseid = false) {
88         $analysedItem = array();
89         $analysedItem[] = $item->typ;
90         $analysedItem[] = $item->name;
91         //die moeglichen Antworten extrahieren
92         $lines = null;
93         $presentation = '';
94         @list($presentation) = explode(FEEDBACK_RADIORATED_ADJUST_SEP, $item->presentation); //remove the adjustment-info
95         $lines = explode (FEEDBACK_RADIORATED_LINE_SEP, stripslashes_safe($presentation));
96         if(!is_array($lines)) return null;
98         //die Werte holen
99         //$values = get_records('feedback_value', 'item', $item->id);
100         $values = feedback_get_group_values($item, $groupid, $courseid);
101         if(!$values) return null;
102         //schleife ueber den Werten und ueber die Antwortmoeglichkeiten
103         
104         $analysedAnswer = array();
106         for($i = 1; $i <= sizeof($lines); $i++) {
107             $item_values = explode(FEEDBACK_RADIORATED_VALUE_SEP, $lines[$i-1]);
108             $ans = null;
109             $ans->answertext = $item_values[1];
110             $avg = 0.0;
111             $anscount = 0;
112             foreach($values as $value) {
113                 //ist die Antwort gleich dem index der Antworten + 1?
114                 if ($value->value == $i) {
115                     $avg += $item_values[0]; //erst alle Werte aufsummieren
116                     $anscount++;
117                 }
118             }
119             $ans->answercount = $anscount;
120             $ans->avg = doubleval($avg) / doubleval(sizeof($values));
121             $ans->value = $item_values[0];
122             $ans->quotient = $ans->answercount / sizeof($values);
123             $analysedAnswer[] = $ans;
124         }
125         $analysedItem[] = $analysedAnswer;
126         return $analysedItem;
127     }
129     function get_printval($item, $value) {
130         $printval = '';
131         
132         if(!isset($value->value)) return $printval;
133                 
134         @list($presentation) = explode(FEEDBACK_RADIORATED_ADJUST_SEP, $item->presentation); //remove the adjustment-info
136         $presentation = explode (FEEDBACK_RADIORATED_LINE_SEP, stripslashes_safe($presentation));
137         $index = 1;
138         foreach($presentation as $pres){
139             if($value->value == $index){
140                 $radio_label = explode(FEEDBACK_RADIORATED_VALUE_SEP, $pres);
141                 $printval = $radio_label[1];
142                 break;
143             }
144             $index++;
145         }
146         return $printval;
147     }
149     function print_analysed($item, $itemnr = 0, $groupid = false, $courseid = false) {
150         $sep_dec = get_string('separator_decimal', 'feedback');
151         if(substr($sep_dec, 0, 2) == '[['){
152             $sep_dec = FEEDBACK_DECIMAL;
153         }
154         
155         $sep_thous = get_string('separator_thousand', 'feedback');
156         if(substr($sep_thous, 0, 2) == '[['){
157             $sep_thous = FEEDBACK_THOUSAND;
158         }
159             
160         $analysedItem = $this->get_analysed($item, $groupid, $courseid);
161         if($analysedItem) {
162             //echo '<table>';
163             $itemnr++;
164             echo '<tr><th colspan="2" align="left">'. $itemnr . '.)&nbsp;' . $analysedItem[1] .'</th></tr>';
165             $analysedVals = $analysedItem[2];
166             $pixnr = 0;
167             $avg = 0.0;
168             foreach($analysedVals as $val) {
169                 
170                 if( function_exists("bcmod")) {
171                     $intvalue = bcmod($pixnr, 10);
172                 }else {
173                     $intvalue = 0;
174                 }
175                 $pix = "pics/$intvalue.gif";
176                 $pixnr++;
177                 $pixwidth = intval($val->quotient * FEEDBACK_MAX_PIX_LENGTH);
178                 
179                 $avg += $val->avg;
180                 $quotient = number_format(($val->quotient * 100), 2, $sep_dec, $sep_thous);
181                 echo '<tr><td align="left" valign="top">-&nbsp;&nbsp;' . trim($val->answertext) . ' ('.$val->value.'):</td><td align="left" style="width: '.FEEDBACK_MAX_PIX_LENGTH.'"><img alt="'.$intvalue.'" src="'.$pix.'" height="5" width="'.$pixwidth.'" />' . $val->answercount. (($val->quotient > 0)?'&nbsp;('. $quotient . '&nbsp;%)':'') . '</td></tr>';
182             }
183             $avg = number_format(($avg), 2, $sep_dec, $sep_thous);
184             echo '<tr><td align="left" colspan="2"><b>'.get_string('average', 'feedback').': '.$avg.'</b></td></tr>';
185             //echo '</table>';
186         }
187         return $itemnr;
188     }
190     function excelprint_item(&$worksheet, $rowOffset, $item, $groupid, $courseid = false) {
191         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
194         $data = $analysed_item[2];
196         $worksheet->setFormat("<l><f><ro2><vo><c:green>");
197         //frage schreiben
198         $worksheet->write_string($rowOffset, 0, $analysed_item[1]);
199         if(is_array($data)) {
200             $avg = 0.0;
201             for($i = 0; $i < sizeof($data); $i++) {
202                 $aData = $data[$i];
203                 
204                 $worksheet->setFormat("<l><f><ro2><vo><c:blue>");
205                 $worksheet->write_string($rowOffset, $i + 1, trim($aData->answertext).' ('.$aData->value.')');
206                 
207                 $worksheet->setFormat("<l><vo>");
208                 $worksheet->write_number($rowOffset + 1, $i + 1, $aData->answercount);
209                 //$worksheet->setFormat("<l><f><vo>");
210                 //$worksheet->write_number($rowOffset + 2, $i + 1, $aData->avg);
211                 $avg += $aData->avg;
212             }
213             //mittelwert anzeigen
214             $worksheet->setFormat("<l><f><ro2><vo><c:red>");
215             $worksheet->write_string($rowOffset, sizeof($data) + 1, get_string('average', 'feedback'));
216             
217             $worksheet->setFormat("<l><f><vo>");
218             $worksheet->write_number($rowOffset + 1, sizeof($data) + 1, $avg);
219         }
220         $rowOffset +=2 ;
221         return $rowOffset;
222     }
224     function print_item($item, $value = false, $readonly = false, $edit = false, $highlightrequire = false){
225         $align = get_string('thisdirection') == 'ltr' ? 'left' : 'right';
226         
227         //extract the adjustment-info
228         $presentation = $horizontal = '';
229         @list($presentation, $horizontal) = explode(FEEDBACK_RADIORATED_ADJUST_SEP, $item->presentation);
230         if(isset($horizontal) AND $horizontal == 1) {
231             $horizontal = true;
232         }else {
233             $horizontal = false;
234         }
235         
236         $lines = explode (FEEDBACK_RADIORATED_LINE_SEP, stripslashes_safe($presentation));
237         if($highlightrequire AND $item->required AND intval($value) <= 0) {
238             $highlight = 'bgcolor="#FFAAAA" class="missingrequire"';
239         }else {
240             $highlight = '';
241         }
242         $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
243     ?>
244         <td <?php echo $highlight;?> valign="top" align="<?php echo $align;?>"><?php echo format_text(stripslashes_safe($item->name) . $requiredmark, true, false, false);?></td>
245         <td valign="top" align="<?php echo $align;?>">
246     <?php
247         $index = 1;
248         $checked = '';
249         if($readonly){
250             foreach($lines as $line){
251                 if($value == $index){
252                     $radio_value = explode(FEEDBACK_RADIORATED_VALUE_SEP, $line);
253                     // print_simple_box_start('left');
254                     print_box_start('generalbox boxalign'.$align);
255                     echo text_to_html($radio_value[1], true, false, false);
256                     // print_simple_box_end();
257                     print_box_end();
258                     break;
259                 }
260                 $index++;
261             }
262         } else {
263     ?>
264             <table><tr>
265             <td valign="top" align="<?php echo $align;?>"><input type="radio"
266                     name="<?php echo $item->typ . '_' . $item->id ;?>"
267                     id="<?php echo $item->typ.'_'.$item->id.'_xxx';?>"
268                     value="" <?php echo $value ? '' : 'checked="checked"';?> />
269             </td>
270             <td align="<?php echo $align;?>">
271                 <label for="<?php echo $item->typ.'_'.$item->id.'_xxx';?>"><?php print_string('not_selected', 'feedback');?>&nbsp;</label>
272             </td>
273             </tr></table>
274     <?php
275             if($horizontal) {
276                 echo '<table><tr>';
277             }
278             foreach($lines as $line){
279                 if($value == $index){
280                     $checked = 'checked="checked"';
281                 }else{
282                     $checked = '';
283                 }
284                 $radio_value = explode(FEEDBACK_RADIORATED_VALUE_SEP, $line);
285                 $inputname = $item->typ . '_' . $item->id;
286                 $inputid = $inputname.'_'.$index;
287                 if($horizontal) {
288     ?>
289                     <td valign="top" align="<?php echo $align;?>"><input type="radio"
290                             name="<?php echo $inputname;?>"
291                             id="<?php echo $inputid;?>"
292                             value="<?php echo $index;?>" <?php echo $checked;?> />
293                     </td><td align="<?php echo $align;?>"><label for="<?php echo $inputid;?>"><?php
294                                     if($edit) {
295                                         echo text_to_html('('.$radio_value[0].') '.$radio_value[1], true, false, false);
296                                     }else {
297                                         echo text_to_html($radio_value[1], true, false, false);
298                                     }
299                                 ?>&nbsp;</label>
300                     </td>
301     <?php
302                 }else {
303     ?>
304                     <table><tr>
305                     <td valign="top" align="<?php echo $align;?>"><input type="radio"
306                             name="<?php echo $inputname;?>"
307                             id="<?php echo $inputid;?>"
308                             value="<?php echo $index;?>" <?php echo $checked;?> />
309                     </td><td align="<?php echo $align;?>"><label for="<?php echo $inputid;?>"><?php
310                                     if($edit) {
311                                         echo text_to_html('('.$radio_value[0].') '.$radio_value[1], true, false, false);
312                                     }else {
313                                         echo text_to_html($radio_value[1], true, false, false);
314                                     }
315                                 ?>&nbsp;</label>
316                     </td></tr></table>
317     <?php
318                 }
319                 $index++;
320             }
321             if($horizontal) {
322                 echo '</tr></table>';
323             }
324             /*
325             if($item->required == 1) {
326                 echo '<input type="hidden" name="'.$item->typ . '_' . $item->id.'" value="1" />';
327             }
328             */
329         }
330     ?>
331         </td>
332     <?php
333     }
335     function check_value($value, $item) {
336         if((!isset($value) OR $value == '' OR $value == 0) AND $item->required != 1) return true;
337         if(intval($value) > 0)return true;
338         return false;
339     }
341     function create_value($data) {
342         $data = clean_param($data, PARAM_INT);
343         return $data;
344     }
346     function get_presentation($data) {
347         $valuelines = $data->fr_val;
348         $labellines = $data->fr_label;
349         $present = '';
350         if(!is_array($valuelines) AND !is_array($labellines)) {
351             return $present;
352         }
353         
354         //if( trim($valuelines[0]) != ''){
355             $value = intval($valuelines[0]);
356             $label = $labellines[0];
357             $present .= $value.FEEDBACK_RADIORATED_VALUE_SEP.$label;
358         //}
359         
360         for($i = 1; $i < FEEDBACK_RADIORATED_MAXCOUNT; $i++) {
361             if( (trim($valuelines[$i]) == '') AND (trim($labellines[$i]) == ''))continue;
362             
363             $value = intval($valuelines[$i]);
364             $label = $labellines[$i];
365             $present .= FEEDBACK_RADIORATED_LINE_SEP.$value.FEEDBACK_RADIORATED_VALUE_SEP.$label;
366         }
367         //$present = str_replace("\n", '|', trim($data->itemvalues));
368         if($data->horizontal == 1) {
369             $present .= FEEDBACK_RADIORATED_ADJUST_SEP.'1';
370         }
371         return $present;
372     }
374     function get_hasvalue() {
375         return 1;
376     }
378 ?>