Note:

If you want to create a new page for developers, you should create it on the Moodle Developer Resource site.

lib/formslib.php repeat elements: Difference between revisions

From MoodleDocs
m (Correction of reference to choice module (previously referred to as Chat))
No edit summary
Line 4: Line 4:
Also on the form there will be a button to add extra elements to the form. The form page reloads with extra form elements. This involves no javascript.
Also on the form there will be a button to add extra elements to the form. The form page reloads with extra form elements. This involves no javascript.


From the phpdoc comments from this moodleform method :
==Overview==
 
Most of the necessary information is in the phpdoc comment for the repeat_elements() method:


<pre>
<pre>
Line 26: Line 28:
     * @param string $addfieldsname name for button to add more fields
     * @param string $addfieldsname name for button to add more fields
     * @param int $addfieldsno how many fields to add at a time
     * @param int $addfieldsno how many fields to add at a time
     * @param array $addstring array of params for get_string for name of button, $a is no of fields that
     * @param string $addstring the label for the add more fields button.
    *                                  will be added.
     */
     */
</pre>
</pre>


Actually it seems that $addstring is more like this:  get_string('key', 'module', '{no}') in which $a is put into by formslib somewhere. (Penny)
==The elements to repeat==
 
Are in the $elementobjs array, with any options passed in the $options array.
 
WIthin these fields, for example, within the element labels or the Defaults (since Moodle 2.3) you can use {no} to represent which element number this is, counting from 1.
 
==The number of repeats==
 
$repeats is the number of repeats to show initially. $addfieldsno is the number of elements to add whenever the user clicks the 'add more fields' button. $addstring is the label for this button. It can use the {no} placeholder, this time for saying how many repeats will be added. $repeathiddenname is the name to use for the hidden form field that records how many repeats there are.
 
==Examples==


This method can be called from within definition(). Here is an example from within choice_mod_form in choice/mod_form.php. You can see this at work if you add or update a Choice in your course.
Here is some code using repeat_elements() from inside  definition() method of the add or update a Choice form:


<pre>
<code php>
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
         $repeatarray=array();
         $repeatarray=array();
Line 65: Line 76:




</pre>
</code>


Note: I have experienced some weirdness when creating the elements for repeating statically, especially for textarea and htmleditor. Try $mform->createElement instead if this happens (Penny)
For other examples, have a look at the question type editing forms. They may extensive use of repeat_elements().


[[Category:Formslib]]
[[Category:Formslib]]

Revision as of 07:14, 26 March 2012

This function adds a repeating group of elements. An array index starting with a zero index will be added to the elementname so that the form will return arrays of submitted values.

Also on the form there will be a button to add extra elements to the form. The form page reloads with extra form elements. This involves no javascript.

Overview

Most of the necessary information is in the phpdoc comment for the repeat_elements() method:

    /**
     * Method to add a repeating group of elements to a form.
     *
     * @param array $elementobjs Array of elements or groups of elements that are to be repeated
     * @param integer $repeats no of times to repeat elements initially
     * @param array $options Array of options to apply to elements. Array keys are element names.
     *                      This is an array of arrays. The second sets of keys are the option types
     *                      for the elements :
     *                          'default' - default value is value
     *                          'helpbutton' - helpbutton params array is value
     *                          'disabledif' - last three moodleform::disabledIf()
     *                                           params are value as an array
     *                          'rule' - array of arguments for addRule for the elements
     *                                     or a string with a rule name which will be a rule name
     *                                     which be validated client side and which has a default error 
     *                                     message.
     * @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 the label for the add more fields button.
     */

The elements to repeat

Are in the $elementobjs array, with any options passed in the $options array.

WIthin these fields, for example, within the element labels or the Defaults (since Moodle 2.3) you can use {no} to represent which element number this is, counting from 1.

The number of repeats

$repeats is the number of repeats to show initially. $addfieldsno is the number of elements to add whenever the user clicks the 'add more fields' button. $addstring is the label for this button. It can use the {no} placeholder, this time for saying how many repeats will be added. $repeathiddenname is the name to use for the hidden form field that records how many repeats there are.

Examples

Here is some code using repeat_elements() from inside definition() method of the add or update a Choice form:

//-------------------------------------------------------------------------------

       $repeatarray=array();
       $repeatarray[] = &MoodleQuickForm::createElement('header', , get_string('choice','choice').' {no}');
       $repeatarray[] = &MoodleQuickForm::createElement('text', 'option', get_string('choice','choice'));
       $repeatarray[] = &MoodleQuickForm::createElement('text', 'limit', get_string('limit','choice'));
       $repeatarray[] = &MoodleQuickForm::createElement('hidden', 'optionid', 0);
       if ($this->_instance){
           $repeatno=count_records('choice_options', 'choiceid', $this->_instance);
           $repeatno += 2;
       } else {
           $repeatno = 5;
       }
       $repeateloptions = array();
       $repeateloptions['limit']['default'] = 0;
       $repeateloptions['limit']['disabledif'] = array('limitanswers', 'eq', 0);
       $mform->setType('limit', PARAM_INT);
       $repeateloptions['option']['helpbutton'] = array('options', get_string('modulenameplural', 'choice'), 'choice');
       $mform->setType('option', PARAM_TEXT);
       $mform->setType('optionid', PARAM_INT);
       $this->repeat_elements($repeatarray, $repeatno,
                   $repeateloptions, 'option_repeats', 'option_add_fields', 3);


For other examples, have a look at the question type editing forms. They may extensive use of repeat_elements().