Index: lang/en_utf8/form.php =================================================================== RCS file: /cvsroot/moodle/moodle/lang/en_utf8/form.php,v retrieving revision 1.17.4.1 diff -u -r1.17.4.1 form.php --- lang/en_utf8/form.php 6 Dec 2007 09:02:02 -0000 1.17.4.1 +++ lang/en_utf8/form.php 11 Nov 2008 22:27:04 -0000 @@ -28,6 +28,10 @@ $string['hour']='Hour'; $string['minute']='Minute'; +$string['apply'] = 'Apply'; +$string['edoptions'] = 'Editing options'; +$string['numofblanks'] = 'Number of blanks'; + $string['advancedelement']='Advanced element'; $string['hideadvanced']='Hide Advanced'; $string['showadvanced']='Show Advanced'; Index: lang/en_utf8/qtype_match.php =================================================================== RCS file: /cvsroot/moodle/moodle/lang/en_utf8/qtype_match.php,v retrieving revision 1.1.6.1 diff -u -r1.1.6.1 qtype_match.php --- lang/en_utf8/qtype_match.php 27 Oct 2008 02:33:28 -0000 1.1.6.1 +++ lang/en_utf8/qtype_match.php 8 Nov 2008 23:54:04 -0000 @@ -4,4 +4,5 @@ $string['nomatchinganswerforq'] = 'You must specify an answer for this question.'; $string['notenoughquestions'] = 'You must supply at least $a question and answer pairs.'; $string['notenoughqsandas'] = 'You must supply at least $a->q questions and $a->a answers.'; +$string['numberofblanks'] = 'Number of blanks for matches'; ?> \ No newline at end of file Index: lib/formslib.php =================================================================== RCS file: /cvsroot/moodle/moodle/lib/formslib.php,v retrieving revision 1.129.2.18 diff -u -r1.129.2.18 formslib.php --- lib/formslib.php 22 Oct 2008 09:09:31 -0000 1.129.2.18 +++ lib/formslib.php 11 Nov 2008 22:47:48 -0000 @@ -529,28 +529,55 @@ * 'helpbutton' - helpbutton params array is value * 'disabledif' - last three moodleform::disabledIf() * params are value as an array - * @param string $repeathiddenname name for hidden element storing no of repeats in this form - * @param string $addfieldsname name for button to add more fields - * @param int $addfieldsno how many fields to add at a time - * @param string $addstring name of button, {no} is replaced by no of blanks that will be added. - * @param boolean $addbuttoninside if true, don't call closeHeaderBefore($addfieldsname). Default false. + * @param string $prefix prefix for additional elements names !!NEW + * @param string $repeatstring string for label of repeats !!NEW + * @param string $adds is we allowed to add blanks, or we must just statically show existing ones + * @param string $addstring text of button - !!new meaning * @return int no of repeats of element in this page */ - function repeat_elements($elementobjs, $repeats, $options, $repeathiddenname, - $addfieldsname, $addfieldsno=5, $addstring=null, $addbuttoninside=false){ + function repeat_elements($elementobjs, $repeats, $options, $prefix, $repeatstring=null, $adds=true, + $addstring=null){ if ($addstring===null){ - $addstring = get_string('addfields', 'form', $addfieldsno); - } else { - $addstring = str_ireplace('{no}', $addfieldsno, $addstring); - } - $repeats = optional_param($repeathiddenname, $repeats, PARAM_INT); + $addstring = get_string('apply', 'form'); + } + if($repeatstring===null){ + $repeatstring=get_string('numofblanks', 'form'); + } + $repeathiddenname=$prefix.'oldnoanswer'; + $repeatname=$prefix.'noanswers'; + $groupname=$prefix.'edoptgrp'; + $addfieldsname=$prefix.'addanswers'; + + $oldrepeats = optional_param($repeathiddenname, 0, PARAM_INT); + $repeats = optional_param($repeatname, $repeats, PARAM_INT); $addfields = optional_param($addfieldsname, '', PARAM_TEXT); - if (!empty($addfields)){ - $repeats += $addfieldsno; - } $mform =& $this->_form; - $mform->registerNoSubmitButton($addfieldsname); - $mform->addElement('hidden', $repeathiddenname, $repeats); + if(!empty($addfields)){//apply button pressed + $lastused=$this->get_last_used_blank($prefix,$oldrepeats); + if($repeats<$lastused){ + $repeats=$lastused; + } + } else {//we are here first time + $repeats=max($repeats,get_user_preferences($mform->_formName.$prefix,0)); + } + set_user_preference($mform->_formName.$prefix,$repeats); + + $numberrepgroup=array(); + if($adds){ + $numberrepgroup[]=&$mform->createElement('text',$repeatname,'',array('size'=>3)); + $numberrepgroup[]=&$mform->createElement('submit',$addfieldsname,$addstring); + $numberrepgroup[]=&$mform->createElement('hidden', $repeathiddenname, $repeats); + $mform->addGroup($numberrepgroup,$groupname,$repeatstring,array(' '),false); + $grouprule=array(); + $grouprule[$repeatname][]=array(null,'required',null,'client',true); + $grouprule[$repeatname][]=array(null,'nonzero',null,'client',true); + $mform->addGroupRule($groupname,$grouprule); + $_POST[$repeatname]=$repeats;//this is somewhat ugly hack, but I honestly can't find another way to replace submitted value. Setting value attribute for the element and using $element->setValue won't do that (they replace default value only, not submitted), and Moodle lacking set_param function + $mform->setDefault($repeatname,$repeats); + $mform->registerNoSubmitButton($addfieldsname); + } else { + $mform->addElement('hidden', $repeathiddenname, $repeats); + } //value not to be overridden by submitted value $mform->setConstants(array($repeathiddenname=>$repeats)); for ($i=0; $i<$repeats; $i++) { @@ -607,11 +634,6 @@ } } } - $mform->addElement('submit', $addfieldsname, $addstring); - - if (!$addbuttoninside) { - $mform->closeHeaderBefore($addfieldsname); - } return $repeats; } @@ -1335,11 +1357,22 @@ //unset($element); //$element =& $this->getElement($elementName); //end of fix - $valFunc = 'validate_' . $this->_formName . '_' . $elementName . '(this)'; - $onBlur = $element->getAttribute('onBlur'); - $onChange = $element->getAttribute('onChange'); - $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, + //Rough Fix for bug with compare rule + if(is_array($element)){ + $onBlur = $element[0]->getAttribute('onBlur'); + $onChange = $element[0]->getAttribute('onChange'); + $element[0]->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc)); + }else{ + //end of rough fix + $valFunc = 'validate_' . $this->_formName . '_' . $elementName . '(this)'; + $onBlur = $element->getAttribute('onBlur'); + $onChange = $element->getAttribute('onChange'); + $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, + 'onChange' => $onChange . $valFunc)); + //Rough Fix for bug with compare rule + } + //end of rough fix } // do not rely on frm function parameter, because htmlarea breaks it when overloading the onsubmit method $js .= ' Index: question/type/match/edit_match_form.php =================================================================== RCS file: /cvsroot/moodle/moodle/question/type/match/edit_match_form.php,v retrieving revision 1.8.2.4 diff -u -r1.8.2.4 edit_match_form.php --- question/type/match/edit_match_form.php 27 Oct 2008 02:33:28 -0000 1.8.2.4 +++ question/type/match/edit_match_form.php 11 Nov 2008 22:47:28 -0000 @@ -36,16 +36,19 @@ } else { $countsubquestions = 0; } + if ($this->question->formoptions->repeatelements){ - $repeatsatstart = (QUESTION_NUMANS_START > ($countsubquestions + QUESTION_NUMANS_ADD))? - QUESTION_NUMANS_START : ($countsubquestions + QUESTION_NUMANS_ADD); + $repeatsatstart = max($countsubquestions, QUESTION_NUMANS_START)+QUESTION_NUMANS_ADD; + $mform->addElement('header','matchblanks_edopthdr',get_string('edoptions', 'form')); } else { $repeatsatstart = $countsubquestions; } + $mform->setType('subanswer', PARAM_TEXT); $mform->setType('subquestion', PARAM_TEXT); - - $this->repeat_elements($repeated, $repeatsatstart, array(), 'noanswers', 'addanswers', QUESTION_NUMANS_ADD, get_string('addmoreqblanks', 'qtype_match')); + + + $this->repeat_elements($repeated, $repeatsatstart, array(), 'matchblanks_',get_string('numberofblanks', 'qtype_match'),$this->question->formoptions->repeatelements); } @@ -103,5 +106,26 @@ } return $errors; } + + /** + * Method do determine the number of last used blank in the form (see repeat_elements) + * + * @param $prefix - prefix to determine which blank set we use (in case there are several on the page) + * @param $repeats - number of blanks + * @return int no of last used blank, 1 if there isn't any as we must leave at least one blank on the page + */ + function get_last_used_blank($prefix, $repeats){ + $lastblankno=0; + $answers=optional_param("subanswers",array(),PARAM_RAW); + $questions=optional_param("subquestions",array(),PARAM_RAW); + for($i=0;$i<$repeats;$i++){ + $trimmedanswer=trim($answers[$i]); + $trimmedquestion=trim($questions[$i]); + if ($trimmedanswer != '' || $trimmedquestion != ''){ + $lastblankno=$i; + } + } + return $lastblankno+1;//use no, not index + } } ?> \ No newline at end of file