aa30d8e90fa5be34d38b6be72242fc4bd4736bd2
[moodle.git] / mod / feedback / item / multichoice / lib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 defined('MOODLE_INTERNAL') OR die('not allowed');
18 require_once($CFG->dirroot.'/mod/feedback/item/feedback_item_class.php');
20 define('FEEDBACK_MULTICHOICE_TYPE_SEP', '>>>>>');
21 define('FEEDBACK_MULTICHOICE_LINE_SEP', '|');
22 define('FEEDBACK_MULTICHOICE_ADJUST_SEP', '<<<<<');
23 define('FEEDBACK_MULTICHOICE_IGNOREEMPTY', 'i');
24 define('FEEDBACK_MULTICHOICE_HIDENOSELECT', 'h');
26 class feedback_item_multichoice extends feedback_item_base {
27     protected $type = "multichoice";
28     private $commonparams;
29     private $item_form;
30     private $item;
32     public function init() {
34     }
36     public function build_editform($item, $feedback, $cm) {
37         global $DB, $CFG;
38         require_once('multichoice_form.php');
40         //get the lastposition number of the feedback_items
41         $position = $item->position;
42         $lastposition = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
43         if ($position == -1) {
44             $i_formselect_last = $lastposition + 1;
45             $i_formselect_value = $lastposition + 1;
46             $item->position = $lastposition + 1;
47         } else {
48             $i_formselect_last = $lastposition;
49             $i_formselect_value = $item->position;
50         }
51         //the elements for position dropdownlist
52         $positionlist = array_slice(range(0, $i_formselect_last), 1, $i_formselect_last, true);
54         $item->presentation = empty($item->presentation) ? '' : $item->presentation;
55         $info = $this->get_info($item);
57         $item->ignoreempty = $this->ignoreempty($item);
58         $item->hidenoselect = $this->hidenoselect($item);
60         //all items for dependitem
61         $feedbackitems = feedback_get_depend_candidates_for_item($feedback, $item);
62         $commonparams = array('cmid'=>$cm->id,
63                              'id'=>isset($item->id) ? $item->id : null,
64                              'typ'=>$item->typ,
65                              'items'=>$feedbackitems,
66                              'feedback'=>$feedback->id);
68         //build the form
69         $customdata = array('item' => $item,
70                             'common' => $commonparams,
71                             'positionlist' => $positionlist,
72                             'position' => $position,
73                             'info' => $info);
75         $this->item_form = new feedback_multichoice_form('edit_item.php', $customdata);
76     }
78     //this function only can used after the call of build_editform()
79     public function show_editform() {
80         $this->item_form->display();
81     }
83     public function is_cancelled() {
84         return $this->item_form->is_cancelled();
85     }
87     public function get_data() {
88         if ($this->item = $this->item_form->get_data()) {
89             return true;
90         }
91         return false;
92     }
94     public function save_item() {
95         global $DB;
97         if (!$item = $this->item_form->get_data()) {
98             return false;
99         }
101         if (isset($item->clone_item) AND $item->clone_item) {
102             $item->id = ''; //to clone this item
103             $item->position++;
104         }
106         $this->set_ignoreempty($item, $item->ignoreempty);
107         $this->set_hidenoselect($item, $item->hidenoselect);
109         $item->hasvalue = $this->get_hasvalue();
110         if (!$item->id) {
111             $item->id = $DB->insert_record('feedback_item', $item);
112         } else {
113             $DB->update_record('feedback_item', $item);
114         }
116         return $DB->get_record('feedback_item', array('id'=>$item->id));
117     }
120     //gets an array with three values(typ, name, XXX)
121     //XXX is an object with answertext, answercount and quotient
122     public function get_analysed($item, $groupid = false, $courseid = false) {
123         $info = $this->get_info($item);
125         $analysed_item = array();
126         $analysed_item[] = $item->typ;
127         $analysed_item[] = $item->name;
129         //get the possible answers
130         $answers = null;
131         $answers = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
132         if (!is_array($answers)) {
133             return null;
134         }
136         //get the values
137         $values = feedback_get_group_values($item, $groupid, $courseid, $this->ignoreempty($item));
138         if (!$values) {
139             return null;
140         }
142         //get answertext, answercount and quotient for each answer
143         $analysed_answer = array();
144         if ($info->subtype == 'c') {
145             $sizeofanswers = count($answers);
146             for ($i = 1; $i <= $sizeofanswers; $i++) {
147                 $ans = new stdClass();
148                 $ans->answertext = $answers[$i-1];
149                 $ans->answercount = 0;
150                 foreach ($values as $value) {
151                     //ist die Antwort gleich dem index der Antworten + 1?
152                     $vallist = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value->value);
153                     foreach ($vallist as $val) {
154                         if ($val == $i) {
155                             $ans->answercount++;
156                         }
157                     }
158                 }
159                 $ans->quotient = $ans->answercount / count($values);
160                 $analysed_answer[] = $ans;
161             }
162         } else {
163             $sizeofanswers = count($answers);
164             for ($i = 1; $i <= $sizeofanswers; $i++) {
165                 $ans = new stdClass();
166                 $ans->answertext = $answers[$i-1];
167                 $ans->answercount = 0;
168                 foreach ($values as $value) {
169                     //ist die Antwort gleich dem index der Antworten + 1?
170                     if ($value->value == $i) {
171                         $ans->answercount++;
172                     }
173                 }
174                 $ans->quotient = $ans->answercount / count($values);
175                 $analysed_answer[] = $ans;
176             }
177         }
178         $analysed_item[] = $analysed_answer;
179         return $analysed_item;
180     }
182     public function get_printval($item, $value) {
183         $info = $this->get_info($item);
185         $printval = '';
187         if (!isset($value->value)) {
188             return $printval;
189         }
191         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
193         if ($info->subtype == 'c') {
194             $vallist = array_values(explode (FEEDBACK_MULTICHOICE_LINE_SEP, $value->value));
195             $sizeofvallist = count($vallist);
196             $sizeofpresentation = count($presentation);
197             for ($i = 0; $i < $sizeofvallist; $i++) {
198                 for ($k = 0; $k < $sizeofpresentation; $k++) {
199                     if ($vallist[$i] == ($k + 1)) {//Die Werte beginnen bei 1, das Array aber mit 0
200                         $printval .= trim($presentation[$k]) . chr(10);
201                         break;
202                     }
203                 }
204             }
205         } else {
206             $index = 1;
207             foreach ($presentation as $pres) {
208                 if ($value->value == $index) {
209                     $printval = $pres;
210                     break;
211                 }
212                 $index++;
213             }
214         }
215         return $printval;
216     }
218     public function print_analysed($item, $itemnr = '', $groupid = false, $courseid = false) {
219         global $OUTPUT;
220         $sep_dec = get_string('separator_decimal', 'feedback');
221         if (substr($sep_dec, 0, 2) == '[[') {
222             $sep_dec = FEEDBACK_DECIMAL;
223         }
225         $sep_thous = get_string('separator_thousand', 'feedback');
226         if (substr($sep_thous, 0, 2) == '[[') {
227             $sep_thous = FEEDBACK_THOUSAND;
228         }
230         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
231         if ($analysed_item) {
232             $itemname = $analysed_item[1];
233             echo '<tr><th colspan="2" align="left">';
234             echo $itemnr . ' ';
235             if (strval($item->label) !== '') {
236                 echo '('. format_string($item->label).') ';
237             }
238             echo $itemname;
239             echo '</th></tr>';
241             $analysed_vals = $analysed_item[2];
242             $pixnr = 0;
243             foreach ($analysed_vals as $val) {
244                 $intvalue = $pixnr % 10;
245                 $pix = $OUTPUT->pix_url('multichoice/' . $intvalue, 'feedback');
246                 $pixnr++;
247                 $pixwidth = intval($val->quotient * FEEDBACK_MAX_PIX_LENGTH);
248                 $quotient = number_format(($val->quotient * 100), 2, $sep_dec, $sep_thous);
249                 $str_quotient = '';
250                 if ($val->quotient > 0) {
251                     $str_quotient = ' ('. $quotient . ' %)';
252                 }
253                 echo '<tr>';
254                 echo '<td align="left" valign="top">
255                             -&nbsp;&nbsp;'.trim($val->answertext).':
256                       </td>
257                       <td align="left" style="width:'.FEEDBACK_MAX_PIX_LENGTH.';">
258                         <img class="feedback_bar_image" alt="'.$intvalue.'" src="'.$pix.'" height="5" width="'.$pixwidth.'" />
259                         '.$val->answercount.$str_quotient.'
260                       </td>';
261                 echo '</tr>';
262             }
263         }
264     }
266     public function excelprint_item(&$worksheet, $row_offset,
267                              $xls_formats, $item,
268                              $groupid, $courseid = false) {
270         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
272         $data = $analysed_item[2];
274         //frage schreiben
275         $worksheet->write_string($row_offset, 0, $item->label, $xls_formats->head2);
276         $worksheet->write_string($row_offset, 1, $analysed_item[1], $xls_formats->head2);
277         if (is_array($data)) {
278             $sizeofdata = count($data);
279             for ($i = 0; $i < $sizeofdata; $i++) {
280                 $analysed_data = $data[$i];
282                 $worksheet->write_string($row_offset,
283                                          $i + 2,
284                                          trim($analysed_data->answertext),
285                                          $xls_formats->head2);
287                 $worksheet->write_number($row_offset + 1,
288                                          $i + 2,
289                                          $analysed_data->answercount,
290                                          $xls_formats->default);
292                 $worksheet->write_number($row_offset + 2,
293                                          $i + 2,
294                                          $analysed_data->quotient,
295                                          $xls_formats->procent);
296             }
297         }
298         $row_offset += 3;
299         return $row_offset;
300     }
302     /**
303      * print the item at the edit-page of feedback
304      *
305      * @global object
306      * @param object $item
307      * @return void
308      */
309     public function print_item_preview($item) {
310         global $OUTPUT, $DB;
311         $info = $this->get_info($item);
312         $align = right_to_left() ? 'right' : 'left';
314         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
315         $strrequiredmark = '<img class="req" title="'.get_string('requiredelement', 'form').'" alt="'.
316             get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />';
318         //test if required and no value is set so we have to mark this item
319         //we have to differ check and the other subtypes
320         $requiredmark = ($item->required == 1) ? $strrequiredmark : '';
322         //print the question and label
323         echo '<div class="feedback_item_label_'.$align.'">';
324         if ($info->subtype == 'd') {
325             echo '<label for="'. $item->typ . '_' . $item->id .'">';
326         }
327         if (strval($item->label) !== '') {
328             echo '('. format_string($item->label).') ';
329         }
330         echo format_text($item->name . $requiredmark, FORMAT_HTML, array('noclean' => true, 'para' => false));
331         if ($item->dependitem) {
332             if ($dependitem = $DB->get_record('feedback_item', array('id'=>$item->dependitem))) {
333                 echo ' <span class="feedback_depend">';
334                 echo '('.format_string($dependitem->label).'-&gt;'.$item->dependvalue.')';
335                 echo '</span>';
336             }
337         }
338         if ($info->subtype == 'd') {
339             echo '</label>';
340         }
341         echo '</div>';
343         //print the presentation
344         echo '<div class="feedback_item_presentation_'.$align.'">';
345         $index = 1;
346         $checked = '';
347         if ($info->subtype == 'r' || $info->subtype == 'c') {
348             // if (r)adio buttons or (c)heckboxes
349             echo '<fieldset>';
350             echo '<ul>';
351         }
353         if ($info->horizontal) {
354             $hv = 'h';
355         } else {
356             $hv = 'v';
357         }
359         if ($info->subtype == 'r' AND !$this->hidenoselect($item)) {
360         //print the "not_selected" item on radiobuttons
361         ?>
362         <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
363             <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
364                 <?php
365                     echo '<input type="radio" '.
366                             'name="'.$item->typ.'_'.$item->id.'[]" '.
367                             'id="'.$item->typ.'_'.$item->id.'_xxx" '.
368                             'value="" checked="checked" />';
369                 ?>
370             </span>
371             <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
372                 <label for="<?php echo $item->typ . '_' . $item->id.'_xxx';?>">
373                     <?php print_string('not_selected', 'feedback');?>
374                 </label>
375             </span>
376         </li>
377         <?php
378         }
380         switch($info->subtype) {
381             case 'r':
382                 $this->print_item_radio($presentation, $item, false, $info, $align);
383                 break;
384             case 'c':
385                 $this->print_item_check($presentation, $item, false, $info, $align);
386                 break;
387             case 'd':
388                 $this->print_item_dropdown($presentation, $item, false, $info, $align);
389                 break;
390         }
391         if ($info->subtype == 'r' || $info->subtype == 'c') {
392             // if (r)adio buttons or (c)heckboxes
393             echo '</ul>';
394             echo '</fieldset>';
395         }
396         echo '</div>';
397     }
399     /**
400      * print the item at the complete-page of feedback
401      *
402      * @global object
403      * @param object $item
404      * @param string $value
405      * @param bool $highlightrequire
406      * @return void
407      */
408     public function print_item_complete($item, $value = null, $highlightrequire = false) {
409         global $OUTPUT;
410         $info = $this->get_info($item);
411         $align = right_to_left() ? 'right' : 'left';
413         if ($value == null) {
414             $value = array();
415         }
416         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
417         $strrequiredmark = '<img class="req" title="'.get_string('requiredelement', 'form').'" alt="'.
418             get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />';
420         //test if required and no value is set so we have to mark this item
421         //we have to differ check and the other subtypes
422         if (is_array($value)) {
423             $values = $value;
424         } else {
425             $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
426         }
427         $requiredmark = ($item->required == 1) ? $strrequiredmark : '';
429         //print the question and label
430         $inputname = $item->typ . '_' . $item->id;
431         echo '<div class="feedback_item_label_'.$align.'">';
432         if ($info->subtype == 'd') {
433             echo '<label for="'. $inputname .'">';
434             echo format_text($item->name . $requiredmark, FORMAT_HTML, array('noclean' => true, 'para' => false));
435             if ($highlightrequire AND $item->required AND (count($values) == 0 OR $values[0] == '' OR $values[0] == 0)) {
436                 echo '<br class="error"><span id="id_error_'.$inputname.'" class="error"> '.get_string('err_required', 'form').
437                     '</span><br id="id_error_break_'.$inputname.'" class="error" >';
438             }
439             echo '</label>';
440         } else {
441             echo format_text($item->name . $requiredmark, FORMAT_HTML, array('noclean' => true, 'para' => false));
442             if ($highlightrequire AND $item->required AND (count($values) == 0 OR $values[0] == '' OR $values[0] == 0)) {
443                 echo '<br class="error"><span id="id_error_'.$inputname.'" class="error"> '.get_string('err_required', 'form').
444                     '</span><br id="id_error_break_'.$inputname.'" class="error" >';
445             }
446         }
447         echo '</div>';
449         //print the presentation
450         echo '<div class="feedback_item_presentation_'.$align.'">';
452         if ($info->subtype == 'r' || $info->subtype == 'c') {
453             // if (r)adio buttons or (c)heckboxes
454             echo '<fieldset>';
455             echo '<ul>';
456         }
457         if ($info->horizontal) {
458             $hv = 'h';
459         } else {
460             $hv = 'v';
461         }
462         //print the "not_selected" item on radiobuttons
463         if ($info->subtype == 'r' AND !$this->hidenoselect($item)) {
464         ?>
465             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
466                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
467                     <?php
468                     $checked = '';
469                     // if (!$value) {
470                         // $checked = 'checked="checked"';
471                     // }
472                     if (count($values) == 0 OR $values[0] == '' OR $values[0] == 0) {
473                         $checked = 'checked="checked"';
474                     }
475                     echo '<input type="radio" '.
476                             'name="'.$item->typ.'_'.$item->id.'[]" '.
477                             'id="'.$item->typ.'_'.$item->id.'_xxx" '.
478                             'value="" '.$checked.' />';
479                     ?>
480                 </span>
481                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
482                     <label for="<?php echo $item->typ.'_'.$item->id.'_xxx';?>">
483                         <?php print_string('not_selected', 'feedback');?>
484                     </label>
485                 </span>
486             </li>
487         <?php
488         }
490         switch($info->subtype) {
491             case 'r':
492                 $this->print_item_radio($presentation, $item, $value, $info, $align);
493                 break;
494             case 'c':
495                 $this->print_item_check($presentation, $item, $value, $info, $align);
496                 break;
497             case 'd':
498                 $this->print_item_dropdown($presentation, $item, $value, $info, $align);
499                 break;
500         }
501         if ($info->subtype == 'r' || $info->subtype == 'c') {
502             // if (r)adio buttons or (c)heckboxes
503             echo '</ul>';
504             echo '</fieldset>';
505         }
506         echo '</div>';
507     }
509     /**
510      * print the item at the complete-page of feedback
511      *
512      * @global object
513      * @param object $item
514      * @param string $value
515      * @return void
516      */
517     public function print_item_show_value($item, $value = null) {
518         global $OUTPUT;
519         $info = $this->get_info($item);
520         $align = right_to_left() ? 'right' : 'left';
522         if ($value == null) {
523             $value = array();
524         }
526         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
528         //test if required and no value is set so we have to mark this item
529         //we have to differ check and the other subtypes
530         if ($info->subtype == 'c') {
531             if (is_array($value)) {
532                 $values = $value;
533             } else {
534                 $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
535             }
536         }
537         $requiredmark = '';
538         if ($item->required == 1) {
539             $requiredmark = '<img class="req" title="'.get_string('requiredelement', 'form').'" alt="'.
540                 get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />';
541         }
543         //print the question and label
544         echo '<div class="feedback_item_label_'.$align.'">';
545         if (strval($item->label) !== '') {
546             echo '('. format_string($item->label).') ';
547         }
548         echo format_text($item->name . $requiredmark, FORMAT_HTML, array('noclean' => true, 'para' => false));
549         echo '</div>';
551         //print the presentation
552         echo '<div class="feedback_item_presentation_'.$align.'">';
553         $index = 1;
554         if ($info->subtype == 'c') {
555             echo $OUTPUT->box_start('generalbox boxalign'.$align);
556             foreach ($presentation as $pres) {
557                 foreach ($values as $val) {
558                     if ($val == $index) {
559                         echo '<div class="feedback_item_multianswer">';
560                         echo format_text($pres, FORMAT_HTML, array('noclean' => true, 'para' => false));
561                         echo '</div>';
562                         break;
563                     }
564                 }
565                 $index++;
566             }
567             echo $OUTPUT->box_end();
568         } else {
569             foreach ($presentation as $pres) {
570                 if ($value == $index) {
571                     echo $OUTPUT->box_start('generalbox boxalign'.$align);
572                     echo format_text($pres, FORMAT_HTML, array('noclean' => true, 'para' => false));
573                     echo $OUTPUT->box_end();
574                     break;
575                 }
576                 $index++;
577             }
578         }
579         echo '</div>';
580     }
582     public function check_value($value, $item) {
583         $info = $this->get_info($item);
585         if ($item->required != 1) {
586             return true;
587         }
589         if (empty($value) OR !is_array($value) OR !array_filter($value)) {
590             return false;
591         }
593         return true;
594     }
596     public function create_value($data) {
597         $vallist = $data;
598         if (is_array($vallist)) {
599             $vallist = array_unique(array_filter($vallist));
600         }
601         return trim($this->item_array_to_string($vallist));
602     }
604     //compares the dbvalue with the dependvalue
605     //dbvalue is the number of one selection
606     //dependvalue is the presentation of one selection
607     public function compare_value($item, $dbvalue, $dependvalue) {
609         if (is_array($dbvalue)) {
610             $dbvalues = $dbvalue;
611         } else {
612             $dbvalues = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $dbvalue);
613         }
615         $info = $this->get_info($item);
616         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
617         $index = 1;
618         foreach ($presentation as $pres) {
619             foreach ($dbvalues as $dbval) {
620                 if ($dbval == $index AND trim($pres) == $dependvalue) {
621                     return true;
622                 }
623             }
624             $index++;
625         }
626         return false;
627     }
629     public function get_presentation($data) {
630         $present = str_replace("\n", FEEDBACK_MULTICHOICE_LINE_SEP, trim($data->itemvalues));
631         if (!isset($data->subtype)) {
632             $subtype = 'r';
633         } else {
634             $subtype = substr($data->subtype, 0, 1);
635         }
636         if (isset($data->horizontal) AND $data->horizontal == 1 AND $subtype != 'd') {
637             $present .= FEEDBACK_MULTICHOICE_ADJUST_SEP.'1';
638         }
639         return $subtype.FEEDBACK_MULTICHOICE_TYPE_SEP.$present;
640     }
642     public function get_hasvalue() {
643         return 1;
644     }
646     public function get_info($item) {
647         $presentation = empty($item->presentation) ? '' : $item->presentation;
649         $info = new stdClass();
650         //check the subtype of the multichoice
651         //it can be check(c), radio(r) or dropdown(d)
652         $info->subtype = '';
653         $info->presentation = '';
654         $info->horizontal = false;
656         $parts = explode(FEEDBACK_MULTICHOICE_TYPE_SEP, $item->presentation);
657         @list($info->subtype, $info->presentation) = $parts;
658         if (!isset($info->subtype)) {
659             $info->subtype = 'r';
660         }
662         if ($info->subtype != 'd') {
663             $parts = explode(FEEDBACK_MULTICHOICE_ADJUST_SEP, $info->presentation);
664             @list($info->presentation, $info->horizontal) = $parts;
665             if (isset($info->horizontal) AND $info->horizontal == 1) {
666                 $info->horizontal = true;
667             } else {
668                 $info->horizontal = false;
669             }
670         }
671         return $info;
672     }
674     private function item_array_to_string($value) {
675         if (!is_array($value)) {
676             return $value;
677         }
678         if (empty($value)) {
679             return '0';
680         }
681         $retval = '';
682         $arrvals = array_values($value);
683         $arrvals = clean_param_array($arrvals, PARAM_INT);  //prevent sql-injection
684         $retval = $arrvals[0];
685         $sizeofarrvals = count($arrvals);
686         for ($i = 1; $i < $sizeofarrvals; $i++) {
687             $retval .= FEEDBACK_MULTICHOICE_LINE_SEP.$arrvals[$i];
688         }
689         return $retval;
690     }
692     private function print_item_radio($presentation, $item, $value, $info, $align) {
693         $index = 1;
694         $checked = '';
696         if (is_array($value)) {
697             $values = $value;
698         } else {
699             $values = array($value);
700         }
702         if ($info->horizontal) {
703             $hv = 'h';
704         } else {
705             $hv = 'v';
706         }
708         foreach ($presentation as $radio) {
709             foreach ($values as $val) {
710                 if ($val == $index) {
711                     $checked = 'checked="checked"';
712                     break;
713                 } else {
714                     $checked = '';
715                 }
716             }
717             $inputname = $item->typ . '_' . $item->id;
718             $inputid = $inputname.'_'.$index;
719         ?>
720             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
721                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
722                     <?php
723                         echo '<input type="radio" '.
724                                 'name="'.$inputname.'[]" '.
725                                 'id="'.$inputid.'" '.
726                                 'value="'.$index.'" '.$checked.' />';
727                     ?>
728                 </span>
729                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
730                     <label for="<?php echo $inputid;?>">
731                         <?php echo format_text($radio, FORMAT_HTML, array('noclean' => true, 'para' => false));?>
732                     </label>
733                 </span>
734             </li>
735         <?php
736             $index++;
737         }
738     }
740     private function print_item_check($presentation, $item, $value, $info, $align) {
742         if (is_array($value)) {
743             $values = $value;
744         } else {
745             $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
746         }
748         if ($info->horizontal) {
749             $hv = 'h';
750         } else {
751             $hv = 'v';
752         }
754         $index = 1;
755         $checked = '';
756         $inputname = $item->typ. '_' . $item->id;
757         echo '<input type="hidden" name="'.$inputname.'[]" value="0" />';
758         foreach ($presentation as $check) {
759             foreach ($values as $val) {
760                 if ($val == $index) {
761                     $checked = 'checked="checked"';
762                     break;
763                 } else {
764                     $checked = '';
765                 }
766             }
767             $inputid = $item->typ. '_' . $item->id.'_'.$index;
768         ?>
769             <li class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
770                 <span class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
771                     <?php
772                         echo '<input type="checkbox" '.
773                               'name="'.$inputname.'[]" '.
774                               'id="'.$inputid.'" '.
775                               'value="'.$index.'" '.$checked.' />';
776                     ?>
777                 </span>
778                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
779                     <label for="<?php echo $inputid;?>">
780                         <?php echo format_text($check, FORMAT_HTML, array('noclean' => true, 'para' => false));?>&nbsp;
781                     </label>
782                 </span>
783             </li>
784         <?php
785             $index++;
786         }
787     }
789     private function print_item_dropdown($presentation, $item, $value, $info, $align) {
790         if (is_array($value)) {
791             $values = $value;
792         } else {
793             $values = array($value);
794         }
796         if ($info->horizontal) {
797             $hv = 'h';
798         } else {
799             $hv = 'v';
800         }
802         ?>
803         <div class="feedback_item_select_<?php echo $hv.'_'.$align;?>">
804             <select  id="<?php echo $item->typ .'_' . $item->id;?>" name="<?php echo $item->typ .'_' . $item->id;?>[]" size="1">
805                 <option value="0">&nbsp;</option>
806                 <?php
807                 $index = 1;
808                 $selected = '';
809                 foreach ($presentation as $dropdown) {
810                     foreach ($values as $val) {
811                         if ($val == $index) {
812                             $selected = 'selected="selected"';
813                             break;
814                         } else {
815                             $selected = '';
816                         }
817                     }
818                 ?>
819                     <option value="<?php echo $index;?>" <?php echo $selected;?>>
820                         <?php echo format_text($dropdown, FORMAT_HTML, array('noclean' => true, 'para' => false));?>
821                     </option>
822                 <?php
823                     $index++;
824                 }
825                 ?>
826             </select>
827         </div>
828         <?php
829     }
831     public function set_ignoreempty($item, $ignoreempty=true) {
832         $item->options = str_replace(FEEDBACK_MULTICHOICE_IGNOREEMPTY, '', $item->options);
833         if ($ignoreempty) {
834             $item->options .= FEEDBACK_MULTICHOICE_IGNOREEMPTY;
835         }
836     }
838     public function ignoreempty($item) {
839         if (strstr($item->options, FEEDBACK_MULTICHOICE_IGNOREEMPTY)) {
840             return true;
841         }
842         return false;
843     }
845     public function set_hidenoselect($item, $hidenoselect=true) {
846         $item->options = str_replace(FEEDBACK_MULTICHOICE_HIDENOSELECT, '', $item->options);
847         if ($hidenoselect) {
848             $item->options .= FEEDBACK_MULTICHOICE_HIDENOSELECT;
849         }
850     }
852     public function hidenoselect($item) {
853         if (strstr($item->options, FEEDBACK_MULTICHOICE_HIDENOSELECT)) {
854             return true;
855         }
856         return false;
857     }
859     public function can_switch_require() {
860         return true;
861     }
863     public function value_type() {
864         return PARAM_INT;
865     }
867     public function value_is_array() {
868         return true;
869     }
871     public function clean_input_value($value) {
872         return clean_param_array($value, $this->value_type());
873     }