Merge branch 'MDL-31112_dndupload_folder_detection' of git://github.com/davosmith...
authorSam Hemelryk <sam@moodle.com>
Tue, 14 Feb 2012 23:41:47 +0000 (12:41 +1300)
committerSam Hemelryk <sam@moodle.com>
Tue, 14 Feb 2012 23:41:47 +0000 (12:41 +1300)
107 files changed:
admin/cli/install.php
admin/settings.php
admin/tool/dbtransfer/locallib.php
admin/tool/uploaduser/index.php
admin/tool/xmldb/actions/create_xml_file/create_xml_file.class.php
admin/webservice/forms.php
admin/webservice/service_functions.php
admin/webservice/service_users.php
course/renderer.php
enrol/category/db/access.php
filter/data/filter.php
filter/mediaplugin/filter.php
grade/export/grade_export_form.php
grade/grading/form/lib.php
grade/grading/form/rubric/lang/en/gradingform_rubric.php
grade/grading/form/rubric/lib.php
grade/grading/form/rubric/preview.php [new file with mode: 0644]
grade/grading/form/rubric/renderer.php
grade/grading/lib.php
grade/report/grader/lib.php
lang/en/form.php
lang/en/moodle.php
lib/accesslib.php
lib/adminlib.php
lib/completion/completion_criteria_date.php
lib/datalib.php
lib/ddl/database_manager.php
lib/ddl/mssql_sql_generator.php
lib/ddl/mysql_sql_generator.php
lib/ddl/oracle_sql_generator.php
lib/ddl/postgres_sql_generator.php
lib/ddl/sql_generator.php
lib/ddl/sqlite_sql_generator.php
lib/form/dndupload.js
lib/form/filemanager.js
lib/formslib.php
lib/htmlpurifier/HTMLPurifier/Lexer/PH5P.php
lib/javascript-static.js
lib/moodlelib.php
lib/navigationlib.php
lib/yui/formslib/formslib.js [new file with mode: 0644]
mod/assignment/db/log.php
mod/assignment/lib.php
mod/chat/db/log.php
mod/choice/db/log.php
mod/choice/renderer.php
mod/data/db/log.php
mod/data/export.php
mod/data/field/file/field.class.php
mod/data/lib.php
mod/feedback/db/log.php
mod/folder/db/log.php
mod/forum/db/log.php
mod/glossary/db/log.php
mod/imscp/db/log.php
mod/label/db/log.php
mod/lesson/db/log.php
mod/lesson/pagetypes/branchtable.php
mod/lesson/view.php
mod/lti/db/log.php
mod/lti/lang/en/lti.php
mod/page/db/log.php
mod/quiz/db/log.php
mod/quiz/view.php
mod/resource/db/log.php
mod/resource/lang/en/resource.php
mod/scorm/db/log.php
mod/survey/db/log.php
mod/url/db/log.php
mod/url/lang/en/url.php
mod/wiki/editors/wiki_editor.php
mod/wiki/lang/en/wiki.php
mod/workshop/db/log.php
portfolio/mahara/lang/en/portfolio_mahara.php
question/engine/upgrade/upgradelib.php
report/log/db/access.php
report/log/db/install.php
report/log/graph.php
report/log/index.php
report/log/lang/en/report_log.php
report/log/lib.php
report/log/locallib.php
report/log/settings.php
report/log/user.php
report/log/version.php
report/loglive/db/access.php
report/loglive/index.php
report/loglive/lang/en/report_loglive.php
report/loglive/lib.php
report/loglive/settings.php
report/loglive/version.php
report/stats/graph.php
repository/lib.php
repository/recent/lib.php
tag/coursetags_add.php
tag/coursetags_edit.php
tag/coursetags_more.php
tag/coursetagslib.php
tag/edit.php
tag/edit_form.php
tag/index.php
tag/lib.php
tag/locallib.php
theme/styles.php
user/view.php
webservice/rest/lib.php
webservice/rest/simpleserver.php

index b812aaf..dc65e31 100644 (file)
@@ -109,7 +109,7 @@ if (file_exists($configfile)) {
 
 $olddir = getcwd();
 
-// change directory so that includes bellow work properly
+// change directory so that includes below work properly
 chdir(dirname($_SERVER['argv'][0]));
 
 // Servers should define a default timezone in php.ini, but if they don't then make sure something is defined.
index 3344f35..3f8d2c9 100644 (file)
@@ -131,6 +131,12 @@ if (empty($SITE->fullname)) {
     echo '</form>';
 }
 
-echo $OUTPUT->footer();
-
+$PAGE->requires->yui_module('moodle-core-formslib',
+        'M.core.init_formslib',
+        array(array(
+            'formid' => 'adminsettings'
+        ))
+);
+$PAGE->requires->string_for_js('changesmadereallygoaway', 'moodle');
 
+echo $OUTPUT->footer();
index 62a34ae..f36ceef 100644 (file)
@@ -37,7 +37,7 @@ TODO:
     (user would need file access to dataroot which might prevent various "accidents")
   - implement "Export/import running" notification in lib/setup.php (similar to new upgrade flag in config table)
   - gzip compression when storing xml file - the xml is very verbose and full of repeated tags (zip is not suitable here at all)
-    this could help us keep the files bellow 2G (expected ratio is > 10:1)
+    this could help us keep the files below 2G (expected ratio is > 10:1)
 
 */
 
index a0a69b0..633b5f2 100644 (file)
@@ -239,7 +239,7 @@ if ($formdata = $mform2->is_cancelled()) {
             }
         }
         if (!isset($user->username)) {
-            // prevent warnings bellow
+            // prevent warnings below
             $user->username = '';
         }
 
index 205700f..1cf3969 100644 (file)
@@ -68,6 +68,7 @@ class create_xml_file extends XMLDBAction {
 
         // Get the dir containing the file
         $dirpath = required_param('dir', PARAM_PATH);
+        $plugintype = $this->get_plugin_type($dirpath);
         $dirpath = $CFG->dirroot . $dirpath;
         $file = $dirpath . '/install.xml';
 
@@ -77,6 +78,9 @@ class create_xml_file extends XMLDBAction {
         $xmlcomment = 'XMLDB file for Moodle ' . dirname($xmlpath);
 
         $xmltable = strtolower(basename(dirname($xmlpath)));
+        if ($plugintype && $plugintype != 'mod') {
+            $xmltable = $plugintype.'_'.$xmltable;
+        }
 
         // Initial contents
         $c = '<?xml version="1.0" encoding="UTF-8" ?>' . "\n";
@@ -106,5 +110,23 @@ class create_xml_file extends XMLDBAction {
         // Return ok if arrived here
         return $result;
     }
+
+    /**
+     * From a given path, work out what type of plugin
+     * this belongs to
+     * @param string $dirpath Path to the db file for this plugin
+     * @return string the type of the plugin or null if not found
+     */
+    function get_plugin_type($dirpath) {
+        global $CFG;
+        $dirpath = $CFG->dirroot.$dirpath;
+        $plugintypes = get_plugin_types();
+        foreach ($plugintypes as $plugintype => $pluginbasedir) {
+            if (substr($dirpath, 0, strlen($pluginbasedir)) == $pluginbasedir) {
+                return $plugintype;
+            }
+        }
+        return null;
+    }
 }
 
index dab9a42..5185b9b 100644 (file)
@@ -160,7 +160,7 @@ class external_service_functions_form extends moodleform {
             $functions[$functionid] = $function->name . ':' . $function->description;
         }
 
-        $mform->addElement('searchableselector', 'fid', get_string('name'),
+        $mform->addElement('searchableselector', 'fids', get_string('name'),
                 $functions, array('multiple'));
 
         $mform->addElement('hidden', 'id');
index d4f7da8..fc0e886 100644 (file)
@@ -67,7 +67,7 @@ switch ($action) {
             //add the function to the service then redirect to function list page
             if ($data = $mform->get_data()) {
                 ignore_user_abort(true); // no interruption here!
-                foreach ($data->fid as $fid) {
+                foreach ($data->fids as $fid) {
                     $function = $webservicemanager->get_external_function_by_id(
                             $fid, MUST_EXIST);
                     // make sure the function is not there yet
index 9d62218..12db2b0 100644 (file)
@@ -98,7 +98,7 @@ $usersmissingcaps = $webservicemanager->get_missing_capabilities_by_users($allow
 //add the missing capabilities to the allowed users object to be displayed by renderer
 foreach ($allowedusers as &$alloweduser) {
     if (!is_siteadmin($alloweduser->id) and key_exists($alloweduser->id, $usersmissingcaps)) {
-        $alloweduser->missingcapabilities = implode(',', $usersmissingcaps[$alloweduser->id]);
+        $alloweduser->missingcapabilities = implode(', ', $usersmissingcaps[$alloweduser->id]);
     }
 }
 
index 3e9898c..1e1d7ad 100644 (file)
@@ -92,8 +92,8 @@ class core_course_renderer extends plugin_renderer_base {
      */
     protected function course_category_tree_category(stdClass $category, $depth=1) {
         $content = '';
-        $hassubcategories = (count($category->categories)>0);
-        $hascourses = (count($category->courses)>0);
+        $hassubcategories = (isset($category->categories) && count($category->categories)>0);
+        $hascourses = (isset($category->courses) && count($category->courses)>0);
         $classes = array('category');
         if ($category->parent != 0) {
             $classes[] = 'subcategory';
index d18e55a..8c24b96 100644 (file)
@@ -28,7 +28,7 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
     // marks roles that have category role assignments synchronised to course enrolments
-    // overrides bellow system context are ignored (for performance reasons).
+    // overrides below system context are ignored (for performance reasons).
     // by default his is not allowed in new installs, admins have to explicitly allow category enrolments
     'enrol/category:synchronised' => array(
         'captype' => 'write',
index 60ca85f..451c1d9 100644 (file)
@@ -71,7 +71,7 @@ class filter_data extends moodle_text_filter {
                       JOIN {data_content} dc ON dc.fieldid = df.id AND dc.recordid = dr.id
                      WHERE d.course ' . $coursesql . '
                        AND df.type = \'text\'
-                       AND ' . $DB->sql_compare_text('df.param1', 1) . ' = 1';
+                       AND ' . $DB->sql_compare_text('df.param1', 1) . " = '1'";
 
             if (!$contents = $DB->get_records_sql($sql, $params)) {
                 $nothingtodo = true;
index e1e61ca..cb4a751 100644 (file)
@@ -74,7 +74,7 @@ class filter_mediaplugin extends moodle_text_filter {
             return $text;
         }
         if (stripos($text, '</a>') === false) {
-            // performance shortcut - all regexes bellow end with the </a> tag,
+            // performance shortcut - all regexes below end with the </a> tag,
             // if not present nothing can match
             return $text;
         }
@@ -281,7 +281,7 @@ function filter_mediaplugin_html5audio_callback(array $link) {
         $sources[] = html_writer::tag('source', '', array('src' => $url, 'type' => $mimetype));
 
         if ($fallbacklink === null) {
-            $fallbacklink = html_writer::link($url.'#', $info); // the extra '#' prevents linking in mp3 filter bellow
+            $fallbacklink = html_writer::link($url.'#', $info); // the extra '#' prevents linking in mp3 filter below
         }
         if ($fallbackurl === null) {
             if ($mimetype === 'audio/mp3' or $mimetype === 'audio/aac') {
@@ -379,7 +379,7 @@ function filter_mediaplugin_html5video_callback(array $link) {
         }
 
         if ($fallbacklink === null) {
-            $fallbacklink = html_writer::link($url.'#', $info); // the extra '#' prevents linking in mp3 filter bellow
+            $fallbacklink = html_writer::link($url.'#', $info); // the extra '#' prevents linking in mp3 filter below
         }
         if ($fallbackurl === null) {
             if ($mimetype === 'video/mp4') {
index 540694c..bd6e396 100644 (file)
@@ -115,7 +115,14 @@ class grade_export_form extends moodleform {
 
         if ($grade_items = $gseq->items) {
             $needs_multiselect = false;
+            $canviewhidden = has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $COURSE->id));
+
             foreach ($grade_items as $grade_item) {
+                // Is the grade_item hidden? If so, can the user see hidden grade_items?
+                if ($grade_item->is_hidden() && !$canviewhidden) {
+                    continue;
+                }
+
                 if (!empty($features['idnumberrequired']) and empty($grade_item->idnumber)) {
                     $mform->addElement('advcheckbox', 'itemids['.$grade_item->id.']', $grade_item->get_name(), get_string('noidnumber', 'grades'));
                     $mform->hardFreeze('itemids['.$grade_item->id.']');
@@ -124,7 +131,7 @@ class grade_export_form extends moodleform {
                     $mform->setDefault('itemids['.$grade_item->id.']', 1);
                     $needs_multiselect = true;
                 }
-                }
+            }
 
             if ($needs_multiselect) {
                 $this->add_checkbox_controller(1, null, null, 1); // 1st argument is group name, 2nd is link text, 3rd is attributes and 4th is original value
index 3634d37..5a27b8f 100644 (file)
@@ -202,6 +202,19 @@ abstract class gradingform_controller {
         // do not extend by default
     }
 
+    /**
+     * Extends the module navigation
+     *
+     * This function is called when the context for the page is an activity module with the
+     * FEATURE_ADVANCED_GRADING and there is an area with the active grading method set to the given plugin.
+     *
+     * @param global_navigation $navigation {@link global_navigation}
+     * @param navigation_node $node {@link navigation_node}
+     */
+    public function extend_navigation(global_navigation $navigation, navigation_node $node=null) {
+        // do not extend by default
+    }
+
     /**
      * Returns the grading form definition structure
      *
index d7f605c..527e8fb 100644 (file)
@@ -25,6 +25,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['addcriterion'] = 'Add criterion';
+$string['alwaysshowdefinition'] = 'Allow users to preview rubric used in the module (otherwise rubric will only become visible after grading)';
 $string['backtoediting'] = 'Back to editing';
 $string['confirmdeletecriterion'] = 'Are you sure you want to delete this criterion?';
 $string['confirmdeletelevel'] = 'Are you sure you want to delete this level?';
@@ -42,11 +43,13 @@ $string['err_nodefinition'] = 'Level definition can not be empty';
 $string['err_nodescription'] = 'Criterion description can not be empty';
 $string['err_scoreformat'] = 'Number of points for each level must be a valid non-negative number';
 $string['err_totalscore'] = 'Maximum number of points possible when graded by the rubric must be more than zero';
+$string['gradingof'] = '{$a} grading';
 $string['leveldelete'] = 'Delete level';
 $string['levelempty'] = 'Click to edit level';
 $string['name'] = 'Name';
 $string['needregrademessage'] = 'The rubric definition was changed after this student had been graded. The student can not see this rubric until you check the rubric and update the grade.';
 $string['pluginname'] = 'Rubric';
+$string['previewrubric'] = 'Preview rubric';
 $string['regrademessage1'] = 'You are about to save changes to a rubric that has already been used for grading. Please indicate if existing grades need to be reviewed. If you set this then the rubric will be hidden from students until their item is regraded.';
 $string['regrademessage5'] = 'You are about to save significant changes to a rubric that has already been used for grading. The gradebook value will be unchanged, but the rubric will be hidden from students until their item is regraded.';
 $string['regradeoption0'] = 'Do not mark for regrade';
index ff24e85..98aeaf9 100644 (file)
@@ -37,8 +37,10 @@ class gradingform_rubric_controller extends gradingform_controller {
     const DISPLAY_EDIT_FULL     = 1;
     /** Rubric display mode: Preview the rubric design with hidden fields */
     const DISPLAY_EDIT_FROZEN   = 2;
-    /** Rubric display mode: Preview the rubric design */
+    /** Rubric display mode: Preview the rubric design (for person with manage permission) */
     const DISPLAY_PREVIEW       = 3;
+    /** Rubric display mode: Preview the rubric (for people being graded) */
+    const DISPLAY_PREVIEW_GRADED= 8;
     /** Rubric display mode: For evaluation, enabled (teacher grades a student) */
     const DISPLAY_EVAL          = 4;
     /** Rubric display mode: For evaluation, with hidden fields */
@@ -64,6 +66,27 @@ class gradingform_rubric_controller extends gradingform_controller {
             null, null, new pix_icon('icon', '', 'gradingform_rubric'));
     }
 
+    /**
+     * Extends the module navigation
+     *
+     * This function is called when the context for the page is an activity module with the
+     * FEATURE_ADVANCED_GRADING and there is an area with the active grading method set to the given plugin.
+     *
+     * @param global_navigation $navigation {@link global_navigation}
+     * @param navigation_node $node {@link navigation_node}
+     */
+    public function extend_navigation(global_navigation $navigation, navigation_node $node=null) {
+        if (has_capability('moodle/grade:managegradingforms', $this->get_context())) {
+            // no need for preview if user can manage forms, he will have link to manage.php in settings instead
+            return;
+        }
+        if ($this->is_form_defined() && ($options = $this->get_options()) && !empty($options['alwaysshowdefinition'])) {
+            $node->add(get_string('gradingof', 'gradingform_rubric', get_grading_manager($this->get_areaid())->get_area_title()),
+                    new moodle_url('/grade/grading/form/'.$this->get_method_name().'/preview.php', array('areaid' => $this->get_areaid())),
+                    settings_navigation::TYPE_CUSTOM);
+        }
+    }
+
     /**
      * Saves the rubric definition into the database
      *
@@ -330,14 +353,14 @@ class gradingform_rubric_controller extends gradingform_controller {
     public static function get_default_options() {
         $options = array(
             'sortlevelsasc' => 1,
-            //'showdescriptionteacher' => 1,
-            //'showdescriptionstudent' => 1,
+            'alwaysshowdefinition' => 1,
+            'showdescriptionteacher' => 1,
+            'showdescriptionstudent' => 1,
             'showscoreteacher' => 1,
             'showscorestudent' => 1,
             'enableremarks' => 1,
             'showremarksstudent' => 1
         );
-        // TODO description options
         return $options;
     }
 
@@ -484,8 +507,13 @@ class gradingform_rubric_controller extends gradingform_controller {
         $output = $this->get_renderer($page);
         $criteria = $this->definition->rubric_criteria;
         $options = $this->get_options();
-        $rubric = $output->display_rubric_mapping_explained($this->get_min_max_score());
-        $rubric .= $output->display_rubric($criteria, $options, self::DISPLAY_PREVIEW, 'rubric');
+        $rubric = '';
+        if (has_capability('moodle/grade:managegradingforms', $page->context)) {
+            $rubric .= $output->display_rubric_mapping_explained($this->get_min_max_score());
+            $rubric .= $output->display_rubric($criteria, $options, self::DISPLAY_PREVIEW, 'rubric');
+        } else {
+            $rubric .= $output->display_rubric($criteria, $options, self::DISPLAY_PREVIEW_GRADED, 'rubric');
+        }
 
         return $rubric;
     }
@@ -812,6 +840,9 @@ class gradingform_rubric_instance extends gradingform_instance {
         if ($this->get_data('isrestored') && $haschanges) {
             $html .= html_writer::tag('div', get_string('restoredfromdraft', 'gradingform_rubric'), array('class' => 'gradingform_rubric-restored'));
         }
+        if (!empty($options['showdescriptionteacher'])) {
+            $html .= html_writer::tag('div', $this->get_controller()->get_formatted_description(), array('class' => 'gradingform_rubric-description'));
+        }
         $html .= $this->get_controller()->get_renderer($page)->display_rubric($criteria, $options, $mode, $gradingformelement->getName(), $value);
         return $html;
     }
diff --git a/grade/grading/form/rubric/preview.php b/grade/grading/form/rubric/preview.php
new file mode 100644 (file)
index 0000000..1a71458
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Preview rubric page
+ *
+ * @package    gradingform_rubric
+ * @copyright  2011 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/config.php');
+require_once(dirname(__FILE__).'/lib.php');
+require_once(dirname(__FILE__).'/edit_form.php');
+require_once($CFG->dirroot.'/grade/grading/lib.php');
+
+$areaid = required_param('areaid', PARAM_INT);
+
+$manager = get_grading_manager($areaid);
+
+list($context, $course, $cm) = get_context_info_array($manager->get_context()->id);
+
+require_login($course, true, $cm);
+
+$controller = $manager->get_controller('rubric');
+$options = $controller->get_options();
+
+if (!$controller->is_form_defined() || empty($options['alwaysshowdefinition'])) {
+    throw new moodle_exception('nopermissions', 'error', '', get_string('previewrubric', 'gradingform_rubric'));
+}
+
+$title = get_string('gradingof', 'gradingform_rubric', $manager->get_area_title());
+$PAGE->set_url(new moodle_url('/grade/grading/form/rubric/preview.php', array('areaid' => $areaid)));
+$PAGE->set_title($title);
+$PAGE->set_heading($title);
+
+echo $OUTPUT->header();
+echo $OUTPUT->heading($title);
+if (!empty($options['showdescriptionstudent'])) {
+    echo $OUTPUT->box($controller->get_formatted_description(), 'gradingform_rubric-description');
+}
+echo $controller->render_preview($PAGE);
+echo $OUTPUT->footer();
index f037263..9469e94 100644 (file)
@@ -191,7 +191,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         if (!$options['showscoreteacher'] && in_array($mode, array(gradingform_rubric_controller::DISPLAY_EVAL, gradingform_rubric_controller::DISPLAY_EVAL_FROZEN, gradingform_rubric_controller::DISPLAY_REVIEW))) {
             $displayscore = false;
         }
-        if (!$options['showscorestudent'] && $mode == gradingform_rubric_controller::DISPLAY_VIEW) {
+        if (!$options['showscorestudent'] && in_array($mode, array(gradingform_rubric_controller::DISPLAY_VIEW, gradingform_rubric_controller::DISPLAY_PREVIEW_GRADED))) {
             $displayscore = false;
         }
         if ($displayscore) {
@@ -241,6 +241,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
             case gradingform_rubric_controller::DISPLAY_EDIT_FROZEN:
                 $classsuffix = ' editor frozen';  break;
             case gradingform_rubric_controller::DISPLAY_PREVIEW:
+            case gradingform_rubric_controller::DISPLAY_PREVIEW_GRADED:
                 $classsuffix = ' editor preview';  break;
             case gradingform_rubric_controller::DISPLAY_EVAL:
                 $classsuffix = ' evaluate editable'; break;
@@ -277,7 +278,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         if ($mode != gradingform_rubric_controller::DISPLAY_EDIT_FULL
                 && $mode != gradingform_rubric_controller::DISPLAY_EDIT_FROZEN
                 && $mode != gradingform_rubric_controller::DISPLAY_PREVIEW) {
-            // Options are displayed only in edit mode
+            // Options are displayed only for people who can manage
             return;
         }
         $html = html_writer::start_tag('div', array('class' => 'options'));
@@ -431,10 +432,17 @@ class gradingform_rubric_renderer extends plugin_renderer_base {
         $values = $instance->get_rubric_filling();
         if ($cangrade) {
             $mode = gradingform_rubric_controller::DISPLAY_REVIEW;
+            $showdescription = $options['showdescriptionteacher'];
         } else {
             $mode = gradingform_rubric_controller::DISPLAY_VIEW;
+            $showdescription = $options['showdescriptionstudent'];
         }
-        return $this->display_rubric($criteria, $options, $mode, 'rubric'.$idx, $values);
+        $output = '';
+        if ($showdescription) {
+            $output .= $this->box($instance->get_controller()->get_formatted_description(), 'gradingform_rubric-description');
+        }
+        $output .= $this->display_rubric($criteria, $options, $mode, 'rubric'.$idx, $values);
+        return $output;
     }
 
     public function display_regrade_confirmation($elementname, $changelevel, $value) {
index e27a4ec..c6e8186 100644 (file)
@@ -454,6 +454,27 @@ class grading_manager {
         }
     }
 
+    /**
+     * Extends the module navigation with the advanced grading information
+     *
+     * This function is called when the context for the page is an activity module with the
+     * FEATURE_ADVANCED_GRADING.
+     *
+     * @param global_navigation $navigation
+     * @param navigation_node $modulenode
+     */
+    public function extend_navigation(global_navigation $navigation, navigation_node $modulenode=null) {
+        $this->ensure_isset(array('context', 'component'));
+
+        $areas = $this->get_available_areas();
+        foreach ($areas as $areaname => $areatitle) {
+            $this->set_area($areaname);
+            if ($controller = $this->get_active_controller()) {
+                $controller->extend_navigation($navigation, $modulenode);
+            }
+        }
+    }
+
     /**
      * Returns the given method's controller in the gradable area
      *
index bcacf6d..7c9fb38 100644 (file)
@@ -163,7 +163,7 @@ class grade_report_grader extends grade_report {
             $separategroups = true;
             $mygroups = groups_get_user_groups($this->course->id);
             $mygroups = $mygroups[0]; // ignore groupings
-            // reorder the groups fro better perf bellow
+            // reorder the groups fro better perf below
             $current = array_search($this->currentgroup, $mygroups);
             if ($current !== false) {
                 unset($mygroups[$current]);
index b42376e..fbd8c9d 100644 (file)
@@ -55,7 +55,7 @@ $string['security'] = 'Security';
 $string['selectallornone'] = 'Select all/none';
 $string['selected'] = 'Selected';
 $string['showadvanced'] = 'Show advanced';
-$string['somefieldsrequired'] = 'There are required fields in this form marked{$a}.';
+$string['somefieldsrequired'] = 'There are required fields in this form marked {$a}.';
 $string['time'] = 'Time';
 $string['timeunit'] = 'Time unit';
 $string['timing'] = 'Timing';
index 0286c52..eb14f76 100644 (file)
@@ -219,6 +219,7 @@ $string['categoryname'] = 'Category name';
 $string['idnumbercoursecategory'] = 'Category ID number';
 $string['idnumbercoursecategory_help'] = 'The ID number of a course category  is only used when matching the category against external systems and is not displayed anywhere on the site. If the category has an official code name it may be entered, otherwise the field can be left blank.';
 $string['categoryupdated'] = 'The category \'{$a}\' was updated';
+$string['changesmadereallygoaway'] = 'You have made changes. Are you sure you want to navigate away and lose your changes?';
 $string['city'] = 'City/town';
 $string['clambroken'] = 'Your administrator has enabled virus checking for file uploads but has misconfigured something.<br />Your file upload was NOT successful. Your administrator has been emailed to notify them so they can fix it.<br />Maybe try uploading this file later.';
 $string['clamdeletedfile'] = 'The file has been deleted';
@@ -1772,9 +1773,7 @@ $string['withoutuserdata'] = 'without user data';
 $string['withselectedusers'] = 'With selected users...';
 $string['withselectedusers_help'] = '* Send message - For sending a message to one or more participants
 * Add a new note - For adding a note to a selected participant
-* Add a common note - For adding the same note to more than one participant
-* Extend enrolment (individual) - For extending a selected student\'s access to the course, even when an enrolment period is set
-* Extend enrolment (common) - For extending more than one student\'s access to the course by the same amount';
+* Add a common note - For adding the same note to more than one participant';
 $string['withuserdata'] = 'with user data';
 $string['wordforstudent'] = 'Your word for Student';
 $string['wordforstudenteg'] = 'eg Student, Participant etc';
index 9ca574d..29aac48 100644 (file)
@@ -7208,7 +7208,7 @@ function get_role_context_caps($roleid, context $context) {
         }
     }
 
-    // now go through the contexts bellow given context
+    // now go through the contexts below given context
     $searchcontexts = array_keys($context->get_child_contexts());
     foreach ($searchcontexts as $cid) {
         if ($capabilities = $DB->get_records('role_capabilities', array('roleid'=>$roleid, 'contextid'=>$cid))) {
index 72d6df3..4025f91 100644 (file)
@@ -7575,7 +7575,7 @@ class admin_setting_managewebservicetokens extends admin_setting {
 
                 if (!is_siteadmin($token->userid) and
                         key_exists($token->userid, $usermissingcaps)) {
-                    $missingcapabilities = implode(',',
+                    $missingcapabilities = implode(', ',
                             $usermissingcaps[$token->userid]);
                     if (!empty($missingcapabilities)) {
                         $useratag .= html_writer::tag('div',
index 9bd66a2..dfe1717 100644 (file)
@@ -53,7 +53,7 @@ class completion_criteria_date extends completion_criteria {
     public function config_form_display(&$mform, $data = null)
     {
         $mform->addElement('checkbox', 'criteria_date', get_string('enable'));
-        $mform->addElement('date', 'criteria_date_value', get_string('afterspecifieddate', 'completion'));
+        $mform->addElement('date_selector', 'criteria_date_value', get_string('afterspecifieddate', 'completion'));
 
         // If instance of criteria exists
         if ($this->id) {
@@ -74,8 +74,7 @@ class completion_criteria_date extends completion_criteria {
 
         if (!empty($data->criteria_date)) {
             $this->course = $data->id;
-            $date = $data->criteria_date_value;
-            $this->timeend = strtotime($date['Y'].'-'.$date['M'].'-'.$date['d']);
+            $this->timeend = $data->criteria_date_value;
             $this->insert();
         }
     }
index 7cc195e..412dfa3 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -23,7 +22,6 @@
  * - moodlelib.php - general-purpose Moodle functions
  *
  * @package    core
- * @subpackage lib
  * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -1649,14 +1647,16 @@ function coursemodule_visible_for_user($cm, $userid=0) {
  * than web server hits, and provide a way to easily reconstruct what
  * any particular student has been doing.
  *
- * @global object
- * @global object
- * @global object
+ * @package core
+ * @category log
+ * @global moodle_database $DB
+ * @global stdClass $CFG
+ * @global stdClass $USER
  * @uses SITEID
  * @uses DEBUG_DEVELOPER
  * @uses DEBUG_ALL
  * @param    int     $courseid  The course id
- * @param    string  $module  The module name - e.g. forum, journal, resource, course, user etc
+ * @param    string  $module  The module name  e.g. forum, journal, resource, course, user etc
  * @param    string  $action  'view', 'update', 'add' or 'delete', possibly followed by another word to clarify.
  * @param    string  $url     The file and parameters used to see the results of the action
  * @param    string  $info    Additional description information
@@ -1746,12 +1746,14 @@ function add_to_log($courseid, $module, $action, $url='', $info='', $cm=0, $user
 /**
  * Store user last access times - called when use enters a course or site
  *
- * @global object
- * @global object
- * @global object
+ * @package core
+ * @category log
+ * @global stdClass $USER
+ * @global stdClass $CFG
+ * @global moodle_database $DB
  * @uses LASTACCESS_UPDATE_SECS
  * @uses SITEID
- * @param int $courseid, empty means site
+ * @param int $courseid  empty courseid means site
  * @return void
  */
 function user_accesstime_log($courseid=0) {
@@ -1816,16 +1818,16 @@ function user_accesstime_log($courseid=0) {
 /**
  * Select all log records based on SQL criteria
  *
- * @todo Finish documenting this function
- *
- * @global object
+ * @package core
+ * @category log
+ * @global moodle_database $DB
  * @param string $select SQL select criteria
  * @param array $params named sql type params
  * @param string $order SQL order by clause to sort the records returned
- * @param string $limitfrom ?
- * @param int $limitnum ?
+ * @param string $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
+ * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set)
  * @param int $totalcount Passed in by reference.
- * @return object
+ * @return array
  */
 function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom='', $limitnum='', &$totalcount) {
     global $DB;
@@ -1860,13 +1862,14 @@ function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom=
 /**
  * Select all log records for a given course and user
  *
- * @todo Finish documenting this function
- *
- * @global object
+ * @package core
+ * @category log
+ * @global moodle_database $DB
  * @uses DAYSECS
  * @param int $userid The id of the user as found in the 'user' table.
  * @param int $courseid The id of the course as found in the 'course' table.
- * @param string $coursestart ?
+ * @param string $coursestart unix timestamp representing course start date and time.
+ * @return array
  */
 function get_logs_usercourse($userid, $courseid, $coursestart) {
     global $DB;
@@ -1891,12 +1894,14 @@ function get_logs_usercourse($userid, $courseid, $coursestart) {
 /**
  * Select all log records for a given course, user, and day
  *
- * @global object
+ * @package core
+ * @category log
+ * @global moodle_database $DB
  * @uses HOURSECS
  * @param int $userid The id of the user as found in the 'user' table.
  * @param int $courseid The id of the course as found in the 'course' table.
- * @param string $daystart ?
- * @return object
+ * @param string $daystart unix timestamp of the start of the day for which the logs needs to be retrived
+ * @return array
  */
 function get_logs_userday($userid, $courseid, $daystart) {
     global $DB;
@@ -1925,7 +1930,7 @@ function get_logs_userday($userid, $courseid, $daystart) {
  * number of accounts.  For non-admins, only the attempts on the given user
  * are shown.
  *
- * @global object
+ * @global moodle_database $DB
  * @uses CONTEXT_SYSTEM
  * @param string $mode Either 'admin' or 'everybody'
  * @param string $username The username we are searching for
index 13036c9..79afe2b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 
 
 /**
- * Database manager instance is responsible for all database structure
- * modifications.
+ * Database manager instance is responsible for all database structure modifications.
  *
  * @package    core
+ * @category   ddl
  * @subpackage ddl
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
 defined('MOODLE_INTERNAL') || die();
 
 /**
- * Database manager instance is responsible for all database structure
- * modifications. It is using db specific generators to find out
- * the correct SQL syntax to do that.
+ * Database manager instance is responsible for all database structure modifications.
+ *
+ * It is using db specific generators to find out the correct SQL syntax to do that.
+ *
+ * @package    core
+ * @category   ddl
+ * @subpackage ddl
+ * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
+ *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
+ *             2008 Petr Skoda                   http://skodak.org
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class database_manager {
 
+    /** @var moodle_database A moodle_database driver speific instance.*/
     protected $mdb;
-    public $generator; // public because XMLDB editor needs to access it
+    /** @var sql_generator A driver specific SQL generator instance. Public because XMLDB editor needs to access it.*/
+    public $generator;
 
     /**
-     * Creates new database manager
-     * @param object moodle_database instance
+     * Creates a new database manager instance.
+     * @param moodle_database $mdb A moodle_database driver specific instance.
+     * @param sql_generator $generator A driver specific SQL generator instance.
      */
     public function __construct($mdb, $generator) {
         global $CFG;
@@ -52,7 +62,7 @@ class database_manager {
     }
 
     /**
-     * Release all resources
+     * Releases all resources
      */
     public function dispose() {
         if ($this->generator) {
@@ -65,10 +75,8 @@ class database_manager {
     /**
      * This function will execute an array of SQL commands.
      *
-     * @exception ddl_exception if error found
-     *
-     * @param array $sqlarr array of sql statements to execute
-     * @return void
+     * @param array $sqlarr Array of sql statements to execute.
+     * @throws ddl_exception This exception is thrown if any error is found.
      */
     protected function execute_sql_arr(array $sqlarr) {
         foreach ($sqlarr as $sql) {
@@ -77,12 +85,10 @@ class database_manager {
     }
 
     /**
-     * Execute a given sql command string
-     *
-     * @exception ddl_exception if error found
+     * Execute a given sql command string.
      *
-     * @param string $command The sql string you wish to be executed.
-     * @return void
+     * @param string $sql The sql string you wish to be executed.
+     * @throws ddl_exception This exception is thrown if any error is found.
      */
     protected function execute_sql($sql) {
         if (!$this->mdb->change_database_structure($sql)) {
@@ -92,10 +98,10 @@ class database_manager {
     }
 
     /**
-     * Given one xmldb_table, check if it exists in DB (true/false)
+     * Given one xmldb_table, check if it exists in DB (true/false).
      *
-     * @param mixed the table to be searched (string name or xmldb_table instance)
-     * @return boolean true/false
+     * @param mixed $table The table to be searched (string name or xmldb_table instance).
+     * @return bool true/false True is a table exists, false otherwise.
      */
     public function table_exists($table) {
         if (!is_string($table) and !($table instanceof xmldb_table)) {
@@ -106,8 +112,8 @@ class database_manager {
 
     /**
      * Reset a sequence to the id field of a table.
-     * @param string $table name of table
-     * @return success
+     * @param string $table Name of table.
+     * @throws ddl_exception|ddl_table_missing_exception Exception thrown upon reset errors.
      */
     public function reset_sequence($table) {
         if (!is_string($table) and !($table instanceof xmldb_table)) {
@@ -127,11 +133,12 @@ class database_manager {
     }
 
     /**
-     * Given one xmldb_field, check if it exists in DB (true/false)
+     * Given one xmldb_field, check if it exists in DB (true/false).
      *
-     * @param mixed the table to be searched (string name or xmldb_table instance)
-     * @param mixed the field to be searched for (string name or xmldb_field instance)
-     * @return boolean true/false
+     * @param mixed $table The table to be searched (string name or xmldb_table instance).
+     * @param mixed $field The field to be searched for (string name or xmldb_field instance).
+     * @return boolean true is exists false otherwise.
+     * @throws ddl_table_missing_exception
      */
     public function field_exists($table, $field) {
     /// Calculate the name of the table
@@ -165,9 +172,10 @@ class database_manager {
      * Given one xmldb_index, the function returns the name of the index in DB
      * of false if it doesn't exist
      *
-     * @param object $xmldb_table table to be searched
-     * @param object $xmldb_index the index to be searched
-     * @return string index name of false
+     * @param xmldb_table $xmldb_table table to be searched
+     * @param xmldb_index $xmldb_index the index to be searched
+     * @return string|bool Index name or false if no indexes are found.
+     * @throws ddl_table_missing_exception Thrown when table is not found.
      */
     public function find_index_name(xmldb_table $xmldb_table, xmldb_index $xmldb_index) {
     /// Calculate the name of the table
@@ -200,11 +208,11 @@ class database_manager {
     }
 
     /**
-     * Given one xmldb_index, check if it exists in DB (true/false)
+     * Given one xmldb_index, check if it exists in DB (true/false).
      *
-     * @param object $xmldb_table the table to be searched
-     * @param object $xmldb_index the index to be searched for
-     * @return boolean true/false
+     * @param xmldb_table $xmldb_table The table to be searched.
+     * @param xmldb_index $xmldb_index The index to be searched for.
+     * @return boolean true id index exists, false otherwise.
      */
     public function index_exists(xmldb_table $xmldb_table, xmldb_index $xmldb_index) {
         if (!$this->table_exists($xmldb_table)) {
@@ -219,11 +227,11 @@ class database_manager {
      * to 1 "enum-like" constraint. So, if more than one is returned, only the first one will be
      * retrieved by this function.
      *
-     * TODO: Moodle 2.1 - Drop find_check_constraint_name()
+     * @todo MDL-31147 Moodle 2.1 - Drop find_check_constraint_name()
      *
-     * @param xmldb_table the table to be searched
-     * @param xmldb_field the field to be searched
-     * @return string check constraint name or false
+     * @param xmldb_table $xmldb_table The table to be searched.
+     * @param xmldb_field $xmldb_field The field to be searched.
+     * @return string|bool check constraint name or false
      */
     public function find_check_constraint_name(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
 
@@ -256,8 +264,8 @@ class database_manager {
      *
      * TODO: Moodle 2.1 - Drop check_constraint_exists()
      *
-     * @param xmldb_table the table
-     * @param xmldb_field the field to be searched for any existing constraint
+     * @param xmldb_table $xmldb_table The table.
+     * @param xmldb_field $xmldb_field The field to be searched for any existing constraint.
      * @return boolean true/false
      */
     public function check_constraint_exists(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -271,9 +279,9 @@ class database_manager {
      * Given one xmldb_key, the function returns the name of the key in DB (if exists)
      * of false if it doesn't exist
      *
-     * @param xmldb_table the table to be searched
-     * @param xmldb_key the key to be searched
-     * @return string key name of false
+     * @param xmldb_table $xmldb_table The table to be searched.
+     * @param xmldb_key $xmldb_key The key to be searched.
+     * @return string key name if found
      */
     public function find_key_name(xmldb_table $xmldb_table, xmldb_key $xmldb_key) {
 
@@ -316,7 +324,7 @@ class database_manager {
     /**
      * This function will delete all tables found in XMLDB file from db
      *
-     * @param $file full path to the XML file to be used
+     * @param string $file Full path to the XML file to be used.
      * @return void
      */
     public function delete_tables_from_xmldb_file($file) {
@@ -354,7 +362,7 @@ class database_manager {
      * and all the associated objects (keys, indexes, constraints, sequences, triggers)
      * will be dropped too.
      *
-     * @param xmldb_table table object (just the name is mandatory)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
      * @return void
      */
     public function drop_table(xmldb_table $xmldb_table) {
@@ -399,7 +407,7 @@ class database_manager {
     /**
      * This function will load one entire XMLDB file and call install_from_xmldb_structure.
      *
-     * @param $file full path to the XML file to be used
+     * @param string $file full path to the XML file to be used
      * @return void
      */
     public function install_from_xmldb_file($file) {
@@ -411,8 +419,8 @@ class database_manager {
     /**
      * This function will load one entire XMLDB file and call install_from_xmldb_structure.
      *
-     * @param $file full path to the XML file to be used
-     * @param $tablename the name of the table.
+     * @param string $file full path to the XML file to be used
+     * @param string $tablename the name of the table.
      * @param bool $cachestructures boolean to decide if loaded xmldb structures can be safely cached
      *             useful for testunits loading the enormous main xml file hundred of times (100x)
      */
@@ -445,7 +453,7 @@ class database_manager {
      * This function will generate all the needed SQL statements, specific for each
      * RDBMS type and, finally, it will execute all those statements against the DB.
      *
-     * @param object $structure xmldb_structure object
+     * @param stdClass $xmldb_structure xmldb_structure object.
      * @return void
      */
     public function install_from_xmldb_structure($xmldb_structure) {
@@ -460,7 +468,7 @@ class database_manager {
      * This function will create the table passed as argument with all its
      * fields/keys/indexes/sequences, everything based in the XMLDB object
      *
-     * @param xmldb_table table object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (full specs are required).
      * @return void
      */
     public function create_table(xmldb_table $xmldb_table) {
@@ -482,7 +490,7 @@ class database_manager {
      * If table already exists ddl_exception will be thrown, please make sure
      * the table name does not collide with existing normal table!
      *
-     * @param xmldb_table table object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (full specs are required).
      * @return void
      */
     public function create_temp_table(xmldb_table $xmldb_table) {
@@ -505,7 +513,7 @@ class database_manager {
      *
      * It is recommended to drop temp table when not used anymore.
      *
-     * @param xmldb_table table object
+     * @param xmldb_table $xmldb_table Table object.
      * @return void
      */
     public function drop_temp_table(xmldb_table $xmldb_table) {
@@ -526,8 +534,8 @@ class database_manager {
      * This function will rename the table passed as argument
      * Before renaming the index, the function will check it exists
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param string new name of the index
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param string $newname New name of the index.
      * @return void
      */
     public function rename_table(xmldb_table $xmldb_table, $newname) {
@@ -563,8 +571,8 @@ class database_manager {
     /**
      * This function will add the field to the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function add_field(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -589,8 +597,8 @@ class database_manager {
     /**
      * This function will drop the field from the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (just the name is mandatory)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function drop_field(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -614,8 +622,8 @@ class database_manager {
     /**
      * This function will change the type of the field in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function change_field_type(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -639,8 +647,8 @@ class database_manager {
     /**
      * This function will change the precision of the field in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function change_field_precision(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -651,8 +659,8 @@ class database_manager {
     /**
      * This function will change the unsigned/signed of the field in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function change_field_unsigned(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -663,8 +671,8 @@ class database_manager {
     /**
      * This function will change the nullability of the field in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function change_field_notnull(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -676,8 +684,8 @@ class database_manager {
      * This function will change the default of the field in the table passed as arguments
      * One null value in the default field means delete the default
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function change_field_default(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -703,8 +711,8 @@ class database_manager {
      *
      * TODO: Moodle 2.1 - Drop drop_enum_from_field()
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field field object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
      * @return void
      */
     public function drop_enum_from_field(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
@@ -733,9 +741,9 @@ class database_manager {
      * This function will rename the field in the table passed as arguments
      * Before renaming the field, the function will check it exists
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_field index object (full specs are required)
-     * @param string new name of the field
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
+     * @param string $newname New name of the field.
      * @return void
      */
     public function rename_field(xmldb_table $xmldb_table, xmldb_field $xmldb_field, $newname) {
@@ -776,7 +784,12 @@ class database_manager {
     /**
      * This function will check, for the given table and field, if there there is any dependency
      * preventing the field to be modified. It's used by all the public methods that perform any
-     * DDL change on fields, throwing one ddl_dependency_exception if dependencies are found
+     * DDL change on fields, throwing one ddl_dependency_exception if dependencies are found.
+     *
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_field $xmldb_field Index object (full specs are required).
+     * @return void
+     * @throws ddl_dependency_exception|ddl_field_missing_exception|ddl_table_missing_exception if dependency not met.
      */
     private function check_field_dependencies(xmldb_table $xmldb_table, xmldb_field $xmldb_field) {
 
@@ -805,8 +818,8 @@ class database_manager {
     /**
      * This function will create the key in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_key index object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_key $xmldb_key Index object (full specs are required).
      * @return void
      */
     public function add_key(xmldb_table $xmldb_table, xmldb_key $xmldb_key) {
@@ -825,8 +838,8 @@ class database_manager {
     /**
      * This function will drop the key in the table passed as arguments
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_key key object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_key $xmldb_key Key object (full specs are required).
      * @return void
      */
     public function drop_key(xmldb_table $xmldb_table, xmldb_key $xmldb_key) {
@@ -845,9 +858,9 @@ class database_manager {
      * This function will rename the key in the table passed as arguments
      * Experimental. Shouldn't be used at all in normal installation/upgrade!
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_key key object (full specs are required)
-     * @param string new name of the key
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_key $xmldb_key key object (full specs are required).
+     * @param string $newname New name of the key.
      * @return void
      */
     public function rename_key(xmldb_table $xmldb_table, xmldb_key $xmldb_key, $newname) {
@@ -869,8 +882,8 @@ class database_manager {
      * This function will create the index in the table passed as arguments
      * Before creating the index, the function will check it doesn't exists
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_index index object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_index $xmldb_intex Index object (full specs are required).
      * @return void
      */
     public function add_index($xmldb_table, $xmldb_intex) {
@@ -896,8 +909,8 @@ class database_manager {
      * This function will drop the index in the table passed as arguments
      * Before dropping the index, the function will check it exists
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_index index object (full specs are required)
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_index $xmldb_intex Index object (full specs are required).
      * @return void
      */
     public function drop_index($xmldb_table, $xmldb_intex) {
@@ -924,9 +937,9 @@ class database_manager {
      * Before renaming the index, the function will check it exists
      * Experimental. Shouldn't be used at all!
      *
-     * @param xmldb_table table object (just the name is mandatory)
-     * @param xmldb_index index object (full specs are required)
-     * @param string new name of the index
+     * @param xmldb_table $xmldb_table Table object (just the name is mandatory).
+     * @param xmldb_index $xmldb_intex Index object (full specs are required).
+     * @param string $newname New name of the index.
      * @return void
      */
     public function rename_index($xmldb_table, $xmldb_intex, $newname) {
index 3c9b41d..fa7cbad 100644 (file)
@@ -20,7 +20,7 @@
  * MSSQL specific SQL code generator.
  *
  * @package    core
- * @subpackage ddl
+ * @subpackage ddl_generator
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
index 3004c76..5f89363 100644 (file)
@@ -20,7 +20,7 @@
  * Mysql specific SQL code generator.
  *
  * @package    core
- * @subpackage ddl
+ * @subpackage ddl_generator
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
index 9450388..80039a5 100644 (file)
@@ -20,7 +20,7 @@
  * Oracle specific SQL code generator.
  *
  * @package    core
- * @subpackage ddl
+ * @subpackage ddl_generator
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
index 5e2a3c8..acde9d2 100644 (file)
@@ -20,7 +20,7 @@
  * PostgreSQL specific SQL code generator.
  *
  * @package    core
- * @subpackage ddl
+ * @subpackage ddl_generator
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
index 203ccf3..f70ab21 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 
 
 /**
- * This class represent the base generator class where all the
- * needed functions to generate proper SQL are defined.
+ * This class represent the base generator class where all the needed functions to generate proper SQL are defined.
  *
  * The rest of classes will inherit, by default, the same logic.
  * Functions will be overridden as needed to generate correct SQL.
  *
  * @package    core
+ * @category   ddl
  * @subpackage ddl
  * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
  *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
@@ -34,6 +33,13 @@ defined('MOODLE_INTERNAL') || die();
 
 /**
  * Abstract sql generator class, base for all db specific implementations.
+ *
+ * @package    core
+ * @category   ddl
+ * @subpackage ddl
+ * @copyright  1999 onwards Martin Dougiamas     http://dougiamas.com
+ *             2001-3001 Eloy Lafuente (stronk7) http://contiento.com
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 abstract class sql_generator {
 
@@ -42,96 +48,146 @@ abstract class sql_generator {
 /// that, by default, inherit this configuration.
 /// To change any of them, do it in extended classes instead.
 
-    public $quote_string = '"';   // String used to quote names
-
-    public $statement_end = ';'; // String to be automatically added at the end of each statement
+    /** @var string Used to quote names. */
+    public $quote_string = '"';
 
-    public $quote_all    = false; // To decide if we want to quote all the names or only the reserved ones
+    /** @var string To be automatically added at the end of each statement. */
+    public $statement_end = ';';
 
-    public $integer_to_number = false;  // To create all the integers as NUMBER(x) (also called DECIMAL, NUMERIC...)
-    public $float_to_number   = false;  // To create all the floats as NUMBER(x) (also called DECIMAL, NUMERIC...)
+    /** @var bool To decide if we want to quote all the names or only the reserved ones. */
+    public $quote_all    = false;
 
-    public $number_type = 'NUMERIC';    // Proper type for NUMBER(x) in this DB
+    /** @var bool To create all the integers as NUMBER(x) (also called DECIMAL, NUMERIC...). */
+    public $integer_to_number = false;
+    /** @var bool To create all the floats as NUMBER(x) (also called DECIMAL, NUMERIC...). */
+    public $float_to_number   = false;
 
-    public $unsigned_allowed = true;    // To define in the generator must handle unsigned information
-    public $default_for_char = null;      // To define the default to set for NOT NULLs CHARs without default (null=do nothing)
+    /** @var string Proper type for NUMBER(x) in this DB. */
+    public $number_type = 'NUMERIC';
 
-    public $drop_default_value_required = false; //To specify if the generator must use some DEFAULT clause to drop defaults
-    public $drop_default_value = ''; //The DEFAULT clause required to drop defaults
+    /** @var bool To define in the generator must handle unsigned information.*/
+    public $unsigned_allowed = true;
+    /** @var string To define the default to set for NOT NULLs CHARs without default (null=do nothing).*/
+    public $default_for_char = null;
 
-    public $default_after_null = true;  //To decide if the default clause of each field must go after the null clause
+    /** @var bool To specify if the generator must use some DEFAULT clause to drop defaults.*/
+    public $drop_default_value_required = false;
+    /** @var string The DEFAULT clause required to drop defaults.*/
+    public $drop_default_value = '';
 
-    public $specify_nulls = false;  //To force the generator if NULL clauses must be specified. It shouldn't be necessary
-                                 //but some mssql drivers require them or everything is created as NOT NULL :-(
+    /** @var bool To decide if the default clause of each field must go after the null clause.*/
+    public $default_after_null = true;
 
-    public $primary_key_name = null; //To force primary key names to one string (null=no force)
+    /**
+     * @var bool To force the generator if NULL clauses must be specified. It shouldn't be necessary.
+     * note: some mssql drivers require them or everything is created as NOT NULL :-(
+     */
+    public $specify_nulls = false;
 
-    public $primary_keys = true;  // Does the generator build primary keys
-    public $unique_keys = false;  // Does the generator build unique keys
-    public $foreign_keys = false; // Does the generator build foreign keys
+    /** @var string To force primary key names to one string (null=no force).*/
+    public $primary_key_name = null;
 
-    public $drop_primary_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME'; // Template to drop PKs
-                               // with automatic replace for TABLENAME and KEYNAME
+    /** @var bool True if the generator builds primary keys.*/
+    public $primary_keys = true;
+    /** @var bool True if the generator builds unique keys.*/
+    public $unique_keys = false;
+    /** @var bool True if the generator builds foreign keys.*/
+    public $foreign_keys = false;
 
-    public $drop_unique_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME'; // Template to drop UKs
-                               // with automatic replace for TABLENAME and KEYNAME
+    /**
+     * @var string Template to drop PKs.
+     * 'TABLENAME' and 'KEYNAME' will be replaced from this template.
+     */
+    public $drop_primary_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME';
 
-    public $drop_foreign_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME'; // Template to drop FKs
-                               // with automatic replace for TABLENAME and KEYNAME
+    /**
+     * @var string Template to drop UKs.
+     * 'TABLENAME' and 'KEYNAME' will be replaced from this template.
+     */
+    public $drop_unique_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME';
 
-    public $sequence_extra_code = true; //Does the generator need to add extra code to generate the sequence fields
-    public $sequence_name = 'auto_increment'; //Particular name for inline sequences in this generator
-    public $sequence_name_small = false; //Different name for small (4byte) sequences or false if same
-    public $sequence_only = false; //To avoid to output the rest of the field specs, leaving only the name and the sequence_name publiciable
+    /** @var string Template to drop FKs.
+     * 'TABLENAME' and 'KEYNAME' will be replaced from this template.
+     */
+    public $drop_foreign_key = 'ALTER TABLE TABLENAME DROP CONSTRAINT KEYNAME';
+
+    /** @var bool True if the generator needs to add extra code to generate the sequence fields.*/
+    public $sequence_extra_code = true;
+    /** @var string The particular name for inline sequences in this generator.*/
+    public $sequence_name = 'auto_increment';
+    /** @var string|bool Different name for small (4byte) sequences or false if same.*/
+    public $sequence_name_small = false;
+    /**
+     * @var bool To avoid outputting the rest of the field specs, leaving only the name and the sequence_name returned.
+     * @see getFieldSQL()
+     */
+    public $sequence_only = false;
 
-    public $add_table_comments  = true;  // Does the generator need to add code for table comments
+    /** @var bool True if the generator needs to add code for table comments.*/
+    public $add_table_comments  = true;
 
-    public $add_after_clause = false; // Does the generator need to add the after clause for fields
+    /** @var bool True if the generator needs to add the after clause for fields.*/
+    public $add_after_clause = false;
 
-    public $prefix_on_names = true; //Does the generator need to prepend the prefix to all the key/index/sequence/trigger/check names
+    /**
+     * @var bool True if the generator needs to prepend the prefix to all the key/index/sequence/trigger/check names.
+     * @see $prefix
+     */
+    public $prefix_on_names = true;
 
-    public $names_max_length = 30; //Max length for key/index/sequence/trigger/check names (keep 30 for all!)
+    /** @var int Maximum length for key/index/sequence/trigger/check names (keep 30 for all!).*/
+    public $names_max_length = 30;
 
-    public $concat_character = '||'; //Characters to be used as concatenation operator. If not defined
-                                  //MySQL CONCAT function will be used
+    /** @var string Characters to be used as concatenation operator.
+     * If not defined, MySQL CONCAT function will be used.
+     */
+    public $concat_character = '||';
 
-    public $rename_table_sql = 'ALTER TABLE OLDNAME RENAME TO NEWNAME'; //SQL sentence to rename one table, both
-                                  //OLDNAME and NEWNAME are dynamically replaced
+    /** @var string SQL sentence to rename one table, both 'OLDNAME' and 'NEWNAME' keywords are dynamically replaced.*/
+    public $rename_table_sql = 'ALTER TABLE OLDNAME RENAME TO NEWNAME';
 
-    public $drop_table_sql = 'DROP TABLE TABLENAME'; //SQL sentence to drop one table
-                                  //TABLENAME is dynamically replaced
+    /** @var string SQL sentence to drop one table where the 'TABLENAME' keyword is dynamically replaced.*/
+    public $drop_table_sql = 'DROP TABLE TABLENAME';
 
-    public $alter_column_sql = 'ALTER TABLE TABLENAME ALTER COLUMN COLUMNSPECS'; //The SQL template to alter columns
+    /** @var string The SQL template to alter columns where the 'TABLENAME' and 'COLUMNSPECS' keywords are dynamically replaced.*/
+    public $alter_column_sql = 'ALTER TABLE TABLENAME ALTER COLUMN COLUMNSPECS';
 
-    public $alter_column_skip_default = false; //The generator will skip the default clause on alter columns
+    /** @var bool The generator will skip the default clause on alter columns.*/
+    public $alter_column_skip_default = false;
 
-    public $alter_column_skip_type = false; //The generator will skip the type clause on alter columns
+    /** @var bool The generator will skip the type clause on alter columns.*/
+    public $alter_column_skip_type = false;
 
-    public $alter_column_skip_notnull = false; //The generator will skip the null/notnull clause on alter columns
+    /** @var bool The generator will skip the null/notnull clause on alter columns.*/
+    public $alter_column_skip_notnull = false;
 
+    /** @var string SQL sentence to rename one column where 'TABLENAME', 'OLDFIELDNAME' and 'NEWFIELDNAME' keywords are dynamically replaced.*/
     public $rename_column_sql = 'ALTER TABLE TABLENAME RENAME COLUMN OLDFIELDNAME TO NEWFIELDNAME';
-                                  ///TABLENAME, OLDFIELDNAME and NEWFIELDNAME are dyanmically replaced
 
-    public $drop_index_sql = 'DROP INDEX INDEXNAME'; //SQL sentence to drop one index
-                                  //TABLENAME, INDEXNAME are dynamically replaced
+    /** @var string SQL sentence to drop one index where 'TABLENAME', 'INDEXNAME' keywords are dynamically replaced.*/
+    public $drop_index_sql = 'DROP INDEX INDEXNAME';
 
-    public $rename_index_sql = 'ALTER INDEX OLDINDEXNAME RENAME TO NEWINDEXNAME'; //SQL sentence to rename one index
-                                  //TABLENAME, OLDINDEXNAME, NEWINDEXNAME are dynamically replaced
+    /** @var string SQL sentence to rename one index where 'TABLENAME', 'OLDINDEXNAME' and 'NEWINDEXNAME' are dynamically replaced.*/
+    public $rename_index_sql = 'ALTER INDEX OLDINDEXNAME RENAME TO NEWINDEXNAME';
 
-    public $rename_key_sql = 'ALTER TABLE TABLENAME CONSTRAINT OLDKEYNAME RENAME TO NEWKEYNAME'; //SQL sentence to rename one key
-                                  //TABLENAME, OLDKEYNAME, NEWKEYNAME are dynamically replaced
+    /** @var string SQL sentence to rename one key 'TABLENAME', 'OLDKEYNAME' and 'NEWKEYNAME' are dynamically replaced.*/
+    public $rename_key_sql = 'ALTER TABLE TABLENAME CONSTRAINT OLDKEYNAME RENAME TO NEWKEYNAME';
 
-    public $prefix;         // Prefix to be used for all the DB objects
+    /** @var string The prefix to be used for all the DB objects.*/
+    public $prefix;
 
-    public $reserved_words; // List of reserved words (in order to quote them properly)
+    /** @var string List of reserved words (in order to quote them properly).*/
+    public $reserved_words;
 
+    /** @var moodle_database The moodle_database instance.*/
     public $mdb;
-
-    protected $temptables; // Control existing temptables
+    /** @var Control existing temptables.*/
+    protected $temptables;
 
     /**
-     * Creates new sql_generator
-     * @param object moodle_database instance
+     * Creates a new sql_generator.
+     * @param moodle_database $mdb The moodle_database object instance.
+     * @param moodle_temptables $temptables The optional moodle_temptables instance, null by default.
      */
     public function __construct($mdb, $temptables = null) {
         $this->prefix         = $mdb->get_prefix();
@@ -141,14 +197,18 @@ abstract class sql_generator {
     }
 
     /**
-     * Release all resources
+     * Releases all resources.
      */
     public function dispose() {
         $this->mdb = null;
     }
 
     /**
-     * Given one string (or one array), ends it with statement_end
+     * Given one string (or one array), ends it with $statement_end .
+     *
+     * @see $statement_end
+     *
+     * @param array|string $input SQL statement(s).
      */
     public function getEndedStatements($input) {
 
@@ -164,9 +224,9 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table, check if it exists in DB (true/false)
+     * Given one xmldb_table, checks if it exists in DB (true/false).
      *
-     * @param mixed the table to be searched (string name or xmldb_table instance)
+     * @param mixed $table The table to be searched (string name or xmldb_table instance).
      * @return boolean true/false
      */
     public function table_exists($table) {
@@ -185,7 +245,11 @@ abstract class sql_generator {
     }
 
     /**
-     * This function will return the SQL code needed to create db tables and statements
+     * This function will return the SQL code needed to create db tables and statements.
+     *
+     * @param xmldb_structure $xmldb_structure An xmldb_structure instance.
+     *
+     * @see xmldb_structure
      */
     public function getCreateStructureSQL($xmldb_structure) {
         $results = array();
@@ -200,11 +264,14 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table, returns it's correct name, depending of all the parametrization
+     * Given one xmldb_table, this returns it's correct name, depending of all the parameterization.
+     * eg: This appends $prefix to the table name.
+     *
+     * @see $prefix
      *
-     * @param xmldb_table table whose name we want
-     * @param boolean to specify if the name must be quoted (if reserved word, only!)
-     * @return string the correct name of the table
+     * @param xmldb_table $xmldb_table The table whose name we want.
+     * @param boolean $quoted To specify if the name must be quoted (if reserved word, only!).
+     * @return string The correct name of the table.
      */
     public function getTableName(xmldb_table $xmldb_table, $quoted=true) {
     /// Get the name
@@ -220,7 +287,11 @@ abstract class sql_generator {
 
     /**
      * Given one correct xmldb_table, returns the SQL statements
-     * to create it (inside one array)
+     * to create it (inside one array).
+     *
+     * @param xmldb_table $xmldb_table An xmldb_table instance.
+     * @return array An array of SQL statements, starting with the table creation SQL followed
+     * by any of its comments, indexes and sequence creation SQL statements.
      */
     public function getCreateTableSQL($xmldb_table) {
 
@@ -345,7 +416,12 @@ abstract class sql_generator {
 
     /**
      * Given one correct xmldb_index, returns the SQL statements
-     * needed to create it (in array)
+     * needed to create it (in array).
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table instance to create the index on.
+     * @param xmldb_index $xmldb_index The xmldb_index to create.
+     * @return array An array of SQL statements to create the index.
+     * @throws coding_exception Thrown if the xmldb_index does not validate with the xmldb_table.
      */
     public function getCreateIndexSQL($xmldb_table, $xmldb_index) {
         if ($error = $xmldb_index->validateDefinition($xmldb_table)) {
@@ -368,7 +444,17 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one correct xmldb_field, returns the complete SQL line to create it
+     * Given one correct xmldb_field, returns the complete SQL line to create it.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to create the SQL from.
+     * @param string $skip_type_clause The type clause on alter columns, NULL by default.
+     * @param string $skip_default_clause The default clause on alter columns, NULL by default.
+     * @param string $skip_notnull_clause The null/notnull clause on alter columns, NULL by default.
+     * @param string $specify_nulls_clause To force a specific null clause, NULL by default.
+     * @param bool $specify_field_name Flag to specify fieldname in return.
+     * @return string The field generating SQL statement.
+     * @throws coding_exception Thrown when xmldb_field doesn't validate with the xmldb_table.
      */
     public function getFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause = NULL, $skip_default_clause = NULL, $skip_notnull_clause = NULL, $specify_nulls_clause = NULL, $specify_field_name = true)  {
         if ($error = $xmldb_field->validateDefinition($xmldb_table)) {
@@ -453,7 +539,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one correct xmldb_key, returns its specs
+     * Given one correct xmldb_key, returns its specs.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_key.
+     * @param xmldb_key $xmldb_key The xmldb_key's specifications requested.
+     * @return string SQL statement about the xmldb_key.
      */
     public function getKeySQL($xmldb_table, $xmldb_key) {
 
@@ -492,6 +582,9 @@ abstract class sql_generator {
 
     /**
      * Give one xmldb_field, returns the correct "default value" for the current configuration
+     *
+     * @param xmldb_field $xmldb_field The field.
+     * @return The default value of the field.
      */
     public function getDefaultValue($xmldb_field) {
 
@@ -529,7 +622,10 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_field, returns the correct "default clause" for the current configuration
+     * Given one xmldb_field, returns the correct "default clause" for the current configuration.
+     *
+     * @param xmldb_field $xmldb_field The xmldb_field.
+     * @return The SQL clause for generating the default value as in $xmldb_field.
      */
     public function getDefaultClause($xmldb_field) {
 
@@ -544,7 +640,11 @@ abstract class sql_generator {
 
     /**
      * Given one correct xmldb_table and the new name, returns the SQL statements
-     * to rename it (inside one array)
+     * to rename it (inside one array).
+     *
+     * @param xmldb_table $xmldb_table The table to rename.
+     * @param string $newname The new name to rename the table to.
+     * @return array SQL statement(s) to rename the table.
      */
     public function getRenameTableSQL($xmldb_table, $newname) {
 
@@ -566,7 +666,10 @@ abstract class sql_generator {
 
     /**
      * Given one correct xmldb_table and the new name, returns the SQL statements
-     * to drop it (inside one array)
+     * to drop it (inside one array).
+     *
+     * @param xmldb_table $xmldb_table The table to drop.
+     * @return array SQL statement(s) for dropping the specified table.
      */
     public function getDropTableSQL($xmldb_table) {
 
@@ -584,7 +687,14 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to add the field to the table
+     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to add the field to the table.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to create the SQL from.
+     * @param string $skip_type_clause The type clause on alter columns, NULL by default.
+     * @param string $skip_default_clause The default clause on alter columns, NULL by default.
+     * @param string $skip_notnull_clause The null/notnull clause on alter columns, NULL by default.
+     * @return array The SQL statement for adding a field to the table.
      */
     public function getAddFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause = NULL, $skip_default_clause = NULL, $skip_notnull_clause = NULL) {
 
@@ -612,7 +722,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to drop the field from the table
+     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to drop the field from the table.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to create the SQL from.
+     * @return array The SQL statement for dropping a field from the table.
      */
     public function getDropFieldSQL($xmldb_table, $xmldb_field) {
 
@@ -629,7 +743,14 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to alter the field in the table
+     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to alter the field in the table.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to create the SQL from.
+     * @param string $skip_type_clause The type clause on alter columns, NULL by default.
+     * @param string $skip_default_clause The default clause on alter columns, NULL by default.
+     * @param string $skip_notnull_clause The null/notnull clause on alter columns, NULL by default.
+     * @return string The field altering SQL statement.
      */
     public function getAlterFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause = NULL, $skip_default_clause = NULL, $skip_notnull_clause = NULL) {
 
@@ -663,7 +784,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to modify the default of the field in the table
+     * Given one xmldb_table and one xmldb_field, return the SQL statements needed to modify the default of the field in the table.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to get the modified default value from.
+     * @return array The SQL statement for modifying the default value.
      */
     public function getModifyDefaultSQL($xmldb_table, $xmldb_field) {
 
@@ -685,7 +810,12 @@ abstract class sql_generator {
 
     /**
      * Given one correct xmldb_field and the new name, returns the SQL statements
-     * to rename it (inside one array)
+     * to rename it (inside one array).
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_field.
+     * @param xmldb_field $xmldb_field The instance of xmldb_field to get the renamed field from.
+     * @param string $newname The new name to rename the field to.
+     * @return array The SQL statements for renaming the field.
      */
     public function getRenameFieldSQL($xmldb_table, $xmldb_field, $newname) {
 
@@ -717,7 +847,11 @@ abstract class sql_generator {
 
     /**
      * Given one xmldb_table and one xmldb_key, return the SQL statements needed to add the key to the table
-     * note that undelying indexes will be added as parametrised by $xxxx_keys and $xxxx_index parameters
+     * note that undelying indexes will be added as parametrised by $xxxx_keys and $xxxx_index parameters.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_key.
+     * @param xmldb_key $xmldb_key The xmldb_key to add.
+     * @return array SQL statement to add the xmldb_key.
      */
     public function getAddKeySQL($xmldb_table, $xmldb_key) {
 
@@ -757,7 +891,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to drop the index from the table
+     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to drop the index from the table.
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_key.
+     * @param xmldb_key $xmldb_key The xmldb_key to drop.
+     * @return array SQL statement to drop the xmldb_key.
      */
     public function getDropKeySQL($xmldb_table, $xmldb_key) {
 
@@ -826,8 +964,12 @@ abstract class sql_generator {
     /**
      * Given one xmldb_table and one xmldb_key, return the SQL statements needed to rename the key in the table
      * Experimental! Shouldn't be used at all!
+     *
+     * @param xmldb_table $xmldb_table The table related to $xmldb_key.
+     * @param xmldb_key $xmldb_key The xmldb_key to rename.
+     * @param string $newname The xmldb_key's new name.
+     * @return array SQL statement to rename the xmldb_key.
      */
-
     public function getRenameKeySQL($xmldb_table, $xmldb_key, $newname) {
 
         $results = array();
@@ -861,7 +1003,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to add the index to the table
+     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to add the index to the table.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table instance to add the index on.
+     * @param xmldb_index $xmldb_index The xmldb_index to add.
+     * @return array An array of SQL statements to add the index.
      */
     public function getAddIndexSQL($xmldb_table, $xmldb_index) {
 
@@ -870,7 +1016,11 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to drop the index from the table
+     * Given one xmldb_table and one xmldb_index, return the SQL statements needed to drop the index from the table.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table instance to drop the index on.
+     * @param xmldb_index $xmldb_index The xmldb_index to drop.
+     * @return array An array of SQL statements to drop the index.
      */
     public function getDropIndexSQL($xmldb_table, $xmldb_index) {
 
@@ -891,6 +1041,11 @@ abstract class sql_generator {
     /**
      * Given one xmldb_table and one xmldb_index, return the SQL statements needed to rename the index in the table
      * Experimental! Shouldn't be used at all!
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table instance to rename the index on.
+     * @param xmldb_index $xmldb_index The xmldb_index to rename.
+     * @param string $newname The xmldb_index's new name.
+     * @return array An array of SQL statements to rename the index.
      */
     function getRenameIndexSQL($xmldb_table, $xmldb_index, $newname) {
     /// Some DB doesn't support index renaming (MySQL) so this can be empty
@@ -914,6 +1069,11 @@ abstract class sql_generator {
      *
      * IMPORTANT: This function must be used to CALCULATE NAMES of objects TO BE CREATED,
      *            NEVER TO GUESS NAMES of EXISTING objects!!!
+     *
+     * @param string $tablename The table name.
+     * @param string $fields A list of comma separated fields.
+     * @param string $suffix A suffix for the object name.
+     * @return string Object's name.
      */
     public function getNameForObject($tablename, $fields, $suffix='') {
 
@@ -985,6 +1145,9 @@ abstract class sql_generator {
     /**
      * Given any string (or one array), enclose it by the proper quotes
      * if it's a reserved word
+     *
+     * @param string|array $input String to quote.
+     * @return Quoted string.
      */
     public function getEncQuoted($input) {
 
@@ -1005,7 +1168,10 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one XMLDB Statement, build the needed SQL insert sentences to execute it
+     * Given one XMLDB Statement, build the needed SQL insert sentences to execute it.
+     *
+     * @param string $statement SQL statement.
+     * @return array Array of sentences in the SQL statement.
      */
     function getExecuteInsertSQL($statement) {
 
@@ -1057,9 +1223,14 @@ abstract class sql_generator {
     }
 
     /**
-     * Given one array of elements, build de proper CONCAT expression, based
+     * Given one array of elements, build the proper CONCAT expression, based
      * in the $concat_character setting. If such setting is empty, then
-     * MySQL's CONCAT function will be used instead
+     * MySQL's CONCAT function will be used instead.
+     *
+     * @param array $elements An array of elements to concatenate.
+     * @return mixed Returns the result of moodle_database::sql_concat() or false.
+     * @uses moodle_database::sql_concat()
+     * @uses call_user_func_array()
      */
     public function getConcatSQL($elements) {
 
@@ -1078,18 +1249,27 @@ abstract class sql_generator {
 
     /**
      * Returns the name (string) of the sequence used in the table for the autonumeric pk
-     * Only some DB have this implemented
+     * Only some DB have this implemented.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table instance.
+     * @return bool Returns the sequence from the DB or false.
      */
     public function getSequenceFromDB($xmldb_table) {
         return false;
     }
 
     /**
-     * Given one object name and it's type (pk, uk, fk, ck, ix, uix, seq, trg)
-     * return if such name is currently in use (true) or no (false)
+     * Given one object name and it's type (pk, uk, fk, ck, ix, uix, seq, trg).
+     *
      * (MySQL requires the whole xmldb_table object to be specified, so we add it always)
-     * (invoked from getNameForObject()
-     * Only some DB have this implemented
+     *
+     * This is invoked from getNameForObject().
+     * Only some DB have this implemented.
+     *
+     * @param string $object_name The object's name to check for.
+     * @param string $type The object's type (pk, uk, fk, ck, ix, uix, seq, trg).
+     * @param string $table_name The table's name to check in
+     * @return bool If such name is currently in use (true) or no (false)
      */
     public function isNameInUse($object_name, $type, $table_name) {
         return false; //For generators not implementing introspection,
@@ -1101,30 +1281,46 @@ abstract class sql_generator {
 
     /**
      * Reset a sequence to the id field of a table.
-     * @param string $table name of table
+     *
+     * @param string $tablename name of table.
      * @return success
      */
     public abstract function getResetSequenceSQL($tablename);
 
     /**
      * Given one correct xmldb_table, returns the SQL statements
-     * to create temporary table (inside one array)
+     * to create temporary table (inside one array).
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @return array SQL statements.
      */
     abstract public function getCreateTempTableSQL($xmldb_table);
 
     /**
-     * Given one correct xmldb_table and the new name, returns the SQL statements
-     * to drop it (inside one array)
+     * Given one correct xmldb_table and the new name, returns the SQL statements.
+     * to drop it (inside one array).
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @return array SQL statements.
      */
     abstract public function getDropTempTableSQL($xmldb_table);
 
     /**
-     * Given one XMLDB Type, length and decimals, returns the DB proper SQL type
+     * Given one XMLDB Type, length and decimals, returns the DB proper SQL type.
+     *
+     * @param int $xmldb_type The xmldb_type defined constant. XMLDB_TYPE_INTEGER and other XMLDB_TYPE_* constants.
+     * @param int $xmldb_length The length of that data type.
+     * @param int $xmldb_decimals The decimal places of precision of the data type.
+     * @return string The DB defined data type.
      */
     public abstract function getTypeSQL($xmldb_type, $xmldb_length=null, $xmldb_decimals=null);
 
     /**
-     * Returns the code (array of statements) needed to execute extra statements on field rename
+     * Returns the code (array of statements) needed to execute extra statements on field rename.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     * @return array Array of extra SQL statements to run with a field being renamed.
      */
     public function getRenameFieldExtraSQL($xmldb_table, $xmldb_field) {
         return array();
@@ -1132,19 +1328,30 @@ abstract class sql_generator {
 
     /**
      * Returns the code (array of statements) needed
-     * to create one sequence for the xmldb_table and xmldb_field passes
+     * to create one sequence for the xmldb_table and xmldb_field passed in.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     * @return array Array of SQL statements to create the sequence.
      */
     public function getCreateSequenceSQL($xmldb_table, $xmldb_field) {
         return array();
     }
 
     /**
-     * Returns the code (array of statements) needed to add one comment to the table
+     * Returns the code (array of statements) needed to add one comment to the table.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @return array Array of SQL statements to add one comment to the table.
      */
     public abstract function getCommentSQL($xmldb_table);
 
     /**
-     * Returns the code (array of statements) needed to execute extra statements on table rename
+     * Returns the code (array of statements) needed to execute extra statements on table rename.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param string $newname The new name for the table.
+     * @return array Array of extra SQL statements to rename a table.
      */
     public function getRenameTableExtraSQL($xmldb_table, $newname) {
         return array();
@@ -1152,6 +1359,9 @@ abstract class sql_generator {
 
     /**
      * Returns the code (array of statements) needed to execute extra statements on table drop
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @return array Array of extra SQL statements to drop a table.
      */
     public function getDropTableExtraSQL($xmldb_table) {
         return array();
@@ -1161,7 +1371,12 @@ abstract class sql_generator {
      * Given one xmldb_table and one xmldb_field, return the SQL statements needed to drop its enum
      * (usually invoked from getModifyEnumSQL()
      *
-     * TODO: Moodle 2.1 - Drop getDropEnumSQL()
+     * Note that this method may be dropped in future.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     *
+     * @todo MDL-31147 Moodle 2.1 - Drop getDropEnumSQL()
      */
     public abstract function getDropEnumSQL($xmldb_table, $xmldb_field);
 
@@ -1169,7 +1384,12 @@ abstract class sql_generator {
      * Given one xmldb_table and one xmldb_field, return the SQL statements needed to drop its default
      * (usually invoked from getModifyDefaultSQL()
      *
-     * TODO: Moodle 2.1 - Drop getDropDefaultSQL()
+     * Note that this method may be dropped in future.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     *
+     * @todo MDL-31147 Moodle 2.1 - Drop getDropDefaultSQL()
      */
     public abstract function getDropDefaultSQL($xmldb_table, $xmldb_field);
 
@@ -1178,27 +1398,37 @@ abstract class sql_generator {
      * constrainst found for that table (or field). Must exist for each DB supported.
      * (usually invoked from find_check_constraint_name)
      *
-     * TODO: Moodle 2.1 - Drop getCheckConstraintsFromDB
+     * Note that this method may be dropped in future.
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     *
+     * @todo MDL-31147 Moodle 2.1 - Drop getCheckConstraintsFromDB
      */
     public abstract function getCheckConstraintsFromDB($xmldb_table, $xmldb_field=null);
 
     /**
      * Given one xmldb_table and one xmldb_field, return the SQL statements needed to add its default
      * (usually invoked from getModifyDefaultSQL()
+     *
+     * @param xmldb_table $xmldb_table The xmldb_table object instance.
+     * @param xmldb_field $xmldb_field The xmldb_field object instance.
+     * @return array Array of SQL statements to create a field's default.
      */
     public abstract function getCreateDefaultSQL($xmldb_table, $xmldb_field);
 
     /**
      * Returns an array of reserved words (lowercase) for this DB
-     * You MUST provide the real list for each DB inside every XMLDB class
-     * @return array of reserved words
+     * You MUST provide the real list for each DB inside every XMLDB class.
+     * @return array An array of database specific reserved words.
+     * @throws coding_exception Thrown if not implemented for the specific DB.
      */
     public static function getReservedWords() {
         throw new coding_exception('getReservedWords() method needs to be overridden in each subclass of sql_generator');
     }
 
     /**
-     * Returns all reserved works in supported databases.
+     * Returns all reserved words in supported databases.
      * Reserved words should be lowercase.
      * @return array ('word'=>array(databases))
      */
@@ -1219,6 +1449,11 @@ abstract class sql_generator {
         return $reserved_words;
     }
 
+    /**
+     * Adds slashes to string.
+     * @param string $s
+     * @return string The escaped string.
+     */
     public function addslashes($s) {
         // do not use php addslashes() because it depends on PHP quote settings!
         $s = str_replace('\\','\\\\',$s);
index d2ba790..d190d07 100644 (file)
@@ -20,7 +20,7 @@
  * Experimental SQLite specific SQL code generator.
  *
  * @package    core
- * @subpackage ddl
+ * @subpackage ddl_generator
  * @copyright  2008 Andrei Bautu
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 0ece5f0..e29e378 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-M.form_dndupload = {
-    // YUI object.
-    Y: null,
-    // URL for upload requests
-    url: M.cfg.wwwroot + '/repository/repository_ajax.php?action=upload',
-    // itemid used for repository upload
-    itemid: null,
-    // accepted filetypes accepted by this form passed to repository
-    acceptedtypes: [],
-    // maximum number of files this form allows
-    maxfiles: 0,
-    // maximum size of files allowed in this form
-    maxbytes: 0,
-    // unqiue id of this form field used for html elements
-    clientid: '',
-    // upload repository id, used for upload
-    repositoryid: 0,
-    // container which holds the node which recieves drag events
-    container: null,
-    // filemanager element we are working with
-    filemanager: null,
-    // callback  to filepicker element to refesh when uploaded
-    callback: null,
-    // Nasty hack to distinguish between dragenter(first entry),
-    // dragenter+dragleave(moving between child elements) and dragleave (leaving element)
-    entercount: 0,
-
-
-    /**
-     * Initalise the drag and drop upload interface
-     * Note: one and only one of options.filemanager and options.formcallback must be defined
-     *
-     * @param Y the YUI object
-     * @param object options {
-     *            itemid: itemid used for repository upload in this form
-     *            acceptdtypes: accepted filetypes by this form
-     *            maxfiles: maximum number of files this form allows
-     *            maxbytes: maximum size of files allowed in this form
-     *            clientid: unqiue id of this form field used for html elements
-     *            containerprefix: prefix of htmlid of container
-     *            repositories: array of repository objects passed from filepicker
-     *            filemanager: filemanager element we are working with
-     *            callback: callback  to filepicker element to refesh when uploaded
-     *          }
-     */
-    init: function(Y, options) {
-        this.Y = Y;
-
-        if (!this.browser_supported()) {
-            return; // Browser does not support the required functionality
-        }
-
-        // try and retrieve enabled upload repository
-        this.repositoryid = this.get_upload_repositoryid(options.repositories);
-
-        if (!this.repositoryid) {
-            return; // no upload repository is enabled to upload to
-        }
-
-        this.acceptedtypes = options.acceptedtypes;
-        this.clientid = options.clientid;
-        this.maxfiles = options.maxfiles;
-        this.maxbytes = options.maxbytes;
-        this.itemid = options.itemid;
-        this.container = this.Y.one(options.containerprefix + this.clientid);
-
-        if (options.filemanager) {
-            // Needed to tell the filemanager to redraw when files uploaded
-            // and to check how many files are already uploaded
-            this.filemanager = options.filemanager;
-        } else if (options.formcallback) {
-
-            // Needed to tell the filepicker to update when a new
-            // file is uploaded
-            this.callback = options.formcallback;
-        } else {
-            if (M.cfg.developerdebug) {
-                alert('dndupload: Need to define either options.filemanager or options.callback');
+M.form_dndupload = {}
+
+M.form_dndupload.init = function(Y, options) {
+    var dnduploadhelper = {
+        // YUI object.
+        Y: null,
+        // URL for upload requests
+        url: M.cfg.wwwroot + '/repository/repository_ajax.php?action=upload',
+        // itemid used for repository upload
+        itemid: null,
+        // accepted filetypes accepted by this form passed to repository
+        acceptedtypes: [],
+        // maximum number of files this form allows
+        maxfiles: 0,
+        // maximum size of files allowed in this form
+        maxbytes: 0,
+        // unqiue id of this form field used for html elements
+        clientid: '',
+        // upload repository id, used for upload
+        repositoryid: 0,
+        // container which holds the node which recieves drag events
+        container: null,
+        // filemanager element we are working with
+        filemanager: null,
+        // callback  to filepicker element to refesh when uploaded
+        callback: null,
+        // Nasty hack to distinguish between dragenter(first entry),
+        // dragenter+dragleave(moving between child elements) and dragleave (leaving element)
+        entercount: 0,
+
+
+        /**
+         * Initalise the drag and drop upload interface
+         * Note: one and only one of options.filemanager and options.formcallback must be defined
+         *
+         * @param Y the YUI object
+         * @param object options {
+         *            itemid: itemid used for repository upload in this form
+         *            acceptdtypes: accepted filetypes by this form
+         *            maxfiles: maximum number of files this form allows
+         *            maxbytes: maximum size of files allowed in this form
+         *            clientid: unqiue id of this form field used for html elements
+         *            containerprefix: prefix of htmlid of container
+         *            repositories: array of repository objects passed from filepicker
+         *            filemanager: filemanager element we are working with
+         *            callback: callback  to filepicker element to refesh when uploaded
+         *          }
+         */
+        init: function(Y, options) {
+            this.Y = Y;
+
+            if (!this.browser_supported()) {
+                return; // Browser does not support the required functionality
             }
-            return;
-        }
-
-        this.init_events();
-        this.Y.one('#dndenabled-'+this.clientid).setStyle('display', 'inline');
-    },
 
-    /**
-     * Check the browser has the required functionality
-     * @return true if browser supports drag/drop upload
-     */
-    browser_supported: function() {
+            // try and retrieve enabled upload repository
+            this.repositoryid = this.get_upload_repositoryid(options.repositories);
 
-        if (typeof FileReader == 'undefined') {
-            return false;
-        }
-        if (typeof FormData == 'undefined') {
-            return false;
-        }
-        return true;
-    },
-
-    /**
-     * Get upload repoistory from array of enabled repositories
-     *
-     * @param array repositories repository objects passed from filepicker
-     * @param returns int id of upload repository or false if not found
-     */
-    get_upload_repositoryid: function(repositories) {
-         for (var i in repositories) {
-             if (repositories[i].type == "upload") {
-                 return repositories[i].id;
-             }
-         }
-
-         return false;
-    },
-
-    /**
-     * Initialise drag events on node container, all events need
-     * to be processed for drag and drop to work
-     */
-    init_events: function() {
-        this.Y.on('dragenter', this.drag_enter, this.container, this);
-        this.Y.on('dragleave', this.drag_leave, this.container, this);
-        this.Y.on('dragover',  this.drag_over,  this.container, this);
-        this.Y.on('drop',      this.drop,      this.container, this);
-    },
-
-    /**
-     * Check if the drag contents are valid and then call
-     * preventdefault / stoppropagation to let the browser know
-     * we will handle this drag/drop
-     *
-     * @param e event object
-     * @return boolean true if a valid file drag event
-     */
-    check_drag: function(e) {
-        if (!this.has_files(e)) {
-            return false;
-        }
+            if (!this.repositoryid) {
+                return; // no upload repository is enabled to upload to
+            }
 
-        e.preventDefault();
-        e.stopPropagation();
+            this.acceptedtypes = options.acceptedtypes;
+            this.clientid = options.clientid;
+            this.maxfiles = options.maxfiles;
+            this.maxbytes = options.maxbytes;
+            this.itemid = options.itemid;
+            this.container = this.Y.one(options.containerprefix + this.clientid);
+
+            if (options.filemanager) {
+                // Needed to tell the filemanager to redraw when files uploaded
+                // and to check how many files are already uploaded
+                this.filemanager = options.filemanager;
+            } else if (options.formcallback) {
+
+                // Needed to tell the filepicker to update when a new
+                // file is uploaded
+                this.callback = options.formcallback;
+            } else {
+                if (M.cfg.developerdebug) {
+                    alert('dndupload: Need to define either options.filemanager or options.callback');
+                }
+                return;
+            }
 
-        if (this.reached_maxfiles()) {
-            return false;
-        }
+            this.init_events();
+            this.Y.one('#dndenabled-'+this.clientid).setStyle('display', 'inline');
+        },
 
-        return true;
-    },
+        /**
+         * Check the browser has the required functionality
+         * @return true if browser supports drag/drop upload
+         */
+        browser_supported: function() {
 
-    /**
-     * Handle a dragenter event, highlight the destination node
-     * when a suitable drag event occurs
-     */
-    drag_enter: function(e) {
-        if (!this.check_drag(e)) {
+            if (typeof FileReader == 'undefined') {
+                return false;
+            }
+            if (typeof FormData == 'undefined') {
+                return false;
+            }
             return true;
-        }
+        },
+
+        /**
+         * Get upload repoistory from array of enabled repositories
+         *
+         * @param array repositories repository objects passed from filepicker
+         * @param returns int id of upload repository or false if not found
+         */
+        get_upload_repositoryid: function(repositories) {
+            for (var i in repositories) {
+                if (repositories[i].type == "upload") {
+                    return repositories[i].id;
+                }
+            }
 
-        this.entercount++;
-        if (this.entercount >= 2) {
-            this.entercount = 2; // Just moved over a child element - nothing to do
             return false;
-        }
+        },
+
+        /**
+         * Initialise drag events on node container, all events need
+         * to be processed for drag and drop to work
+         */
+        init_events: function() {
+            this.Y.on('dragenter', this.drag_enter, this.container, this);
+            this.Y.on('dragleave', this.drag_leave, this.container, this);
+            this.Y.on('dragover',  this.drag_over,  this.container, this);
+            this.Y.on('drop',      this.drop,      this.container, this);
+        },
+
+        /**
+         * Check if the drag contents are valid and then call
+         * preventdefault / stoppropagation to let the browser know
+         * we will handle this drag/drop
+         *
+         * @param e event object
+         * @return boolean true if a valid file drag event
+         */
+        check_drag: function(e) {
+            if (!this.has_files(e)) {
+                return false;
+            }
 
-        this.show_upload_ready();
-        return false;
-    },
+            e.preventDefault();
+            e.stopPropagation();
+
+            if (this.reached_maxfiles()) {
+                return false;
+            }
 
-    /**
-     * Handle a dragleave event, Remove the highlight if dragged from
-     * node
-     */
-    drag_leave: function(e) {
-        if (!this.check_drag(e)) {
             return true;
-        }
+        },
+
+        /**
+         * Handle a dragenter event, highlight the destination node
+         * when a suitable drag event occurs
+         */
+        drag_enter: function(e) {
+            if (!this.check_drag(e)) {
+                return true;
+            }
 
-        this.entercount--;
-        if (this.entercount == 1) {
-            return false; // Just moved over a child element - nothing to do
-        }
+            this.entercount++;
+            if (this.entercount >= 2) {
+                this.entercount = 2; // Just moved over a child element - nothing to do
+                return false;
+            }
 
-        this.entercount = 0;
-        this.hide_upload_ready();
-        return false;
-    },
-
-    /**
-     * Handle a dragover event. Required to intercept to prevent the browser from
-     * handling the drag and drop event as normal
-     */
-    drag_over: function(e) {
-        if (!this.check_drag(e)) {
-            return true;
-        }
+            this.show_upload_ready();
+            return false;
+        },
+
+        /**
+         * Handle a dragleave event, Remove the highlight if dragged from
+         * node
+         */
+        drag_leave: function(e) {
+            if (!this.check_drag(e)) {
+                return true;
+            }
 
-        return false;
-    },
+            this.entercount--;
+            if (this.entercount == 1) {
+                return false; // Just moved over a child element - nothing to do
+            }
 
-    /**
-     * Handle a drop event.  Remove the highlight and then upload each
-     * of the files (until we reach the file limit, or run out of files)
-     */
-    drop: function(e) {
-        if (!this.check_drag(e)) {
-            return true;
-        }
+            this.entercount = 0;
+            this.hide_upload_ready();
+            return false;
+        },
+
+        /**
+         * Handle a dragover event. Required to intercept to prevent the browser from
+         * handling the drag and drop event as normal
+         */
+        drag_over: function(e) {
+            if (!this.check_drag(e)) {
+                return true;
+            }
 
-        this.entercount = 0;
-        this.hide_upload_ready();
-        this.show_progress_spinner();
+            return false;
+        },
+
+        /**
+         * Handle a drop event.  Remove the highlight and then upload each
+         * of the files (until we reach the file limit, or run out of files)
+         */
+        drop: function(e) {
+            if (!this.check_drag(e)) {
+                return true;
+            }
+
+            this.entercount = 0;
+            this.hide_upload_ready();
+            this.show_progress_spinner();
 
-        var files = e._event.dataTransfer.files;
-        if (this.filemanager) {
-            var currentfilecount = this.filemanager.filecount;
-            for (var i=0, f; f=files[i]; i++) {
-                if (currentfilecount >= this.maxfiles && this.maxfiles != -1) {
-                    break;
+            var files = e._event.dataTransfer.files;
+            if (this.filemanager) {
+                var currentfilecount = this.filemanager.filecount;
+                for (var i=0, f; f=files[i]; i++) {
+                    if (currentfilecount >= this.maxfiles && this.maxfiles != -1) {
+                        break;
+                    }
+                    if (this.upload_file(f)) {
+                        currentfilecount++;
+                    }
                 }
-                if (this.upload_file(f)) {
-                    currentfilecount++;
+            } else {
+                if (files.length >= 1) {
+                    this.upload_file(files[0]);
                 }
             }
-        } else {
-            if (files.length >= 1) {
-                this.upload_file(files[0]);
-            }
-        }
 
-        return false;
-    },
-
-    /**
-     * Check to see if the drag event has any files in it
-     *
-     * @param e event object
-     * @return boolean true if event has files
-     */
-    has_files: function(e) {
-        var types = e._event.dataTransfer.types;
-        for (var i=0; i<types.length; i++) {
-            if (types[i] == 'Files') {
-                return true;
+            return false;
+        },
+
+        /**
+         * Check to see if the drag event has any files in it
+         *
+         * @param e event object
+         * @return boolean true if event has files
+         */
+        has_files: function(e) {
+            var types = e._event.dataTransfer.types;
+            for (var i=0; i<types.length; i++) {
+                if (types[i] == 'Files') {
+                    return true;
+                }
             }
-        }
-        return false;
-    },
-
-    /**
-     * Check if reached the maximumum number of allowed files
-     *
-     * @return boolean true if reached maximum number of files
-     */
-    reached_maxfiles: function() {
-        if (this.filemanager) {
-            if (this.filemanager.filecount >= this.maxfiles && this.maxfiles != -1) {
-                return true;
+            return false;
+        },
+
+        /**
+         * Check if reached the maximumum number of allowed files
+         *
+         * @return boolean true if reached maximum number of files
+         */
+        reached_maxfiles: function() {
+            if (this.filemanager) {
+                if (this.filemanager.filecount >= this.maxfiles && this.maxfiles != -1) {
+                    return true;
+                }
             }
-        }
-        return false;
-    },
-
-    /**
-     * Highlight the destination node
-     */
-    show_upload_ready: function() {
-        this.container.addClass('dndupload-over');
-    },
-
-    /**
-     * Remove highlight on destination node
-     */
-    hide_upload_ready: function() {
-        this.container.removeClass('dndupload-over');
-    },
-
-    /**
-     * Display a progress spinner in the destination node
-     */
-    show_progress_spinner: function() {
-        // add a loading spinner to show something is happening
-        var loadingspinner = this.Y.Node.create('<div id="dndprogresspinner-'+this.clientid+'" style="text-align: center">');
-        loadingspinner.append('<img src="'+M.util.image_url('i/loading_small')+'" />');
-        this.container.append(loadingspinner);
-    },
-
-    /**
-     * Remove progress spinner in the destination node
-     */
-    hide_progress_spinner: function() {
-        this.Y.one('#dndprogresspinner-'+this.clientid).remove();
-    },
-
-    /**
-     * Tell the attached filemanager element (if any) to refresh on file
-     * upload
-     */
-    update_filemanager: function() {
-        if (this.filemanager) {
-            // update the filemanager that we've uploaded the files
-            this.filemanager.filepicker_callback();
-        }
-    },
-
-    /**
-     * Upload a single file via an AJAX call to the 'upload' repository
-     */
-    upload_file: function(file) {
-        if (file.size > this.maxbytes && this.maxbytes > 0) {
-            // Check filesize before attempting to upload
-            this.hide_progress_spinner();
-            alert(M.util.get_string('uploadformlimit', 'moodle')+"\n'"+file.name+"'");
             return false;
-        }
+        },
+
+        /**
+         * Highlight the destination node
+         */
+        show_upload_ready: function() {
+            this.container.addClass('dndupload-over');
+        },
+
+        /**
+         * Remove highlight on destination node
+         */
+        hide_upload_ready: function() {
+            this.container.removeClass('dndupload-over');
+        },
+
+        /**
+         * Display a progress spinner in the destination node
+         */
+        show_progress_spinner: function() {
+            // add a loading spinner to show something is happening
+            var loadingspinner = this.Y.Node.create('<div id="dndprogresspinner-'+this.clientid+'" style="text-align: center">');
+            loadingspinner.append('<img src="'+M.util.image_url('i/loading_small')+'" />');
+            this.container.append(loadingspinner);
+        },
+
+        /**
+         * Remove progress spinner in the destination node
+         */
+        hide_progress_spinner: function() {
+            this.Y.one('#dndprogresspinner-'+this.clientid).remove();
+        },
+
+        /**
+         * Tell the attached filemanager element (if any) to refresh on file
+         * upload
+         */
+        update_filemanager: function() {
+            if (this.filemanager) {
+                // update the filemanager that we've uploaded the files
+                this.filemanager.filepicker_callback();
+            }
+        },
+
+        /**
+         * Upload a single file via an AJAX call to the 'upload' repository
+         */
+        upload_file: function(file) {
+            if (file.size > this.maxbytes && this.maxbytes > 0) {
+                // Check filesize before attempting to upload
+                this.hide_progress_spinner();
+                alert(M.util.get_string('uploadformlimit', 'moodle')+"\n'"+file.name+"'");
+                return false;
+            }
 
-        // This would be an ideal place to use the Y.io function
-        // however, this does not support data encoded using the
-        // FormData object, which is needed to transfer data from
-        // the DataTransfer object into an XMLHTTPRequest
-        // This can be converted when the YUI issue has been integrated:
-        // http://yuilibrary.com/projects/yui3/ticket/2531274
-        var xhr = new XMLHttpRequest();
-        var self = this;
-        xhr.onreadystatechange = function() { // Process the server response
-            if (xhr.readyState == 4) {
-                self.hide_progress_spinner();
-                if (xhr.status == 200) {
-                    var result = JSON.parse(xhr.responseText);
-                    if (result) {
-                        if (result.error) {
-                            alert(result.error);
-                        } else if (self.callback) {
-                            // Only update the filepicker if there were no errors
-                            if (result.event == 'fileexists') {
-                                // Do not worry about this, as we only care about the last
-                                // file uploaded, with the filepicker
-                                result.file = result.newfile.filename;
-                                result.url = result.newfile.url;
+            // This would be an ideal place to use the Y.io function
+            // however, this does not support data encoded using the
+            // FormData object, which is needed to transfer data from
+            // the DataTransfer object into an XMLHTTPRequest
+            // This can be converted when the YUI issue has been integrated:
+            // http://yuilibrary.com/projects/yui3/ticket/2531274
+            var xhr = new XMLHttpRequest();
+            var self = this;
+            xhr.onreadystatechange = function() { // Process the server response
+                if (xhr.readyState == 4) {
+                    self.hide_progress_spinner();
+                    if (xhr.status == 200) {
+                        var result = JSON.parse(xhr.responseText);
+                        if (result) {
+                            if (result.error) {
+                                alert(result.error);
+                            } else if (self.callback) {
+                                // Only update the filepicker if there were no errors
+                                if (result.event == 'fileexists') {
+                                    // Do not worry about this, as we only care about the last
+                                    // file uploaded, with the filepicker
+                                    result.file = result.newfile.filename;
+                                    result.url = result.newfile.url;
+                                }
+                                result.client_id = self.clientid;
+                                self.callback(result);
+                            } else {
+                                self.update_filemanager();
                             }
-                            result.client_id = self.clientid;
-                            self.callback(result);
-                        } else {
-                            self.update_filemanager();
                         }
+                    } else {
+                        alert(M.util.get_string('serverconnection', 'error'));
                     }
-                } else {
-                    alert(M.util.get_string('serverconnection', 'error'));
                 }
+            };
+
+            // Prepare the data to send
+            var formdata = new FormData();
+            formdata.append('repo_upload_file', file); // The FormData class allows us to attach a file
+            formdata.append('sesskey', M.cfg.sesskey);
+            formdata.append('repo_id', this.repositoryid);
+            formdata.append('itemid', this.itemid);
+            if (this.filemanager) { // Filepickers do not have folders
+                formdata.append('savepath', this.filemanager.currentpath);
             }
-        };
-
-        // Prepare the data to send
-        var formdata = new FormData();
-        formdata.append('repo_upload_file', file); // The FormData class allows us to attach a file
-        formdata.append('sesskey', M.cfg.sesskey);
-        formdata.append('repo_id', this.repositoryid);
-        formdata.append('itemid', this.itemid);
-        if (this.filemanager) { // Filepickers do not have folders
-            formdata.append('savepath', this.filemanager.currentpath);
-        }
 
-        if (this.acceptedtypes.constructor == Array) {
-            for (var i=0; i<this.acceptedtypes.length; i++) {
-                formdata.append('accepted_types[]', this.acceptedtypes[i]);
+            if (this.acceptedtypes.constructor == Array) {
+                for (var i=0; i<this.acceptedtypes.length; i++) {
+                    formdata.append('accepted_types[]', this.acceptedtypes[i]);
+                }
+            } else {
+                formdata.append('accepted_types[]', this.acceptedtypes);
             }
-        } else {
-            formdata.append('accepted_types[]', this.acceptedtypes);
+
+            // Send the file & required details
+            xhr.open("POST", this.url, true);
+            xhr.send(formdata);
+            return true;
         }
+    };
 
-        // Send the file & required details
-        xhr.open("POST", this.url, true);
-        xhr.send(formdata);
-        return true;
-    }
+    dnduploadhelper.init(Y, options);
 };
index 18d3842..d3d237b 100644 (file)
@@ -144,6 +144,7 @@ M.form_filemanager.init = function(Y, options) {
             this.filecount++;
             this.check_buttons();
             this.refresh(this.currentpath);
+            M.util.set_form_changed();
         },
         check_buttons: function() {
             var button_addfile  = Y.one("#btnadd-"+this.client_id);
@@ -213,6 +214,7 @@ M.form_filemanager.init = function(Y, options) {
                                 scope.mkdir_dialog.hide();
                                 scope.refresh(filepath);
                                 Y.one('#fm-newname').set('value', '');
+                                M.util.set_form_changed();
                             }
                         });
                     }
@@ -559,6 +561,7 @@ M.form_filemanager.init = function(Y, options) {
                         callback: function(id, obj, args) {
                             scope.filecount--;
                             scope.refresh(obj.filepath);
+                            M.util.set_form_changed();
                             if (scope.filecount < scope.maxfiles && scope.maxfiles!=-1) {
                                 var button_addfile  = Y.one("#btnadd-"+scope.client_id);
                                 button_addfile.setStyle('display', 'inline');
@@ -606,6 +609,7 @@ M.form_filemanager.init = function(Y, options) {
                                 alert(M.str.repository.fileexists);
                             } else {
                                 scope.refresh(obj.filepath);
+                                M.util.set_form_changed();
                             }
                             Y.one('#fm-rename-input').set('value', '');
                             scope.rename_dialog.hide();
@@ -683,6 +687,7 @@ M.form_filemanager.init = function(Y, options) {
                             }
                             dialog.cancel();
                             scope.refresh(p);
+                            M.util.set_form_changed();
                         }
                     });
                 }
index 0f06fcf..371c2b0 100644 (file)
@@ -2255,6 +2255,7 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
      * @param object $form MoodleQuickForm
      */
     function startForm(&$form){
+        global $PAGE;
         $this->_reqHTML = $form->getReqHTML();
         $this->_elementTemplates = str_replace('{req}', $this->_reqHTML, $this->_elementTemplates);
         $this->_advancedHTML = $form->getAdvancedHTML();
@@ -2267,7 +2268,13 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
             $this->_hiddenHtml .= $form->_pageparams;
         }
 
-
+        $PAGE->requires->yui_module('moodle-core-formslib',
+                'M.core.init_formslib',
+                array(array(
+                    'formid' => $form->getAttribute('id')
+                ))
+        );
+        $PAGE->requires->string_for_js('changesmadereallygoaway', 'moodle');
     }
 
     /**
index faf00b8..6f3a137 100644 (file)
@@ -1113,7 +1113,7 @@ class HTML5 {
                 $entity = $this->character($start, $this->char);
                 $cond = strlen($e_name) > 0;
 
-                // The rest of the parsing happens bellow.
+                // The rest of the parsing happens below.
             break;
 
             // Anything else
@@ -1140,7 +1140,7 @@ class HTML5 {
                 }
 
                 $cond = isset($entity);
-                // The rest of the parsing happens bellow.
+                // The rest of the parsing happens below.
             break;
         }
 
index 07f8cfc..452be34 100644 (file)
@@ -1752,4 +1752,72 @@ M.util.load_flowplayer = function() {
         fileref.onreadystatechange = embed_function;
         document.getElementsByTagName('head')[0].appendChild(fileref);
     }
+};
+
+/**
+ * Set the form changed state to true
+ */
+M.util.set_form_changed = function() {
+    M.cfg.form_changed = 1;
+};
+
+/**
+ * Set the form submitted state to true
+ */
+M.util.set_form_submitted = function() {
+    M.cfg.form_submitted = 1;
 }
+
+/**
+ * Attempt to determine whether the form has been modified in any way and
+ * is thus 'dirty'
+ *
+ * @return Integer 1 is the form is dirty; 0 if not
+ */
+M.util.get_form_dirty_state = function() {
+    // If the form was submitted, then return a non-dirty state
+    if (M.cfg.form_submitted) {
+        return 0;
+    }
+
+    // If any fields have been marked dirty, return a dirty state
+    if (M.cfg.form_changed) {
+        return 1;
+    }
+
+    // Handle TinyMCE editor instances
+    // We can't add a listener in the initializer as the editors may not have been created by that point
+    // so we do so here instead
+    if (typeof tinyMCE != 'undefined') {
+        for (var editor in tinyMCE.editors) {
+            if (tinyMCE.editors[editor].isDirty()) {
+                return 1;
+            }
+        }
+    }
+
+    // If we reached here, then the form hasn't met any of the dirty conditions
+    return 0;
+};
+
+/**
+ * Return a suitable message if changes have been made to a form
+ */
+M.util.report_form_dirty_state = function(e) {
+    if (!M.util.get_form_dirty_state()) {
+        // the form is not dirty, so don't display any message
+        return;
+    }
+
+    // This is the error message that we'll show to browsers which support it
+    var returnValue = M.util.get_string('changesmadereallygoaway', 'moodle');
+
+    // Most browsers are happy with the returnValue being set on the event
+    // But some browsers do not consistently pass the event
+    if (e) {
+        e.returnValue = returnValue;
+    }
+
+    // But some require it to be returned instead
+    return returnValue;
+};
index 9d249dd..c90b3af 100644 (file)
@@ -7580,7 +7580,6 @@ function get_core_subsystems() {
             'license'     => NULL,
             'mathslib'    => NULL,
             'message'     => 'message',
-            'message'     => 'message',
             'mimetypes'   => NULL,
             'mnet'        => 'mnet',
             'moodle.org'  => NULL, // the dot is nasty, watch out! should be renamed to moodleorg
@@ -7915,7 +7914,7 @@ function plugin_callback($type, $name, $feature, $action, $params = null, $defau
  * @return mixed
  */
 function component_callback($component, $function, array $params = array(), $default = null) {
-    global $CFG; // this is needed for require_once() bellow
+    global $CFG; // this is needed for require_once() below
 
     $cleancomponent = clean_param($component, PARAM_COMPONENT);
     if (empty($cleancomponent)) {
index 600298b..8fe1042 100644 (file)
@@ -1854,6 +1854,7 @@ class global_navigation extends navigation_node {
             $cm = $modinfo->get_cm($cm->id);
         }
 
+        $activity->nodetype = navigation_node::NODETYPE_LEAF;
         $activity->make_active();
         $file = $CFG->dirroot.'/mod/'.$cm->modname.'/lib.php';
         $function = $cm->modname.'_extend_navigation';
@@ -1863,11 +1864,18 @@ class global_navigation extends navigation_node {
             if (function_exists($function)) {
                 $activtyrecord = $DB->get_record($cm->modname, array('id' => $cm->instance), '*', MUST_EXIST);
                 $function($activity, $course, $activtyrecord, $cm);
-                return true;
             }
         }
-        $activity->nodetype = navigation_node::NODETYPE_LEAF;
-        return false;
+
+        // Allow the active advanced grading method plugin to append module navigation
+        $featuresfunc = $cm->modname.'_supports';
+        if (function_exists($featuresfunc) && $featuresfunc(FEATURE_ADVANCED_GRADING)) {
+            require_once($CFG->dirroot.'/grade/grading/lib.php');
+            $gradingman = get_grading_manager($cm->context, $cm->modname);
+            $gradingman->extend_navigation($this, $activity);
+        }
+
+        return $activity->has_children();
     }
     /**
      * Loads user specific information into the navigation in the appropriate place.
@@ -1943,7 +1951,8 @@ class global_navigation extends navigation_node {
                 return false;
             }
             // Add a branch for the current user
-            $usernode = $usersnode->add(fullname($user, true), $userviewurl, self::TYPE_USER, null, $user->id);
+            $canseefullname = has_capability('moodle/site:viewfullnames', $coursecontext);
+            $usernode = $usersnode->add(fullname($user, $canseefullname), $userviewurl, self::TYPE_USER, null, $user->id);
 
             if ($this->page->context->contextlevel == CONTEXT_USER && $user->id == $this->page->context->instanceid) {
                 $usernode->make_active();
diff --git a/lib/yui/formslib/formslib.js b/lib/yui/formslib/formslib.js
new file mode 100644 (file)
index 0000000..452b9e3
--- /dev/null
@@ -0,0 +1,59 @@
+YUI.add('moodle-core-formslib',
+    function(Y) {
+        // The CSS selectors we use
+        var CSS = {
+        };
+
+        var FORMSLIBNAME = 'core-formslib';
+
+        var FORMSLIB = function() {
+            FORMSLIB.superclass.constructor.apply(this, arguments);
+        }
+
+        Y.extend(FORMSLIB, Y.Base, {
+                /**
+                * Initialize the module
+                */
+                initializer : function(config) {
+                    var formid = 'form#' + this.get('formid');
+
+                    // Add change events to the form elements
+                    Y.all(formid + ' input').on('change', M.util.set_form_changed, this);
+                    Y.all(formid + ' textarea').on('change', M.util.set_form_changed, this);
+                    Y.all(formid + ' select').on('change', M.util.set_form_changed, this);
+
+                    // We need any submit buttons on the form to set the submitted flag
+                    Y.one(formid).on('submit', M.util.set_form_submitted, this);
+
+                    // YUI doesn't support onbeforeunload properly so we must use the DOM to set the onbeforeunload. As
+                    // a result, the has_changed must stay in the DOM too
+                    window.onbeforeunload = M.util.report_form_dirty_state;
+                },
+
+                /**
+                 * Unset the form dirty state and also set the form submitted flag to true
+                 */
+                unset_changed : function(e) {
+                    M.util.set_form_changed();
+                }
+            },
+            {
+                NAME : FORMSLIBNAME,
+                ATTRS : {
+                    formid : {
+                        'value' : ''
+                    }
+                }
+            }
+        );
+
+        M.core = M.core || {};
+        M.core.init_formslib = function(config) {
+            return new FORMSLIB(config);
+        }
+
+    },
+    '@VERSION@', {
+        requires : ['base']
+    }
+);
index 09e6c56..62ca1fa 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage assignment
+ * @package    mod_assignment
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 67feffa..4e5ae7d 100644 (file)
@@ -3940,6 +3940,45 @@ function assignment_get_file_areas($course, $cm, $context) {
     return $areas;
 }
 
+/**
+ * File browsing support for assignment module.
+ *
+ * @param file_browser $browser
+ * @param array $areas
+ * @param stdClass $course
+ * @param cm_info $cm
+ * @param context $context
+ * @param string $filearea
+ * @param int $itemid
+ * @param string $filepath
+ * @param string $filename
+ * @return file_info_stored file_info_stored instance or null if not found
+ */
+function mod_assignment_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
+    global $CFG, $DB, $USER;
+
+    if ($context->contextlevel != CONTEXT_MODULE || $filearea != 'submission') {
+        return null;
+    }
+    if (!$submission = $DB->get_record('assignment_submissions', array('id' => $itemid))) {
+        return null;
+    }
+    if (!(($submission->userid == $USER->id && has_capability('mod/assignment:view', $context))
+            || has_capability('mod/assignment:grade', $context))) {
+        // no permission to view this submission
+        return null;
+    }
+
+    $fs = get_file_storage();
+    $filepath = is_null($filepath) ? '/' : $filepath;
+    $filename = is_null($filename) ? '.' : $filename;
+    if (!($storedfile = $fs->get_file($context->id, 'mod_assignment', $filearea, $itemid, $filepath, $filename))) {
+        return null;
+    }
+    $urlbase = $CFG->wwwroot.'/pluginfile.php';
+    return new file_info_stored($browser, $context, $storedfile, $urlbase, $filearea, $itemid, true, true, false);
+}
+
 /**
  * Return a list of page types
  * @param string $pagetype current page type
index 4355e30..275f5f7 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage chat
+ * @package    mod_chat
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e048776..3fd3ef9 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage choice
+ * @package    mod_choice
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4ef840d..1c4da2b 100644 (file)
@@ -46,10 +46,13 @@ class mod_choice_renderer extends plugin_renderer_base {
         $html .= html_writer::start_tag('ul', array('class'=>'choices' ));
 
         $availableoption = count($options['options']);
+        $choicecount = 0;
         foreach ($options['options'] as $option) {
+            $choicecount++;
             $html .= html_writer::start_tag('li', array('class'=>'option'));
             $option->attributes->name = 'answer';
             $option->attributes->type = 'radio';
+            $option->attributes->id = 'choice_'.$choicecount;
 
             $labeltext = $option->text;
             if (!empty($option->attributes->disabled)) {
@@ -58,7 +61,7 @@ class mod_choice_renderer extends plugin_renderer_base {
             }
 
             $html .= html_writer::empty_tag('input', (array)$option->attributes);
-            $html .= html_writer::tag('label', $labeltext, array('for'=>$option->attributes->name));
+            $html .= html_writer::tag('label', $labeltext, array('for'=>$option->attributes->id));
             $html .= html_writer::end_tag('li');
         }
         $html .= html_writer::tag('li','', array('class'=>'clearfloat'));
index 3f32f53..37235c2 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage data
+ * @package    mod_data
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index e108b4d..e865858 100644 (file)
@@ -84,6 +84,8 @@ if($mform->is_cancelled()) {
     $PAGE->set_title($data->name);
     $PAGE->set_heading($course->fullname);
     echo $OUTPUT->header();
+    $url = new moodle_url('/mod/data/export.php', array('d' => $d));
+    groups_print_activity_menu($cm, $url);
     echo $OUTPUT->heading(format_string($data->name));
 
     // these are for the tab display
@@ -104,7 +106,9 @@ foreach ($formdata as $key => $value) {
     }
 }
 
-$exportdata = data_get_exportdata($data->id, $fields, $selectedfields);
+$currentgroup = groups_get_activity_group($cm);
+
+$exportdata = data_get_exportdata($data->id, $fields, $selectedfields, $currentgroup);
 $count = count($exportdata);
 switch ($formdata['exporttype']) {
     case 'csv':
index bfea754..9e9df3d 100644 (file)
@@ -167,27 +167,29 @@ class data_field_file extends data_field_base {
         $fs->delete_area_files($this->context->id, 'mod_data', 'content', $content->id);
 
         $usercontext = get_context_instance(CONTEXT_USER, $USER->id);
-        $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $value);
+        $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $value, 'timecreated DESC');
 
         if (count($files)<2) {
             // no file
         } else {
-            $count = 0;
             foreach ($files as $draftfile) {
-                $file_record = array('contextid'=>$this->context->id, 'component'=>'mod_data', 'filearea'=>'content', 'itemid'=>$content->id, 'filepath'=>'/');
                 if (!$draftfile->is_directory()) {
-                    $file_record['filename'] = $draftfile->get_filename();
+                    $file_record = array(
+                        'contextid' => $this->context->id,
+                        'component' => 'mod_data',
+                        'filearea' => 'content',
+                        'itemid' => $content->id,
+                        'filepath' => '/',
+                        'filename' => $draftfile->get_filename(),
+                    );
 
-                    $content->content = $draftfile->get_filename();
+                    $content->content = $file_record['filename'];
 
                     $fs->create_file_from_storedfile($file_record, $draftfile);
                     $DB->update_record('data_content', $content);
 
-                    if ($count > 0) {
-                        break;
-                    } else {
-                        $count++;
-                    }
+                    // Break from the loop now to avoid overwriting the uploaded file record
+                    break;
                 }
             }
         }
index 2bee85b..364ad4c 100644 (file)
@@ -2804,9 +2804,11 @@ function data_export_ods($export, $dataname, $count) {
  * @param int $dataid
  * @param array $fields
  * @param array $selectedfields
+ * @param int $currentgroup group ID of the current group. This is used for
+ * exporting data while maintaining group divisions.
  * @return array
  */
-function data_get_exportdata($dataid, $fields, $selectedfields) {
+function data_get_exportdata($dataid, $fields, $selectedfields, $currentgroup=0) {
     global $DB;
 
     $exportdata = array();
@@ -2826,7 +2828,15 @@ function data_get_exportdata($dataid, $fields, $selectedfields) {
     $line = 1;
     foreach($datarecords as $record) {
         // get content indexed by fieldid
-        if( $content = $DB->get_records('data_content', array('recordid'=>$record->id), 'fieldid', 'fieldid, content, content1, content2, content3, content4') ) {
+        if ($currentgroup) {
+            $select = 'SELECT c.fieldid, c.content, c.content1, c.content2, c.content3, c.content4 FROM {data_content} c, {data_records} r WHERE c.recordid = ? AND r.id = c.recordid AND r.groupid = ?';
+            $where = array($record->id, $currentgroup);
+        } else {
+            $select = 'SELECT fieldid, content, content1, content2, content3, content4 FROM {data_content} WHERE recordid = ?';
+            $where = array($record->id);
+        }
+
+        if( $content = $DB->get_records_sql($select, $where) ) {
             foreach($fields as $field) {
                 $contents = '';
                 if(isset($content[$field->field->id])) {
@@ -3144,7 +3154,7 @@ function data_presets_export($course, $cm, $data, $tostorage=false) {
     $presetname = clean_filename($data->name) . '-preset-' . gmdate("Ymd_Hi");
     $exportsubdir = "mod_data/presetexport/$presetname";
     make_temp_directory($exportsubdir);
-    $exportdir = "$CFG->dataroot/$exportsubdir";
+    $exportdir = "$CFG->tempdir/$exportsubdir";
 
     // Assemble "preset.xml":
     $presetxmldata = data_presets_generate_xml($course, $cm, $data);
index a27ce3e..1b97e03 100644 (file)
@@ -17,8 +17,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage feedback
+ * @package    mod_feedback
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 37b6017..6a22bcf 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage folder
+ * @package    mod_folder
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index b39f898..22ae66c 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage forum
+ * @package    mod_forum
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 19d77d5..8f80259 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage glossary
+ * @package    mod_glossary
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 599b40d..5c37279 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage imscp
+ * @package    mod_imscp
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index bc98f86..768cabc 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage label
+ * @package    mod_label
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index c77cceb..90ace43 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage lesson
+ * @package    mod_lesson
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 5b6cabd..dffa778 100644 (file)
@@ -110,7 +110,8 @@ class lesson_page_type_branchtable extends lesson_page {
         if ($this->lesson->slideshow) {
             $output .= $renderer->slideshow_start($this->lesson);
         }
-        $output .= $renderer->heading(format_string($this->properties->title));
+        // We are using level 3 header because the page title is a sub-heading of lesson title (MDL-30911).
+        $output .= $renderer->heading(format_string($this->properties->title), 3);
         $output .= $renderer->box($this->get_contents(), 'contents');
 
         $buttons = array();
index adf4ead..e0540b0 100644 (file)
@@ -391,7 +391,8 @@ if ($pageid != LESSON_EOL) {
     lesson_add_fake_blocks($PAGE, $cm, $lesson, $timer);
     echo $lessonoutput->header($lesson, $cm, $currenttab, $extraeditbuttons, $lessonpageid);
     if ($attemptflag) {
-        echo $OUTPUT->heading(get_string('attempt', 'lesson', $retries));
+        // We are using level 3 header because attempt heading is a sub-heading of lesson title (MDL-30911).
+        echo $OUTPUT->heading(get_string('attempt', 'lesson', $retries), 3);
     }
     /// This calculates and prints the ongoing score
     if ($lesson->ongoing && !empty($pageid) && !$reviewmode) {
@@ -415,7 +416,8 @@ if ($pageid != LESSON_EOL) {
     // Update the clock / get time information for this user
     add_to_log($course->id, "lesson", "end", "view.php?id=".$PAGE->cm->id, "$lesson->id", $PAGE->cm->id);
 
-    $lessoncontent .= $OUTPUT->heading(get_string("congratulations", "lesson"));
+    // We are using level 3 header because the page title is a sub-heading of lesson title (MDL-30911).
+    $lessoncontent .= $OUTPUT->heading(get_string("congratulations", "lesson"), 3);
     $lessoncontent .= $OUTPUT->box_start('generalbox boxaligncenter');
     $ntries = $DB->count_records("lesson_grades", array("lessonid"=>$lesson->id, "userid"=>$USER->id));
     if (isset($USER->modattempts[$lesson->id])) {
index e043978..f00306e 100644 (file)
@@ -17,8 +17,8 @@
 /**
  * LTI web service endpoints
  *
- * @package    mod
- * @subpackage lti
+ * @package    mod_lti
+ * @category   log
  * @copyright  Copyright (c) 2011 Moodlerooms Inc. (http://www.moodlerooms.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  * @author     Chris Scribner
index 37ca31d..8ecdeae 100644 (file)
@@ -121,7 +121,7 @@ real estate to the tool, and others provide a more integrated feel with the Mood
 * **New window** - The tool opens in a new window, occupying all the available space.
         Depending on the browser, it will open in a new tab or a popup window.
         It is possible that browsers will prevent the new window from opening.';
-$string['delegate'] = 'Delegate to Instructor';
+$string['delegate'] = 'Delegate to Teacher';
 $string['delete'] = 'Delete';
 $string['delete_confirmation'] = 'Are you sure you want to delete this external tool configuration?';
 $string['deletetype'] = 'Delete external tool configuration';
@@ -194,8 +194,8 @@ $string['icon_url'] = 'Icon URL';
 $string['icon_url_help'] = 'The icon URL allows the icon that shows up in the course listing for this activity to be modified. Instead of using the default
 LTI icon, an icon which conveys the type of activity may be specified.';
 $string['id'] = 'id';
-$string['imsroleadmin'] = 'Instructor,Administrator';
-$string['imsroleinstructor'] = 'Instructor';
+$string['imsroleadmin'] = 'Teacher,Administrator';
+$string['imsroleinstructor'] = 'Teacher';
 $string['imsrolelearner'] = 'Learner';
 $string['invalidid'] = 'LTI ID was incorrect';
 $string['launch_in_moodle'] = 'Launch tool in moodle';
@@ -250,9 +250,9 @@ Tool types listed on this page are separated into three categories:
         course on this Moodle instance. If a consumer key and shared secret are entered, a trust relationship is established
         between this Moodle instance and the remote tool, providing a secure communication channel.
 * **Pending** - These tool providers came in through a package import, but have not been configured by an administrator.
-        Instructors may still use tools from these providers if they have a consumer key and shared secret, or if none is required.
+        Teachers may still use tools from these providers if they have a consumer key and shared secret, or if none is required.
 * **Rejected** - These tools providers are flagged as ones which an administrator has no intention of making available to the entire
-        Moodle instance. Instructors may still use tools from these providers if they have a consumer key and shared secret, or if none is required.';
+        Moodle instance. Teachers may still use tools from these providers if they have a consumer key and shared secret, or if none is required.';
 $string['miscellaneous'] = 'Miscellaneous';
 $string['misconfiguredtools'] = 'Misconfigured tool instances were detected';
 $string['missingparameterserror'] = 'The page is misconfigured: "{$a}"';
@@ -396,7 +396,7 @@ $string['show_in_course'] = 'Show tool type when creating tool instances';
 $string['show_in_course_help'] = 'If selected, this tool configuration will appear in the "External tool type" dropdown when instructors
 configure external tools within courses.
 
-In most cases, this option does not need to be selected. Instructors can use this tool configuration
+In most cases, this option does not need to be selected. Teachers can use this tool configuration
 based on the Launch URL matching the Tool base URL, which is the preferred method.
 
 The only case in which this option should be selected is if the tool configuration is just intended for single sign on.
index e321dc2..915a5a1 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage page
+ * @package    mod_page
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index c5a31e7..f86c835 100644 (file)
@@ -17,8 +17,8 @@
 /**
  * Definition of log events for the quiz module.
  *
- * @package    mod
- * @subpackage quiz
+ * @package    mod_quiz
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 4236cf5..f21f3d9 100644 (file)
@@ -216,13 +216,13 @@ if (!$viewobj->quizhasquestions) {
 
 echo $OUTPUT->header();
 
-// Guests can't do a quiz, so offer them a choice of logging in or going back.
 if (isguestuser()) {
-    echo $output->view_page_guest($course, $quiz, $cm, $context, $infomessages, $viewobj);
+    // Guests can't do a quiz, so offer them a choice of logging in or going back.
+    echo $output->view_page_guest($course, $quiz, $cm, $context, $viewobj->infomessages);
 } else if (!isguestuser() && !($canattempt || $canpreview
           || $viewobj->canreviewmine)) {
     // If they are not enrolled in this course in a good enough role, tell them to enrol.
-    echo $output->view_page_notenrolled($course, $quiz, $cm, $context, $infomessages, $viewobj);
+    echo $output->view_page_notenrolled($course, $quiz, $cm, $context, $viewobj->infomessages);
 } else {
     echo $output->view_page($course, $quiz, $cm, $context, $viewobj);
 }
index 687bc0c..4fd4d22 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage resource
+ * @package    mod_resource
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 1f908fb..d675cc4 100644 (file)
@@ -80,7 +80,7 @@ $string['popupwidthexplain'] = 'Specifies default width of popup windows.';
 $string['printheading'] = 'Display resource name';
 $string['printheadingexplain'] = 'Display resource name above content? Some display types may not display resource name even if enabled.';
 $string['printintro'] = 'Display resource description';
-$string['printintroexplain'] = 'Display resource description bellow content? Some display types may not display description even if enabled.';
+$string['printintroexplain'] = 'Display resource description below content? Some display types may not display description even if enabled.';
 $string['resourcecontent'] = 'Files and subfolders';
 $string['resourcedetails_sizetype'] = '{$a->size} {$a->type}';
 $string['resource:exportresource'] = 'Export resource';
index 2448fb0..6e8a014 100644 (file)
@@ -17,8 +17,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage scorm
+ * @package    mod_scorm
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 293ffe0..c0a7917 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage survey
+ * @package    mod_survey
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9edde72..a393eb9 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage url
+ * @package    mod_url
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9e954a8..b152259 100644 (file)
@@ -64,7 +64,7 @@ $string['popupwidthexplain'] = 'Specifies default width of popup windows.';
 $string['printheading'] = 'Display URL name';
 $string['printheadingexplain'] = 'Display URL name above content? Some display types may not display URL name even if enabled.';
 $string['printintro'] = 'Display URL description';
-$string['printintroexplain'] = 'Display URL description bellow content? Some display types may not display description even if enabled.';
+$string['printintroexplain'] = 'Display URL description below content? Some display types may not display description even if enabled.';
 $string['rolesinparams'] = 'Include role names in parameters';
 $string['serverurl'] = 'Server URL';
 $string['url:view'] = 'View URL';
index d206d14..8a21a0c 100644 (file)
@@ -38,26 +38,26 @@ function wiki_print_editor_wiki($pageid, $content, $editor, $version = -1, $sect
     }
 
     ///Get tags for every element we are displaying
-    $tag = wiki_parser_get_token($editor, 'bold');
+    $tag = getTokens($editor, 'bold');
     $wiki_editor['bold'] = array('ed_bold.gif', get_string('wikiboldtext', 'wiki'), $tag[0], $tag[1], get_string('wikiboldtext', 'wiki'));
-    $tag = wiki_parser_get_token($editor, 'italic');
+    $tag = getTokens($editor, 'italic');
     $wiki_editor['italic'] = array('ed_italic.gif', get_string('wikiitalictext', 'wiki'), $tag[0], $tag[1], get_string('wikiitalictext', 'wiki'));
-    $tag = wiki_parser_get_token($editor, 'link');
+    $tag = getTokens($editor, 'link');
     $wiki_editor['internal'] = array('ed_internal.gif', get_string('wikiinternalurl', 'wiki'), $tag[0], $tag[1], get_string('wikiinternalurl', 'wiki'));
-    $tag = wiki_parser_get_token($editor, 'url');
+    $tag = getTokens($editor, 'url');
     $wiki_editor['external'] = array('ed_external.gif', get_string('wikiexternalurl', 'wiki'), $tag[0], $tag[1], get_string('wikiexternalurl', 'wiki'));
-    $tag = wiki_parser_get_token($editor, 'list');
+    $tag = getTokens($editor, 'list');
     $wiki_editor['u_list'] = array('ed_ul.gif', get_string('wikiunorderedlist', 'wiki'), '\\n' . $tag[0], '', '');
     $wiki_editor['o_list'] = array('ed_ol.gif', get_string('wikiorderedlist', 'wiki'), '\\n' . $tag[1], '', '');
-    $tag = wiki_parser_get_token($editor, 'image');
+    $tag = getTokens($editor, 'image');
     $wiki_editor['image'] = array('ed_img.gif', get_string('wikiimage', 'wiki'), $tag[0], $tag[1], get_string('wikiimage', 'wiki'));
-    $tag = wiki_parser_get_token($editor, 'header');
+    $tag = getTokens($editor, 'header');
     $wiki_editor['h1'] = array('ed_h1.gif', get_string('wikiheader', 'wiki', 1), '\\n' . $tag . ' ', ' ' . $tag . '\\n', get_string('wikiheader', 'wiki', 1));
     $wiki_editor['h2'] = array('ed_h2.gif', get_string('wikiheader', 'wiki', 2), '\\n' . $tag . $tag . ' ', ' ' . $tag . $tag . '\\n', get_string('wikiheader', 'wiki', 2));
     $wiki_editor['h3'] = array('ed_h3.gif', get_string('wikiheader', 'wiki', 3), '\\n' . $tag . $tag . $tag . ' ', ' ' . $tag . $tag . $tag . '\\n', get_string('wikiheader', 'wiki', 3));
-    $tag = wiki_parser_get_token($editor, 'line_break');
+    $tag = getTokens($editor, 'line_break');
     $wiki_editor['hr'] = array('ed_hr.gif', get_string('wikihr', 'wiki'), '\\n' . $tag . '\\n', '', '');
-    $tag = wiki_parser_get_token($editor, 'nowiki');
+    $tag = getTokens($editor, 'nowiki');
     $wiki_editor['nowiki'] = array('ed_nowiki.gif', get_string('wikinowikitext', 'wiki'), $tag[0], $tag[1], get_string('wikinowikitext', 'wiki'));
 
     $OUTPUT->heading(strtoupper(get_string('format' . $editor, 'wiki')));
@@ -74,7 +74,7 @@ function wiki_print_editor_wiki($pageid, $content, $editor, $version = -1, $sect
     echo $OUTPUT->container_end();
 
     echo $OUTPUT->container_start('mdl-align');
-    echo '<form method="post" id="wikiform" action="' . $action . '">';
+    echo '<form method="post" id="mform1" action="' . $action . '">';
     echo $OUTPUT->container(print_textarea(false, 20, 60, 0, 0, "newcontent", $content, 0, true), false, 'wiki_editor');
     echo $OUTPUT->container_start();
     wiki_print_edit_form_default_fields($editor, $pageid, $version, $upload, $deleteuploads);
@@ -82,3 +82,24 @@ function wiki_print_editor_wiki($pageid, $content, $editor, $version = -1, $sect
     echo '</form>';
     echo $OUTPUT->container_end();
 }
+
+/**
+ * Returns escaped token used by a wiki language to represent a given tag or "object" (bold -> **)
+ *
+ * @param string $format format of page
+ * @param array|string $token format tokens which needs to be escaped
+ * @return array|string
+ */
+function getTokens($format, $token) {
+    $tokens = wiki_parser_get_token($format, $token);
+
+    if (is_array($tokens)) {
+        foreach ($tokens as $key => $value) {
+            $tokens[$key] = urlencode(str_replace("'", "\'", $value));
+        }
+    } else {
+        urlencode(str_replace("'", "\'", $token));
+    }
+
+    return $tokens;
+}
index 960803f..09a6c58 100644 (file)
@@ -114,7 +114,7 @@ $string['navigation'] = 'Navigation';
 $string['navigationfrom'] = 'This page comes from';
 $string['navigationfrom_help'] = 'The wiki pages linking to this page';
 $string['navigationto'] = 'This page goes to';
-$string['navigationto_help'] = 'The links that included in this page';
+$string['navigationto_help'] = 'Links to other pages';
 $string['newpage'] = 'New';
 $string['newpagetitle'] = 'New page title';
 $string['noattachments'] = '<strong>No files attached</strong>';
index 82627ed..19d04e4 100644 (file)
@@ -18,8 +18,8 @@
 /**
  * Definition of log events
  *
- * @package    mod
- * @subpackage workshop
+ * @package    mod_workshop
+ * @category   log
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index fdaf5ad..527eaf6 100644 (file)
@@ -27,7 +27,7 @@ $string['enableleap2a'] = 'Enable Leap2A portfolio support (requires Mahara 1.3
 $string['err_invalidhost'] = 'Invalid MNet host';
 $string['err_invalidhost_help'] = 'This plugin is misconfigured to point to an invalid (or deleted) MNet host.  This plugin relies on Moodle Networking peers with SSO IDP published, SSO_SP subscribed, and portfolio subscribed <b>and</b> published.';
 $string['err_networkingoff'] = 'MNet is off';
-$string['err_networkingoff_help'] = 'MNet is off entirely. Please enable it before trying to configure this pugin.  Any instances of this plugin have been set to not visible until this is fixed - you will need to set them to visible again manully.  They cannot be used until this happens';
+$string['err_networkingoff_help'] = 'MNet is off entirely. Please enable it before trying to configure this plugin.  Any instances of this plugin have been set to not visible until this is fixed - you will need to set them to visible again manully.  They cannot be used until this happens';
 $string['err_nomnetauth'] = 'The MNet authentication plugin is disabled';
 $string['err_nomnetauth_help'] = 'The MNet authentication plugin is disabled, but is required for this service';
 $string['err_nomnethosts'] = 'Relies on MNet';
index 8c6e175..b11ef48 100644 (file)
@@ -155,19 +155,19 @@ class question_engine_attempt_upgrader {
 
         $quizattemptsrs = $DB->get_recordset_select('quiz_attempts', $where, $params, 'uniqueid');
         $questionsessionsrs = $DB->get_recordset_sql("
-                SELECT *
-                FROM {question_sessions}
-                WHERE attemptid IN (
-                    SELECT uniqueid FROM {quiz_attempts} WHERE $where)
-                ORDER BY attemptid, questionid
+                SELECT s.*
+                  FROM {question_sessions} s
+                  JOIN {quiz_attempts} a ON (attemptid = uniqueid)
+                 WHERE $where
+              ORDER BY attemptid, questionid
         ", $params);
 
         $questionsstatesrs = $DB->get_recordset_sql("
-                SELECT *
-                FROM {question_states}
-                WHERE attempt IN (
-                    SELECT uniqueid FROM {quiz_attempts} WHERE $where)
-                ORDER BY attempt, question, seq_number, id
+                SELECT s.*
+                  FROM {question_states} s
+                  JOIN {quiz_attempts} ON (s.attempt = uniqueid)
+                 WHERE $where
+              ORDER BY s.attempt, question, seq_number, s.id
         ", $params);
 
         $datatodo = $quizattemptsrs && $questionsessionsrs && $questionsstatesrs;
index 212af73..aec7ac9 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Capabilities
  *
- * @package    report
- * @subpackage log
+ * Defines capablities related to logs
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 306b0a1..ad6057c 100644 (file)
 /**
  * Post installation and migration code.
  *
- * @package    report
- * @subpackage log
+ * Contains code that are run during the installation of report/logs
+ *
+ * @package    report_log
  * @copyright  2011 Petr Skoda {@link http://skodak.org}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die;
 
+/**
+ * Contains codes to be run during installation of report/logs
+ *
+ * @global moodle_database $DB
+ * @return void
+ */
 function xmldb_report_log_install() {
     global $DB;
 
index 5d4a980..842f847 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Produces a graph of log accesses for a user
  *
- * @package    report
- * @subpackage log
+ * Generates an image representing the log data in a graphical manner for a user.
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 08434eb..c0a94fe 100644 (file)
@@ -17,8 +17,7 @@
 /**
  * Displays different views of the logs.
  *
- * @package    report
- * @subpackage log
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 615cb96..677fab5 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Lang strings.
  *
- * @package    report
- * @subpackage log
+ * Language strings to be used by report/logs
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index f757272..1102b8a 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Public API of the log report.
  *
- * @package    report
- * @subpackage log
+ * Defines the APIs used by log reports
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -62,8 +63,8 @@ function report_log_extend_navigation_user($navigation, $user, $course) {
 /**
  * Is current user allowed to access this report
  *
- * @private defined in lib.php for performance reasons
- *
+ * @access private defined in lib.php for performance reasons
+ * @global stdClass $USER
  * @param stdClass $user
  * @param stdClass $course
  * @return array with two elements $all, $today
@@ -117,10 +118,11 @@ function report_log_extend_navigation_module($navigation, $cm) {
 
 /**
  * Return a list of page types
+ *
  * @param string $pagetype current page type
  * @param stdClass $parentcontext Block's parent context
  * @param stdClass $currentcontext Current context of block
- * @return array
+ * @return array a list of page types
  */
 function report_log_page_type_list($pagetype, $parentcontext, $currentcontext) {
     $array = array(
@@ -131,4 +133,4 @@ function report_log_page_type_list($pagetype, $parentcontext, $currentcontext) {
         'report-log-user'  => get_string('page-report-log-user',  'report_log')
     );
     return $array;
-}
\ No newline at end of file
+}
index aa14d01..dd543b0 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * This file contains functions used by the log reports
  *
- * @package    report
- * @subpackage log
+ * This files lists the functions that are used during the log report generation.
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -31,6 +32,16 @@ if (!defined('REPORT_LOG_MAX_DISPLAY')) {
 
 require_once(dirname(__FILE__).'/lib.php');
 
+/**
+ * This function is used to generate and display the log activity graph
+ *
+ * @global stdClass $CFG
+ * @param  stdClass $course course instance
+ * @param  int    $userid id of the user whose logs are needed
+ * @param  string $type type of logs graph needed (usercourse.png/userday.png)
+ * @param  int    $date timestamp in GMT (seconds since epoch)
+ * @return void
+ */
 function report_log_print_graph($course, $userid, $type, $date=0) {
     global $CFG;
 
@@ -41,7 +52,32 @@ function report_log_print_graph($course, $userid, $type, $date=0) {
              '&amp;user='.$userid.'&amp;type='.$type.'&amp;date='.$date.'" alt="" />';
     }
 }
-
+/**
+ * This function is used to generate and display Mnet selector form
+ *
+ * @global stdClass $USER
+ * @global stdClass $CFG
+ * @global stdClass $SITE
+ * @global moodle_database $DB
+ * @global core_renderer $OUTPUT
+ * @global stdClass $SESSION
+ * @uses CONTEXT_SYSTEM
+ * @uses COURSE_MAX_COURSES_PER_DROPDOWN
+ * @uses CONTEXT_COURSE
+ * @uses SEPARATEGROUPS
+ * @param  int      $hostid host id
+ * @param  stdClass $course course instance
+ * @param  int      $selecteduser id of the selected user
+ * @param  string   $selecteddate Date selected
+ * @param  string   $modname course_module->id
+ * @param  string   $modid number or 'site_errors'
+ * @param  string   $modaction an action as recorded in the logs
+ * @param  int      $selectedgroup Group to display
+ * @param  int      $showcourses whether to show courses if we're over our limit.
+ * @param  int      $showusers whether to show users if we're over our limit.
+ * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
+ * @return void
+ */
 function report_log_print_mnet_selector_form($hostid, $course, $selecteduser=0, $selecteddate='today',
                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
 
@@ -326,7 +362,30 @@ function report_log_print_mnet_selector_form($hostid, $course, $selecteduser=0,
     echo '</div>';
     echo '</form>';
 }
-
+/**
+ * This function is used to generate and display selector form
+ *
+ * @global stdClass $USER
+ * @global stdClass $CFG
+ * @global moodle_database $DB
+ * @global core_renderer $OUTPUT
+ * @global stdClass $SESSION
+ * @uses CONTEXT_SYSTEM
+ * @uses COURSE_MAX_COURSES_PER_DROPDOWN
+ * @uses CONTEXT_COURSE
+ * @uses SEPARATEGROUPS
+ * @param  stdClass $course course instance
+ * @param  int      $selecteduser id of the selected user
+ * @param  string   $selecteddate Date selected
+ * @param  string   $modname course_module->id
+ * @param  string   $modid number or 'site_errors'
+ * @param  string   $modaction an action as recorded in the logs
+ * @param  int      $selectedgroup Group to display
+ * @param  int      $showcourses whether to show courses if we're over our limit.
+ * @param  int      $showusers whether to show users if we're over our limit.
+ * @param  string   $logformat Format of the logs (downloadascsv, showashtml, downloadasods, downloadasexcel)
+ * @return void
+ */
 function report_log_print_selector_form($course, $selecteduser=0, $selecteddate='today',
                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
 
@@ -545,4 +604,4 @@ function report_log_print_selector_form($course, $selecteduser=0, $selecteddate=
     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
     echo '</div>';
     echo '</form>';
-}
\ No newline at end of file
+}
index 22fb794..74c22e2 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Links and settings
  *
- * @package    report
- * @subpackage log
+ * Contains settings used by logs report.
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 0a51e73..32ed582 100644 (file)
@@ -17,8 +17,7 @@
 /**
  * Display user activity reports for a course (totals)
  *
- * @package    report
- * @subpackage log
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas  http://dougiamas.com
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9072eac..a1c5fba 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Version info
  *
- * @package    report
- * @subpackage log
+ * This File contains information about the current version of report/logs
+ *
+ * @package    report_log
  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index a97cd3a..bc94c93 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Capabilities
  *
- * @package    report
- * @subpackage loglive
+ * This files lists capabilites related to report_logline
+ *
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 57ae10f..782679b 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Displays live view of recent logs
  *
- * @package    report
- * @subpackage loglive
+ * This file generates live view of recent logs.
+ *
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 6d5cc0a..0b04e16 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Lang strings.
  *
- * @package    report
- * @subpackage loglive
+ * Language strings used by report_loglive
+ *
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 9d05936..b233d26 100644 (file)
@@ -19,8 +19,7 @@
  *
  * NOTE: page type not included because there can not be any blocks in popups
  *
- * @package    report
- * @subpackage loglive
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -30,9 +29,11 @@ defined('MOODLE_INTERNAL') || die;
 /**
  * This function extends the navigation with the report items
  *
+ * @global stdClass $CFG
+ * @global core_renderer $OUTPUT
  * @param navigation_node $navigation The navigation node to extend
- * @param stdClass $course The course to object for the report
- * @param stdClass $context The context of the course
+ * @param stdClass        $course     The course to object for the report
+ * @param stdClass        $context    The context of the course
  */
 function report_loglive_extend_navigation_course($navigation, $course, $context) {
     global $CFG, $OUTPUT;
index 13de346..2966e63 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Links and settings
  *
- * @package    report
- * @subpackage loglive
+ * This file contains links and settings used by report_loglive
+ *
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 3ea3950..8d81583 100644 (file)
@@ -17,8 +17,9 @@
 /**
  * Version info
  *
- * @package    report
- * @subpackage loglive
+ * This file contains version information about report_loglive
+ *
+ * @package    report_loglive
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 89c1800..83411ec 100644 (file)
@@ -157,7 +157,7 @@ if (empty($param->crosstab)) {
     }
 
     $roleid = 0;
-    krsort($roles); // the same sorting as in table bellow graph
+    krsort($roles); // the same sorting as in table below graph
 
     $colors = array('green', 'blue', 'red', 'purple', 'yellow', 'olive', 'navy', 'maroon', 'gray', 'ltred', 'ltltred', 'ltgreen', 'ltltgreen', 'orange', 'ltorange', 'ltltorange', 'lime', 'ltblue', 'ltltblue', 'fuchsia', 'aqua', 'grayF0', 'grayEE', 'grayDD', 'grayCC', 'gray33', 'gray66', 'gray99');
     $colorindex = 0;
index 8652aa9..eae6072 100644 (file)
@@ -818,6 +818,9 @@ abstract class repository {
         } else {
             $accepted_types = '*';
         }
+        // Sortorder should be unique, which is not true if we use $record->sortorder
+        // and there are multiple instances of any repository type
+        $sortorder = 1;
         foreach ($records as $record) {
             if (!file_exists($CFG->dirroot . '/repository/'. $record->repositorytype.'/lib.php')) {
                 continue;
@@ -826,7 +829,7 @@ abstract class repository {
             $options['visible'] = $record->visible;
             $options['type']    = $record->repositorytype;
             $options['typeid']  = $record->typeid;
-            $options['sortorder'] = $record->sortorder;
+            $options['sortorder'] = $sortorder++;
             // tell instance what file types will be accepted by file picker
             $classname = 'repository_' . $record->repositorytype;
 
index da4e61f..e9756dd 100644 (file)
@@ -97,7 +97,7 @@ class repository_recent extends repository {
      * @return mixed
      */
     public function get_listing($encodedpath = '', $page = '') {
-        global $CFG, $USER, $OUTPUT;
+        global $OUTPUT;
         $ret = array();
         $ret['dynload'] = true;
         $ret['nosearch'] = true;
@@ -108,14 +108,18 @@ class repository_recent extends repository {
         try {
             foreach ($files as $file) {
                 $params = base64_encode(serialize($file));
-                $node = array(
-                    'title' => $file['filename'],
-                    'size' => 0,
-                    'date' => '',
-                    'source'=> $params,
-                    'thumbnail' => $OUTPUT->pix_url(file_extension_icon($file['filename'], 32))->out(false),
-                );
-                $list[] = $node;
+                // Check that file exists and accessible
+                $filesize = $this->get_file_size($params);
+                if (!empty($filesize)) {
+                    $node = array(
+                        'title' => $file['filename'],
+                        'size' => $filesize,
+                        'date' => '',
+                        'source'=> $params,
+                        'thumbnail' => $OUTPUT->pix_url(file_extension_icon($file['filename'], 32))->out(false),
+                    );
+                    $list[] = $node;
+                }
             }
         } catch (Exception $e) {
             throw new repository_exception('emptyfilelist', 'repository_recent');
index e5c316a..969dda3 100644 (file)
@@ -1,7 +1,27 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+
 /**
  * coursetags_add.php
- * @author j.beedell@open.ac.uk June07
+ *
+ * @package    core_tag
+ * @category   tag
+ * @copyright  2007 j.beedell@open.ac.uk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 require_once('../config.php');
index 18d40a4..8bb33b4 100644 (file)
@@ -1,9 +1,27 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
 
 /**
- * coursetags_edit.php
- * displays personal tags for a course with some editing facilites
- * @author j.beedell@open.ac.uk June07
+ * Displays personal tags for a course with some editing facilites
+ *
+ * @package    core_tag
+ * @category   tag
+ * @copyright  2007 j.beedell@open.ac.uk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 require_once('../config.php');
index ee7c75c..60b1820 100644 (file)
@@ -1,8 +1,27 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+
 /**
- * coursetags_more.php
- * a full display of tags allowing some filtering and reordering
- * @author j.beedell@open.ac.uk June07
+ * A full display of tags allowing some filtering and reordering
+ *
+ * @package    core_tag
+ * @category   tag
+ * @copyright  2007 j.beedell@open.ac.uk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 require_once('../config.php');
index f022dfc..c83b954 100644 (file)
@@ -1,7 +1,26 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+
 /**
  * coursetagslib.php
- * @author j.beedell@open.ac.uk July07
+ *
+ * @package    core_tag
+ * @copyright  2007 j.beedell@open.ac.uk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 require_once $CFG->dirroot.'/tag/lib.php';
@@ -10,13 +29,15 @@ require_once $CFG->dirroot.'/tag/lib.php';
  * Returns an ordered array of tags associated with visible courses
  * (boosted replacement of get_all_tags() allowing association with user and tagtype).
  *
- * @uses $CFG
- * @param int $courseid, a 0 will return all distinct tags for visible courses
- * @param int $userid optional the user id, a default of 0 will return all users tags for the course
- * @param string $tagtype optional 'official' or 'default', empty returns both tag types
- * @param int $numtags optional number of tags to display, default of 80 is set in the block, 0 returns all
- * @param string $sort optional selected sorting, default is alpha sort (name) also timemodified or popularity
- * @return array
+ * @package  core_tag
+ * @category tag
+ * @param    int      $courseid A course id. Passing 0 will return all distinct tags for all visible courses
+ * @param    int      $userid   (optional) the user id, a default of 0 will return all users tags for the course
+ * @param    string   $tagtype  (optional) The type of tag, empty string returns all types. Currently (Moodle 2.2) there are two
+ *                              types of tags which are used within Moodle, they are 'official' and 'default'.
+ * @param    int      $numtags  (optional) number of tags to display, default of 80 is set in the block, 0 returns all
+ * @param    string   $sort     (optional) selected sorting, default is alpha sort (name) also timemodified or popularity
+ * @return   array
  */
 function coursetag_get_tags($courseid, $userid=0, $tagtype='', $numtags=0, $sort='name') {
 
@@ -93,10 +114,11 @@ function coursetag_get_tags($courseid, $userid=0, $tagtype='', $numtags=0, $sort
  * Returns an ordered array of tags
  * (replaces popular_tags_count() allowing sorting).
  *
- * @uses $CFG
- * @param string $sort optional selected sorting, default is alpha sort (name) also timemodified or popularity
- * @param int $numtags optional number of tags to display, default of 20 is set in the block, 0 returns all
- * @return array
+ * @package  core_tag
+ * @category tag
+ * @param    string $sort    (optional) selected sorting, default is alpha sort (name) also timemodified or popularity
+ * @param    int    $numtags (optional) number of tags to display, default of 20 is set in the block, 0 returns all
+ * @return   array
  */
 function coursetag_get_all_tags($sort='name', $numtags=0) {
 
@@ -135,8 +157,21 @@ function coursetag_get_all_tags($sort='name', $numtags=0) {
 }
 
 /**
- * Callback function for coursetag_get_tags() and coursetag_get_all_tags() only
- * @uses $CFG
+ * Sorting callback function for coursetag_get_tags() and coursetag_get_all_tags() only
+ *
+ * This function does a comparision on a field withing two variables, $a and $b. The field used is specified by
+ * $CFG->tagsort or we just use the 'name' field if $CFG->tagsort is empty. The comparison works as follows:
+ * If $a->$tagsort is greater than $b->$tagsort, 1 is returned.
+ * If $a->$tagsort is equal to $b->$tagsort, 0 is returned.
+ * If $a->$tagsort is less than $b->$tagsort, -1 is returned.
+ *
+ * Also if $a->$tagsort is not numeric or a string, 0 is returned.
+ *
+ * @package core_tag
+ * @access  private
+ * @param   int|string|mixed $a Variable to compare against $b
+ * @param   int|string|mixed $b Variable to compare against $a
+ * @return  int                 The result of the comparison/validation 1, 0 or -1
  */
 function coursetag_sort($a, $b) {
     // originally from block_blog_tags
@@ -161,10 +196,12 @@ function coursetag_sort($a, $b) {
 /**
  * Prints a tag cloud
  *
- * @param array $tagcloud array of tag objects (fields: id, name, rawname, count and flag)
- * @param int $max_size maximum text size, in percentage
- * @param int $min_size minimum text size, in percentage
- * @param $return if true return html string
+ * @package  core_tag
+ * @category tag
+ * @param    array $tagcloud array of tag objects (fields: id, name, rawname, count and flag)
+ * @param    mixed $return   if true return html string
+ * @param    int   $max_size maximum text size, in percentage
+ * @param    int   $min_size minimum text size, in percentage
  */
 function coursetag_print_cloud($tagcloud, $return=false, $max_size=180, $min_size=80) {
 
@@ -237,8 +274,11 @@ function coursetag_print_cloud($tagcloud, $return=false, $max_size=180, $min_siz
 
 /**
  * Returns javascript for use in tags block and supporting pages
- * @param string $coursetagdivs comma separated divs ids
- * @uses $CFG
+ *
+ * @package  core_tag
+ * @category tag
+ * @param    string   $coursetagdivs comma separated divs ids
+ * @return   null
  */
 function coursetag_get_jscript($coursetagdivs = '') {
     global $CFG, $DB, $PAGE;
@@ -263,6 +303,12 @@ function coursetag_get_jscript($coursetagdivs = '') {
 
 /**
  * Returns javascript to create the links in the tag block footer.
+ *
+ * @package  core_tag
+ * @category tag
+ * @param    string   $elementid       the element to attach the footer to
+ * @param    array    $coursetagslinks links arrays each consisting of 'title', 'onclick' and 'text' elements
+ * @return   string   always returns a blank string
  */
 function coursetag_get_jscript_links($elementid, $coursetagslinks) {
     global $PAGE;
@@ -279,12 +325,12 @@ function coursetag_get_jscript_links($elementid, $coursetagslinks) {
 /**
  * Returns all tags created by a user for a course
  *
- * @uses $CFG
- * @param int $courseid
- * @param int $userid
+ * @package  core_tag
+ * @category tag
+ * @param    int      $courseid tags are returned for the course that has this courseid
+ * @param    int      $userid   return tags which were created by this user
  */
 function coursetag_get_records($courseid, $userid) {
-
     global $CFG, $DB;
 
     $sql = "SELECT t.id, name, rawname
@@ -300,12 +346,13 @@ function coursetag_get_records($courseid, $userid) {
 /**
  * Stores a tag for a course for a user
  *
- * @uses $CFG
- * @param array $tags simple array of keywords to be stored
- * @param integer $courseid
- * @param integer $userid
- * @param string $tagtype official or default only
- * @param string $myurl optional for logging creation of course tags
+ * @package  core_tag
+ * @category tag
+ * @param    array  $tags     simple array of keywords to be stored
+ * @param    int    $courseid the id of the course we wish to store a tag for
+ * @param    int    $userid   the id of the user we wish to store a tag for
+ * @param    string $tagtype  official or default only
+ * @param    string $myurl    (optional) for logging creation of course tags
  */
 function coursetag_store_keywords($tags, $courseid, $userid=0, $tagtype='official', $myurl='') {
 
@@ -348,11 +395,12 @@ function coursetag_store_keywords($tags, $courseid, $userid=0, $tagtype='officia
 /**
  * Deletes a personal tag for a user for a course.
  *
- * @uses $CFG
- * @param int $tagid
- * @param int $userid
- * @param int $courseid
-  */
+ * @package  core_tag
+ * @category tag
+ * @param    int      $tagid    the tag we wish to delete
+ * @param    int      $userid   the user that the tag is associated with
+ * @param    int      $courseid the course that the tag is associated with
+ */
 function coursetag_delete_keyword($tagid, $userid, $courseid) {
 
     global $CFG, $DB;
@@ -385,11 +433,12 @@ function coursetag_delete_keyword($tagid, $userid, $courseid) {
 /**
  * Get courses tagged with a tag
  *
+ * @package  core_tag
+ * @category tag
  * @param int $tagid
  * @return array of course objects
  */
 function coursetag_get_tagged_courses($tagid) {
-
     global $DB;
 
     $courses = array();
@@ -411,14 +460,13 @@ function coursetag_get_tagged_courses($tagid) {
 }
 
 /**
- * Course tagging function used only during the deletion of a
- * course (called by lib/moodlelib.php) to clean up associated tags
+ * Course tagging function used only during the deletion of a course (called by lib/moodlelib.php) to clean up associated tags
  *
- * @param int $courseid
- * @param bool $showfeedback
+ * @package core_tag
+ * @param   int      $courseid     the course we wish to delete tag instances from
+ * @param   bool     $showfeedback if we should output a notification of the delete to the end user
  */
 function coursetag_delete_course_tags($courseid, $showfeedback=false) {
-
     global $DB, $OUTPUT;
 
     if ($tags = $DB->get_records_select('tag_instance', "itemtype='course' AND itemid=:courseid", array('courseid'=>$courseid))) {
@@ -440,10 +488,9 @@ function coursetag_delete_course_tags($courseid, $showfeedback=false) {
     }
 }
 
-/**
+/*
  * Function called by cron to create/update users rss feeds
  *
- * @uses $CFG
  * @return true
  *
  * Function removed.
@@ -618,10 +665,10 @@ function coursetag_rss_feeds() {
 }
  */
 
-/**
+/*
  * Get official keywords for the <meta name="keywords"> in header.html
  * use: echo '<meta name="keywords" content="'.coursetag_get_official_keywords($COURSE->id).'"/>';
- * @uses $CFG
+ *
  * @param int $courseid
  * @return string
  *
index 66fd0fb..b71c72f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+
 /**
- * @package    core
- * @subpackage tag
+ * @package    core_tag
+ * @category   tag
  * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index f1e8286..9728367 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+
 /**
- * @package    core
- * @subpackage tag
+ * @package    core_tag
+ * @category   tag
  * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
@@ -28,8 +28,20 @@ if (!defined('MOODLE_INTERNAL')) {
 
 require_once($CFG->dirroot.'/lib/formslib.php');
 
+/**
+ * Defines the form for editing tags
+ *
+ * @package    core_tag
+ * @category   tag
+ * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
 class tag_edit_form extends moodleform {
 
+    /**
+     * Overrides the abstract moodleform::definition method for defining what the form that is to be
+     * presented to the user.
+     */
     function definition () {
 
         $mform =& $this->_form;
@@ -62,4 +74,4 @@ class tag_edit_form extends moodleform {
 
     }
 
-}
+}
\ No newline at end of file
index 5525f04..56e2372 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+
 /**
- * @package    core
- * @subpackage tag
+ * @package    core_tag
+ * @category   tag
  * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
index 2284a41..2859162 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+
 /**
  * Moodle tag library
  *
- * Tag strings : you can use any character in tags, except the comma (which is
- * the separator) and the '\' (backslash).  Note that many spaces (or other
- * blank characters) will get "compressed" into one. A tag string is always a
- * rawurlencode'd string. This is the same behavior as http://del.icio.us.
- *
- * A "record" is a php array (note that an object will work too) that contains
- * the following variables :
- *  - type: the table containing the record that we are tagging (eg: for a
- *    blog, this is table 'post', and for a user it is 'user')
- *  - id: the id of the record
+ * Tag strings : you can use any character in tags, except the comma (which is the separator) and
+ * the '\' (backslash).  Note that many spaces (or other blank characters) will get "compressed"
+ * into one. A tag string is always a rawurlencode'd string. This is the same behavior as
+ * http://del.icio.us.
  *
- * TODO: turn this into a full-fledged categorization system. This could start
- * by modifying (removing, probably) the 'tag type' to use another table
- * describing the relationship between tags (parents, sibling, etc.), which
- * could then be merged with the 'course categorization' system...
+ * A "record" is a php array (note that an object will work too) that contains the following
+ * variables :
+ *  - type: The database table containing the record that we are tagging (eg: for a blog, this is
+ *          the table named 'post', and for a user it is the table name 'user')
+ *  - id:   The id of the record
  *
  * BASIC INSTRUCTIONS :
  *  - to "tag a blog post" (for example):
  *
  * Tag set will create tags that need to be created.
  *
- * @package    core
- * @subpackage tag
- * @see http://www.php.net/manual/en/function.urlencode.php
+ * @package    core_tag
+ * @category   tag
+ * @todo       MDL-31090 turn this into a full-fledged categorization system. This could start by
+ *             modifying (removing, probably) the 'tag type' to use another table describing the
+ *             relationship between tags (parents, sibling, etc.), which could then be merged with
+ *             the 'course categorization' system.
+ * @see        http://www.php.net/manual/en/function.urlencode.php
  * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+/**
+ * Used to require that the return value from a function is an array.
+ * @see tag_set()
+ */
 define('TAG_RETURN_ARRAY', 0);
+/**
+ * Used to require that the return value from a function is an object.
+ * @see tag_set()
+ */
 define('TAG_RETURN_OBJECT', 1);
+/**
+ * Use to specify that HTML free text is expected to be returned from a function.
+ * @see tag_display_name()
+ */
 define('TAG_RETURN_TEXT', 2);
+/**
+ * Use to specify that encoded HTML is expected to be returned from a function.
+ * @see tag_display_name()
+ */
 define('TAG_RETURN_HTML', 3);
 
+/**
+ * Used to specify that we wish a lowercased string to be returned
+ * @see tag_normal()
+ */
 define('TAG_CASE_LOWER', 0);
+/**
+ * Used to specify that we do not wish the case of the returned string to change
+ * @see tag_normal()
+ */
 define('TAG_CASE_ORIGINAL', 1);
 
+/**
+ * Used to specify that we want all related tags returned, no matter how they are related.
+ * @see tag_get_related_tags()
+ */
 define('TAG_RELATED_ALL', 0);
+/**
+ * Used to specify that we only want back tags that were manually related.
+ * @see tag_get_related_tags()
+ */
 define('TAG_RELATED_MANUAL', 1);
+/**
+ * Used to specify that we only want back tags where the relationship was automatically correlated.
+ * @see tag_get_related_tags()
+ */
 define('TAG_RELATED_CORRELATED', 2);
 
 ///////////////////////////////////////////////////////
@@ -70,15 +105,15 @@ define('TAG_RELATED_CORRELATED', 2);
 /**
  * Set the tags assigned to a record.  This overwrites the current tags.
  *
- * This function is meant to be fed the string coming up from the user
- * interface, which contains all tags assigned to a record.
+ * This function is meant to be fed the string coming up from the user interface, which contains all tags assigned to a record.
  *
- * @param string $record_type the type of record to tag ('post' for blogs,
- *     'user' for users, 'tag' for tags, etc.
- * @param int $record_id the id of the record to tag
- * @param array $tags the array of tags to set on the record. If
- *     given an empty array, all tags will be removed.
- * @return void
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string    $record_type the type of record to tag ('post' for blogs, 'user' for users, 'tag' for tags, etc.)
+ * @param    int       $record_id   the id of the record to tag
+ * @param    array     $tags        the array of tags to set on the record. If given an empty array, all tags will be removed.
+ * @return   bool|null
  */
 function tag_set($record_type, $record_id, $tags) {
 
@@ -142,11 +177,12 @@ function tag_set($record_type, $record_id, $tags) {
 /**
  * Adds a tag to a record, without overwriting the current tags.
  *
- * @param string $record_type the type of record to tag ('post' for blogs,
- *     'user' for users, etc.
- * @param int $record_id the id of the record to tag
- * @param string $tag the tag to add
- * @return void
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $record_type the type of record to tag ('post' for blogs, 'user' for users, etc.)
+ * @param    int      $record_id   the id of the record to tag
+ * @param    string   $tag         the tag to add
  */
 function tag_set_add($record_type, $record_id, $tag) {
 
@@ -162,11 +198,12 @@ function tag_set_add($record_type, $record_id, $tag) {
 /**
  * Removes a tag from a record, without overwriting other current tags.
  *
- * @param string $record_type the type of record to tag ('post' for blogs,
- *     'user' for users, etc.
- * @param int $record_id the id of the record to tag
- * @param string $tag the tag to delete
- * @return void
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $record_type the type of record to tag ('post' for blogs, 'user' for users, etc.)
+ * @param    int      $record_id   the id of the record to tag
+ * @param    string   $tag         the tag to delete
  */
 function tag_set_delete($record_type, $record_id, $tag) {
 
@@ -181,13 +218,15 @@ function tag_set_delete($record_type, $record_id, $tag) {
 }
 
 /**
- * Set the type of a tag.  At this time (version 1.9) the possible values
- * are 'default' or 'official'.  Official tags will be displayed separately "at
- * tagging time" (while selecting the tags to apply to a record).
+ * Set the type of a tag.  At this time (version 2.2) the possible values are 'default' or 'official'.  Official tags will be
+ * displayed separately "at tagging time" (while selecting the tags to apply to a record).
  *
- * @param string $tagid tagid to modify
- * @param string $type either 'default' or 'official'
- * @return true on success, false otherwise
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $tagid tagid to modify
+ * @param    string   $type either 'default' or 'official'
+ * @return   bool     true on success, false otherwise
  */
 function tag_type_set($tagid, $type) {
     global $DB;
@@ -200,14 +239,17 @@ function tag_type_set($tagid, $type) {
     return false;
 }
 
-
 /**
  * Set the description of a tag
  *
- * @param int $tagid the id of the tag
- * @param string $description the description
- * @param int $descriptionformat the moodle text format of the description
- * @return true on success, false otherwise
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    int      $tagid the id of the tag
+ * @param    string   $description the tag's description string to be set
+ * @param    int      $descriptionformat the moodle text format of the description
+ *                    {@link http://docs.moodle.org/dev/Text_formats_2.0#Database_structure}
+ * @return   bool     true on success, false otherwise
  */
 function tag_description_set($tagid, $description, $descriptionformat) {
     global $DB;
@@ -231,12 +273,15 @@ function tag_description_set($tagid, $description, $descriptionformat) {
 /**
  * Simple function to just return a single tag object when you know the name or something
  *
- * @param string $field which field do we use to identify the tag: id, name or rawname
- * @param string $value the required value of the aforementioned field
- * @param string $returnfields which fields do we want returned?
- * @return tag object
- *
- **/
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string $field        which field do we use to identify the tag: id, name or rawname
+ * @param    string $value        the required value of the aforementioned field
+ * @param    string $returnfields which fields do we want returned. This is a comma seperated string containing any combination of
+ *                                'id', 'name', 'rawname' or '*' to include all fields.
+ * @return   mixed  tag object
+ */
 function tag_get($field, $value, $returnfields='id, name, rawname') {
     global $DB;
 
@@ -248,15 +293,17 @@ function tag_get($field, $value, $returnfields='id, name, rawname') {
 
 
 /**
- * Get the array of db record of tags associated to a record (instances).  Use
- * tag_get_tags_csv to get the same information in a comma-separated string.
- * This should really be called tag_get_tag_instances()
+ * Get the array of db record of tags associated to a record (instances).  Use {@see tag_get_tags_csv()} if you wish to get the same
+ * data in a comma-separated string, for instances such as needing to simply display a list of tags to the end user. This should
+ * really be called tag_get_tag_instances().
  *
+ * @package core_tag
+ * @category tag
+ * @access public
  * @param string $record_type the record type for which we want to get the tags
  * @param int $record_id the record id for which we want to get the tags
- * @param string $type the tag type (either 'default' or 'official'). By default,
- *     all tags are returned.
- * @param int $userid optional only required for course tagging
+ * @param string $type the tag type (either 'default' or 'official'). By default, all tags are returned.
+ * @param int $userid (optional) only required for course tagging
  * @return array the array of tags
  */
 function tag_get_tags($record_type, $record_id, $type=null, $userid=0) {
@@ -300,11 +347,13 @@ function tag_get_tags($record_type, $record_id, $type=null, $userid=0) {
 /**
  * Get the array of tags display names, indexed by id.
  *
- * @param string $record_type the record type for which we want to get the tags
- * @param int $record_id the record id for which we want to get the tags
- * @param string $type the tag type (either 'default' or 'official'). By default,
- *     all tags are returned.
- * @return array the array of tags (with the value returned by tag_display_name), indexed by id
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string $record_type the record type for which we want to get the tags
+ * @param    int    $record_id   the record id for which we want to get the tags
+ * @param    string $type        the tag type (either 'default' or 'official'). By default, all tags are returned.
+ * @return   array  the array of tags (with the value returned by tag_display_name), indexed by id
  */
 function tag_get_tags_array($record_type, $record_id, $type=null) {
     $tags = array();
@@ -315,16 +364,16 @@ function tag_get_tags_array($record_type, $record_id, $type=null) {
 }
 
 /**
- * Get a comma-separated string of tags associated to a record.  Use tag_get_tags
- * to get the same information in an array.
+ * Get a comma-separated string of tags associated to a record.  Use {@see tag_get_tags()} to get the same information in an array.
  *
- * @param string $record_type the record type for which we want to get the tags
- * @param int $record_id the record id for which we want to get the tags
- * @param int $html either TAG_RETURN_HTML or TAG_RETURN_TEXT, depending
- *     on the type of output desired
- * @param string $type either 'official' or 'default', if null, all tags are
- *     returned
- * @return string the comma-separated list of tags.
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $record_type the record type for which we want to get the tags
+ * @param    int      $record_id   the record id for which we want to get the tags
+ * @param    int      $html        either TAG_RETURN_HTML or TAG_RETURN_TEXT, depending on the type of output desired
+ * @param    string   $type        either 'official' or 'default', if null, all tags are returned
+ * @return   string   the comma-separated list of tags.
  */
 function tag_get_tags_csv($record_type, $record_id, $html=TAG_RETURN_HTML, $type=null) {
     global $CFG;
@@ -343,18 +392,21 @@ function tag_get_tags_csv($record_type, $record_id, $html=TAG_RETURN_HTML, $type
 /**
  * Get an array of tag ids associated to a record.
  *
- * @param string $record_type the record type for which we want to get the tags
- * @param int $record_id the record id for which we want to get the tags
- * @return array of tag ids, indexed and sorted by 'ordering'
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @todo     MDL-31150 Update ordering property
+ * @param    string    $record_type the record type for which we want to get the tags
+ * @param    int       $record_id the record id for which we want to get the tags
+ * @return   array     tag ids, indexed and sorted by 'ordering'
  */
 function tag_get_tags_ids($record_type, $record_id) {
-
     $tag_ids = array();
     foreach (tag_get_tags($record_type, $record_id) as $tag) {
         if ( array_key_exists($tag->ordering, $tag_ids) ) {
             // until we can add a unique constraint, in table tag_instance,
             // on (itemtype, itemid, ordering), this is needed to prevent a bug
-            // TODO : modify database in 2.0
+            // TODO MDL-31150 modify database in 2.0
             $tag->ordering++;
         }
         $tag_ids[$tag->ordering] = $tag->id;
@@ -366,14 +418,16 @@ function tag_get_tags_ids($record_type, $record_id) {
 /**
  * Returns the database ID of a set of tags.
  *
- * @param mixed $tags one tag, or array of tags, to look for.
- * @param bool $return_value specify the type of the returned value. Either
- *     TAG_RETURN_OBJECT, or TAG_RETURN_ARRAY (default). If TAG_RETURN_ARRAY
- *     is specified, an array will be returned even if only one tag was
- *     passed in $tags.
- * @return mixed tag-indexed array of ids (or objects, if second parameter is
- *     TAG_RETURN_OBJECT), or only an int, if only one tag is given *and* the
- *     second parameter is null. No value for a key means the tag wasn't found.
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @todo     MDL-31152 Test the commented MDL-31152 todo in this function to see if it helps performance
+ *                     without breaking anything.
+ * @param    mixed $tags one tag, or array of tags, to look for.
+ * @param    bool  $return_value specify the type of the returned value. Either TAG_RETURN_OBJECT, or TAG_RETURN_ARRAY (default).
+ *                               If TAG_RETURN_ARRAY is specified, an array will be returned even if only one tag was passed in $tags.
+ * @return   mixed tag-indexed array of ids (or objects, if second parameter is TAG_RETURN_OBJECT), or only an int, if only one tag
+ *                 is given *and* the second parameter is null. No value for a key means the tag wasn't found.
  */
 function tag_get_id($tags, $return_value=null) {
     global $CFG, $DB;
@@ -390,7 +444,7 @@ function tag_get_id($tags, $return_value=null) {
 
     $result = array();
 
-    //TODO: test this and see if it helps performance without breaking anything
+    //TODO MDL-31152 test this and see if it helps performance without breaking anything
     //foreach($tags as $key => $tag) {
     //    $clean_tag = moodle_strtolower($tag);
     //    if ( array_key_exists($clean_tag), $tag_id_cache) ) {
@@ -434,16 +488,16 @@ function tag_get_id($tags, $return_value=null) {
  *
  * Related tags of a tag come from two sources:
  *   - manually added related tags, which are tag_instance entries for that tag
- *   - correlated tags, which are calculated
+ *   - correlated tags, which are calculated
  *
- * @param string $tag_name_or_id is a single **normalized** tag name or the id
- *     of a tag
- * @param int $type the function will return either manually
- *     (TAG_RELATED_MANUAL) related tags or correlated (TAG_RELATED_CORRELATED)
- *     tags. Default is TAG_RELATED_ALL, which returns everything.
- * @param int $limitnum return a subset comprising this many records (optional,
- *     default is 10)
- * @return array an array of tag objects
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $tagid          is a single **normalized** tag name or the id of a tag
+ * @param    int      $type           the function will return either manually (TAG_RELATED_MANUAL) related tags or correlated
+ *                                    (TAG_RELATED_CORRELATED) tags. Default is TAG_RELATED_ALL, which returns everything.
+ * @param    int      $limitnum       (optional) return a subset comprising this many records, the default is 10
+ * @return   array    an array of tag objects
  */
 function tag_get_related_tags($tagid, $type=TAG_RELATED_ALL, $limitnum=10) {
 
@@ -468,9 +522,12 @@ function tag_get_related_tags($tagid, $type=TAG_RELATED_ALL, $limitnum=10) {
 /**
  * Get a comma-separated list of tags related to another tag.
  *
- * @param array $related_tags the array returned by tag_get_related_tags
- * @param int $html either TAG_RETURN_HTML (default) or TAG_RETURN_TEXT : return html links, or just text.
- * @return string comma-separated list
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    array    $related_tags the array returned by tag_get_related_tags
+ * @param    int      $html    either TAG_RETURN_HTML (default) or TAG_RETURN_TEXT : return html links, or just text.
+ * @return   string   comma-separated list
  */
 function tag_get_related_tags_csv($related_tags, $html=TAG_RETURN_HTML) {
     global $CFG;
@@ -491,9 +548,12 @@ function tag_get_related_tags_csv($related_tags, $html=TAG_RETURN_HTML) {
 /**
  * Change the "value" of a tag, and update the associated 'name'.
  *
- * @param int $tagid the id of the tag to modify
- * @param string $newtag the new rawname
- * @return bool true on success, false otherwise
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    int      $tagid  the id of the tag to modify
+ * @param    string   $newrawname the new rawname
+ * @return   bool     true on success, false otherwise
  */
 function tag_rename($tagid, $newrawname) {
     global $DB;
@@ -526,8 +586,11 @@ function tag_rename($tagid, $newrawname) {
 /**
  * Delete one or more tag, and all their instances if there are any left.
  *
- * @param mixed $tagids one tagid (int), or one array of tagids to delete
- * @return bool true on success, false otherwise
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    mixed    $tagids one tagid (int), or one array of tagids to delete
+ * @return   bool     true on success, false otherwise
  */
 function tag_delete($tagids) {
     global $DB;
@@ -560,13 +623,15 @@ function tag_delete($tagids) {
 }
 
 /**
- * Delete one instance of a tag.  If the last instance was deleted, it will
- * also delete the tag, unless its type is 'official'.
+ * Delete one instance of a tag.  If the last instance was deleted, it will also delete the tag, unless its type is 'official'.
  *
- * @param string $record_type the type of the record for which to remove the instance
- * @param int $record_id the id of the record for which to remove the instance
- * @param int $tagid the tagid that needs to be removed
- * @return bool true on success, false otherwise
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string $record_type the type of the record for which to remove the instance
+ * @param    int    $record_id   the id of the record for which to remove the instance
+ * @param    int    $tagid       the tagid that needs to be removed
+ * @return   bool   true on success, false otherwise
  */
 function tag_delete_instance($record_type, $record_id, $tagid) {
     global $CFG, $DB;
@@ -592,12 +657,14 @@ function tag_delete_instance($record_type, $record_id, $tagid) {
 /**
  * Function that returns the name that should be displayed for a specific tag
  *
- * @param object $tag_object a line out of tag table, as returned by the adobd functions
- * @param int $html TAG_RETURN_HTML (default) will return htmlspecialchars encoded string, TAG_RETURN_TEXT will not encode.
- * @return string
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    object   $tagobject a line out of tag table, as returned by the adobd functions
+ * @param    int      $html TAG_RETURN_HTML (default) will return htmlspecialchars encoded string, TAG_RETURN_TEXT will not encode.
+ * @return   string
  */
 function tag_display_name($tagobject, $html=TAG_RETURN_HTML) {
-
     global $CFG;
 
     if (!isset($tagobject->name)) {
@@ -626,12 +693,14 @@ function tag_display_name($tagobject, $html=TAG_RETURN_HTML) {
 /**
  * Find all records tagged with a tag of a given type ('post', 'user', etc.)
  *
- * @param string $tag tag to look for
- * @param string $type type to restrict search to.  If null, every matching
- *     record will be returned
- * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
- * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
- * @return array of matching objects, indexed by record id, from the table containing the type requested
+ * @package  core_tag
+ * @category tag
+ * @access   public
+ * @param    string   $tag       tag to look for
+ * @param    string   $type      type to restrict search to.  If null, every matching record will be returned
+ * @param    int      $limitfrom (optional, required if $limitnum is set) return a subset of records, starting at this point.
+ * @param    int      $limitnum  (optional, required if $limitfrom is set) return a subset comprising this many records.
+ * @return   array of matching objects, indexed by record id, from the table containing the type requested
  */
 function tag_find_records($tag, $type, $limitfrom='', $limitnum='') {
     global $CFG, $DB;
@@ -657,15 +726,16 @@ function tag_find_records($tag, $type, $limitfrom='', $limitnum='') {
 /////////////////// PRIVATE TAG API ///////////////////
 
 /**
- * Adds one or more tag in the database.  This function should not be called
- * directly : you should use tag_set.
+ * Adds one or more tag in the database.  This function should not be called directly : you should
+ * use tag_set.
  *
- * @param mixed $tags one tag, or an array of tags, to be created
- * @param string $type type of tag to be created ("default" is the default
- *     value and "official" is the only other supported value at this time). An
- *     official tag is kept even if there are no records tagged with it.
- * @return an array of tags ids, indexed by their lowercase normalized names.
- *     Any boolean false in the array indicates an error while adding the tag.
+ * @package core_tag
+ * @access  private
+ * @param   mixed    $tags     one tag, or an array of tags, to be created
+ * @param   string   $type     type of tag to be created ("default" is the default value and "official" is the only other supported
+ *                             value at this time). An official tag is kept even if there are no records tagged with it.
+ * @return array     $tags ids indexed by their lowercase normalized names. Any boolean false in the array indicates an error while
+ *                             adding the tag.
  */
 function tag_add($tags, $type="default") {
     global $USER, $DB;
@@ -701,15 +771,16 @@ function tag_add($tags, $type="default") {
 }
 
 /**
- * Assigns a tag to a record: if the record already exists, the time and
- * ordering will be updated.
+ * Assigns a tag to a record; if the record already exists, the time and ordering will be updated.
  *
- * @param string $record_type the type of the record that will be tagged
- * @param int $record_id the id of the record that will be tagged
- * @param string $tagid the tag id to set on the record.
- * @param int $ordering the order of the instance for this record
- * @param int $userid optional only required for course tagging
- * @return bool true on success, false otherwise
+ * @package core_tag
+ * @access  private
+ * @param   string   $record_type the type of the record that will be tagged
+ * @param   int      $record_id   the id of the record that will be tagged
+ * @param   string   $tagid       the tag id to set on the record.
+ * @param   int      $ordering    the order of the instance for this record
+ * @param   int      $userid      (optional) only required for course tagging
+ * @return  bool     true on success, false otherwise
  */
 function tag_assign($record_type, $record_id, $tagid, $ordering, $userid = 0) {
     global $DB;
@@ -733,8 +804,10 @@ function tag_assign($record_type, $record_id, $tagid, $ordering, $userid = 0) {
 /**
  * Function that returns tags that start with some text, for use by the autocomplete feature
  *
- * @param string $text string that the tag names will be matched against
- * @return mixed an array of objects, or false if no records were found or an error occured.
+ * @package core_tag
+ * @access  private
+ * @param   string   $text string that the tag names will be matched against
+ * @return  mixed    an array of objects, or false if no records were found or an error occured.
  */
 function tag_autocomplete($text) {
     global $DB;
@@ -746,10 +819,13 @@ function tag_autocomplete($text) {
 /**
  * Clean up the tag tables, making sure all tagged object still exists.
  *
- * This should normally not be necessary, but in case related tags are not deleted
- * when the tagged record is removed, this should be done once in a while, perhaps on
- * an occasional cron run.  On a site with lots of tags, this could become an expensive
- * function to call: don't run at peak time.
+ * This should normally not be necessary, but in case related tags are not deleted when the tagged record is removed, this should be
+ * done once in a while, perhaps on an occasional cron run.  On a site with lots of tags, this could become an expensive function to
+ * call: don't run at peak time.
+ *
+ * @package core_tag
+ * @access  private
+ * @todo    MDL-31212 Update tag cleanup sql so that it supports multiple types of tags
  */
 function tag_cleanup() {
     global $DB;
@@ -784,7 +860,7 @@ function tag_cleanup() {
     }
     $instances->close();
 
-    // TODO: this will only clean tags of type 'default'.  This is good as
+    // TODO MDL-31212 this will only clean tags of type 'default'.  This is good as
     // it won't delete 'official' tags, but the day we get more than two
     // types, we need to fix this.
     $unused_tags = $DB->get_recordset_sql("SELECT tg.id
@@ -805,20 +881,16 @@ function tag_cleanup() {
 }
 
 /**
- * Calculates and stores the correlated tags of all tags.
- * The correlations are stored in the 'tag_correlation' table.
+ * Calculates and stores the correlated tags of all tags. The correlations are stored in the 'tag_correlation' table.
  *
- * Two tags are correlated if they appear together a lot.
- * Ex.: Users tagged with "computers" will probably also be tagged with "algorithms".
+ * Two tags are correlated if they appear together a lot. Ex.: Users tagged with "computers" will probably also be tagged with "algorithms".
  *
- * The rationale for the 'tag_correlation' table is performance.
- * It works as a cache for a potentially heavy load query done at the 'tag_instance' table.
- * So, the 'tag_correlation' table stores redundant information derived from the 'tag_instance' table.
+ * The rationale for the 'tag_correlation' table is performance. It works as a cache for a potentially heavy load query done at the
+ * 'tag_instance' table. So, the 'tag_correlation' table stores redundant information derived from the 'tag_instance' table.
  *
- * @global moodle_database $DB
- * @param int $mincorrelation Only tags with more than $mincorrelation correlations will
- *                             be identified.
- * @return void
+ * @package core_tag
+ * @access  private
+ * @param   int      $mincorrelation Only tags with more than $mincorrelation correlations will be identified.
  */
 function tag_compute_correlations($mincorrelation = 2) {
     global $DB;
@@ -896,14 +968,14 @@ function tag_compute_correlations($mincorrelation = 2) {
 }
 
 /**
- * This function processes a tag correlation and makes changes in the database
- * as required.
+ * This function processes a tag correlation and makes changes in the database as required.
  *
- * The tag correlation object needs have both a tagid property and a correlatedtags
- * property that is an array.
+ * The tag correlation object needs have both a tagid property and a correlatedtags property that is an array.
  *
- * @param stdClass $tagcorrelation
- * @return int The id of the tag correlation that was just processed.
+ * @package core_tag
+ * @access  private
+ * @param   stdClass $tagcorrelation
+ * @return  int/bool The id of the tag correlation that was just processed or false.
  */
 function tag_process_computed_correlation(stdClass $tagcorrelation) {
     global $DB;
@@ -926,6 +998,9 @@ function tag_process_computed_correlation(stdClass $tagcorrelation) {
 
 /**
  * Tasks that should be performed at cron time
+ *
+ * @package core_tag
+ * @access private
  */
 function tag_cron() {
     tag_compute_correlations();
@@ -935,11 +1010,13 @@ function tag_cron() {
 /**
  * Search for tags with names that match some text
  *
- * @param string $text escaped string that the tag names will be matched against
- * @param boolean $ordered If true, tags are ordered by their popularity. If false, no ordering.
- * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
- * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
- * @return mixed an array of objects, or false if no records were found or an error occured.
+ * @package core_tag
+ * @access  private
+ * @param   string        $text      escaped string that the tag names will be matched against
+ * @param   bool          $ordered   If true, tags are ordered by their popularity. If false, no ordering.
+ * @param   int/string    $limitfrom (optional, required if $limitnum is set) return a subset of records, starting at this point.
+ * @param   int/string    $limitnum  (optional, required if $limitfrom is set) return a subset comprising this many records.
+ * @return  array/boolean an array of objects, or false if no records were found or an error occured.
  */
 function tag_find_tags($text, $ordered=true, $limitfrom='', $limitnum='') {
     global $DB;
@@ -964,8 +1041,10 @@ function tag_find_tags($text, $ordered=true, $limitfrom='', $limitnum='') {
 /**
  * Get the name of a tag
  *
- * @param mixed $tagids the id of the tag, or an array of ids
- * @return mixed string name of one tag, or id-indexed array of strings
+ * @package core_tag
+ * @access  private
+ * @param   mixed    $tagids the id of the tag, or an array of ids
+ * @return  mixed    string name of one tag, or id-indexed array of strings
  */
 function tag_get_name($tagids) {
     global $DB;
@@ -986,12 +1065,14 @@ function tag_get_name($tagids) {
 }
 
 /**
- * Returns the correlated tags of a tag, retrieved from the tag_correlation
- * table.  Make sure cron runs, otherwise the table will be empty and this
- * function won't return anything.
+ * Returns the correlated tags of a tag, retrieved from the tag_correlation table. Make sure cron runs, otherwise the table will be
+ * empty and this function won't return anything.
  *
- * @param int $tag_id is a single tag id
- * @return array an array of tag objects, empty if no correlated tags are found
+ * @package core_tag
+ * @access  private
+ * @param   int      $tag_id   is a single tag id
+ * @param   int      $limitnum this parameter does not appear to have any function???
+ * @return  array    an array of tag objects or an empty if no correlated tags are found
  */
 function tag_get_correlated($tag_id, $limitnum=null) {
     global $DB;
@@ -1018,11 +1099,12 @@ function tag_get_correlated($tag_id, $limitnum=null) {
 /**
  * Function that normalizes a list of tag names.
  *
- * @param mixed $tags array of tags, or a single tag.
- * @param int $case case to use for returned value (default: lower case).
- *     Either TAG_CASE_LOWER (default) or TAG_CASE_ORIGINAL
- * @return array of lowercased normalized tags, indexed by the normalized tag,
- *     in the same order as the original array. (Eg: 'Banana' => 'banana').
+ * @package core_tag
+ * @access  private
+ * @param   array/string $rawtags array of tags, or a single tag.
+ * @param   int          $case    case to use for returned value (default: lower case). Either TAG_CASE_LOWER (default) or TAG_CASE_ORIGINAL
+ * @return  array        lowercased normalized tags, indexed by the normalized tag, in the same order as the original array.
+ *                       (Eg: 'Banana' => 'banana').
  */
 function tag_normalize($rawtags, $case = TAG_CASE_LOWER) {
 
@@ -1055,11 +1137,13 @@ function tag_normalize($rawtags, $case = TAG_CASE_LOWER) {
 }
 
 /**
- * Count how many records are tagged with a specific tag,
+ * Count how many records are tagged with a specific tag.
  *
- * @param string $record record to look for ('post', 'user', etc.)
- * @param int $tag is a single tag id
- * @return int number of mathing tags.
+ * @package core_tag
+ * @access  private
+ * @param   string   $record_type record to look for ('post', 'user', etc.)
+ * @param   int      $tagid       is a single tag id
+ * @return  int      number of mathing tags.
  */
 function tag_record_count($record_type, $tagid) {
     global $DB;
@@ -1069,10 +1153,12 @@ function tag_record_count($record_type, $tagid) {
 /**
  * Determine if a record is tagged with a specific tag
  *
- * @param string $record_type the record type to look for
- * @param int $record_id the record id to look for
- * @param string $tag a tag name
- * @return bool true if it is tagged, false otherwise
+ * @package core_tag
+ * @access  private
+ * @param   string   $record_type the record type to look for
+ * @param   int      $record_id   the record id to look for
+ * @param   string   $tag         a tag name
+ * @return  bool/int true if it is tagged, 0 (false) otherwise
  */
 function tag_record_tagged_with($record_type, $record_id, $tag) {
     global $DB;
@@ -1086,8 +1172,9 @@ function tag_record_tagged_with($record_type, $record_id, $tag) {
 /**
  * Flag a tag as inapropriate
  *
- * @param mixed $tagids one (int) tagid, or an array of tagids
- * @return void
+ * @package core_tag
+ * @access  private
+ * @param   int|array $tagids a single tagid, or an array of tagids
  */
 function tag_set_flag($tagids) {
     global $DB;
@@ -1104,8 +1191,10 @@ function tag_set_flag($tagids) {
 /**
  * Remove the inapropriate flag on a tag
  *
- * @param mixed $tagids one (int) tagid, or an array of tagids
- * @return bool true if function succeeds, false otherwise
+ * @package core_tag
+ * @access  private
+ * @param   int|array $tagids a single tagid, or an array of tagids
+ * @return  bool      true    if function succeeds, false otherwise
  */
 function tag_unset_flag($tagids) {
     global $DB;
@@ -1120,9 +1209,12 @@ function tag_unset_flag($tagids) {
 
 /**
  * Return a list of page types
- * @param string $pagetype current page type
- * @param stdClass $parentcontext Block's parent context
- * @param stdClass $currentcontext Current context of block
+ *
+ * @package core_tag
+ * @access  private
+ * @param   string   $pagetype       current page type
+ * @param   stdClass $parentcontext  Block's parent context
+ * @param   stdClass $currentcontext Current context of block
  */
 function tag_page_type_list($pagetype, $parentcontext, $currentcontext) {
     return array(
index 7b7cd46..6c750b0 100644 (file)
@@ -1,21 +1,40 @@
 <?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-require_once($CFG->dirroot.'/tag/lib.php');
-require_once($CFG->libdir.'/filelib.php');
 
 /**
- * locallib.php - moodle tag local library - output functions
- *
- * @licence http://www.gnu.org/copyleft/gpl.html GNU Public License
- * @package moodlecore
+ * Moodle tag local library - output functions
  *
+ * @package    core_tag
+ * @copyright  2007 Luiz Cruz <luiz.laydner@gmail.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU Public License
  */
 
+require_once($CFG->dirroot.'/tag/lib.php');
+require_once($CFG->libdir.'/filelib.php');
+
 /**
- * Prints a tag cloud
+ * Prints or returns a HTML tag cloud with varying classes styles depending on the popularity and type of each tag.
  *
- * @param array $tagcloud array of tag objects (fields: id, name, rawname, count and flag)
- * @param $return if true return html string
+ * @package  core_tag
+ * @access   public
+ * @category tag
+ * @param    int       $nr_of_tags Limit for the number of tags to return/display
+ * @param    bool      $return     if true the function will return the generated tag cloud instead of displaying it.
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_cloud($nr_of_tags=150, $return=false) {
     global $CFG, $DB;
@@ -69,9 +88,14 @@ function tag_print_cloud($nr_of_tags=150, $return=false) {
 }
 
 /**
- * This function is used by print_tag_cloud, to usort() the tags in the cloud.
- * See php.net/usort for the parameters documentation. This was originally in
- * blocks/blog_tags/block_blog_tags.php, named blog_tags_sort().
+ * This function is used by print_tag_cloud, to usort() the tags in the cloud. See php.net/usort for the parameters documentation.
+ * This was originally in blocks/blog_tags/block_blog_tags.php, named blog_tags_sort().
+ *
+ * @package core_tag
+ * @access  private
+ * @param   string $a Tag name to compare against $b
+ * @param   string $b Tag name to compare against $a
+ * @return  int    The result of the comparison/validation 1, 0 or -1
  */
 function tag_cloud_sort($a, $b) {
     global $CFG;
@@ -94,14 +118,19 @@ function tag_cloud_sort($a, $b) {
 /**
  * Prints a box with the description of a tag and its related tags
  *
- * @param stdClass $tag_object
- * @param $return if true return html string
+ * @package core_tag
+ * @access  public
+ * @todo    MDL-31149 create a system setting for $max_tags_displayed, instead of using an in code literal
+ * @param   stdClass    $tag_object
+ * @param   bool        $return     if true the function will return the generated tag cloud instead of displaying it.
+ * @return  string/null a HTML box showing a description of the tag object and it's relationsips or null if output is done directly
+ *                      in the function.
  */
 function tag_print_description_box($tag_object, $return=false) {
 
     global $USER, $CFG, $OUTPUT;
 
-    $max_tags_displayed = 10; // todo: turn this into a system setting
+    $max_tags_displayed = 10;
 
     $tagname  = tag_display_name($tag_object);
     $related_tags = tag_get_related_tags($tag_object->id, TAG_RELATED_ALL, $max_tags_displayed+1); // this gets one more than we want
@@ -147,8 +176,10 @@ function tag_print_description_box($tag_object, $return=false) {
 /**
  * Prints a box that contains the management links of a tag
  *
- * @param $tagid
- * @param $return if true return html string
+ * @access public
+ * @param  stdClass    $tag_object
+ * @param  bool        $return     if true the function will return the generated tag cloud instead of displaying it.
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_management_box($tag_object, $return=false) {
 
@@ -192,7 +223,9 @@ function tag_print_management_box($tag_object, $return=false) {
 /**
  * Prints the tag search box
  *
- * @param bool $return if true return html string
+ * @access public
+ * @param  bool        $return if true return html string
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_search_box($return=false) {
     global $CFG, $OUTPUT;
@@ -217,10 +250,12 @@ function tag_print_search_box($return=false) {
 /**
  * Prints the tag search results
  *
- * @param string $query text that tag names will be matched against
- * @param int $page current page
- * @param int $perpage nr of users displayed per page
- * @param $return if true return html string
+ * @access public
+ * @param string       $query text that tag names will be matched against
+ * @param int          $page current page
+ * @param int          $perpage nr of users displayed per page
+ * @param bool         $return if true return html string
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_search_results($query,  $page, $perpage, $return=false) {
 
@@ -290,13 +325,13 @@ function tag_print_search_results($query,  $page, $perpage, $return=false) {
 /**
  * Prints a table of the users tagged with the tag passed as argument
  *
- * @param $tag_object
- * @param int $users_per_row number of users per row to display
- * @param int $limitfrom prints users starting at this point (optional, required if $limitnum is set).
- * @param int $limitnum prints this many users (optional, required if $limitfrom is set).
- * @param $return if true return html string
+ * @param  int         $tag_object the tag we wish to return data for
+ * @param  int         $limitfrom (optional, required if $limitnum is set) prints users starting at this point.
+ * @param  int         $limitnum (optional, required if $limitfrom is set) prints this many users.
+ * @param  bool        $return if true return html string
+ * @return string|null a HTML string or null if this function does the output
  */
-function tag_print_tagged_users_table($tag_object, $limitfrom='' , $limitnum='', $return=false) {
+function tag_print_tagged_users_table($tag_object, $limitfrom='', $limitnum='', $return=false) {
 
     //List of users with this tag
     $userlist = tag_find_records($tag_object->name, 'user', $limitfrom, $limitnum);
@@ -314,8 +349,9 @@ function tag_print_tagged_users_table($tag_object, $limitfrom='' , $limitnum='',
 /**
  * Prints an individual user box
  *
- * @param $user user object (contains the following fields: id, firstname, lastname and picture)
- * @param $return if true return html string
+ * @param user_object  $user  (contains the following fields: id, firstname, lastname and picture)
+ * @param bool         $return if true return html string
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_user_box($user, $return=false) {
     global $CFG, $OUTPUT;
@@ -359,11 +395,13 @@ function tag_print_user_box($user, $return=false) {
         echo $output;
     }
 }
+
 /**
  * Prints a list of users
  *
- * @param array $userlist an array of user objects
- * @param $return if true return html string
+ * @param  array       $userlist an array of user objects
+ * @param  bool        $return if true return html string, otherwise output the result
+ * @return string|null a HTML string or null if this function does the output
  */
 function tag_print_user_list($userlist, $return=false) {
 
index 23c5660..5f6fd90 100644 (file)
@@ -83,7 +83,7 @@ require("$CFG->dirroot/lib/setup.php");
 $theme = theme_config::load($themename);
 
 if ($type === 'editor') {
-    $files = $theme->editor_css_files();
+    $cssfiles = $theme->editor_css_files();
     css_store_css($theme, $candidatesheet, $cssfiles);
 } else {
     $css = $theme->css_files();
index cb53491..59cbcb3 100644 (file)
@@ -57,7 +57,7 @@ if (isguestuser($user)) {
 }
 
 if (!empty($CFG->forceloginforprofiles)) {
-    require_login(); // we can not log in to course due to the parent hack bellow
+    require_login(); // we can not log in to course due to the parent hack below
 }
 
 $PAGE->set_context($coursecontext);
index 6774547..e2b7df8 100644 (file)
  */
 class webservice_rest_client {
 
+    /** @var moodle_url the REST server url */
     private $serverurl;
+
     private $token;
+    private $format;
 
     /**
      * Constructor
      * @param string $serverurl a Moodle URL
      * @param string $token
      */
-    public function __construct($serverurl, $token) {
-        $this->serverurl = $serverurl;
+    public function __construct($serverurl, $token, $format = 'xml') {
+        $this->serverurl = new moodle_url($serverurl);
         $this->token = $token;
+        $this->format = $format;
     }
 
     /**
@@ -51,11 +55,22 @@ class webservice_rest_client {
     public function call($functionname, $params) {
         global $DB, $CFG;
 
-        $result = download_file_content($this->serverurl
-                        . '?wstoken='.$this->token.'&wsfunction='
-                        . $functionname, null, $params);
+         if ($this->format == 'json') {
+             $formatparam = '&moodlewsrestformat=json';
+             $this->serverurl->param('moodlewsrestformat','json');
+         } else {
+             $formatparam = ''; //to keep retro compability with old server that only support xml (they don't expect this param)
+         }
+
+        $this->serverurl->param('wstoken',$this->token);
+        $this->serverurl->param('wsfunction',$functionname); //you could also use params().
+
+        $result = download_file_content($this->serverurl->out(false), null, $params);
 
         //TODO : transform the XML result into PHP values - MDL-22965
+        if ($this->format == 'json') {
+            $result = json_decode($result);
+        }
 
         return $result;
     }
index f35340f..7b30696 100644 (file)
@@ -34,6 +34,18 @@ if (!webservice_protocol_is_enabled('rest')) {
     die;
 }
 
+$restformat = optional_param('moodlewsrestformat', 'xml', PARAM_ALPHA);
+//remove the alt from the request
+if (isset($_REQUEST['moodlewsrestformat'])) {
+    unset($_REQUEST['moodlewsrestformat']);
+}
+if (isset($_GET['moodlewsrestformat'])) {
+    unset($_GET['moodlewsrestformat']);
+}
+if (isset($_POST['moodlewsrestformat'])) {
+    unset($_POST['moodlewsrestformat']);
+}
+
 $server = new webservice_rest_server(WEBSERVICE_AUTHMETHOD_USERNAME);
 $server->run();
 die;