mirror of
https://github.com/moodle/moodle.git
synced 2025-02-13 20:36:42 +01:00
Previously, we had overridden the _generateId method in almost all subclasses; and then we mostly, but not always; ignored the value that was generated there, and instead generated new (nicer) values in MoodleQuickForm_Renderer::renderElement. Of course, that is not really a logical place to (re)generate ids. I have fixed the code so that the _generateId method now uses the 'nice id' algorithm from renderElement. This should make the whole code flow more logical. This make all our overriding of _generateId unnecessary. We do need a special _generateId for radio buttons, because you often have different radio buttons with the same name but different values. This change should only change the ids on radio, checkbox and advcheckbox elements. Previously, those were essentially random, so I don't think anyone could have been relying on the particular values. This commit also has new unit tests, first to test the basic _generateId algorithm, and then to create and render an example form (including some tricky things like repeat_elements) and chech the acutal ids in the generated HTML.
139 lines
4.1 KiB
PHP
139 lines
4.1 KiB
PHP
<?php
|
|
require_once('HTML/QuickForm/select.php');
|
|
|
|
/**
|
|
* HTML class for a select type element
|
|
*
|
|
* @author Jamie Pratt
|
|
* @access public
|
|
*/
|
|
class MoodleQuickForm_select extends HTML_QuickForm_select{
|
|
/**
|
|
* html for help button, if empty then no help
|
|
*
|
|
* @var string
|
|
*/
|
|
var $_helpbutton='';
|
|
var $_hiddenLabel=false;
|
|
|
|
function MoodleQuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
|
|
parent::HTML_QuickForm_select($elementName, $elementLabel, $options, $attributes);
|
|
}
|
|
function setHiddenLabel($hiddenLabel){
|
|
$this->_hiddenLabel = $hiddenLabel;
|
|
}
|
|
function toHtml(){
|
|
if ($this->_hiddenLabel){
|
|
$this->_generateId();
|
|
return '<label class="accesshide" for="'.$this->getAttribute('id').'" >'.
|
|
$this->getLabel().'</label>'.parent::toHtml();
|
|
} else {
|
|
return parent::toHtml();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* set html for help button
|
|
*
|
|
* @access public
|
|
* @param array $help array of arguments to make a help button
|
|
* @param string $function function name to call to get html
|
|
*/
|
|
function setHelpButton($helpbuttonargs, $function='helpbutton'){
|
|
debugging('component setHelpButton() is not used any more, please use $mform->setHelpButton() instead');
|
|
}
|
|
/**
|
|
* get html for help button
|
|
*
|
|
* @access public
|
|
* @return string html for help button
|
|
*/
|
|
function getHelpButton(){
|
|
return $this->_helpbutton;
|
|
}
|
|
/**
|
|
* Removes an OPTION from the SELECT
|
|
*
|
|
* @param string $value Value for the OPTION to remove
|
|
* @since 1.0
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function removeOption($value)
|
|
{
|
|
$key=array_search($value, $this->_values);
|
|
if ($key!==FALSE and $key!==null) {
|
|
unset($this->_values[$key]);
|
|
}
|
|
foreach ($this->_options as $key=>$option){
|
|
if ($option['attr']['value']==$value){
|
|
unset($this->_options[$key]);
|
|
// we must reindex the options because the ugly code in quickforms' select.php expects that keys are 0,1,2,3... !?!?
|
|
$this->_options = array_merge($this->_options);
|
|
return;
|
|
}
|
|
}
|
|
} // end func removeOption
|
|
/**
|
|
* Removes all OPTIONs from the SELECT
|
|
*
|
|
* @param string $value Value for the OPTION to remove
|
|
* @since 1.0
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function removeOptions()
|
|
{
|
|
$this->_options = array();
|
|
} // end func removeOption
|
|
/**
|
|
* Slightly different container template when frozen. Don't want to use a label tag
|
|
* with a for attribute in that case for the element label but instead use a div.
|
|
* Templates are defined in renderer constructor.
|
|
*
|
|
* @return string
|
|
*/
|
|
function getElementTemplateType(){
|
|
if ($this->_flagFrozen){
|
|
return 'static';
|
|
} else {
|
|
return 'default';
|
|
}
|
|
}
|
|
/**
|
|
* We check the options and return only the values that _could_ have been
|
|
* selected. We also return a scalar value if select is not "multiple"
|
|
*/
|
|
function exportValue(&$submitValues, $assoc = false)
|
|
{
|
|
if (empty($this->_options)) {
|
|
return $this->_prepareValue(null, $assoc);
|
|
}
|
|
|
|
$value = $this->_findValue($submitValues);
|
|
if (is_null($value)) {
|
|
$value = $this->getValue();
|
|
}
|
|
$value = (array)$value;
|
|
|
|
$cleaned = array();
|
|
foreach ($value as $v) {
|
|
foreach ($this->_options as $option) {
|
|
if ((string)$option['attr']['value'] === (string)$v) {
|
|
$cleaned[] = (string)$option['attr']['value'];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (empty($cleaned)) {
|
|
return $this->_prepareValue(null, $assoc);
|
|
}
|
|
if ($this->getMultiple()) {
|
|
return $this->_prepareValue($cleaned, $assoc);
|
|
} else {
|
|
return $this->_prepareValue($cleaned[0], $assoc);
|
|
}
|
|
}
|
|
}
|