From 4dd114b834f2e6c2131c2c0c4ad0bd8ef6527ff3 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Thu, 17 Nov 2011 11:29:25 +0000 Subject: [PATCH] MDL-27045 formslib: fix disabledif for advcheckbox This is based on earlier work by Henning Bostelmann and Tom Potts. --- lib/form/form.js | 20 ++++++++++++++++++++ lib/formslib.php | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/form/form.js b/lib/form/form.js index ee473ebe5cf..e2f743e2a8a 100644 --- a/lib/form/form.js +++ b/lib/form/form.js @@ -237,6 +237,10 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { _dependency_notchecked : function(elements, value) { var lock = false; elements.each(function(){ + if (this.getAttribute('type').toLowerCase()=='hidden' && Y.Node.getDOMNode(this).ancestor('div.felement.fcheckbox')) { + // This is the hidden input that is part of an advcheckbox. + return; + } if (this.getAttribute('type').toLowerCase()=='radio' && this.get('value') != value) { return; } @@ -250,6 +254,10 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { _dependency_checked : function(elements, value) { var lock = false; elements.each(function(){ + if (this.getAttribute('type').toLowerCase()=='hidden' && Y.Node.getDOMNode(this).ancestor('div.felement.fcheckbox')) { + // This is the hidden input that is part of an advcheckbox. + return; + } if (this.getAttribute('type').toLowerCase()=='radio' && this.get('value') != value) { return; } @@ -272,10 +280,16 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { }, _dependency_eq : function(elements, value) { var lock = false; + var hidden_val = false; elements.each(function(){ if (this.getAttribute('type').toLowerCase()=='radio' && !Y.Node.getDOMNode(this).checked) { return; + } else if (this.getAttribute('type').toLowerCase() == 'hidden' && Y.Node.getDOMNode(this).ancestor('div.felement.fcheckbox')) { + // This is the hidden input that is part of an advcheckbox. + hidden_val = (this.get('value') == value); + return; } else if (this.getAttribute('type').toLowerCase() == 'checkbox' && !Y.Node.getDOMNode(this).checked) { + lock = lock || hidden_val; return; } //check for filepicker status @@ -303,10 +317,16 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { }, _dependency_default : function(elements, value, ev) { var lock = false; + var hidden_val = false; elements.each(function(){ if (this.getAttribute('type').toLowerCase()=='radio' && !Y.Node.getDOMNode(this).checked) { return; + } else if (this.getAttribute('type').toLowerCase() == 'hidden' && Y.Node.getDOMNode(this).ancestor('div.felement.fcheckbox')) { + // This is the hidden input that is part of an advcheckbox. + hidden_val = (this.get('value') != value); + return; } else if (this.getAttribute('type').toLowerCase() == 'checkbox' && !Y.Node.getDOMNode(this).checked) { + lock = lock || hidden_val; return; } //check for filepicker status diff --git a/lib/formslib.php b/lib/formslib.php index cee1aafaeda..929b000b79d 100644 --- a/lib/formslib.php +++ b/lib/formslib.php @@ -1950,7 +1950,11 @@ function validate_' . $this->_formName . '(frm) { } else if (is_a($element, 'HTML_QuickForm_hidden')) { return array(); - } else if (method_exists($element, 'getPrivateName')) { + } else if (method_exists($element, 'getPrivateName') && + !($element instanceof HTML_QuickForm_advcheckbox)) { + // The advcheckbox element implements a method called getPrivateName, + // but in a way that is not compatible with the generic API, so we + // have to explicitly exclude it. return array($element->getPrivateName()); } else {