MDL-12130 and MDL-12129 - fixed advanced status of elements when header not closed; disableIf now works inside grouped elements too; code cleanup in focus() and _getElNamesRecursive()

This commit is contained in:
skodak 2007-11-12 17:12:35 +00:00
parent 0dbb2191fb
commit 46f3921edd

View file

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