]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-12130 and MDL-12129 - fixed advanced status of elements when header not closed...
authorskodak <skodak>
Mon, 12 Nov 2007 17:12:35 +0000 (17:12 +0000)
committerskodak <skodak>
Mon, 12 Nov 2007 17:12:35 +0000 (17:12 +0000)
lib/formslib.php

index 743cf3dfd60220996519927b5d4da2803f104f33..8bb5b1f358cb60ab503d0f56838f71bca75be233 100644 (file)
@@ -138,22 +138,32 @@ class moodleform {
      *                  first element if no errors. Use this as a parameter
      *                  when calling print_header
      */
-    function focus($name=NULL){
+    function focus($name=NULL) {
         $form =& $this->_form;
-        $elkeys=array_keys($form->_elementIndex);
+        $elkeys = array_keys($form->_elementIndex);
+        $error = false;
         if (isset($form->_errors) &&  0 != count($form->_errors)){
             $errorkeys = array_keys($form->_errors);
             $elkeys = array_intersect($elkeys, $errorkeys);
+            $error = true;
         }
-        $names=null;
-        while (!$names){
-            $el = array_shift($elkeys);
-            $names = $form->_getElNamesRecursive($el);
+
+        if ($error or empty($name)) {
+            $names = array();
+            while (empty($names) and !empty($elkeys)) {
+                $el = array_shift($elkeys);
+                $names = $form->_getElNamesRecursive($el);
+            }
+            if (!empty($names)) {
+                $name = array_shift($names);
+            }
         }
-        if (empty($name)) {
-            $name=array_shift($names);
+
+        $focus = '';
+        if (!empty($name)) {
+            $focus = 'forms[\''.$form->getAttribute('id').'\'].elements[\''.$name.'\']';
         }
-        $focus='forms[\''.$this->_form->getAttribute('id').'\'].elements[\''.$name.'\']';
+
         return $focus;
      }
 
@@ -803,8 +813,7 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
     * @access public
     * @return void
     */
-    function accept(&$renderer)
-    {
+    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.
@@ -815,14 +824,19 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
             $anyAdvanced = false;
             foreach (array_keys($this->_elements) as $elementIndex){
                 $element =& $this->_elements[$elementIndex];
+
+                // if closing header and any contained element was advanced then mark it as advanced
                 if ($element->getType()=='header' || in_array($element->getName(), $stopFields)){
-                    if ($anyAdvanced && ($lastHeader!==null)){
+                    if ($anyAdvanced && !is_null($lastHeader)){
                         $this->setAdvanced($lastHeader->getName());
                     }
                     $lastHeaderAdvanced = false;
+                    unset($lastHeader);
+                    $lastHeader = null;
                 } elseif ($lastHeaderAdvanced) {
                     $this->setAdvanced($element->getName());
                 }
+
                 if ($element->getType()=='header'){
                     $lastHeader =& $element;
                     $anyAdvanced = false;
@@ -831,6 +845,10 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
                     $anyAdvanced = true;
                 }
             }
+            // the last header may not be closed yet...
+            if ($anyAdvanced && !is_null($lastHeader)){
+                $this->setAdvanced($lastHeader->getName());
+            }
             $renderer->setAdvancedElements($this->_advancedElements);
 
         }
@@ -1286,6 +1304,10 @@ function validate_' . $this->_formName . '(frm) {
                     $i = 0;
                     foreach ($dependents as $dependent) {
                         $elements = $this->_getElNamesRecursive($dependent);
+                        if (empty($elements)) {
+                            // probably element inside of some group
+                            $elements = array($dependent);
+                        }
                         foreach($elements as $element) {
                             if ($element == $dependentOn) {
                                 continue;
@@ -1303,38 +1325,37 @@ function validate_' . $this->_formName . '(frm) {
         return $js;
     }
 
-    function _getElNamesRecursive($element, $group=null){
-        if ($group==null){
+    function _getElNamesRecursive($element{
+        if (is_string($element)) {
             if (!$this->elementExists($element)) {
                 return array();
             }
-            $el = $this->getElement($element);
-        } else {
-            $el = &$element;
+            $element = $this->getElement($element);
         }
-        if (is_a($el, 'HTML_QuickForm_group')){
-            $group = $el;
-            $elsInGroup = $group->getElements();
+
+        if (is_a($element, 'HTML_QuickForm_group')) {
+            $elsInGroup = $element->getElements();
             $elNames = array();
             foreach ($elsInGroup as $elInGroup){
-                $elNames = array_merge($elNames, $this->_getElNamesRecursive($elInGroup, $group));
-            }
-        }else{
-            if ($group != null){
-                $elNames = array($group->getElementName($el->getName()));
-            } elseif (is_a($el, 'HTML_QuickForm_header')) {
-                return null;
-            } elseif (is_a($el, 'HTML_QuickForm_hidden')) {
-                return null;
-            } elseif (method_exists($el, 'getPrivateName')) {
-                return array($el->getPrivateName());
-            } else {
-                $elNames = array($el->getName());
+                $elNames = array_merge($elNames, $this->_getElNamesRecursive($elInGroup));
             }
+
+        } else if (is_a($element, 'HTML_QuickForm_header')) {
+            return array();
+
+        } else if (is_a($element, 'HTML_QuickForm_hidden')) {
+            return array();
+
+        } else if (method_exists($element, 'getPrivateName')) {
+            return array($element->getPrivateName());
+
+        } else {
+            $elNames = array($element->getName());
         }
-        return $elNames;
 
+        return $elNames;
     }
+
     /**
      * Adds a dependency for $elementName which will be disabled if $condition is met.
      * If $condition = 'notchecked' (default) then the condition is that the $dependentOn element