]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-8157 improved hadling of conditions in disabledIf formslib method
authorskodak <skodak>
Fri, 12 Jan 2007 09:38:02 +0000 (09:38 +0000)
committerskodak <skodak>
Fri, 12 Jan 2007 09:38:02 +0000 (09:38 +0000)
lib/formslib.php
lib/javascript-static.js

index 3fddeca2ad0b049a821c05fb08b2d8cd949e5c1b..8ce6952aa61f2066f2025ea6098c49fe3de5b0eb 100644 (file)
@@ -1170,34 +1170,39 @@ function validate_' . $this->_formName . '(frm) {
     }
 
     function getLockOptionEndScript(){
+
+        $iname = $this->getAttribute('id').'items';
         $js = '<script type="text/javascript">'."\n";
         $js .= '//<![CDATA['."\n";
-        $js .= "var ".$this->getAttribute('id')."items= {";
-        foreach ($this->_dependencies as $dependentOn => $elements){
-            $js .= "'$dependentOn'".' : {dependents :[';
-            foreach ($elements as $element){
-                $elementNames = $this->_getElNamesRecursive($element['dependent']);
-                foreach ($elementNames as $dependent){
-                    if ($dependent !=  $dependentOn) {
-                        $js.="'".$dependent."', ";
+        $js .= "var $iname = Array();\n";
+
+        foreach ($this->_dependencies as $dependentOn => $conditions){
+            $js .= "{$iname}['$dependentOn'] = Array();\n";
+            foreach ($conditions as $condition=>$values) {
+                $js .= "{$iname}['$dependentOn']['$condition'] = Array();\n";
+                foreach ($values as $value=>$dependents) {
+                    $js .= "{$iname}['$dependentOn']['$condition']['$value'] = Array();\n";
+                    $i = 0;
+                    foreach ($dependents as $dependent) {
+                        $elements = $this->_getElNamesRecursive($dependent);
+                        foreach($elements as $element) {
+                            if ($element == $dependentOn) {
+                                continue;
+                            }
+                            $js .= "{$iname}['$dependentOn']['$condition']['$value'][$i]='$element';\n";
+                            $i++;
+                        }
                     }
                 }
             }
-            $js=rtrim($js, ', ');
-            $js .= "],\n";
-            $js .= "condition : '{$element['condition']}',\n";
-            $js .= "value : '{$element['value']}'},\n";
-
-        };
-        $js=rtrim($js, ",\n");
-        $js .= '};'."\n";
+        }
         $js .="lockoptionsallsetup('".$this->getAttribute('id')."');\n";
         $js .='//]]>'."\n";
         $js .='</script>'."\n";
         return $js;
     }
 
-    function _getElNamesRecursive(&$element, $group=null){
+    function _getElNamesRecursive($element, $group=null){
         if ($group==null){
             $el = $this->getElement($element);
         } else {
@@ -1237,16 +1242,27 @@ function validate_' . $this->_formName . '(frm) {
      * @param string $condition the condition to check
      * @param mixed $value used in conjunction with condition.
      */
-    function disabledIf($elementName, $dependentOn, $condition = 'notchecked', $value=null){
-        $this->_dependencies[$dependentOn][] = array('dependent'=>$elementName,
-                                    'condition'=>$condition, 'value'=>$value);
+    function disabledIf($elementName, $dependentOn, $condition = 'notchecked', $value='1'){
+        if (!array_key_exists($dependentOn, $this->_dependencies)) {
+            $this->_dependencies[$dependentOn] = array();
+        }
+        if (!array_key_exists($condition, $this->_dependencies[$dependentOn])) {
+            $this->_dependencies[$dependentOn][$condition] = array();
+        }
+        if (!array_key_exists($value, $this->_dependencies[$dependentOn][$condition])) {
+            $this->_dependencies[$dependentOn][$condition][$value] = array();
+        }
+        $this->_dependencies[$dependentOn][$condition][$value][] = $elementName;
     }
+
     function registerNoSubmitButton($buttonname){
         $this->_noSubmitButtons[]=$buttonname;
     }
+
     function isNoSubmitButton($buttonname){
         return (array_search($buttonname, $this->_noSubmitButtons)!==FALSE);
     }
+
     function _registerCancelButton($addfieldsname){
         $this->_cancelButtons[]=$addfieldsname;
     }
index 9af0df8a255f7a6eb9642136772538cee7c14f22..60a0713c03d3d2a33aeb1c8d3dff4e3cb604002d 100644 (file)
@@ -81,65 +81,56 @@ function unlockoption(form,item) {
     eval("form.h"+item+".value=0");
   }
 }
+
+
 function lockoptionsall(formid) {
-  var lock = new Object();
-  var items = eval(formid+'items');
-  var form = document.forms[formid];
-  for (var master in items){
-      var subitems=items[master].dependents;
-      var thislock;
-      if (items[master].condition=='notchecked'){
-          thislock=!form.elements[master].checked;
-      } else if (items[master].condition=='checked'){
-          thislock=form.elements[master].checked;
-      } else if  (items[master].condition=='noitemselected'){
-          thislock=(form.elements[master].selectedIndex==-1);
-      } else if  (items[master].condition=='eq'){
-          thislock=(form.elements[master].value==items[master].value);
-      } else {
-          thislock=(form.elements[master].value!=items[master].value);
-
-      }
-
-      for (var i=0; i<subitems.length; i++) {
-        if (lock[subitems[i]]!=null){
-          lock[subitems[i]] = thislock || lock[subitems[i]];
-        }else{
-          lock[subitems[i]] = thislock;
+    var form = document.forms[formid];
+    var dependons = eval(formid+'items');
+    for (var dependon in dependons) {
+        var master = form[dependon];
+        for (var condition in dependons[dependon]) {
+            for (var value in dependons[dependon][condition]) {
+                var lock;
+                switch (condition) {
+                  case 'notchecked':
+                      lock = !master.checked; break;
+                  case 'checked':
+                      lock = master.checked; break;
+                  case 'noitemselected':
+                      lock = master.selectedIndex==-1; break;
+                  case 'eq':
+                      lock = master.value==value; break;
+                  default:
+                      lock = master.value!=value; break;
+                }
+                for (var ei in dependons[dependon][condition][value]) {
+                    var formelement = form[dependons[dependon][condition][value][ei]];
+                    formelement.disabled = lock;
+                }
+            }
         }
-      }
-
-      for (var item in lock) {
-          form.elements[item].disabled=lock[item];
-      }
-  }
-  return(true);
+    }
+    return true;
 }
 
 function lockoptionsallsetup(formid) {
-  var varname = formid.replace(/\-/g, '_');
-  var items=eval(varname+'items');
-  var form=document.forms[formid];
-  for (var i = 0; i < form.elements.length; i++){
-      var found=false;
-      var formelement = form.elements[i];
-      if (formelement.type=='reset'){
-          formelement.onclick = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
-          formelement.onblur = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
-          formelement.onchange = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
-      } else {
-          for (var master in items){
-              if (master==formelement.name){
-                  formelement.onclick = function(){return lockoptionsall(this.form.getAttribute('id'));};
-                  formelement.onblur = function(){return lockoptionsall(this.form.getAttribute('id'));};
-                  formelement.onchange = function(){return lockoptionsall(this.form.getAttribute('id'));};
-                  break;
-              }
-          }
-      }
-  }
-
-  return lockoptionsall(formid);
+    var form = document.forms[formid];
+    var dependons = eval(formid+'items');
+    for (var dependon in dependons) {
+        var master = form[dependon];
+        master.onclick  = function() {return lockoptionsall(this.form.getAttribute('id'));};
+        master.onblur   = function() {return lockoptionsall(this.form.getAttribute('id'));};
+        master.onchange = function() {return lockoptionsall(this.form.getAttribute('id'));};
+    }
+    for (var i = 0; i < form.elements.length; i++){
+        var formelement = form.elements[i];
+        if (formelement.type=='reset') {
+            formelement.onclick  = function() {this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
+            formelement.onblur   = function() {this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
+            formelement.onchange = function() {this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
+        }
+    }
+    return lockoptionsall(formid);
 }