From 9f1c9dfce5e9e60f284dcd449c850e957f344969 Mon Sep 17 00:00:00 2001 From: tjhunt Date: Thu, 15 Jan 2009 09:24:45 +0000 Subject: [PATCH] formslib / tags: MDL-17889 a new formslib field type for editing a list of tags. Not yet used anywhere. That can wait until tomorrow. --- lang/en_utf8/tag.php | 2 + lib/form/tags.php | 180 +++++++++++++++++++++++++++++++ lib/form/textarea.php | 18 ++++ lib/formslib.php | 1 + theme/standard/styles_layout.css | 8 ++ 5 files changed, 209 insertions(+) create mode 100644 lib/form/tags.php diff --git a/lang/en_utf8/tag.php b/lang/en_utf8/tag.php index b4f2f40b4f..b75b3a59af 100644 --- a/lang/en_utf8/tag.php +++ b/lang/en_utf8/tag.php @@ -21,6 +21,7 @@ $string['helprelatedtags'] = 'Comma separated related tags'; $string['id'] = 'id'; $string['relatedblogs'] = 'Most recent blog entries'; $string['managetags'] = 'Manage tags'; +$string['manageofficialtags'] = 'Manage official tags'; $string['name'] = 'Tag name'; $string['namesalreadybeeingused'] = 'Tag names already being used'; $string['newname'] = 'New tag name'; @@ -28,6 +29,7 @@ $string['noresultsfor'] = 'No results for \"$a\"'; $string['officialtag'] = 'Official tag'; $string['owner'] = 'Owner'; $string['otags'] = 'Official tags'; +$string['othertags'] = 'Other tags (enter tags separated by commas)'; $string['ptags'] = 'User defined tags (Comma separated)'; $string['relatedtags'] = 'Related tags'; $string['removetagfrommyinterests'] = 'Remove \"$a\" from my interests'; diff --git a/lib/form/tags.php b/lib/form/tags.php new file mode 100644 index 0000000000..0fa5b950ab --- /dev/null +++ b/lib/form/tags.php @@ -0,0 +1,180 @@ +libdir . '/form/group.php'); + +/** + * Formslib field type for editing tags. + */ +class MoodleQuickForm_tags extends MoodleQuickForm_group { + /** Inidcates that the user should be the usual interface, with the official + * tags listed seprately, and a text box where they can type anything. + * @var integer */ + const DEFAULTUI = 0; + /** Indicates that the user should only be allowed to select official tags. + * @var integer */ + const ONLYOFFICIAL = 1; + /** Indicates that the user should just be given a text box to type in (they + * can still type official tags though. + * @var integer */ + const NOOFFICIAL = 2; + + /** + * Control the fieldnames for form elements + * + * display => integer, one of the constants above. + */ + var $_options = array('display' => MoodleQuickForm_tags::DEFAULTUI); + + /** + * These complement separators, they are appended to the resultant HTML + * @access private + * @var array + */ + var $_wrap = array('', ''); + + /** + * Constructor + * + * @param string $elementName Element name + * @param mixed $elementLabel Label(s) for an element + * @param array $options Options to control the element's display + * @param mixed $attributes Either a typical HTML attribute string or an associative array. + */ + function MoodleQuickForm_tags($elementName = null, $elementLabel = null, $options = array(), $attributes = null) { + $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes); + $this->_persistantFreeze = true; + $this->_appendName = true; + $this->_type = 'tags'; + // set the options, do not bother setting bogus ones + if (is_array($options)) { + foreach ($options as $name => $value) { + if (isset($this->_options[$name])) { + if (is_array($value) && is_array($this->_options[$name])) { + $this->_options[$name] = @array_merge($this->_options[$name], $value); + } else { + $this->_options[$name] = $value; + } + } + } + } + } + + function _createElements() { + global $CFG, $DB; + $this->_elements = array(); + + // Official tags. + if ($this->_options['display'] != MoodleQuickForm_tags::NOOFFICIAL) { + // If the user can manage official tags, give them a link to manage them. + $label = get_string('otags', 'tag'); + if (has_capability('moodle/tag:manage', get_context_instance(CONTEXT_SYSTEM))) { + $label .= ' (' . link_to_popup_window($CFG->wwwroot .'/tag/manage.php', + 'managetags', get_string('manageofficialtags', 'tag'), '', '', get_string('newwindow'), null, true) . ')'; + } + + // Get the list of official tags. + $noofficial = false; + $namefield = empty($CFG->keeptagnamecase) ? 'name' : 'rawname'; + $officialtags = $DB->get_records_sql_menu("SELECT id, $namefield FROM {tag} WHERE tagtype='official' ORDER by $namefield ASC"); + if (empty($officialtags)) { + $officialtags = array('' => get_string('none')); + $noofficial = true; + } else { + $officialtags = array_combine($officialtags, $officialtags); + } + + // Create the element. + $size = min(5, count($officialtags)); + $officialtagsselect = MoodleQuickForm::createElement('select', 'officialtags', $label, $officialtags, array('size' => $size)); + $officialtagsselect->setMultiple(true); + if ($noofficial) { + $officialtagsselect->updateAttributes(array('disabled' => 'disabled')); + } + + // + $this->_elements[] = $officialtagsselect; + } + + // Other tags. + if ($this->_options['display'] != MoodleQuickForm_tags::ONLYOFFICIAL) { + $othertags = MoodleQuickForm::createElement('textarea', 'othertags', get_string('othertags', 'tag'), array('cols'=>'40', 'rows'=>'5')); + $this->_elements[] = $othertags; + } + + // Paradoxically, the only way to get labels output is to ask for 'hidden' + // labels, and then override the .accesshide class in the CSS! + foreach ($this->_elements as $element){ + if (method_exists($element, 'setHiddenLabel')){ + $element->setHiddenLabel(true); + } + } + } + + function toHtml() { + require_once('HTML/QuickForm/Renderer/Default.php'); + $renderer =& new HTML_QuickForm_Renderer_Default(); + $renderer->setElementTemplate('{element}'); + parent::accept($renderer); + return $this->_wrap[0] . $renderer->toHtml() . $this->_wrap[1]; + } + + function exportValue(&$submitValues, $assoc = false) { + $valuearray = array(); + + // Get the data out of our child elements. + foreach ($this->_elements as $element){ + $thisexport = $element->exportValue($submitValues[$this->getName()], true); + if ($thisexport != null){ + $valuearray += $thisexport; + } + } + + // Get any manually typed tags. + $tags = array(); + if ($this->_options['display'] != MoodleQuickForm_tags::ONLYOFFICIAL && + !empty($valuearray['othertags'])) { + $rawtags = explode(',', clean_param($valuearray['othertags'], PARAM_NOTAGS)); + foreach ($rawtags as $tag) { + $tags[] = trim($tag); + } + } + + // Add any official tags that were selected. + if ($this->_options['display'] != MoodleQuickForm_tags::NOOFFICIAL && + !empty($valuearray['officialtags'])) { + $tags = array_unique(array_merge($tags, $valuearray['officialtags'])); + } + + return array($this->getName() => $tags); + } +} +?> \ No newline at end of file diff --git a/lib/form/textarea.php b/lib/form/textarea.php index b8885a3253..5803c28ac1 100644 --- a/lib/form/textarea.php +++ b/lib/form/textarea.php @@ -20,6 +20,9 @@ class MoodleQuickForm_textarea extends HTML_QuickForm_textarea{ * @var string */ var $_helpbutton=''; + + var $_hiddenLabel=false; + /** * set html for help button * @@ -61,6 +64,21 @@ class MoodleQuickForm_textarea extends HTML_QuickForm_textarea{ function getHelpButton(){ return $this->_helpbutton; } + + function setHiddenLabel($hiddenLabel){ + $this->_hiddenLabel = $hiddenLabel; + } + + function toHtml(){ + if ($this->_hiddenLabel){ + $this->_generateId(); + return '' . parent::toHtml(); + } else { + return parent::toHtml(); + } + } + /** * Called by HTML_QuickForm whenever form event is made on this element * diff --git a/lib/formslib.php b/lib/formslib.php index 96ba7b473f..07babab472 100644 --- a/lib/formslib.php +++ b/lib/formslib.php @@ -2073,6 +2073,7 @@ MoodleQuickForm::registerElementType('selectyesno', "$CFG->libdir/form/selectyes MoodleQuickForm::registerElementType('static', "$CFG->libdir/form/static.php", 'MoodleQuickForm_static'); MoodleQuickForm::registerElementType('submit', "$CFG->libdir/form/submit.php", 'MoodleQuickForm_submit'); MoodleQuickForm::registerElementType('submitlink', "$CFG->libdir/form/submitlink.php", 'MoodleQuickForm_submitlink'); +MoodleQuickForm::registerElementType('tags', "$CFG->libdir/form/tags.php", 'MoodleQuickForm_tags'); MoodleQuickForm::registerElementType('text', "$CFG->libdir/form/text.php", 'MoodleQuickForm_text'); MoodleQuickForm::registerElementType('textarea', "$CFG->libdir/form/textarea.php", 'MoodleQuickForm_textarea'); MoodleQuickForm::registerElementType('warning', "$CFG->libdir/form/warning.php", 'MoodleQuickForm_warning'); diff --git a/theme/standard/styles_layout.css b/theme/standard/styles_layout.css index 4452d9d35a..948bf4f1ab 100644 --- a/theme/standard/styles_layout.css +++ b/theme/standard/styles_layout.css @@ -702,6 +702,14 @@ fieldset.fdate_selector label { .mform label .req, .mform label .adv { cursor: help; } +.mform .ftags label.accesshide { + display: block; + position: static; +} +.mform .ftags select { + margin-bottom: 0.7em; + min-width: 22em; +} /* form frozen */ div.mform div.fitem div.fstatic{ -- 2.39.5