diff --git a/lang/en_utf8/form.php b/lang/en_utf8/form.php
index 90ce2018bc0..c1ee2eea589 100644
--- a/lang/en_utf8/form.php
+++ b/lang/en_utf8/form.php
@@ -1,6 +1,4 @@
\ No newline at end of file
diff --git a/lib/form/req.png b/lib/form/req.png
index e843ed30a87..52f81359009 100644
Binary files a/lib/form/req.png and b/lib/form/req.png differ
diff --git a/lib/form/select.php b/lib/form/select.php
index e349211b82f..63df3f919b0 100644
--- a/lib/form/select.php
+++ b/lib/form/select.php
@@ -19,8 +19,8 @@ class MoodleQuickForm_select extends HTML_QuickForm_select{
$this->_hiddenLabel = $hiddenLabel;
}
function toHtml(){
- $this->_generateId();
if ($this->_hiddenLabel){
+ $this->_generateId();
return ''.parent::toHtml();
} else {
diff --git a/lib/form/text.php b/lib/form/text.php
index cae359cfa88..c517d1a1119 100644
--- a/lib/form/text.php
+++ b/lib/form/text.php
@@ -19,8 +19,8 @@ class MoodleQuickForm_text extends HTML_QuickForm_text{
$this->_hiddenLabel = $hiddenLabel;
}
function toHtml(){
- $this->_generateId();
if ($this->_hiddenLabel){
+ $this->_generateId();
return ''.parent::toHtml();
} else {
diff --git a/lib/formslib.php b/lib/formslib.php
index a772712414f..d91d6fee190 100644
--- a/lib/formslib.php
+++ b/lib/formslib.php
@@ -1,4 +1,4 @@
-libdir.'/uploadlib.php';
+define('FORM_ADVANCEDIMAGEURL', $CFG->wwwroot.'/lib/form/adv.gif');
+define('FORM_REQIMAGEURL', $CFG->wwwroot.'/lib/form/req.gif');
+
if ($CFG->debug >= DEBUG_ALL){
PEAR::setErrorHandling(PEAR_ERROR_PRINT);
}
@@ -386,6 +389,7 @@ class moodleform {
+
/**
* Method to add a repeating group of elements to a form.
*
@@ -459,11 +463,11 @@ class moodleform {
}
}
$mform->addElement('submit', $addfieldsname, get_string('addfields', 'form', $addfieldsno),
- array('onclick'=>'this.form.submit();'));//need this to bypass client validation
+ array('onclick'=>'skipClientValidation = true; return true;'));//need this to bypass client validation
$renderer =& $mform->defaultRenderer();
$renderer->addStopFieldsetElements($addfieldsname);
-
+ return $repeats;
}
}
@@ -490,6 +494,20 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
*/
var $_cancelButtons=array();
+ /**
+ * Array whose keys are element names. If the key exists this is a advanced element
+ *
+ * @var array
+ */
+ var $_advancedElements = array();
+
+ /**
+ * Whether to display advanced elements (on page load)
+ *
+ * @var boolean
+ */
+ var $_showAdvanced = null;
+
/**
* Class constructor - same parameters as HTML_QuickForm_DHTMLRulesTableless
* @param string $formName Form's name.
@@ -516,12 +534,120 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
}else {
$this->updateAttributes(array('class'=>'mform'));
}
- $this->_helpImageURL="$CFG->wwwroot/lib/form/req.gif";
- $this->_reqHTML = '';
+ $this->_reqHTML = '';
+ $this->_advancedHTML = '';
$this->setRequiredNote(get_string('denotesreq', 'form',
helpbutton('requiredelement', get_string('requiredelement', 'form'),'moodle',
true, false, '', true, '')));
+ FORM_REQIMAGEURL.'" />')));
+ }
+
+ function setShowAdvanced($showadvancedNow){
+ $this->_showAdvanced=$showadvancedNow;
+ }
+ function getShowAdvanced(){
+ return $this->_showAdvanced;
+ }
+
+ /**
+ * Adds an element into the form
+ *
+ * If $element is a string representing element type, then this
+ * method accepts variable number of parameters, their meaning
+ * and count depending on $element
+ *
+ * @param mixed $element element object or type of element to add (text, textarea, file...)
+ * @since 1.0
+ * @return object reference to element
+ * @access public
+ * @throws HTML_QuickForm_Error
+ */
+ function addElement($element)
+ {
+ //call parent with a variable ammount of arguments
+ $args = func_get_args();
+ $parent_name = get_parent_class($this);
+ //static method call
+
+ return call_user_func_array(array($parent_name, 'addElement'), $args);
+ }
+
+ /**
+ * Accepts a renderer
+ *
+ * @param HTML_QuickForm_Renderer An HTML_QuickForm_Renderer object
+ * @since 3.0
+ * @access public
+ * @return void
+ */
+ function accept(&$renderer)
+ {
+ if (method_exists($renderer, 'setAdvancedElements')){
+ //check for visible fieldsets where all elements are advanced
+ //and mark these headers as advanced as well.
+ //And mark all elements in a advanced header as advanced
+ $stopFields = $renderer->getStopFieldSetElements();
+ $lastHeader = null;
+ $lastHeaderAdvanced = false;
+ $anyAdvanced = false;
+ foreach (array_keys($this->_elements) as $elementIndex){
+ $element =& $this->_elements[$elementIndex];
+ if ($element->getType()=='header' || in_array($element->getName(), $stopFields)){
+ if ($anyAdvanced && ($lastHeader!==null)){
+ $this->setAdvanced($lastHeader->getName());
+ }
+ $lastHeaderAdvanced = false;
+ } elseif ($lastHeaderAdvanced) {
+ $this->setAdvanced($element->getName());
+ }
+ if ($element->getType()=='header'){
+ $lastHeader =& $element;
+ $anyAdvanced = false;
+ $lastHeaderAdvanced = isset($this->_advancedElements[$element->getName()]);
+ } elseif (isset($this->_advancedElements[$element->getName()])){
+ $anyAdvanced = true;
+ }
+ }
+ $renderer->setAdvancedElements($this->_advancedElements);
+ if (count($this->_advancedElements)){
+
+ }
+ }
+ parent::accept($renderer);
+ }
+
+ function setAdvanced($elementName, $advanced=true){
+ if ($advanced){
+ $this->_advancedElements[$elementName]='';
+ } elseif (isset($this->_advancedElements[$elementName])) {
+ unset($this->_advancedElements[$elementName]);
+ }
+ if ($advanced && $this->getShowAdvanced()===null){
+ //hidden element
+ $showadvanced_last = optional_param('mform_showadvanced_last', 0, PARAM_INT);
+ //button
+ $showadvanced = optional_param('mform_showadvanced', 0, PARAM_RAW);
+ //toggle if button pressed or else stay the same
+ if ($showadvanced && $showadvanced_last){
+ $showadvanced_now = 0;
+ } elseif ($showadvanced && !$showadvanced_last) {
+ $showadvanced_now = 1;
+ } else {
+ $showadvanced_now = $showadvanced_last;
+ }
+
+ $this->setConstants(array('mform_showadvanced_last'=>$showadvanced_now));
+ //below tells form whether to display elements or not
+ $this->setShowAdvanced($showadvanced_now);
+ $this->_registerNoSubmitButton('mform_showadvanced');
+
+ $this->addElement('hidden', 'mform_showadvanced_last');
+ }
+ }
+
+ function closeHeaderBefore($elementName){
+ $renderer =& $this->defaultRenderer();
+ $renderer->addStopFieldsetElements($elementName);
}
/**
@@ -593,6 +719,10 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
return $this->_reqHTML;
}
+ function getAdvancedHTML(){
+ return $this->_advancedHTML;
+ }
+
/**
* Initializes a default form value. Used to specify the default for a new entry where
* no data is loaded in using moodleform::set_defaults()
@@ -936,10 +1066,6 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
* @access private
*/
var $_elementTemplates;
-
-// uncomment templates below and edit formslib.php for
-// ol li containers for form items.
-
/**
* Template used when opening a hidden fieldset
* (i.e. a fieldset that is opened when there is no header element)
@@ -947,16 +1073,13 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
* @access private
*/
var $_openHiddenFieldsetTemplate = "\n\t
";
/**
* Required Note template string
@@ -974,18 +1096,38 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
var $_requiredNoteTemplate =
"\n\t\t
{requiredNote}
";
+ var $_advancedElements = array();
+
+ /**
+ * Whether to display advanced elements (on page load)
+ *
+ * @var integer 1 means show 0 means hide
+ */
+ var $_showAdvanced;
+
function MoodleQuickForm_Renderer(){
// switch next two lines for ol li containers for form items.
// $this->_elementTemplates=array('default'=>"\n\t\t