MDL-14493 First checkin of Feedback module into HEAD.
[moodle.git] / mod / feedback / item / dropdownrated / 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_DROPDOWNRATED_MAXCOUNT', 10); //count of possible items
6 define('FEEDBACK_DROPDOWN_LINE_SEP', '|');
7 define('FEEDBACK_DROPDOWN_VALUE_SEP', '####');
10 class feedback_item_dropdownrated extends feedback_item_base {
11     var $type = "dropdownrated";
12     function init() {
14     }
16     function show_edit($item, $usehtmleditor = false) {
18          $item->presentation=empty($item->presentation)?'':$item->presentation;
20     ?>
21         <table>
22             <tr>
23                 <th colspan="2"><?php print_string('dropdownrated', 'feedback');?>
24                     &nbsp;(<input type="checkbox" name="required" value="1" <?php
25                          $item->required=isset($item->required)?$item->required:0;
26                          echo ($item->required == 1?'checked="checked"':'');
27                          ?> />&nbsp;<?php print_string('required', 'feedback');?>)
28                 </th>
29             </tr>
30             <tr>
31                 <td><?php print_string('item_name', 'feedback');?></td>
32                 <td><input type="text" id="itemname" name="itemname" size="40" maxlength="255" value="<?php echo isset($item->name)?htmlspecialchars(stripslashes_safe($item->name)):'';?>" /></td>
33             </tr>
34             <tr>
35                 <td>
36                     <?php print_string('dropdown_values', 'feedback');?>
37                 </td>
38                 <td>
39     <?php
40                     //$itemvalues = str_replace('|', "\n", stripslashes_safe($item->presentation));
41                     if($itemvalues = explode(FEEDBACK_DROPDOWN_LINE_SEP, stripslashes_safe($item->presentation), FEEDBACK_DROPDOWNRATED_MAXCOUNT)){
42                         echo '<table>';
43                         echo '<tr>';
44                         echo '<td><b>'.get_string('line_values', 'feedback').'</b></td><td><b>'.get_string('line_labels', 'feedback').'</b></td>';
45                         echo '</tr>';
46                         for ($i = 0; $i < FEEDBACK_DROPDOWNRATED_MAXCOUNT; $i++) {
47                             if(count($itemvalues) > $i) { 
48                                 $value = explode(FEEDBACK_DROPDOWN_VALUE_SEP, $itemvalues[$i]);
49                                 if(count($value) <= 1) {
50                                     $value[0] = ''; $value[1] = '';
51                                 }
52                             }else {
53                                 $value[0] = ''; $value[1] = '';
54                             }
55                             echo '<tr>';
56                             echo '<td><input type="text" name="fr_val[]" size="4" maxlength="4" value="'.$value[0].'" /></td>';
57                             echo '<td><input type="text" name="fr_label[]" size="40" maxlength="255" value="'.$value[1].'" /></td>';
58                             echo '</tr>';
59                         }
60                         echo '</table>';
61                     }
62                     
63     ?>
64                 </td>
65             </tr>
66         </table>
67     <?php
68     }
70     //liefert ein eindimensionales Array mit drei Werten(typ, name, XXX)
71     //XXX ist ein eindimensionales Array (Mittelwert der Werte der Antworten bei Typ dropdown_rated) Jedes Element ist eine Struktur (answertext, avg)
72     function get_analysed($item, $groupid = false, $courseid = false) {
73         $analysedItem = array();
74         $analysedItem[] = $item->typ;
75         $analysedItem[] = $item->name;
76         //die moeglichen Antworten extrahieren
77         $lines = null;
78         $lines = explode (FEEDBACK_DROPDOWN_LINE_SEP, stripslashes_safe($item->presentation));
79         if(!is_array($lines)) return null;
81         //die Werte holen
82         //$values = get_records('feedback_value', 'item', $item->id);
83         $values = feedback_get_group_values($item, $groupid, $courseid);
84         if(!$values) return null;
85         //schleife ueber den Werten und ueber die Antwortmoeglichkeiten
86         
87         $analysedAnswer = array();
89         for($i = 1; $i <= sizeof($lines); $i++) {
90             $item_values = explode(FEEDBACK_DROPDOWN_VALUE_SEP, $lines[$i-1]);
91             $ans = null;
92             $ans->answertext = $item_values[1];
93             $avg = 0.0;
94             $anscount = 0;
95             foreach($values as $value) {
96                 //ist die Antwort gleich dem index der Antworten + 1?
97                 if ($value->value == $i) {
98                     $avg += $item_values[0]; //erst alle Werte aufsummieren
99                     $anscount++;
100                 }
101             }
102             $ans->answercount = $anscount;
103             $ans->avg = doubleval($avg) / doubleval(sizeof($values));
104             $ans->value = $item_values[0];
105             $ans->quotient = $ans->answercount / sizeof($values);
106             $analysedAnswer[] = $ans;
107         }
108         $analysedItem[] = $analysedAnswer;
109         return $analysedItem;
110     }
112     function get_printval($item, $value) {
113         $printval = '';
114         
115         if(!isset($value->value)) return $printval;
116         
117         $presentation = explode (FEEDBACK_DROPDOWN_LINE_SEP, stripslashes_safe($item->presentation));
118         $index = 1;
119         foreach($presentation as $pres){
120             if($value->value == $index){
121                 $dropdown_label = explode(FEEDBACK_DROPDOWN_VALUE_SEP, $pres);
122                 $printval = $dropdown_label[1];
123                 break;
124             }
125             $index++;
126         }
127         return $printval;
128     }
130     function print_analysed($item, $itemnr = 0, $groupid = false, $courseid = false) {
131         $sep_dec = get_string('separator_decimal', 'feedback');
132         if(substr($sep_dec, 0, 2) == '[['){
133             $sep_dec = FEEDBACK_DECIMAL;
134         }
135         
136         $sep_thous = get_string('separator_thousand', 'feedback');
137         if(substr($sep_thous, 0, 2) == '[['){
138             $sep_thous = FEEDBACK_THOUSAND;
139         }
140             
141         $analysedItem = $this->get_analysed($item, $groupid, $courseid);
142         if($analysedItem) {
143             //echo '<table>';
144             $itemnr++;
145             echo '<tr><th colspan="2" align="left">'. $itemnr . '.)&nbsp;' . stripslashes($analysedItem[1]) .'</th></tr>';
146             $analysedVals = $analysedItem[2];
147             $pixnr = 0;
148             $avg = 0.0;
149             foreach($analysedVals as $val) {
150                 if( function_exists("bcmod")) {
151                     $intvalue = bcmod($pixnr, 10);
152                 }else {
153                     $intvalue = 0;
154                 }
155                 $pix = "pics/$intvalue.gif";
156                 $pixnr++;
157                 $pixwidth = intval($val->quotient * FEEDBACK_MAX_PIX_LENGTH);
158                 
159                 $avg += $val->avg;
160                 $quotient = number_format(($val->quotient * 100), 2, $sep_dec, $sep_thous);
161                 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>';
162             }
163             $avg = number_format(($avg), 2, $sep_dec, $sep_thous);
164             echo '<tr><td align="left" colspan="2"><b>'.get_string('average', 'feedback').': '.$avg.'</b></td></tr>';
165             //echo '</table>';
166         }
167         return $itemnr;
168     }
170     function excelprint_item(&$worksheet, $rowOffset, $item, $groupid, $courseid = false) {
171         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
174         $data = $analysed_item[2];
176         $worksheet->setFormat("<l><f><ro2><vo><c:green>");
177         //frage schreiben
178         $worksheet->write_string($rowOffset, 0, stripslashes($analysed_item[1]));
179         if(is_array($data)) {
180             $avg = 0.0;
181             for($i = 0; $i < sizeof($data); $i++) {
182                 $aData = $data[$i];
183                 
184                 $worksheet->setFormat("<l><f><ro2><vo><c:blue>");
185                 $worksheet->write_string($rowOffset, $i + 1, trim($aData->answertext).' ('.$aData->value.')');
186                 
187                 $worksheet->setFormat("<l><vo>");
188                 $worksheet->write_number($rowOffset + 1, $i + 1, $aData->answercount);
189                 //$worksheet->setFormat("<l><f><vo>");
190                 //$worksheet->write_number($rowOffset + 2, $i + 1, $aData->avg);
191                 $avg += $aData->avg;
192             }
193             //mittelwert anzeigen
194             $worksheet->setFormat("<l><f><ro2><vo><c:red>");
195             $worksheet->write_string($rowOffset, sizeof($data) + 1, get_string('average', 'feedback'));
196             
197             $worksheet->setFormat("<l><f><vo>");
198             $worksheet->write_number($rowOffset + 1, sizeof($data) + 1, $avg);
199         }
200         $rowOffset +=2 ;
201         return $rowOffset;
202     }
204     function print_item($item, $value = false, $readonly = false, $edit = false, $highlightrequire = false){
205         $align = get_string('thisdirection') == 'ltr' ? 'left' : 'right';
206         
207         $lines = explode (FEEDBACK_DROPDOWN_LINE_SEP, stripslashes_safe($item->presentation));
208         $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
209         if($highlightrequire AND $item->required AND intval($value) <= 0) {
210             $highlight = 'bgcolor="#FFAAAA" class="missingrequire"';
211         }else {
212             $highlight = '';
213         }
214     ?>
215         <td <?php echo $highlight;?> valign="top" align="<?php echo $align;?>"><?php echo format_text(stripslashes_safe($item->name) . $requiredmark, true, false, false);?></td>
216         <td valign="top" align="<?php echo $align;?>">
217     <?php
218         $index = 1;
219         $selected = '';
220         if($readonly){
221             foreach($lines as $line){
222                 if($value == $index){
223                     $dropdown_value = explode(FEEDBACK_DROPDOWN_VALUE_SEP, $line);
224                     // print_simple_box_start($align);
225                     print_box_start('generalbox boxalign'.$align);
226                     echo text_to_html($dropdown_value[1], true, false, false);
227                     // print_simple_box_end();
228                     print_box_end();
229                     break;
230                 }
231                 $index++;
232             }
233         } else {
234             echo '<select name="'. $item->typ . '_' . $item->id . '">';
235             echo '<option value="0">&nbsp;</option>';
236             foreach($lines as $line){
237                 if($value == $index){
238                     $selected = 'selected="selected"';
239                 }else{
240                     $selected = '';
241                 }
242                 $dropdown_value = explode(FEEDBACK_DROPDOWN_VALUE_SEP, $line);
243                 if($edit) {
244                     echo '<option value="'. $index.'" '. $selected.'>'. clean_text('('.$dropdown_value[0].') '.$dropdown_value[1]).'</option>';
245                 }else {
246                     echo '<option value="'. $index.'" '. $selected.'>'. clean_text($dropdown_value[1]).'</option>';
247                 }
248                 $index++;
249             }
250             echo '</select>';
251             /*
252             if($item->required == 1) {
253                 echo '<input type="hidden" name="'.$item->typ . '_' . $item->id.'" value="1" />';
254             }
255             */
256         }
257     ?>
258         </td>
259     <?php
260     }
262     function check_value($value, $item) {
263         //if the item is not required, so the check is true if no value is given
264         if((!isset($value) OR $value == '' OR $value == 0) AND $item->required != 1) return true;
265         if(intval($value) > 0)return true;
266         return false;
267     }
269     function create_value($data) {
270         $data = clean_param($data, PARAM_INT);
271         return $data;
272     }
274     function get_presentation($data) {
275         $valuelines = $data->fr_val;
276         $labellines = $data->fr_label;
277         $present = '';
278         if(!is_array($valuelines) AND !is_array($labellines)) {
279             return $present;
280         }
281         
282         //if( trim($valuelines[0]) != ''){
283             $value = intval($valuelines[0]);
284             $label = $labellines[0];
285             $present .= $value.FEEDBACK_DROPDOWN_VALUE_SEP.$label;
286         //}
287         
288         for($i = 1; $i < FEEDBACK_DROPDOWNRATED_MAXCOUNT; $i++) {
289             if( (trim($valuelines[$i]) == '') AND (trim($labellines[$i]) == ''))continue;
290             
291             $value = intval($valuelines[$i]);
292             $label = $labellines[$i];
293             $present .= FEEDBACK_DROPDOWN_LINE_SEP.$value.FEEDBACK_DROPDOWN_VALUE_SEP.$label;
294         }
295         //$present = str_replace("\n", '|', trim($data->itemvalues));
296         return $present;
297     }
299     function get_hasvalue() {
300         return 1;
301     }
303 ?>