729c72d6c02bb29b540a9342af577a7b24d359e5
[moodle.git] / mod / feedback / item / multichoice / lib.php
1 <?php
2 defined('MOODLE_INTERNAL') OR die('not allowed');
3 require_once($CFG->dirroot.'/mod/feedback/item/feedback_item_class.php');
5 define('FEEDBACK_MULTICHOICE_TYPE_SEP', '>>>>>');
6 define('FEEDBACK_MULTICHOICE_LINE_SEP', '|');
7 define('FEEDBACK_MULTICHOICE_ADJUST_SEP', '<<<<<');
8 define('FEEDBACK_MULTICHOICE_IGNOREEMPTY', 'i');
9 define('FEEDBACK_MULTICHOICE_HIDENOSELECT', 'h');
11 class feedback_item_multichoice extends feedback_item_base {
12     var $type = "multichoice";
13     var $commonparams;
14     var $item_form;
15     var $item;
17     function init() {
19     }
21     function build_editform($item, $feedback, $cm) {
22         global $DB, $CFG;
23         require_once('multichoice_form.php');
25         //get the lastposition number of the feedback_items
26         $position = $item->position;
27         $lastposition = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
28         if($position == -1){
29             $i_formselect_last = $lastposition + 1;
30             $i_formselect_value = $lastposition + 1;
31             $item->position = $lastposition + 1;
32         }else {
33             $i_formselect_last = $lastposition;
34             $i_formselect_value = $item->position;
35         }
36         //the elements for position dropdownlist
37         $positionlist = array_slice(range(0,$i_formselect_last),1,$i_formselect_last,true);
39         $item->presentation = empty($item->presentation) ? '' : $item->presentation;
40         $info = $this->get_info($item);
42         $item->ignoreempty = $this->ignoreempty($item);
43         $item->hidenoselect = $this->hidenoselect($item);
45         //all items for dependitem
46         $feedbackitems = feedback_get_depend_candidates_for_item($feedback, $item);
47         $commonparams = array('cmid'=>$cm->id,
48                              'id'=>isset($item->id) ? $item->id : NULL,
49                              'typ'=>$item->typ,
50                              'items'=>$feedbackitems,
51                              'feedback'=>$feedback->id);
53         //build the form
54         $this->item_form = new feedback_multichoice_form('edit_item.php', array('item'=>$item, 'common'=>$commonparams, 'positionlist'=>$positionlist, 'position'=>$position, 'info'=>$info));
55     }
57     //this function only can used after the call of build_editform()
58     function show_editform() {
59         $this->item_form->display();
60     }
62     function is_cancelled() {
63         return $this->item_form->is_cancelled();
64     }
66     function get_data() {
67         if($this->item = $this->item_form->get_data()) {
68             return true;
69         }
70         return false;
71     }
73     function save_item() {
74         global $DB;
76         if(!$item = $this->item_form->get_data()) {
77             return false;
78         }
80         if(isset($item->clone_item) AND $item->clone_item) {
81             $item->id = ''; //to clone this item
82             $item->position++;
83         }
85         $this->set_ignoreempty($item, $item->ignoreempty);
86         $this->set_hidenoselect($item, $item->hidenoselect);
88         $item->hasvalue = $this->get_hasvalue();
89         if(!$item->id) {
90             $item->id = $DB->insert_record('feedback_item', $item);
91         }else {
92             $DB->update_record('feedback_item', $item);
93         }
95         return $DB->get_record('feedback_item', array('id'=>$item->id));
96     }
99     //liefert ein eindimensionales Array mit drei Werten(typ, name, XXX)
100     //XXX ist ein eindimensionales Array (anzahl der Antworten bei Typ Radio) Jedes Element ist eine Struktur (answertext, answercount)
101     function get_analysed($item, $groupid = false, $courseid = false) {
102         $info = $this->get_info($item);
104         $analysedItem = array();
105         $analysedItem[] = $item->typ;
106         $analysedItem[] = $item->name;
107         //die moeglichen Antworten extrahieren
108         $answers = null;
109         // $presentation = '';
110         // @list($presentation) = explode(FEEDBACK_RADIO_ADJUST_SEP, $item->presentation); //remove the adjustment-info
112         $answers = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
113         if(!is_array($answers)) return null;
115         //die Werte holen
116         $values = feedback_get_group_values($item, $groupid, $courseid, $this->ignoreempty($item));
117         if(!$values) return null;
118         //schleife ueber den Werten und ueber die Antwortmoeglichkeiten
120         $analysedAnswer = array();
121         if($info->subtype == 'c') {
122             $sizeofanswers = sizeof($answers);
123             for($i = 1; $i <= $sizeofanswers; $i++) {
124                 $ans = null;
125                 $ans->answertext = $answers[$i-1];
126                 $ans->answercount = 0;
127                 foreach($values as $value) {
128                     //ist die Antwort gleich dem index der Antworten + 1?
129                     $vallist = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value->value);
130                     foreach($vallist as $val) {
131                         if ($val == $i) {
132                            $ans->answercount++;
133                         }
134                     }
135                 }
136                 $ans->quotient = $ans->answercount / sizeof($values);
137                 $analysedAnswer[] = $ans;
138             }
139         }else {
140             $sizeofanswers = sizeof($answers);
141             for($i = 1; $i <= $sizeofanswers; $i++) {
142                 $ans = null;
143                 $ans->answertext = $answers[$i-1];
144                 $ans->answercount = 0;
145                 foreach($values as $value) {
146                     //ist die Antwort gleich dem index der Antworten + 1?
147                     if ($value->value == $i) {
148                         $ans->answercount++;
149                     }
150                 }
151                 $ans->quotient = $ans->answercount / sizeof($values);
152                 $analysedAnswer[] = $ans;
153             }
154         }
155         $analysedItem[] = $analysedAnswer;
156         return $analysedItem;
157     }
159     function get_printval($item, $value) {
160         $info = $this->get_info($item);
162         $printval = '';
164         if(!isset($value->value)) return $printval;
166         // @list($presentation) = explode(FEEDBACK_RADIO_ADJUST_SEP, $item->presentation); //remove the adjustment-info
168         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
170         if($info->subtype == 'c') {
171             $vallist = array_values(explode (FEEDBACK_MULTICHOICE_LINE_SEP, $value->value));
172             $sizeofvallist = sizeof($vallist);
173             for($i = 0; $i < $sizeofvallist; $i++) {
174                 $sizeofpresentation = sizeof($presentation);
175                 for($k = 0; $k < $sizeofpresentation; $k++) {
176                     if($vallist[$i] == ($k + 1)) {//Die Werte beginnen bei 1, das Array aber mit 0
177                         $printval .= trim($presentation[$k]) . chr(10);
178                         break;
179                     }
180                 }
181             }
182         }else {
183             $index = 1;
184             foreach($presentation as $pres){
185                 if($value->value == $index){
186                     $printval = $pres;
187                     break;
188                 }
189                 $index++;
190             }
191         }
192         return $printval;
193     }
195     function print_analysed($item, $itemnr = '', $groupid = false, $courseid = false) {
196         $sep_dec = get_string('separator_decimal', 'feedback');
197         if(substr($sep_dec, 0, 2) == '[['){
198             $sep_dec = FEEDBACK_DECIMAL;
199         }
201         $sep_thous = get_string('separator_thousand', 'feedback');
202         if(substr($sep_thous, 0, 2) == '[['){
203             $sep_thous = FEEDBACK_THOUSAND;
204         }
206         $analysedItem = $this->get_analysed($item, $groupid, $courseid);
207         if($analysedItem) {
208             // $itemnr++;
209             $itemname = $analysedItem[1];
210             echo '<tr><th colspan="2" align="left">'. $itemnr . '&nbsp;('. $item->label .') ' . $itemname .'</th></tr>';
211             $analysedVals = $analysedItem[2];
212             $pixnr = 0;
213             foreach($analysedVals as $val) {
214                 if( function_exists("bcmod")) {
215                     $intvalue = bcmod($pixnr, 10);
216                 }else {
217                     $intvalue = 0;
218                 }
219                 $pix = "pics/$intvalue.gif";
220                 $pixnr++;
221                 $pixwidth = intval($val->quotient * FEEDBACK_MAX_PIX_LENGTH);
222                 $quotient = number_format(($val->quotient * 100), 2, $sep_dec, $sep_thous);
223                 echo '<tr><td align="left" valign="top">-&nbsp;&nbsp;' . trim($val->answertext) . ':</td><td align="left" style="width: '.FEEDBACK_MAX_PIX_LENGTH.'"><img alt="'.$intvalue.'" src="'.$pix.'" height="5" width="'.$pixwidth.'" />&nbsp;' . $val->answercount . (($val->quotient > 0)?'&nbsp;('. $quotient . '&nbsp;%)':'').'</td></tr>';
224             }
225         }
226         // return $itemnr;
227     }
229     function excelprint_item(&$worksheet, $rowOffset, $xlsFormats, $item, $groupid, $courseid = false) {
230         $analysed_item = $this->get_analysed($item, $groupid, $courseid);
232         $data = $analysed_item[2];
234         // $worksheet->setFormat("<l><f><ro2><vo><c:green>");
235         //frage schreiben
236         $worksheet->write_string($rowOffset, 0, $item->label, $xlsFormats->head2_green);
237         $worksheet->write_string($rowOffset, 1, $analysed_item[1], $xlsFormats->head2_green);
238         if(is_array($data)) {
239             $sizeofdata = sizeof($data);
240             for($i = 0; $i < $sizeofdata; $i++) {
241                 $aData = $data[$i];
243                 // $worksheet->setFormat("<l><f><ro2><vo><c:blue>");
244                 $worksheet->write_string($rowOffset, $i + 2, trim($aData->answertext), $xlsFormats->value_blue);
246                 // $worksheet->setFormat("<l><vo>");
247                 $worksheet->write_number($rowOffset + 1, $i + 2, $aData->answercount, $xlsFormats->default);
248                 // $worksheet->setFormat("<l><f><vo><pr>");
249                 $worksheet->write_number($rowOffset + 2, $i + 2, $aData->quotient, $xlsFormats->procent);
250             }
251         }
252         $rowOffset +=3 ;
253         return $rowOffset;
254     }
256     /**
257      * print the item at the edit-page of feedback
258      *
259      * @global object
260      * @param object $item
261      * @return void
262      */
263     function print_item_preview($item) {
264         global $OUTPUT, $DB;
265         $info = $this->get_info($item);
266         $align = right_to_left() ? 'right' : 'left';
268         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
271         //test if required and no value is set so we have to mark this item
272         //we have to differ check and the other subtypes
273         $requiredmark =  ($item->required == 1) ? '<span class="feedback_required_mark">*</span>' : '';
275         //print the question and label
276         echo '<div class="feedback_item_label_'.$align.'">';
277         echo '('.$item->label.') ';
278         echo format_text($item->name.$requiredmark, true, false, false);
279         if($item->dependitem) {
280             if($dependitem = $DB->get_record('feedback_item', array('id'=>$item->dependitem))) {
281                 echo ' <span class="feedback_depend">('.$dependitem->label.'-&gt;'.$item->dependvalue.')</span>';
282             }
283         }
284         echo '</div>';
286         //print the presentation
287         echo '<div class="feedback_item_presentation_'.$align.'">';
288         $index = 1;
289         $checked = '';
290         echo '<ul>';
291         if($info->horizontal) {
292             $hv = 'h';
293         }else {
294             $hv = 'v';
295         }
297         if($info->subtype == 'r' AND !$this->hidenoselect($item)) {
298         //print the "not_selected" item on radiobuttons
299         ?>
300             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
301                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
302                     <input type="radio" name="<?php echo $item->typ . '_' . $item->id ;?>" id="<?php echo $item->typ . '_' . $item->id.'_xxx';?>" value="" checked="checked" />
303                 </span>
304                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
305                     <label for="<?php echo $item->typ . '_' . $item->id.'_xxx';?>"><?php print_string('not_selected', 'feedback');?>&nbsp;</label>
306                 </span>
307             </li>
308         <?php
309         }
311         switch($info->subtype) {
312             case 'r':
313                 $this->print_item_radio($presentation, $item, false, $info, $align);
314                 break;
315             case 'c':
316                 $this->print_item_check($presentation, $item, false, $info, $align);
317                 break;
318             case 'd':
319                 $this->print_item_dropdown($presentation, $item, false, $info, $align);
320                 break;
321         }
322         echo '</ul>';
323         echo '</div>';
324     }
326     /**
327      * print the item at the complete-page of feedback
328      *
329      * @global object
330      * @param object $item
331      * @param string $value
332      * @param bool $highlightrequire
333      * @return void
334      */
335     function print_item_complete($item, $value = '', $highlightrequire = false) {
336         global $OUTPUT;
337         $info = $this->get_info($item);
338         $align = right_to_left() ? 'right' : 'left';
340         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
343         //test if required and no value is set so we have to mark this item
344         //we have to differ check and the other subtypes
345         if($info->subtype == 'c') {
346             if (is_array($value)) {
347                 $values = $value;
348             }else {
349                 $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
350             }
351             if($highlightrequire AND $item->required AND $values[0] == '') {
352                 $highlight = ' missingrequire';
353             }else {
354                 $highlight = '';
355             }
356             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
357         }else {
358             if($highlightrequire AND $item->required AND intval($value) <= 0) {
359                 $highlight = ' missingrequire';
360             }else {
361                 $highlight = '';
362             }
363             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
364         }
366         //print the question and label
367         echo '<div class="feedback_item_label_'.$align.$highlight.'">';
368             echo format_text($item->name.$requiredmark, true, false, false);
369         echo '</div>';
371         //print the presentation
372         echo '<div class="feedback_item_presentation_'.$align.$highlight.'">';
374         echo '<ul>';
375         if($info->horizontal) {
376             $hv = 'h';
377         }else {
378             $hv = 'v';
379         }
380         //print the "not_selected" item on radiobuttons
381         if($info->subtype == 'r' AND !$this->hidenoselect($item)) {
382         ?>
383             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
384                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
385                     <input type="radio" name="<?php echo $item->typ.'_'.$item->id ;?>" id="<?php echo $item->typ . '_' . $item->id.'_xxx';?>" value="" <?php echo $value ? '' : 'checked="checked"';?> />
386                 </span>
387                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
388                     <label for="<?php echo $item->typ.'_'.$item->id.'_xxx';?>"><?php print_string('not_selected', 'feedback');?>&nbsp;</label>
389                 </span>
390             </li>
391         <?php
392         }
394         switch($info->subtype) {
395             case 'r':
396                 $this->print_item_radio($presentation, $item, $value, $info, $align);
397                 break;
398             case 'c':
399                 $this->print_item_check($presentation, $item, $value, $info, $align);
400                 break;
401             case 'd':
402                 $this->print_item_dropdown($presentation, $item, $value, $info, $align);
403                 break;
404         }
405         echo '</ul>';
406         echo '</div>';
407     }
409     /**
410      * print the item at the complete-page of feedback
411      *
412      * @global object
413      * @param object $item
414      * @param string $value
415      * @return void
416      */
417     function print_item_show_value($item, $value = '') {
418         global $OUTPUT;
419         $info = $this->get_info($item);
420         $align = right_to_left() ? 'right' : 'left';
422         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
425         //test if required and no value is set so we have to mark this item
426         //we have to differ check and the other subtypes
427         if($info->subtype == 'c') {
428             if (is_array($value)) {
429                 $values = $value;
430             }else {
431                 $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
432             }
433             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
434         }else {
435             $requiredmark =  ($item->required == 1)?'<span class="feedback_required_mark">*</span>':'';
436         }
438         //print the question and label
439         echo '<div class="feedback_item_label_'.$align.'">';
440         echo '('.$item->label.') ';
441         echo format_text($item->name . $requiredmark, true, false, false);
442         echo '</div>';
444         //print the presentation
445         echo '<div class="feedback_item_presentation_'.$align.'">';
446         $index = 1;
447         if($info->subtype == 'c') {
448             echo $OUTPUT->box_start('generalbox boxalign'.$align);
449             foreach($presentation as $pres){
450                 foreach($values as $val) {
451                     if($val == $index){
452                         echo '<div class="feedback_item_multianswer">';
453                         echo text_to_html($pres, true, false, false);
454                         echo '</div>';
455                         break;
456                     }
457                 }
458                 $index++;
459             }
460             echo $OUTPUT->box_end();
461         }else {
462             foreach($presentation as $pres){
463                 if($value == $index){
464                     echo $OUTPUT->box_start('generalbox boxalign'.$align);
465                     echo text_to_html($pres, true, false, false);
466                     echo $OUTPUT->box_end();
467                     break;
468                 }
469                 $index++;
470             }
471         }
472         echo '</div>';
473     }
475     function check_value($value, $item) {
476         $info = $this->get_info($item);
478         if($info->subtype == 'c') {
479             if((!isset($value) OR !is_array($value) OR $value[0] == '' OR $value[0] == 0) AND $item->required != 1){
480                 return true;
481             }
482             if($value[0] == ""){
483                 return false;
484             }
485             return true;
486         }else {
487             //if the item is not required, so the check is true if no value is given
488             if((!isset($value) OR $value == '' OR $value == 0) AND $item->required != 1) return true;
489             if(intval($value) > 0)return true;
490         }
491         return false;
492     }
494     function create_value($data) {
495         $vallist = $data;
496         return trim($this->item_arrayToString($vallist));
497     }
499     //compares the dbvalue with the dependvalue
500     //dbvalue is the number of one selection
501     //dependvalue is the presentation of one selection
502     function compare_value($item, $dbvalue, $dependvalue) {
504         if (is_array($dbvalue)) {
505             $dbvalues = $dbvalue;
506         }else {
507             $dbvalues = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $dbvalue);
508         }
510         $info = $this->get_info($item);
511         $presentation = explode (FEEDBACK_MULTICHOICE_LINE_SEP, $info->presentation);
512         $index = 1;
513         foreach($presentation as $pres) {
514             foreach($dbvalues as $dbval) {
515                 if($dbval == $index AND trim($pres) == $dependvalue) {
516                     return true;
517                 }
518             }
519             $index++;
520         }
521         return false;
522     }
524     function get_presentation($data) {
525         $present = str_replace("\n", FEEDBACK_MULTICHOICE_LINE_SEP, trim($data->itemvalues));
526         if(!isset($data->subtype)) {
527             $subtype = 'r';
528         }else {
529             $subtype = substr($data->subtype, 0, 1);
530         }
531         if(isset($data->horizontal) AND $data->horizontal == 1 AND $subtype != 'd') {
532             $present .= FEEDBACK_MULTICHOICE_ADJUST_SEP.'1';
533         }
534         return $subtype.FEEDBACK_MULTICHOICE_TYPE_SEP.$present;
535     }
537     function get_hasvalue() {
538         return 1;
539     }
541     function get_info($item) {
542         $presentation = empty($item->presentation) ? '' : $item->presentation;
544         $info = new stdClass();
545         //check the subtype of the multichoice
546         //it can be check(c), radio(r) or dropdown(d)
547         $info->subtype = '';
548         $info->presentation = '';
549         $info->horizontal = false;
551         @list($info->subtype, $info->presentation) = explode(FEEDBACK_MULTICHOICE_TYPE_SEP, $item->presentation);
552         if(!isset($info->subtype)) {
553             $info->subtype = 'r';
554         }
556         if($info->subtype != 'd') {
557             @list($info->presentation, $info->horizontal) = explode(FEEDBACK_MULTICHOICE_ADJUST_SEP, $info->presentation);
558             if(isset($info->horizontal) AND $info->horizontal == 1) {
559                 $info->horizontal = true;
560             }else {
561                 $info->horizontal = false;
562             }
563         }
564         return $info;
565     }
567     function item_arrayToString($value) {
568         if(!is_array($value)) {
569             return $value;
570         }
571         $retval = '';
572         $arrvals = array_values($value);
573         $arrvals = clean_param($arrvals, PARAM_INT);  //prevent sql-injection
574         $retval = $arrvals[0];
575         $sizeofarrvals = sizeof($arrvals);
576         for($i = 1; $i < $sizeofarrvals; $i++) {
577             $retval .= FEEDBACK_MULTICHOICE_LINE_SEP.$arrvals[$i];
578         }
579         return $retval;
580     }
582     function print_item_radio($presentation, $item, $value, $info, $align) {
583         $index = 1;
584         $checked = '';
586         if($info->horizontal) {
587             $hv = 'h';
588         }else {
589             $hv = 'v';
590         }
592         foreach($presentation as $radio){
593             if($value == $index){
594                 $checked = 'checked="checked"';
595             }else{
596                 $checked = '';
597             }
598             $inputname = $item->typ . '_' . $item->id;
599             $inputid = $inputname.'_'.$index;
600         ?>
601             <li class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
602                 <span class="feedback_item_radio_<?php echo $hv.'_'.$align;?>">
603                     <input type="radio" name="<?php echo $inputname;?>" id="<?php echo $inputid;?>" value="<?php echo $index;?>" <?php echo $checked;?> />
604                 </span>
605                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
606                     <label for="<?php echo $inputid;?>"><?php echo text_to_html($radio, true, false, false);?>&nbsp;</label>
607                 </span>
608             </li>
609         <?php
610             $index++;
611         }
612     }
614     function print_item_check($presentation, $item, $value, $info, $align) {
616         if (is_array($value)) {
617             $values = $value;
618         }else {
619             $values = explode(FEEDBACK_MULTICHOICE_LINE_SEP, $value);
620         }
622         if($info->horizontal) {
623             $hv = 'h';
624         }else {
625             $hv = 'v';
626         }
628         $index = 1;
629         $checked = '';
630         foreach($presentation as $check){
631             foreach($values as $val) {
632                 if($val == $index){
633                     $checked = 'checked="checked"';
634                     break;
635                 }else{
636                     $checked = '';
637                 }
638             }
639             $inputname = $item->typ. '_' . $item->id;
640             $inputid = $item->typ. '_' . $item->id.'_'.$index;
641         ?>
642             <li class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
643                 <span class="feedback_item_check_<?php echo $hv.'_'.$align;?>">
644                     <input type="checkbox" name="<?php echo $inputname;?>[]" id="<?php echo $inputid;?>" value="<?php echo $index;?>" <?php echo $checked;?> />
645                 </span>
646                 <span class="feedback_item_radiolabel_<?php echo $hv.'_'.$align;?>">
647                     <label for="<?php echo $inputid;?>"><?php echo text_to_html($check, true, false, false);?>&nbsp;</label>
648                 </span>
649             </li>
650         <?php
651             $index++;
652         }
653     }
655     function print_item_dropdown($presentation, $item, $value, $info, $align) {
656         if($info->horizontal) {
657             $hv = 'h';
658         }else {
659             $hv = 'v';
660         }
662         ?>
663         <li class="feedback_item_select_<?php echo $hv.'_'.$align;?>">
664             <select name="<?php echo $item->typ .'_' . $item->id;?>" size="1">
665                 <option value="0">&nbsp;</option>
666                 <?php
667                 $index = 1;
668                 $checked = '';
669                 foreach($presentation as $dropdown){
670                     if($value == $index){
671                         $selected = 'selected="selected"';
672                     }else{
673                         $selected = '';
674                     }
675                 ?>
676                     <option value="<?php echo $index;?>" <?php echo $selected;?>><?php echo text_to_html($dropdown, true, false, false);?></option>
677                 <?php
678                     $index++;
679                 }
680                 ?>
681             </select>
682         </li>
683         <?php
684     }
686     function set_ignoreempty($item, $ignoreempty=true) {
687         $item->options = str_replace(FEEDBACK_MULTICHOICE_IGNOREEMPTY, '', $item->options);
688         if($ignoreempty) {
689             $item->options .= FEEDBACK_MULTICHOICE_IGNOREEMPTY;
690         }
691     }
693     function ignoreempty($item) {
694         if(strstr($item->options, FEEDBACK_MULTICHOICE_IGNOREEMPTY)) {
695             return true;
696         }
697         return false;
698     }
700     function set_hidenoselect($item, $hidenoselect=true) {
701         $item->options = str_replace(FEEDBACK_MULTICHOICE_HIDENOSELECT, '', $item->options);
702         if($hidenoselect) {
703             $item->options .= FEEDBACK_MULTICHOICE_HIDENOSELECT;
704         }
705     }
707     function hidenoselect($item) {
708         if(strstr($item->options, FEEDBACK_MULTICHOICE_HIDENOSELECT)) {
709             return true;
710         }
711         return false;
712     }
715     function can_switch_require() {
716         return true;
717     }