Merge branch 'MDL-52336-master' of git://github.com/marinaglancy/moodle
authorDavid Monllao <davidm@moodle.com>
Thu, 10 Dec 2015 09:38:15 +0000 (17:38 +0800)
committerDavid Monllao <davidm@moodle.com>
Thu, 10 Dec 2015 09:38:15 +0000 (17:38 +0800)
173 files changed:
Gruntfile.js
admin/environment.xml
admin/roles/classes/define_role_table_advanced.php
admin/tool/uploaduser/index.php
admin/tool/uploaduser/tests/behat/upload_users.feature [moved from admin/tests/behat/upload_users.feature with 58% similarity]
blocks/edit_form.php
blocks/rss_client/editfeed.php
course/lib.php
course/mod.php
course/moodleform_mod.php
filter/local_settings_form.php
grade/grading/form/guide/guideeditor.php
grade/grading/form/rubric/rubriceditor.php
install/lang/he/admin.php
lib/amd/build/form-autocomplete.min.js
lib/amd/build/templates.min.js
lib/amd/src/form-autocomplete.js
lib/amd/src/templates.js
lib/db/services.php
lib/form/advcheckbox.php
lib/form/autocomplete.php
lib/form/button.php
lib/form/cancel.php
lib/form/checkbox.php
lib/form/dateselector.php
lib/form/datetimeselector.php
lib/form/duration.php
lib/form/editor.php
lib/form/filemanager.php
lib/form/filepicker.php
lib/form/grading.php
lib/form/group.php
lib/form/header.php
lib/form/hidden.php
lib/form/htmleditor.php
lib/form/listing.php
lib/form/modgrade.php
lib/form/modvisible.php
lib/form/password.php
lib/form/passwordunmask.php
lib/form/questioncategory.php
lib/form/radio.php
lib/form/recaptcha.php
lib/form/searchableselector.php
lib/form/select.php
lib/form/selectgroups.php
lib/form/selectwithlink.php
lib/form/selectyesno.php
lib/form/static.php
lib/form/submit.php
lib/form/submitlink.php
lib/form/tags.php
lib/form/text.php
lib/form/textarea.php
lib/form/url.php
lib/form/warning.php
lib/formslib.php
lib/installlib.php
lib/jabber/XMPP/XMLStream.php
lib/jabber/readme_moodle.txt
lib/medialib.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputlib.php
lib/outputrenderers.php
lib/pear/HTML/Common.php
lib/pear/HTML/QuickForm.php
lib/pear/HTML/QuickForm/Renderer.php
lib/pear/HTML/QuickForm/Renderer/Array.php
lib/pear/HTML/QuickForm/Renderer/Default.php
lib/pear/HTML/QuickForm/Renderer/Object.php
lib/pear/HTML/QuickForm/Renderer/Tableless.php
lib/pear/HTML/QuickForm/advcheckbox.php
lib/pear/HTML/QuickForm/autocomplete.php
lib/pear/HTML/QuickForm/button.php
lib/pear/HTML/QuickForm/checkbox.php
lib/pear/HTML/QuickForm/date.php
lib/pear/HTML/QuickForm/element.php
lib/pear/HTML/QuickForm/file.php
lib/pear/HTML/QuickForm/group.php
lib/pear/HTML/QuickForm/header.php
lib/pear/HTML/QuickForm/hidden.php
lib/pear/HTML/QuickForm/hiddenselect.php
lib/pear/HTML/QuickForm/hierselect.php
lib/pear/HTML/QuickForm/html.php
lib/pear/HTML/QuickForm/image.php
lib/pear/HTML/QuickForm/input.php
lib/pear/HTML/QuickForm/link.php
lib/pear/HTML/QuickForm/password.php
lib/pear/HTML/QuickForm/radio.php
lib/pear/HTML/QuickForm/reset.php
lib/pear/HTML/QuickForm/select.php
lib/pear/HTML/QuickForm/static.php
lib/pear/HTML/QuickForm/submit.php
lib/pear/HTML/QuickForm/text.php
lib/pear/HTML/QuickForm/textarea.php
lib/pear/HTML/QuickForm/xbutton.php
lib/pear/PEAR.php
lib/pear/README_MOODLE.txt
lib/tests/fixtures/upload_users_profile.csv [new file with mode: 0644]
lib/tests/moodlelib_test.php
lib/upgrade.txt
mod/assign/feedback/editpdf/fpdi/ASL20.txt [deleted file]
mod/assign/feedback/editpdf/fpdi/LICENSE [new file with mode: 0644]
mod/assign/feedback/editpdf/fpdi/filters/FilterASCII85.php
mod/assign/feedback/editpdf/fpdi/filters/FilterASCII85_FPDI.php [deleted file]
mod/assign/feedback/editpdf/fpdi/filters/FilterASCIIHexDecode.php
mod/assign/feedback/editpdf/fpdi/filters/FilterLZW.php
mod/assign/feedback/editpdf/fpdi/filters/FilterLZW_FPDI.php [deleted file]
mod/assign/feedback/editpdf/fpdi/fpdf_tpl.php
mod/assign/feedback/editpdf/fpdi/fpdi.php
mod/assign/feedback/editpdf/fpdi/fpdi_bridge.php
mod/assign/feedback/editpdf/fpdi/fpdi_pdf_parser.php
mod/assign/feedback/editpdf/fpdi/pdf_context.php
mod/assign/feedback/editpdf/fpdi/pdf_parser.php
mod/assign/feedback/editpdf/fpdi/readme_moodle.txt
mod/assign/feedback/editpdf/thirdpartylibs.xml
mod/data/export_form.php
mod/data/field/textarea/field.class.php
mod/forum/db/services.php
mod/forum/externallib.php
mod/forum/tests/externallib_test.php
mod/forum/tests/lib_test.php
mod/forum/version.php
mod/glossary/classes/external.php [new file with mode: 0644]
mod/glossary/db/services.php [new file with mode: 0644]
mod/glossary/tests/external_test.php [new file with mode: 0644]
mod/glossary/version.php
mod/lesson/mod_form.php
mod/lesson/view.php
mod/lti/locallib.php
mod/lti/tests/locallib_test.php
mod/wiki/classes/external.php [new file with mode: 0644]
mod/wiki/db/services.php [new file with mode: 0644]
mod/wiki/editors/wikieditor.php
mod/wiki/editors/wikifiletable.php
mod/wiki/lib.php
mod/wiki/locallib.php
mod/wiki/tests/externallib_test.php [new file with mode: 0644]
mod/wiki/version.php
package.json
question/type/calculated/question.php
question/type/calculated/questiontype.php
question/type/calculatedmulti/question.php
question/type/ddimageortext/questionbase.php
question/type/description/question.php
question/type/essay/question.php
question/type/gapselect/questionbase.php
question/type/match/question.php
question/type/missingtype/question.php
question/type/missingtype/questiontype.php
question/type/multianswer/question.php
question/type/multianswer/questiontype.php
question/type/multichoice/question.php
question/type/numerical/question.php
question/type/randomsamatch/questiontype.php
question/type/shortanswer/question.php
question/type/truefalse/question.php
theme/bootstrapbase/README.txt
theme/bootstrapbase/less/README
theme/bootstrapbase/readme_moodle.txt
theme/bootstrapbase/style/editor.css
theme/bootstrapbase/style/moodle.css
user/tests/behat/set_default_homepage.feature
version.php
webservice/amf/testclient/index.php
webservice/upgrade.txt
webservice/xmlrpc/lib.php
webservice/xmlrpc/locallib.php
webservice/xmlrpc/tests/fixtures/array_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/fixtures/fault_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/fixtures/value_response.xml [new file with mode: 0644]
webservice/xmlrpc/tests/lib_test.php [new file with mode: 0644]

index a3b699e..dcc22a8 100644 (file)
@@ -50,6 +50,17 @@ module.exports = function(grunt) {
                     }
                 )
             }
+        },
+        less: {
+            bootstrapbase: {
+                files: {
+                    "theme/bootstrapbase/style/moodle.css": "theme/bootstrapbase/less/moodle.less",
+                    "theme/bootstrapbase/style/editor.css": "theme/bootstrapbase/less/editor.less",
+                },
+                options: {
+                    compress: true
+                }
+           }
         }
     });
 
@@ -208,13 +219,11 @@ module.exports = function(grunt) {
             grunt.task.run('shifter');
         // Are we in an AMD directory?
         } else if (path.basename(cwd) == 'amd') {
-            grunt.task.run('jshint');
-            grunt.task.run('uglify');
+            grunt.task.run('amd');
         } else {
             // Run them all!.
-            grunt.task.run('shifter');
-            grunt.task.run('jshint');
-            grunt.task.run('uglify');
+            grunt.task.run('css');
+            grunt.task.run('js');
         }
     };
 
@@ -222,9 +231,15 @@ module.exports = function(grunt) {
     // Register NPM tasks.
     grunt.loadNpmTasks('grunt-contrib-uglify');
     grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.loadNpmTasks('grunt-contrib-less');
 
-    // Register the shifter task.
+    // Register JS tasks.
     grunt.registerTask('shifter', 'Run Shifter against the current directory', tasks.shifter);
+    grunt.registerTask('amd', ['jshint', 'uglify']);
+    grunt.registerTask('js', ['amd', 'shifter']);
+
+    // Register CSS taks.
+    grunt.registerTask('css', ['less:bootstrapbase']);
 
     // Register the startup task.
     grunt.registerTask('startup', 'Run the correct tasks for the current directory', tasks.startup);
index 6847483..4bf5798 100644 (file)
       <VENDOR name="oracle" version="10.2" />
     </DATABASE>
     <PHP version="5.4.4" level="required">
-      <RESTRICT function="restrict_php_version_7" message="unsupportedphpversion7" />
     </PHP>
     <PCREUNICODE level="optional">
       <FEEDBACK>
index 06f565d..d18c144 100644 (file)
@@ -422,6 +422,12 @@ class core_role_define_role_table_advanced extends core_role_capability_table_wi
         } else {
             // Updating role.
             $DB->update_record('role', $this->role);
+
+            // This will ensure the course contacts cache is purged so name changes get updated in
+            // the UI. It would be better to do this only when we know that fields affected are
+            // updated. But thats getting into the weeds of the coursecat cache and role edits
+            // should not be that frequent, so here is the ugly brutal approach.
+            coursecat::role_assignment_changed($this->role->id, context_system::instance());
         }
 
         // Assignable contexts.
index ad36657..e687fe3 100644 (file)
@@ -232,8 +232,8 @@ if ($formdata = $mform2->is_cancelled()) {
                 if (isset($USER->$key) and is_array($USER->$key)) {
                     // this must be some hacky field that is abusing arrays to store content and format
                     $user->$key = array();
-                    $user->$key['text']   = $value;
-                    $user->$key['format'] = FORMAT_MOODLE;
+                    $user->{$key['text']}   = $value;
+                    $user->{$key['format']} = FORMAT_MOODLE;
                 } else {
                     $user->$key = trim($value);
                 }
@@ -1,4 +1,4 @@
-@core @core_admin @_file_upload
+@tool @tool_uploaduser @_file_upload
 Feature: Upload users
   In order to add users to the system
   As an admin
@@ -39,3 +39,25 @@ Feature: Upload users
     And I follow "Groups"
     And I set the field "groups" to "Section 1 (1)"
     And the "members" select box should contain "Tom Jones"
+
+  @javascript
+  Scenario: Upload users with custom profile fields
+    # Create user profile field.
+    Given I log in as "admin"
+    And I navigate to "User profile fields" node in "Site administration > Users > Accounts"
+    And I set the field "datatype" to "Text area"
+    And I set the following fields to these values:
+      | Short name | superfield  |
+      | Name       | Super field |
+    And I click on "Save changes" "button"
+    # Upload users.
+    When I navigate to "Upload users" node in "Site administration > Users > Accounts"
+    And I upload "lib/tests/fixtures/upload_users_profile.csv" file to "File" filemanager
+    And I press "Upload users"
+    And I press "Upload users"
+    # Check that users were created and the superfield is filled.
+    And I navigate to "Browse list of users" node in "Site administration > Users > Accounts"
+    And I follow "Tom Jones"
+    And I should see "Super field"
+    And I should see "The big guy"
+    And I log out
index ad32113..57c9de8 100644 (file)
@@ -54,7 +54,7 @@ class block_edit_form extends moodleform {
         global $CFG;
         $this->block = $block;
         $this->page = $page;
-        parent::moodleform($actionurl);
+        parent::__construct($actionurl);
     }
 
     function definition() {
index 77e3097..2b6d92a 100644 (file)
@@ -36,7 +36,7 @@ class feed_edit_form extends moodleform {
     function __construct($actionurl, $isadding, $caneditshared) {
         $this->isadding = $isadding;
         $this->caneditshared = $caneditshared;
-        parent::moodleform($actionurl);
+        parent::__construct($actionurl);
     }
 
     function definition() {
index bee6132..21c4481 100644 (file)
@@ -2519,6 +2519,8 @@ function save_local_role_names($courseid, $data) {
             $rolename->name = $value;
             $DB->insert_record('role_names', $rolename);
         }
+        // This will ensure the course contacts cache is purged..
+        coursecat::role_assignment_changed($roleid, $context);
     }
 }
 
index 3247db4..9c23493 100644 (file)
@@ -106,7 +106,8 @@ if (!empty($add)) {
         $optionsyes = array('confirm'=>1, 'delete'=>$cm->id, 'sesskey'=>sesskey(), 'sr' => $sectionreturn);
 
         $strdeletecheck = get_string('deletecheck', '', $fullmodulename);
-        $strdeletecheckfull = get_string('deletecheckfull', '', "$fullmodulename '$cm->name'");
+        $strparams = (object)array('type' => $fullmodulename, 'name' => $cm->name);
+        $strdeletechecktypename = get_string('deletechecktypename', '', $strparams);
 
         $PAGE->set_pagetype('mod-' . $cm->modname . '-delete');
         $PAGE->set_title($strdeletecheck);
@@ -117,7 +118,7 @@ if (!empty($add)) {
         echo $OUTPUT->box_start('noticebox');
         $formcontinue = new single_button(new moodle_url("$CFG->wwwroot/course/mod.php", $optionsyes), get_string('yes'));
         $formcancel = new single_button($return, get_string('no'), 'get');
-        echo $OUTPUT->confirm($strdeletecheckfull, $formcontinue, $formcancel);
+        echo $OUTPUT->confirm($strdeletechecktypename, $formcontinue, $formcancel);
         echo $OUTPUT->box_end();
         echo $OUTPUT->footer();
 
index 4c8c25f..690dda8 100644 (file)
@@ -58,7 +58,7 @@ abstract class moodleform_mod extends moodleform {
     /** @var object The course format of the current course. */
     protected $courseformat;
 
-    function moodleform_mod($current, $section, $cm, $course) {
+    public function __construct($current, $section, $cm, $course) {
         global $CFG;
 
         $this->current   = $current;
@@ -83,7 +83,17 @@ abstract class moodleform_mod extends moodleform {
         }
         $this->_modname = $matches[1];
         $this->init_features();
-        parent::moodleform('modedit.php');
+        parent::__construct('modedit.php');
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function moodleform_mod($current, $section, $cm, $course) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($current, $section, $cm, $course);
     }
 
     protected function init_features() {
index 1721ffa..fce01a1 100644 (file)
@@ -33,7 +33,7 @@ abstract class filter_local_settings_form extends moodleform {
     public function __construct($submiturl, $filter, $context) {
         $this->filter = $filter;
         $this->context = $context;
-        parent::moodleform($submiturl);
+        parent::__construct($submiturl);
     }
 
     /**
index 902834c..a6e43a1 100644 (file)
@@ -53,8 +53,18 @@ class moodlequickform_guideeditor extends HTML_QuickForm_input {
      * @param string $elementlabel
      * @param array $attributes
      */
+    public function __construct($elementname=null, $elementlabel=null, $attributes=null) {
+        parent::__construct($elementname, $elementlabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
     public function moodlequickform_guideeditor($elementname=null, $elementlabel=null, $attributes=null) {
-        parent::HTML_QuickForm_input($elementname, $elementlabel, $attributes);
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementname, $elementlabel, $attributes);
     }
 
     /**
index b3cc5bf..d990126 100644 (file)
@@ -60,8 +60,18 @@ class MoodleQuickForm_rubriceditor extends HTML_QuickForm_input {
      * @param string $elementLabel
      * @param array $attributes
      */
-    function MoodleQuickForm_rubriceditor($elementName=null, $elementLabel=null, $attributes=null) {
-        parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_rubriceditor($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
     }
 
     /**
index d63a267..c9f613d 100644 (file)
@@ -36,7 +36,7 @@ $string['cliincorrectvalueerror'] = 'שגיאה: ערך לא תקין
 "{$a->value}" עבור "{$a->option}"';
 $string['cliincorrectvalueretry'] = 'ערך שגוי, נסה שנית';
 $string['clitypevalue'] = 'סוג הערך';
-$string['clitypevaluedefault'] = 'ס×\95×\92 ×\94ער×\9a, ×\94קש Enter ×\9cש×\99×\9e×\95ש ×\91ער×\9a ×\91ר×\99רת מחדל ({$a})';
+$string['clitypevaluedefault'] = '×\99ש ×\9c×\94×\96×\99×\9f ×¢×¨×\9a, ×\90×\95 ×\9c×\94ק×\99ש ×¢×\9c ×\9bפת×\95ר Enter ×\9cש×\99×\9e×\95ש ×\91ער×\9a ×\91ררת־×\94מחדל ({$a})';
 $string['cliunknowoption'] = 'אפשרויות לא מוכרות :
 {$a}
 אנא השתמש באפשרות העזרה.';
index f8bd0d8..1adc2b0 100644 (file)
Binary files a/lib/amd/build/form-autocomplete.min.js and b/lib/amd/build/form-autocomplete.min.js differ
index 71f74a7..87a7d6c 100644 (file)
Binary files a/lib/amd/build/templates.min.js and b/lib/amd/build/templates.min.js differ
index ec3fb43..24d32c4 100644 (file)
@@ -69,6 +69,52 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
         selectionElement.attr('aria-activedescendant', itemId);
     };
 
+    /**
+     * Update the element that shows the currently selected items.
+     *
+     * @method updateSelectionList
+     * @private
+     * @param {Object} options Original options for this autocomplete element.
+     * @param {Object} state State variables for this autocomplete element.
+     * @param {JQuery} originalSelect The JQuery object matching the hidden select list.
+     */
+    var updateSelectionList = function(options, state, originalSelect) {
+        // Build up a valid context to re-render the template.
+        var items = [];
+        var newSelection = $(document.getElementById(state.selectionId));
+        var activeId = newSelection.attr('aria-activedescendant');
+        var activeValue = false;
+
+        if (activeId) {
+            activeValue = $(document.getElementById(activeId)).attr('data-value');
+        }
+        originalSelect.children('option').each(function(index, ele) {
+            if ($(ele).prop('selected')) {
+                items.push( { label: $(ele).html(), value: $(ele).attr('value') } );
+            }
+        });
+        var context = $.extend({ items: items }, options, state);
+
+        // Render the template.
+        templates.render('core/form_autocomplete_selection', context).done(function(newHTML) {
+            // Add it to the page.
+            newSelection.empty().append($(newHTML).html());
+
+            if (activeValue !== false) {
+                // Reselect any previously selected item.
+                newSelection.children('[aria-selected=true]').each(function(index, ele) {
+                    if ($(ele).attr('data-value') === activeValue) {
+                        activateSelection(index, state);
+                    }
+                });
+            }
+        }).fail(notification.exception);
+        // Because this function get's called after changing the selection, this is a good place
+        // to trigger a change notification.
+        originalSelect.change();
+    };
+
+
     /**
      * Remove the given item from the list of selected things.
      *
@@ -360,51 +406,6 @@ define(['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification']
         closeSuggestions(state);
     };
 
-    /**
-     * Update the element that shows the currently selected items.
-     *
-     * @method updateSelectionList
-     * @private
-     * @param {Object} options Original options for this autocomplete element.
-     * @param {Object} state State variables for this autocomplete element.
-     * @param {JQuery} originalSelect The JQuery object matching the hidden select list.
-     */
-    var updateSelectionList = function(options, state, originalSelect) {
-        // Build up a valid context to re-render the template.
-        var items = [];
-        var newSelection = $(document.getElementById(state.selectionId));
-        var activeId = newSelection.attr('aria-activedescendant');
-        var activeValue = false;
-
-        if (activeId) {
-            activeValue = $(document.getElementById(activeId)).attr('data-value');
-        }
-        originalSelect.children('option').each(function(index, ele) {
-            if ($(ele).prop('selected')) {
-                items.push( { label: $(ele).html(), value: $(ele).attr('value') } );
-            }
-        });
-        var context = $.extend({ items: items }, options, state);
-
-        // Render the template.
-        templates.render('core/form_autocomplete_selection', context).done(function(newHTML) {
-            // Add it to the page.
-            newSelection.empty().append($(newHTML).html());
-
-            if (activeValue !== false) {
-                // Reselect any previously selected item.
-                newSelection.children('[aria-selected=true]').each(function(index, ele) {
-                    if ($(ele).attr('data-value') === activeValue) {
-                        activateSelection(index, state);
-                    }
-                });
-            }
-        }).fail(notification.exception);
-        // Because this function get's called after changing the selection, this is a good place
-        // to trigger a change notification.
-        originalSelect.change();
-    };
-
     /**
      * Select the currently active item from the suggestions list.
      *
index 6e4bc0c..bde7e0d 100644 (file)
@@ -52,6 +52,83 @@ define([ 'core/mustache',
     /** @var {String} themeName for the current render */
     var currentThemeName = '';
 
+    /**
+     * Load a template from the cache or local storage or ajax request.
+     *
+     * @method getTemplate
+     * @private
+     * @param {string} templateName - should consist of the component and the name of the template like this:
+     *                              core/menu (lib/templates/menu.mustache) or
+     *                              tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)
+     * @return {Promise} JQuery promise object resolved when the template has been fetched.
+     */
+    var getTemplate = function(templateName, async) {
+        var deferred = $.Deferred();
+        var parts = templateName.split('/');
+        var component = parts.shift();
+        var name = parts.shift();
+
+        var searchKey = currentThemeName + '/' + templateName;
+
+        // First try request variables.
+        if (searchKey in templateCache) {
+            deferred.resolve(templateCache[searchKey]);
+            return deferred.promise();
+        }
+
+        // Now try local storage.
+        var cached = storage.get('core_template/' + searchKey);
+
+        if (cached) {
+            deferred.resolve(cached);
+            templateCache[searchKey] = cached;
+            return deferred.promise();
+        }
+
+        // Oh well - load via ajax.
+        var promises = ajax.call([{
+            methodname: 'core_output_load_template',
+            args:{
+                component: component,
+                template: name,
+                themename: currentThemeName
+            }
+        }], async, false);
+
+        promises[0].done(
+            function (templateSource) {
+                storage.set('core_template/' + searchKey, templateSource);
+                templateCache[searchKey] = templateSource;
+                deferred.resolve(templateSource);
+            }
+        ).fail(
+            function (ex) {
+                deferred.reject(ex);
+            }
+        );
+        return deferred.promise();
+    };
+
+    /**
+     * Load a partial from the cache or ajax.
+     *
+     * @method partialHelper
+     * @private
+     * @param {string} name The partial name to load.
+     * @return {string}
+     */
+    var partialHelper = function(name) {
+        var template = '';
+
+        getTemplate(name, false).done(
+            function(source) {
+                template = source;
+            }
+        ).fail(notification.exception);
+
+        return template;
+    };
+
     /**
      * Render image icons.
      *
@@ -92,26 +169,6 @@ define([ 'core/mustache',
         return result.trim();
     };
 
-    /**
-     * Load a partial from the cache or ajax.
-     *
-     * @method partialHelper
-     * @private
-     * @param {string} name The partial name to load.
-     * @return {string}
-     */
-    var partialHelper = function(name) {
-        var template = '';
-
-        getTemplate(name, false).done(
-            function(source) {
-                template = source;
-            }
-        ).fail(notification.exception);
-
-        return template;
-    };
-
     /**
      * Render blocks of javascript and save them in an array.
      *
@@ -270,63 +327,6 @@ define([ 'core/mustache',
         return deferred.promise();
     };
 
-    /**
-     * Load a template from the cache or local storage or ajax request.
-     *
-     * @method getTemplate
-     * @private
-     * @param {string} templateName - should consist of the component and the name of the template like this:
-     *                              core/menu (lib/templates/menu.mustache) or
-     *                              tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)
-     * @return {Promise} JQuery promise object resolved when the template has been fetched.
-     */
-    var getTemplate = function(templateName, async) {
-        var deferred = $.Deferred();
-        var parts = templateName.split('/');
-        var component = parts.shift();
-        var name = parts.shift();
-
-        var searchKey = currentThemeName + '/' + templateName;
-
-        // First try request variables.
-        if (searchKey in templateCache) {
-            deferred.resolve(templateCache[searchKey]);
-            return deferred.promise();
-        }
-
-        // Now try local storage.
-        var cached = storage.get('core_template/' + searchKey);
-
-        if (cached) {
-            deferred.resolve(cached);
-            templateCache[searchKey] = cached;
-            return deferred.promise();
-        }
-
-        // Oh well - load via ajax.
-        var promises = ajax.call([{
-            methodname: 'core_output_load_template',
-            args:{
-                component: component,
-                template: name,
-                themename: currentThemeName
-            }
-        }], async, false);
-
-        promises[0].done(
-            function (templateSource) {
-                storage.set('core_template/' + searchKey, templateSource);
-                templateCache[searchKey] = templateSource;
-                deferred.resolve(templateSource);
-            }
-        ).fail(
-            function (ex) {
-                deferred.reject(ex);
-            }
-        );
-        return deferred.promise();
-    };
-
     /**
      * Execute a block of JS returned from a template.
      * Call this AFTER adding the template HTML into the DOM so the nodes can be found.
index 3bf4a07..54902d9 100644 (file)
@@ -1132,7 +1132,7 @@ $functions = array(
     ),
 
     // Tag functions.
-   'core_tag_update_tags' => array(
+    'core_tag_update_tags' => array(
         'classname'   => 'core_tag_external',
         'methodname'  => 'update_tags',
         'description' => 'Updates tags',
@@ -1197,6 +1197,7 @@ $services = array(
             'mod_forum_get_forum_discussion_posts',
             'mod_forum_add_discussion_post',
             'mod_forum_add_discussion',
+            'mod_forum_can_add_discussion',
             'core_files_get_files',
             'core_message_get_messages',
             'core_message_create_contacts',
@@ -1269,6 +1270,8 @@ $services = array(
             'mod_lti_view_lti',
             'mod_imscp_view_imscp',
             'mod_imscp_get_imscps_by_courses',
+            'mod_glossary_get_glossaries_by_courses',
+            'mod_wiki_get_wikis_by_courses',
             ),
         'enabled' => 0,
         'restrictedusers' => 0,
index 26ae788..ff679d4 100644 (file)
@@ -55,7 +55,7 @@ class MoodleQuickForm_advcheckbox extends HTML_QuickForm_advcheckbox{
      *              or an associative array
      * @param mixed $values (optional) Values to pass if checked or not checked
      */
-    function MoodleQuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null)
+    public function __construct($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null)
     {
         if ($values === null){
             $values = array(0, 1);
@@ -81,7 +81,17 @@ class MoodleQuickForm_advcheckbox extends HTML_QuickForm_advcheckbox{
             }
         }
 
-        parent::HTML_QuickForm_advcheckbox($elementName, $elementLabel, $text, $attributes, $values);
+        parent::__construct($elementName, $elementLabel, $text, $attributes, $values);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $attributes, $values);
     }
 
     /**
index 206bc67..5cf63c2 100644 (file)
@@ -60,7 +60,7 @@ class MoodleQuickForm_autocomplete extends MoodleQuickForm_select {
      * @param mixed $attributes Either a typical HTML attribute string or an associative array. Special options
      *                          "tags", "placeholder", "ajax", "multiple", "casesensitive" are supported.
      */
-    function MoodleQuickForm_autocomplete($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
         // Even if the constructor gets called twice we do not really want 2x options (crazy forms!).
         $this->_options = array();
         if ($attributes === null) {
@@ -87,11 +87,21 @@ class MoodleQuickForm_autocomplete extends MoodleQuickForm_select {
             $this->casesensitive = $attributes['casesensitive'] ? true : false;
             unset($attributes['casesensitive']);
         }
-        parent::HTML_QuickForm_select($elementName, $elementLabel, $options, $attributes);
+        parent::__construct($elementName, $elementLabel, $options, $attributes);
 
         $this->_type = 'autocomplete';
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_autocomplete($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     /**
      * Returns HTML for select form element.
      *
index bfa9615..a69e217 100644 (file)
@@ -50,8 +50,18 @@ class MoodleQuickForm_button extends HTML_QuickForm_button
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_button($elementName=null, $value=null, $attributes=null) {
-        parent::HTML_QuickForm_button($elementName, $value, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, $value, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_button($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
     }
 
     /**
index 6674377..2a5764f 100644 (file)
@@ -52,7 +52,7 @@ class MoodleQuickForm_cancel extends MoodleQuickForm_submit
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_cancel($elementName=null, $value=null, $attributes=null)
+    public function __construct($elementName=null, $value=null, $attributes=null)
     {
         if ($elementName==null){
             $elementName='cancel';
@@ -60,7 +60,7 @@ class MoodleQuickForm_cancel extends MoodleQuickForm_submit
         if ($value==null){
             $value=get_string('cancel');
         }
-        MoodleQuickForm_submit::MoodleQuickForm_submit($elementName, $value, $attributes);
+        parent::__construct($elementName, $value, $attributes);
         $this->updateAttributes(array('onclick'=>'skipClientValidation = true; return true;'));
 
         // Add the class btn-cancel.
@@ -71,6 +71,16 @@ class MoodleQuickForm_cancel extends MoodleQuickForm_submit
         $this->updateAttributes(array('class' => $class . ' btn-cancel'));
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_cancel($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
+    }
+
     /**
      * Called by HTML_QuickForm whenever form event is made on this element
      *
@@ -83,8 +93,7 @@ class MoodleQuickForm_cancel extends MoodleQuickForm_submit
     {
         switch ($event) {
             case 'createElement':
-                $className = get_class($this);
-                $this->$className($arg[0], $arg[1], $arg[2]);
+                static::__construct($arg[0], $arg[1], $arg[2]);
                 $caller->_registerCancelButton($this->getName());
                 return true;
                 break;
index 37397da..8aaecdd 100644 (file)
@@ -52,8 +52,18 @@ class MoodleQuickForm_checkbox extends HTML_QuickForm_checkbox{
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null) {
-        parent::HTML_QuickForm_checkbox($elementName, $elementLabel, $text, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $text='', $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $text, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $attributes);
     }
 
     /**
index 2332e99..29957e3 100644 (file)
@@ -75,12 +75,13 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group {
      * @param array $options Options to control the element's display
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_date_selector($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+    public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
         // Get the calendar type used - see MDL-18375.
         $calendartype = \core_calendar\type_factory::get_calendar_instance();
         $this->_options = array('startyear' => $calendartype->get_min_year(), 'stopyear' => $calendartype->get_max_year(),
             'defaulttime' => 0, 'timezone' => 99, 'step' => 5, 'optional' => false);
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_appendName = true;
         $this->_type = 'date_selector';
@@ -103,6 +104,16 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_date_selector($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     /**
      * This will create date group element constisting of day, month and year.
      *
index 3153f34..8055f02 100644 (file)
@@ -77,13 +77,14 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group {
      * @param array $options Options to control the element's display
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_date_time_selector($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+    public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
         // Get the calendar type used - see MDL-18375.
         $calendartype = \core_calendar\type_factory::get_calendar_instance();
         $this->_options = array('startyear' => $calendartype->get_min_year(), 'stopyear' => $calendartype->get_max_year(),
             'defaulttime' => 0, 'timezone' => 99, 'step' => 5, 'optional' => false);
 
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_appendName = true;
         $this->_type = 'date_time_selector';
@@ -106,6 +107,16 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_date_time_selector($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     /**
      * This will create date group element constisting of day, month and year.
      *
index 4298f00..ab2d434 100644 (file)
@@ -63,8 +63,9 @@ class MoodleQuickForm_duration extends MoodleQuickForm_group {
     *              If not specified, minutes is used.
     * @param mixed $attributes Either a typical HTML attribute string or an associative array
     */
-    function MoodleQuickForm_duration($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_appendName = true;
         $this->_type = 'duration';
@@ -83,6 +84,16 @@ class MoodleQuickForm_duration extends MoodleQuickForm_group {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_duration($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     /**
      * Returns time associative array of unit length.
      *
index 0c18b21..4e06505 100644 (file)
@@ -68,7 +68,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
      *              or an associative array
      * @param array $options set of options to initalize filepicker
      */
-    function MoodleQuickForm_editor($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
         global $CFG, $PAGE;
 
         $options = (array)$options;
@@ -89,7 +89,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
             }
         }
         $this->_options['trusted'] = trusttext_trusted($this->_options['context']);
-        parent::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
 
         // Note: for some reason the code using this setting does not like bools.
         $this->_options['subdirs'] = (int)($this->_options['subdirs'] == 1);
@@ -97,6 +97,16 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element {
         editors_head_setup();
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_editor($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
+    }
+
     /**
      * Called by HTML_QuickForm whenever form event is made on this element
      *
index 8140fec..d525253 100644 (file)
@@ -60,7 +60,7 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element {
      *              or an associative array
      * @param array $options set of options to initalize filemanager
      */
-    function MoodleQuickForm_filemanager($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
         global $CFG, $PAGE;
 
         $options = (array)$options;
@@ -76,7 +76,17 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element {
             $this->_options['return_types'] = (FILE_INTERNAL | FILE_REFERENCE);
         }
         $this->_type = 'filemanager';
-        parent::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_filemanager($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
     }
 
     /**
index da5aff8..1634096 100644 (file)
@@ -59,7 +59,7 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input {
      *              or an associative array
      * @param array $options set of options to initalize filepicker
      */
-    function MoodleQuickForm_filepicker($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
         global $CFG, $PAGE;
 
         $options = (array)$options;
@@ -81,7 +81,17 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input {
         }
         $this->_options['maxbytes'] = get_user_max_upload_file_size($PAGE->context, $CFG->maxbytes, $coursemaxbytes, $fpmaxbytes);
         $this->_type = 'filepicker';
-        parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_filepicker($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
     }
 
     /**
index 18191dd..c47de8a 100644 (file)
@@ -61,11 +61,21 @@ class MoodleQuickForm_grading extends HTML_QuickForm_input{
      * @param mixed $elementLabel Label(s) for the input field
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    public function MoodleQuickForm_grading($elementName=null, $elementLabel=null, $attributes=null) {
-        parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->gradingattributes = $attributes;
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_grading($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
+
     /**
      * Helper function to retrieve gradingform_instance passed in element attributes
      *
index 3d95d9f..753977f 100644 (file)
@@ -50,8 +50,18 @@ class MoodleQuickForm_group extends HTML_QuickForm_group{
      * @param string $separator (optional) string to seperate elements.
      * @param string $appendName (optional) string to appened to grouped elements.
      */
-    function MoodleQuickForm_group($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true) {
-        parent::HTML_QuickForm_group($elementName, $elementLabel, $elements, $separator, $appendName);
+    public function __construct($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true) {
+        parent::__construct($elementName, $elementLabel, $elements, $separator, $appendName);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_group($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $elements, $separator, $appendName);
     }
 
     /** @var string template type, would cause problems with client side validation so will leave for now */
index 36c5a08..f5f1ed5 100644 (file)
@@ -48,8 +48,18 @@ class MoodleQuickForm_header extends HTML_QuickForm_header
      * @param string $elementName name of the header element
      * @param string $text text displayed in header element
      */
-    function MoodleQuickForm_header($elementName = null, $text = null) {
-        parent::HTML_QuickForm_header($elementName, $text);
+    public function __construct($elementName = null, $text = null) {
+        parent::__construct($elementName, $text);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_header($elementName = null, $text = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $text);
     }
 
    /**
index 6c2f239..d21c029 100644 (file)
@@ -49,8 +49,18 @@ class MoodleQuickForm_hidden extends HTML_QuickForm_hidden{
      * @param mixed  $attributes (optional) Either a typical HTML attribute string
      *               or an associative array
      */
-    function MoodleQuickForm_hidden($elementName=null, $value='', $attributes=null) {
-        parent::HTML_QuickForm_hidden($elementName, $value, $attributes);
+    public function __construct($elementName=null, $value='', $attributes=null) {
+        parent::__construct($elementName, $value, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_hidden($elementName=null, $value='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        return self::__construct($elementName, $value, $attributes);
     }
 
     /**
index adddc3f..32353d6 100644 (file)
@@ -54,8 +54,8 @@ class MoodleQuickForm_htmleditor extends MoodleQuickForm_textarea{
      * @param array $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_htmleditor($elementName=null, $elementLabel=null, $options=array(), $attributes=null){
-        parent::MoodleQuickForm_textarea($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $options=array(), $attributes=null){
+        parent::__construct($elementName, $elementLabel, $attributes);
         // set the options, do not bother setting bogus ones
         if (is_array($options)) {
             foreach ($options as $name => $value) {
@@ -73,6 +73,16 @@ class MoodleQuickForm_htmleditor extends MoodleQuickForm_textarea{
         editors_head_setup();
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_htmleditor($elementName=null, $elementLabel=null, $options=array(), $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     /**
      * Returns the input field in HTML
      *
index 102b492..cd9477c 100644 (file)
@@ -73,7 +73,7 @@ class MoodleQuickForm_listing extends HTML_QuickForm_input {
      * @param array $attributes (optional) Either a typical HTML attribute string or an associative array.
      * @param array $options set of options to initalize listing.
      */
-    function MoodleQuickForm_listing($elementName=null, $elementLabel=null, $attributes=null, $options=array()) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=array()) {
 
        $this->_type = 'listing';
         if (!empty($options['items'])) {
@@ -89,7 +89,17 @@ class MoodleQuickForm_listing extends HTML_QuickForm_input {
         } else {
             $this->hideall = get_string('hide');
         }
-        parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_listing($elementName=null, $elementLabel=null, $attributes=null, $options=array()) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
     }
 
     /**
index d76122b..dd8ccce 100644 (file)
@@ -53,13 +53,24 @@ class MoodleQuickForm_modgrade extends MoodleQuickForm_group{
      * @param array $options Options to control the element's display. Not used.
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    public function MoodleQuickForm_modgrade($elementname = null, $elementlabel = null, $options = array(), $attributes = null) {
-        $this->HTML_QuickForm_element($elementname, $elementlabel, $attributes);
+    public function __construct($elementname = null, $elementlabel = null, $options = array(), $attributes = null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementname, $elementlabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_appendName = true;
         $this->_type = 'modgrade';
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_modgrade($elementname = null, $elementlabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementname, $elementlabel, $options, $attributes);
+    }
+
     /**
      * Create elements for this group.
      */
index 2a6acd9..ddc4a6f 100644 (file)
@@ -48,12 +48,20 @@ class MoodleQuickForm_modvisible extends MoodleQuickForm_select{
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      * @param array $options ignored
      */
-    function MoodleQuickForm_modvisible($elementName=null, $elementLabel=null, $attributes=null, $options=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes, null);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes, null);
         $this->_type = 'modvisible';
+    }
 
-
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_modvisible($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
     }
 
     /**
index 4265ec6..82153bc 100644 (file)
@@ -49,7 +49,7 @@ class MoodleQuickForm_password extends HTML_QuickForm_password{
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_password($elementName=null, $elementLabel=null, $attributes=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
         global $CFG;
         // no standard mform in moodle should allow autocomplete of passwords
         if (empty($attributes)) {
@@ -62,7 +62,17 @@ class MoodleQuickForm_password extends HTML_QuickForm_password{
             }
         }
 
-        parent::HTML_QuickForm_password($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_password($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
     }
 
     /**
index 15bd4bc..b8d4102 100644 (file)
@@ -51,7 +51,7 @@ class MoodleQuickForm_passwordunmask extends MoodleQuickForm_password {
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_passwordunmask($elementName=null, $elementLabel=null, $attributes=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
         global $CFG;
         // no standard mform in moodle should allow autocomplete of passwords
         if (empty($attributes)) {
@@ -64,7 +64,17 @@ class MoodleQuickForm_passwordunmask extends MoodleQuickForm_password {
             }
         }
 
-        parent::MoodleQuickForm_password($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_passwordunmask($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
     }
 
     /**
index 4f7d999..8ebe1d0 100644 (file)
@@ -53,8 +53,8 @@ class MoodleQuickForm_questioncategory extends MoodleQuickForm_selectgroups {
      *              from moodlelib.php.
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_questioncategory($elementName = null, $elementLabel = null, $options = null, $attributes = null) {
-        MoodleQuickForm_selectgroups::MoodleQuickForm_selectgroups($elementName, $elementLabel, array(), $attributes);
+    public function __construct($elementName = null, $elementLabel = null, $options = null, $attributes = null) {
+        parent::__construct($elementName, $elementLabel, array(), $attributes);
         $this->_type = 'questioncategory';
         if (is_array($options)) {
             $this->_options = $options + $this->_options;
@@ -64,4 +64,13 @@ class MoodleQuickForm_questioncategory extends MoodleQuickForm_selectgroups {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_questioncategory($elementName = null, $elementLabel = null, $options = null, $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
 }
index 6aaa780..3f6a731 100644 (file)
@@ -51,8 +51,18 @@ class MoodleQuickForm_radio extends HTML_QuickForm_radio{
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) {
-        parent::HTML_QuickForm_radio($elementName, $elementLabel, $text, $value, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $text, $value, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $value, $attributes);
     }
 
     /**
index 2080088..f043353 100644 (file)
@@ -53,9 +53,9 @@ class MoodleQuickForm_recaptcha extends HTML_QuickForm_input {
      * @param mixed $attributes (optional) Either a typical HTML attribute string
      *              or an associative array
      */
-    function MoodleQuickForm_recaptcha($elementName = null, $elementLabel = null, $attributes = null) {
+    public function __construct($elementName = null, $elementLabel = null, $attributes = null) {
         global $CFG;
-        parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_type = 'recaptcha';
         if (is_https()) {
             $this->_https = true;
@@ -64,6 +64,16 @@ class MoodleQuickForm_recaptcha extends HTML_QuickForm_input {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_recaptcha($elementName = null, $elementLabel = null, $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
+
     /**
      * Returns the recaptcha element in HTML
      *
index 681549b..458a23c 100644 (file)
@@ -49,12 +49,22 @@ class MoodleQuickForm_searchableselector extends MoodleQuickForm_select{
      * @param array $options additional options.
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_searchableselector($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
         //set size default to 12
         if (empty($attributes) || empty($attributes['size'])) {
             $attributes['size'] = 12;
         }
-        parent::MoodleQuickForm_select($elementName, $elementLabel, $options, $attributes);
+        parent::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_searchableselector($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
     }
 
     /**
index 8b0beba..aa888cb 100644 (file)
@@ -52,8 +52,18 @@ class MoodleQuickForm_select extends HTML_QuickForm_select{
      * @param mixed $options Data to be used to populate options
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
-        parent::HTML_QuickForm_select($elementName, $elementLabel, $options, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
     }
 
     /**
index 2d5dd63..c942acb 100644 (file)
@@ -63,10 +63,10 @@ class MoodleQuickForm_selectgroups extends HTML_QuickForm_element {
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      * @param bool $showchoose add standard moodle "Choose..." option as first item
      */
-    function MoodleQuickForm_selectgroups($elementName=null, $elementLabel=null, $optgrps=null, $attributes=null, $showchoose=false)
+    public function __construct($elementName=null, $elementLabel=null, $optgrps=null, $attributes=null, $showchoose=false)
     {
         $this->showchoose = $showchoose;
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_type = 'selectgroups';
         if (isset($optgrps)) {
@@ -74,6 +74,16 @@ class MoodleQuickForm_selectgroups extends HTML_QuickForm_element {
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_selectgroups($elementName=null, $elementLabel=null, $optgrps=null, $attributes=null, $showchoose=false) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $optgrps, $attributes, $showchoose);
+    }
+
     /**
      * Sets the default values of the select box
      *
index 4377b31..78832d9 100644 (file)
@@ -62,8 +62,7 @@ class MoodleQuickForm_selectwithlink extends HTML_QuickForm_select{
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      * @param bool $linkdata data to be posted
      */
-    function MoodleQuickForm_selectwithlink($elementName=null, $elementLabel=null, $options=null, $attributes=null, $linkdata=null)
-    {
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null, $linkdata=null) {
         if (!empty($linkdata['link']) && !empty($linkdata['label'])) {
             $this->_link = $linkdata['link'];
             $this->_linklabel = $linkdata['label'];
@@ -73,7 +72,17 @@ class MoodleQuickForm_selectwithlink extends HTML_QuickForm_select{
             $this->_linkreturn = $linkdata['return'];
         }
 
-        parent::HTML_QuickForm_select($elementName, $elementLabel, $options, $attributes);
+        parent::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_selectwithlink($elementName=null, $elementLabel=null, $options=null, $attributes=null, $linkdata=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes, $linkdata);
     }
 
     /**
index d88a276..7764fbb 100644 (file)
@@ -47,13 +47,23 @@ class MoodleQuickForm_selectyesno extends MoodleQuickForm_select{
      * @param mixed $attributes Either a typical HTML attribute string or an associative array
      * @param mixed $options ignored, not used.
      */
-    function MoodleQuickForm_selectyesno($elementName=null, $elementLabel=null, $attributes=null, $options=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes, null);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes, null);
         $this->_type = 'selectyesno';
         $this->_persistantFreeze = true;
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_selectyesno($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
+    }
+
     /**
      * Called by HTML_QuickForm whenever form event is made on this element
      *
index 716b026..391be8e 100644 (file)
@@ -51,8 +51,18 @@ class MoodleQuickForm_static extends HTML_QuickForm_static{
      * @param string $elementLabel (optional) text field label
      * @param string $text (optional) Text to put in text field
      */
-    function MoodleQuickForm_static($elementName=null, $elementLabel=null, $text=null) {
-        parent::HTML_QuickForm_static($elementName, $elementLabel, $text);
+    public function __construct($elementName=null, $elementLabel=null, $text=null) {
+        parent::__construct($elementName, $elementLabel, $text);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_static($elementName=null, $elementLabel=null, $text=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text);
     }
 
     /**
index af94e4f..c0e2d96 100644 (file)
@@ -45,8 +45,18 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit {
      * @param string $value (optional) field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_submit($elementName=null, $value=null, $attributes=null) {
-        parent::HTML_QuickForm_submit($elementName, $value, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, $value, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_submit($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
     }
 
     /**
index 9b7b5e0..bf238a5 100644 (file)
@@ -51,8 +51,18 @@ class MoodleQuickForm_submitlink extends MoodleQuickForm_submit {
      * @param string $value (optional) field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_submitlink($elementName=null, $value=null, $attributes=null) {
-        parent::MoodleQuickForm_submit($elementName, $value, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, $value, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_submitlink($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
     }
 
     /**
index 961a262..a472767 100644 (file)
@@ -71,7 +71,7 @@ class MoodleQuickForm_tags extends MoodleQuickForm_autocomplete {
      * @param array $options Options to control the element's display
      * @param mixed $attributes Either a typical HTML attribute string or an associative array.
      */
-    function MoodleQuickForm_tags($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+    public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
         if (!isset($options['display'])) {
             $options['display'] = self::DEFAULTUI;
         }
@@ -92,7 +92,17 @@ class MoodleQuickForm_tags extends MoodleQuickForm_autocomplete {
         $attributes['placeholder'] = get_string('entertags', 'tag');
         $attributes['showsuggestions'] = $this->showingofficial;
 
-        parent::MoodleQuickForm_autocomplete($elementName, $elementLabel, $validoptions, $attributes);
+        parent::__construct($elementName, $elementLabel, $validoptions, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_tags($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
     }
 
     /**
index 97a0219..a1af03b 100644 (file)
@@ -51,8 +51,18 @@ class MoodleQuickForm_text extends HTML_QuickForm_text{
      * @param string $elementLabel (optional) text field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_text($elementName=null, $elementLabel=null, $attributes=null) {
-        parent::HTML_QuickForm_text($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_text($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
     }
 
     /**
index f03b610..273fff5 100644 (file)
@@ -54,8 +54,18 @@ class MoodleQuickForm_textarea extends HTML_QuickForm_textarea{
      * @param string $elementLabel (optional) text field label
      * @param string $attributes (optional) Either a typical HTML attribute string or an associative array
      */
-    function MoodleQuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null) {
-        parent::HTML_QuickForm_textarea($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
     }
 
     /**
index 2e62463..4a22571 100644 (file)
@@ -51,7 +51,7 @@ class MoodleQuickForm_url extends HTML_QuickForm_text{
      * @param mixed $attributes Either a typical HTML attribute string or an associative array.
      * @param array $options data which need to be posted.
      */
-    function MoodleQuickForm_url($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
         global $CFG;
         require_once("$CFG->dirroot/repository/lib.php");
         $options = (array)$options;
@@ -61,7 +61,17 @@ class MoodleQuickForm_url extends HTML_QuickForm_text{
         if (!isset($this->_options['usefilepicker'])) {
             $this->_options['usefilepicker'] = true;
         }
-        parent::HTML_QuickForm_text($elementName, $elementLabel, $attributes);
+        parent::__construct($elementName, $elementLabel, $attributes);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_url($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $options);
     }
 
     /**
index 90865ea..38c21a3 100644 (file)
@@ -53,8 +53,8 @@ class MoodleQuickForm_warning extends HTML_QuickForm_static{
      * @param string $elementClass (optional) show as warning or notification => 'notifyproblem'
      * @param string $text (optional) Text to put in warning field
      */
-    function MoodleQuickForm_warning($elementName=null, $elementClass='notifyproblem', $text=null) {
-        parent::HTML_QuickForm_static($elementName, null, $text);
+    public function __construct($elementName=null, $elementClass='notifyproblem', $text=null) {
+        parent::__construct($elementName, null, $text);
         $this->_type = 'warning';
         if (is_null($elementClass)) {
             $elementClass = 'notifyproblem';
@@ -62,6 +62,16 @@ class MoodleQuickForm_warning extends HTML_QuickForm_static{
         $this->_class = $elementClass;
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_warning($elementName=null, $elementClass='notifyproblem', $text=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementClass, $text);
+    }
+
     /**
      * Returns HTML for this form element.
      *
index e65979c..6192514 100644 (file)
@@ -157,7 +157,7 @@ abstract class moodleform {
      * @param mixed $attributes you can pass a string of html attributes here or an array.
      * @param bool $editable
      */
-    function moodleform($action=null, $customdata=null, $method='post', $target='', $attributes=null, $editable=true) {
+    public function __construct($action=null, $customdata=null, $method='post', $target='', $attributes=null, $editable=true) {
         global $CFG, $FULLME;
         // no standard mform in moodle should allow autocomplete with the exception of user signup
         if (empty($attributes)) {
@@ -207,6 +207,16 @@ abstract class moodleform {
         $this->_process_submission($method);
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function moodleform($action=null, $customdata=null, $method='post', $target='', $attributes=null, $editable=true) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($action, $customdata, $method, $target, $attributes, $editable);
+    }
+
     /**
      * It should returns unique identifier for the form.
      * Currently it will return class name, but in case two same forms have to be
@@ -1426,12 +1436,13 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
      * @param string $target (optional)Form's target defaults to none
      * @param mixed $attributes (optional)Extra attributes for <form> tag
      */
-    function MoodleQuickForm($formName, $method, $action, $target='', $attributes=null){
+    public function __construct($formName, $method, $action, $target='', $attributes=null) {
         global $CFG, $OUTPUT;
 
         static $formcounter = 1;
 
-        HTML_Common::HTML_Common($attributes);
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_Common::__construct($attributes);
         $target = empty($target) ? array() : array('target' => $target);
         $this->_formName = $formName;
         if (is_a($action, 'moodle_url')){
@@ -1460,6 +1471,16 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
         $this->setRequiredNote(get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />'));
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm($formName, $method, $action, $target='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($formName, $method, $action, $target, $attributes);
+    }
+
     /**
      * Use this method to indicate an element in a form is an advanced field. If items in a form
      * are marked as advanced then 'Hide/Show Advanced' buttons will automatically be displayed in the
@@ -2594,7 +2615,7 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
     /**
      * Constructor
      */
-    function MoodleQuickForm_Renderer(){
+    public function __construct() {
         // switch next two lines for ol li containers for form items.
         //        $this->_elementTemplates=array('default'=>"\n\t\t".'<li class="fitem"><label>{label}{help}<!-- BEGIN required -->{req}<!-- END required --></label><div class="qfelement<!-- BEGIN error --> error<!-- END error --> {type}"><!-- BEGIN error --><span class="error">{error}</span><br /><!-- END error -->{element}</div></li>');
         $this->_elementTemplates = array(
@@ -2610,7 +2631,17 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
 
         'nodisplay'=>'');
 
-        parent::HTML_QuickForm_Renderer_Tableless();
+        parent::__construct();
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function MoodleQuickForm_Renderer() {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct();
     }
 
     /**
index d69ed35..8f033c9 100644 (file)
@@ -337,6 +337,7 @@ function install_print_header($config, $stagename, $heading, $stagetext, $stagec
 
     echo '<link rel="stylesheet" type="text/css" href="'.$CFG->wwwroot.'/install/css.php" />
           <title>'.get_string('installation','install').' - Moodle '.$CFG->target_release.'</title>
+          <meta name="robots" content="noindex">
           <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
           <meta http-equiv="pragma" content="no-cache" />
           <meta http-equiv="expires" content="0" />';
index 73ab3fe..5c71426 100644 (file)
@@ -564,7 +564,7 @@ class XMPPHP_XMLStream {
                                                if ($searchxml !== null) {
                                                        if($handler[2] === null) $handler[2] = $this;
                                                        $this->log->log("Calling {$handler[1]}",  XMPPHP_Log::LEVEL_DEBUG);
-                                                       $handler[2]->$handler[1]($this->xmlobj[2]);
+                                                       $handler[2]->{$handler[1]}($this->xmlobj[2]);
                                                }
                                        }
                                }
@@ -578,13 +578,13 @@ class XMPPHP_XMLStream {
                                if($searchxml !== null and $searchxml->name == $handler[0] and ($searchxml->ns == $handler[1] or (!$handler[1] and $searchxml->ns == $this->default_ns))) {
                                        if($handler[3] === null) $handler[3] = $this;
                                        $this->log->log("Calling {$handler[2]}",  XMPPHP_Log::LEVEL_DEBUG);
-                                       $handler[3]->$handler[2]($this->xmlobj[2]);
+                                       $handler[3]->{$handler[2]}($this->xmlobj[2]);
                                }
                        }
                        foreach($this->idhandlers as $id => $handler) {
                                if(array_key_exists('id', $this->xmlobj[2]->attrs) and $this->xmlobj[2]->attrs['id'] == $id) {
                                        if($handler[1] === null) $handler[1] = $this;
-                                       $handler[1]->$handler[0]($this->xmlobj[2]);
+                                       $handler[1]->{$handler[0]}($this->xmlobj[2]);
                                        #id handlers are only used once
                                        unset($this->idhandlers[$id]);
                                        break;
@@ -640,7 +640,7 @@ class XMPPHP_XMLStream {
                                if($handler[2] === null) {
                                        $handler[2] = $this;
                                }
-                               $handler[2]->$handler[1]($payload);
+                               $handler[2]->{$handler[1]}($payload);
                        }
                }
                foreach($this->until as $key => $until) {
index f8328fb..205c214 100644 (file)
@@ -1,3 +1,4 @@
 Description of XMPPHP (aka jabber) version 0.1rc2-r77 library import into Moodle
 
 MDL-20876 - replaced deprecated split() with explode()
+MDL-52335 - PHP7 variable syntax changes
index 34c2829..0d0bd35 100644 (file)
@@ -811,7 +811,7 @@ class core_media_player_wmp extends core_media_player {
         <param name="ShowGotoBar" value="false" />
         <param name="EnableFullScreenControls" value="true" />
         <param name="uimode" value="full" />
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         <object data="$url" type="$mimetype" $size>
             <param name="src" value="$url" />
             <param name="controller" value="true" />
@@ -820,7 +820,7 @@ class core_media_player_wmp extends core_media_player {
             <param name="resize" value="scale" />
         <!--<![endif]-->
             $fallback
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         </object>
         <!--<![endif]-->
     </object>
@@ -875,7 +875,7 @@ class core_media_player_qt extends core_media_player {
         <param name="autoplay" value="false" />
         <param name="autostart" value="false" />
         <param name="scale" value="aspect" />
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         <object data="$url" type="$mimetype" $size>
             <param name="src" value="$url" />
             <param name="pluginurl" value="http://www.apple.com/quicktime/download/" />
@@ -886,7 +886,7 @@ class core_media_player_qt extends core_media_player {
             <param name="scale" value="aspect" />
         <!--<![endif]-->
             $fallback
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         </object>
         <!--<![endif]-->
     </object>
@@ -934,14 +934,14 @@ class core_media_player_rm extends core_media_player {
             data="$url" width="$width" height="$height"">
         <param name="src" value="$url" />
         <param name="controls" value="All" />
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         <object title="$info" type="audio/x-pn-realaudio-plugin"
                 data="$url" width="$width" height="$height">
             <param name="src" value="$url" />
             <param name="controls" value="All" />
         <!--<![endif]-->
             $fallback
-        <!--[if !IE]>-->
+        <!--[if !IE]><!-->
         </object>
         <!--<![endif]-->
   </object>
@@ -989,7 +989,8 @@ class core_media_player_swf extends core_media_player {
     <param name="scale" value="aspect" />
     <param name="base" value="." />
     <param name="allowscriptaccess" value="never" />
-<!--[if !IE]>-->
+    <param name="allowfullscreen" value="true" />
+<!--[if !IE]><!-->
     <object type="application/x-shockwave-flash" data="$url" width="$width" height="$height">
       <param name="controller" value="true" />
       <param name="autoplay" value="true" />
@@ -997,9 +998,10 @@ class core_media_player_swf extends core_media_player {
       <param name="scale" value="aspect" />
       <param name="base" value="." />
       <param name="allowscriptaccess" value="never" />
+      <param name="allowfullscreen" value="true" />
 <!--<![endif]-->
 $fallback
-<!--[if !IE]>-->
+<!--[if !IE]><!-->
     </object>
 <!--<![endif]-->
   </object>
index 8fd08cd..55c8b69 100644 (file)
@@ -7691,6 +7691,18 @@ function shorten_text($text, $ideal=30, $exact = false, $ending='...') {
                             'tag'  => core_text::strtolower($tagmatchings[1]),
                             'pos'  => core_text::strlen($truncate),
                         );
+                } else if (preg_match('/^<!--\[if\s.*?\]>$/s', $linematchings[1], $tagmatchings)) {
+                    $tagdetails[] = (object) array(
+                            'open' => true,
+                            'tag'  => core_text::strtolower('if'),
+                            'pos'  => core_text::strlen($truncate),
+                    );
+                } else if (preg_match('/^<!--<!\[endif\]-->$/s', $linematchings[1], $tagmatchings)) {
+                    $tagdetails[] = (object) array(
+                            'open' => false,
+                            'tag'  => core_text::strtolower('if'),
+                            'pos'  => core_text::strlen($truncate),
+                    );
                 }
             }
             // Add html-tag to $truncate'd text.
@@ -7776,7 +7788,11 @@ function shorten_text($text, $ideal=30, $exact = false, $ending='...') {
 
     // Close all unclosed html-tags.
     foreach ($opentags as $tag) {
-        $truncate .= '</' . $tag . '>';
+        if ($tag === 'if') {
+            $truncate .= '<!--<![endif]-->';
+        } else {
+            $truncate .= '</' . $tag . '>';
+        }
     }
 
     return $truncate;
index 9385451..b3b79cc 100644 (file)
@@ -3084,13 +3084,15 @@ class navbar extends navigation_node {
     public $children = array();
     /** @var bool A switch for whether we want to include the root node in the navbar */
     public $includesettingsbase = false;
-    /** @var navigation_node[] $prependchildren */
+    /** @var breadcrumb_navigation_node[] $prependchildren */
     protected $prependchildren = array();
     /**
      * The almighty constructor
      *
      * @param moodle_page $page
      */
+
+
     public function __construct(moodle_page $page) {
         global $CFG;
         if (during_initial_install()) {
@@ -3141,8 +3143,8 @@ class navbar extends navigation_node {
      * Gets a navigation node
      *
      * @param string|int $key for referencing the navbar nodes
-     * @param int $type navigation_node::TYPE_*
-     * @return navigation_node|bool
+     * @param int $type breadcrumb_navigation_node::TYPE_*
+     * @return breadcrumb_navigation_node|bool
      */
     public function get($key, $type = null) {
         foreach ($this->children as &$child) {
@@ -3158,7 +3160,7 @@ class navbar extends navigation_node {
         return false;
     }
     /**
-     * Returns an array of navigation_node's that make up the navbar.
+     * Returns an array of breadcrumb_navigation_nodes that make up the navbar.
      *
      * @return array
      */
@@ -3190,7 +3192,7 @@ class navbar extends navigation_node {
                 // Parse a combined navigation tree
                 while ($settingsactivenode && $settingsactivenode->parent !== null) {
                     if (!$settingsactivenode->mainnavonly) {
-                        $items[] = $settingsactivenode;
+                        $items[] = new breadcrumb_navigation_node($settingsactivenode);
                     }
                     $settingsactivenode = $settingsactivenode->parent;
                 }
@@ -3200,12 +3202,14 @@ class navbar extends navigation_node {
                 }
                 while ($navigationactivenode && $navigationactivenode->parent !== null) {
                     if (!$navigationactivenode->mainnavonly) {
-                        $items[] = $navigationactivenode;
+                        $items[] = new breadcrumb_navigation_node($navigationactivenode);
                     }
                     if (!empty($CFG->navshowcategories) &&
                             $navigationactivenode->type === self::TYPE_COURSE &&
                             $navigationactivenode->parent->key === 'currentcourse') {
-                        $items = array_merge($items, $this->get_course_categories());
+                        foreach ($this->get_course_categories() as $item) {
+                            $items[] = new breadcrumb_navigation_node($item);
+                        }
                     }
                     $navigationactivenode = $navigationactivenode->parent;
                 }
@@ -3213,12 +3217,14 @@ class navbar extends navigation_node {
                 // Parse the navigation tree to get the active node
                 while ($navigationactivenode && $navigationactivenode->parent !== null) {
                     if (!$navigationactivenode->mainnavonly) {
-                        $items[] = $navigationactivenode;
+                        $items[] = new breadcrumb_navigation_node($navigationactivenode);
                     }
                     if (!empty($CFG->navshowcategories) &&
                             $navigationactivenode->type === self::TYPE_COURSE &&
                             $navigationactivenode->parent->key === 'currentcourse') {
-                        $items = array_merge($items, $this->get_course_categories());
+                        foreach ($this->get_course_categories() as $item) {
+                            $items[] = new breadcrumb_navigation_node($item);
+                        }
                     }
                     $navigationactivenode = $navigationactivenode->parent;
                 }
@@ -3226,18 +3232,18 @@ class navbar extends navigation_node {
                 // Parse the settings navigation to get the active node
                 while ($settingsactivenode && $settingsactivenode->parent !== null) {
                     if (!$settingsactivenode->mainnavonly) {
-                        $items[] = $settingsactivenode;
+                        $items[] = new breadcrumb_navigation_node($settingsactivenode);
                     }
                     $settingsactivenode = $settingsactivenode->parent;
                 }
             }
         }
 
-        $items[] = new navigation_node(array(
-            'text'=>$this->page->navigation->text,
-            'shorttext'=>$this->page->navigation->shorttext,
-            'key'=>$this->page->navigation->key,
-            'action'=>$this->page->navigation->action
+        $items[] = new breadcrumb_navigation_node(array(
+            'text' => $this->page->navigation->text,
+            'shorttext' => $this->page->navigation->shorttext,
+            'key' => $this->page->navigation->key,
+            'action' => $this->page->navigation->action
         ));
 
         if (count($this->prependchildren) > 0) {
@@ -3274,7 +3280,7 @@ class navbar extends navigation_node {
                 }
                 $url = new moodle_url('/course/index.php', array('categoryid' => $category->id));
                 $name = format_string($category->name, true, array('context' => context_coursecat::instance($category->id)));
-                $categorynode = navigation_node::create($name, $url, self::TYPE_CATEGORY, null, $category->id);
+                $categorynode = breadcrumb_navigation_node::create($name, $url, self::TYPE_CATEGORY, null, $category->id);
                 if (!$category->visible) {
                     $categorynode->hidden = true;
                 }
@@ -3287,7 +3293,7 @@ class navbar extends navigation_node {
             $courses = $this->page->navigation->get('courses');
             if (!$courses) {
                 // Courses node may not be present.
-                $courses = navigation_node::create(
+                $courses = breadcrumb_navigation_node::create(
                     get_string('courses'),
                     new moodle_url('/course/index.php'),
                     self::TYPE_CONTAINER
@@ -3300,9 +3306,9 @@ class navbar extends navigation_node {
     }
 
     /**
-     * Add a new navigation_node to the navbar, overrides parent::add
+     * Add a new breadcrumb_navigation_node to the navbar, overrides parent::add
      *
-     * This function overrides {@link navigation_node::add()} so that we can change
+     * This function overrides {@link breadcrumb_navigation_node::add()} so that we can change
      * the way nodes get added to allow us to simply call add and have the node added to the
      * end of the navbar
      *
@@ -3345,7 +3351,7 @@ class navbar extends navigation_node {
         // Set the parent to this node
         $itemarray['parent'] = $this;
         // Add the child using the navigation_node_collections add method
-        $this->children[] = new navigation_node($itemarray);
+        $this->children[] = new breadcrumb_navigation_node($itemarray);
         return $this;
     }
 
@@ -3390,11 +3396,44 @@ class navbar extends navigation_node {
         // Set the parent to this node.
         $itemarray['parent'] = $this;
         // Add the child node to the prepend list.
-        $this->prependchildren[] = new navigation_node($itemarray);
+        $this->prependchildren[] = new breadcrumb_navigation_node($itemarray);
         return $this;
     }
 }
 
+/**
+ * Subclass of navigation_node allowing different rendering for the breadcrumbs
+ * in particular adding extra metadata for search engine robots to leverage.
+ *
+ * @package   core
+ * @category  navigation
+ * @copyright 2015 Brendan Heywood
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class breadcrumb_navigation_node extends navigation_node {
+
+    /**
+     * A proxy constructor
+     *
+     * @param mixed $navnode A navigation_node or an array
+     */
+    public function __construct($navnode) {
+        if (is_array($navnode)) {
+            parent::__construct($navnode);
+        } else if ($navnode instanceof navigation_node) {
+
+            // Just clone everything.
+            $objvalues = get_object_vars($navnode);
+            foreach ($objvalues as $key => $value) {
+                 $this->$key = $value;
+            }
+        } else {
+            throw coding_exception('Not a valid breadcrumb_navigation_node');
+        }
+    }
+
+}
+
 /**
  * Class used to manage the settings option for the current page
  *
index e1ada8a..64e0299 100644 (file)
@@ -1078,6 +1078,7 @@ class theme_config {
      * @return bool|string Return false when the compilation failed. Else the compiled string.
      */
     protected function get_css_content_from_less($themedesigner) {
+        global $CFG;
 
         $lessfile = $this->lessfile;
         if (!$lessfile || !is_readable($this->dir . '/less/' . $lessfile . '.less')) {
@@ -1106,7 +1107,8 @@ class theme_config {
         if ($themedesigner) {
             // Add the sourceMap inline to ensure that it is atomically generated.
             $options['sourceMap'] = true;
-            $options['sourceRoot'] = 'theme';
+            $options['sourceMapBasepath'] = $CFG->dirroot;
+            $options['sourceMapRootpath'] = $CFG->wwwroot;
         }
 
         // Instantiate the compiler.
index 99f4cb2..35fba72 100644 (file)
@@ -3340,6 +3340,39 @@ EOD;
         return $navbarcontent;
     }
 
+    /**
+     * Renders a breadcrumb navigation node object.
+     *
+     * @param breadcrumb_navigation_node $item The navigation node to render.
+     * @return string HTML fragment
+     */
+    protected function render_breadcrumb_navigation_node(breadcrumb_navigation_node $item) {
+
+        if ($item->action instanceof moodle_url) {
+            $content = $item->get_content();
+            $title = $item->get_title();
+            $attributes = array();
+            $attributes['itemprop'] = 'url';
+            if ($title !== '') {
+                $attributes['title'] = $title;
+            }
+            if ($item->hidden) {
+                $attributes['class'] = 'dimmed_text';
+            }
+            $content = html_writer::tag('span', $content, array('itemprop' => 'title'));
+            $content = html_writer::link($item->action, $content, $attributes);
+
+            $attributes = array();
+            $attributes['itemscope'] = '';
+            $attributes['itemtype'] = 'http://data-vocabulary.org/Breadcrumb';
+            $content = html_writer::tag('span', $content, $attributes);
+
+        } else {
+            $content = $this->render_navigation_node($item);
+        }
+        return $content;
+    }
+
     /**
      * Renders a navigation node object.
      *
index 2c51010..b862179 100644 (file)
@@ -83,12 +83,22 @@ class HTML_Common {
      * @param    int     $tabOffset      Indent offset in tabs
      * @access   public
      */
-    function HTML_Common($attributes = null, $tabOffset = 0)
+    public function __construct($attributes = null, $tabOffset = 0)
     {
         $this->setAttributes($attributes);
         $this->setTabOffset($tabOffset);
     } // end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_Common($attributes = null, $tabOffset = 0) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($attributes, $tabOffset);
+    }
+
     public static function raiseError($message = null,
                                        $code = null,
                                        $mode = null,
index 6da6ff4..bf8062e 100644 (file)
@@ -253,9 +253,9 @@ class HTML_QuickForm extends HTML_Common {
      * @param    bool        $trackSubmit       (optional)Whether to track if the form was submitted by adding a special hidden field
      * @access   public
      */
-    function HTML_QuickForm($formName='', $method='post', $action='', $target='', $attributes=null, $trackSubmit = false)
+    public function __construct($formName='', $method='post', $action='', $target='', $attributes=null, $trackSubmit = false)
     {
-        HTML_Common::HTML_Common($attributes);
+        parent::__construct($attributes);
         $method = (strtoupper($method) == 'GET') ? 'get' : 'post';
         $action = ($action == '') ? $_SERVER['PHP_SELF'] : $action;
         $target = empty($target) ? array() : array('target' => $target);
@@ -301,6 +301,16 @@ class HTML_QuickForm extends HTML_Common {
         }
     } // end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm($formName='', $method='post', $action='', $target='', $attributes=null, $trackSubmit = false) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($formName, $method, $action, $target, $attributes, $trackSubmit);
+    }
+
     // }}}
     // {{{ apiVersion()
 
@@ -1983,16 +1993,27 @@ class HTML_QuickForm_Error extends PEAR_Error {
     * @param int   $level intensity of the error (PHP error code)
     * @param mixed $debuginfo any information that can inform user as to nature of the error
     */
-    function HTML_QuickForm_Error($code = QUICKFORM_ERROR, $mode = PEAR_ERROR_RETURN,
+    public function __construct($code = QUICKFORM_ERROR, $mode = PEAR_ERROR_RETURN,
                          $level = E_USER_NOTICE, $debuginfo = null)
     {
         if (is_int($code)) {
-            $this->PEAR_Error(HTML_QuickForm::errorMessage($code), $code, $mode, $level, $debuginfo);
+            parent::__construct(HTML_QuickForm::errorMessage($code), $code, $mode, $level, $debuginfo);
         } else {
-            $this->PEAR_Error("Invalid error code: $code", QUICKFORM_ERROR, $mode, $level, $debuginfo);
+            parent::__construct("Invalid error code: $code", QUICKFORM_ERROR, $mode, $level, $debuginfo);
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Error($code = QUICKFORM_ERROR, $mode = PEAR_ERROR_RETURN,
+                         $level = E_USER_NOTICE, $debuginfo = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($code, $mode, $level, $debuginfo);
+    }
+
     // }}}
 } // end class HTML_QuickForm_Error
 ?>
index 7162c64..324fbf7 100644 (file)
@@ -33,10 +33,19 @@ class HTML_QuickForm_Renderer
     *
     * @access public
     */
-    function HTML_QuickForm_Renderer()
-    {
+    public function __construct() {
     } // end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Renderer() {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct();
+    }
+
    /**
     * Called when visiting a form, before processing any form elements
     *
index ee0c4ce..a91d90b 100644 (file)
@@ -147,13 +147,21 @@ class HTML_QuickForm_Renderer_Array extends HTML_QuickForm_Renderer
     * @param  bool    true: render an array of labels to many labels, $key 0 to 'label' and the oterh to "label_$key"
     * @access public
     */
-    function HTML_QuickForm_Renderer_Array($collectHidden = false, $staticLabels = false)
-    {
-        $this->HTML_QuickForm_Renderer();
+    public function __construct($collectHidden = false, $staticLabels = false) {
+        parent::__construct();
         $this->_collectHidden = $collectHidden;
         $this->_staticLabels  = $staticLabels;
     } // end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Renderer_Array($collectHidden = false, $staticLabels = false) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($collectHidden, $staticLabels);
+    }
 
    /**
     * Returns the resultant array
index 5eeee14..7c54c13 100644 (file)
@@ -141,9 +141,18 @@ class HTML_QuickForm_Renderer_Default extends HTML_QuickForm_Renderer
     *
     * @access public
     */
-    function HTML_QuickForm_Renderer_Default()
-    {
-        $this->HTML_QuickForm_Renderer();
+    public function __construct() {
+        parent::__construct();
+    } // end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Renderer_Default() {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct();
     } // end constructor
 
    /**
index 9ed495c..9928a0b 100644 (file)
@@ -78,13 +78,22 @@ class HTML_QuickForm_Renderer_Object extends HTML_QuickForm_Renderer
      * @param collecthidden bool    true: collect all hidden elements
      * @access public
      */
-    function HTML_QuickForm_Renderer_Object($collecthidden = false) 
-    {
-        $this->HTML_QuickForm_Renderer();
+    public function __construct($collecthidden = false) {
+        parent::__construct();
         $this->_collectHidden = $collecthidden;
         $this->_obj = new QuickformForm;
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Renderer_Object($collecthidden = false) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($collecthidden);
+    }
+
     /**
      * Return the rendered Object
      * @access public
index 7326ede..4ef5a33 100644 (file)
@@ -118,11 +118,20 @@ class HTML_QuickForm_Renderer_Tableless extends HTML_QuickForm_Renderer_Default
     *
     * @access public
     */
-    function HTML_QuickForm_Renderer_Tableless()
-    {
-        $this->HTML_QuickForm_Renderer_Default();
+    public function __construct() {
+        parent::__construct();
     } // end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_Renderer_Tableless() {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct();
+    }
+
    /**
     * Called when visiting a header element
     *
index cc14b71..896fa27 100644 (file)
@@ -77,12 +77,21 @@ class HTML_QuickForm_advcheckbox extends HTML_QuickForm_checkbox
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null)
-    {
-        $this->HTML_QuickForm_checkbox($elementName, $elementLabel, $text, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null) {
+        parent::__construct($elementName, $elementLabel, $text, $attributes);
         $this->setValues($values);
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_advcheckbox($elementName=null, $elementLabel=null, $text=null, $attributes=null, $values=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $attributes, $values);
+    }
+
     // }}}
     // {{{ getPrivateName()
 
index c39bd8d..acfbd20 100644 (file)
@@ -75,9 +75,8 @@ class HTML_QuickForm_autocomplete extends HTML_QuickForm_text
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_autocomplete($elementName = null, $elementLabel = null, $options = null, $attributes = null)
-    {
-        $this->HTML_QuickForm_text($elementName, $elementLabel, $attributes);
+    public function __construct($elementName = null, $elementLabel = null, $options = null, $attributes = null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_type = 'autocomplete';
         if (isset($options)) {
@@ -85,6 +84,16 @@ class HTML_QuickForm_autocomplete extends HTML_QuickForm_text
         }
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_autocomplete($elementName = null, $elementLabel = null, $options = null, $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     // }}}
     // {{{ setOptions()
 
index bf6f10e..95e975f 100644 (file)
@@ -45,13 +45,22 @@ class HTML_QuickForm_button extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_button($elementName=null, $value=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, null, $attributes);
         $this->_persistantFreeze = false;
         $this->setValue($value);
         $this->setType('button');
     } //end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_button($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
+    }
     
     // }}}
     // {{{ freeze()
index 100f8e7..f305fc5 100644 (file)
@@ -57,15 +57,24 @@ class HTML_QuickForm_checkbox extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $text='', $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_text = $text;
         $this->setType('checkbox');
         $this->updateAttributes(array('value'=>1));
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_checkbox($elementName=null, $elementLabel=null, $text='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $attributes);
+    }
+
     // }}}
     // {{{ setChecked()
 
index 495e76e..c0090e4 100644 (file)
@@ -266,9 +266,9 @@ class HTML_QuickForm_date extends HTML_QuickForm_group
     * @param    array   Options to control the element's display
     * @param    mixed   Either a typical HTML attribute string or an associative array
     */
-    function HTML_QuickForm_date($elementName = null, $elementLabel = null, $options = array(), $attributes = null)
-    {
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_appendName = true;
         $this->_type = 'date';
@@ -288,6 +288,16 @@ class HTML_QuickForm_date extends HTML_QuickForm_group
         }
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_date($elementName = null, $elementLabel = null, $options = array(), $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     // }}}
     // {{{ _createElements()
 
index a0a600c..dc615f5 100644 (file)
@@ -80,9 +80,8 @@ class HTML_QuickForm_element extends HTML_Common
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_element($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        HTML_Common::HTML_Common($attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($attributes);
         if (isset($elementName)) {
             $this->setName($elementName);
         }
@@ -90,6 +89,16 @@ class HTML_QuickForm_element extends HTML_Common
             $this->setLabel($elementLabel);
         }
     } //end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_element($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
     
     // }}}
     // {{{ apiVersion()
@@ -359,8 +368,7 @@ class HTML_QuickForm_element extends HTML_Common
     {
         switch ($event) {
             case 'createElement':
-                $className = get_class($this);
-                $this->$className($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]);
+                static::__construct($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]);
                 break;
             case 'addElement':
                 $this->onQuickFormEvent('createElement', $arg, $caller);
index a8906f5..b698b67 100644 (file)
@@ -61,12 +61,21 @@ class HTML_QuickForm_file extends HTML_QuickForm_input
      * @since     1.0
      * @access    public
      */
-    function HTML_QuickForm_file($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->setType('file');
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_file($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
+
     // }}}
     // {{{ setSize()
 
@@ -176,8 +185,7 @@ class HTML_QuickForm_file extends HTML_QuickForm_input
                 return $this->onQuickFormEvent('updateValue', null, $caller);
                 break;
             case 'createElement':
-                $className = get_class($this);
-                $this->$className($arg[0], $arg[1], $arg[2]);
+                static::__construct($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]);
                 break;
         }
         return true;
index 229d697..b400964 100644 (file)
@@ -92,9 +92,8 @@ class HTML_QuickForm_group extends HTML_QuickForm_element
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_group($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true)
-    {
-        $this->HTML_QuickForm_element($elementName, $elementLabel);
+    public function __construct($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true) {
+        parent::__construct($elementName, $elementLabel);
         $this->_type = 'group';
         if (isset($elements) && is_array($elements)) {
             $this->setElements($elements);
@@ -107,6 +106,16 @@ class HTML_QuickForm_group extends HTML_QuickForm_element
         }
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_group($elementName=null, $elementLabel=null, $elements=null, $separator=null, $appendName = true) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $elements, $separator, $appendName);
+    }
+
     // }}}
     // {{{ setName()
 
index b13eb2d..6ba301c 100644 (file)
@@ -38,12 +38,21 @@ class HTML_QuickForm_header extends HTML_QuickForm_static
     * @access public
     * @return void
     */
-    function HTML_QuickForm_header($elementName = null, $text = null)
-    {
-        $this->HTML_QuickForm_static($elementName, null, $text);
+    public function __construct($elementName = null, $text = null) {
+        parent::__construct($elementName, null, $text);
         $this->_type = 'header';
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_header($elementName = null, $text = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $text);
+    }
+
     // }}}
     // {{{ accept()
 
index e758aee..edbade9 100644 (file)
@@ -45,13 +45,22 @@ class HTML_QuickForm_hidden extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_hidden($elementName=null, $value='', $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+    public function __construct($elementName=null, $value='', $attributes=null) {
+        parent::__construct($elementName, null, $attributes);
         $this->setType('hidden');
         $this->setValue($value);
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_hidden($elementName=null, $value='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        return self::__construct($elementName, $value, $attributes);
+    }
+
     // }}}
     // {{{ freeze()
 
index 458aa5c..acafa4f 100644 (file)
@@ -49,9 +49,9 @@ class HTML_QuickForm_hiddenselect extends HTML_QuickForm_select
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_hiddenselect($elementName=null, $elementLabel=null, $options=null, $attributes=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_type = 'hiddenselect';
         if (isset($options)) {
@@ -59,6 +59,16 @@ class HTML_QuickForm_hiddenselect extends HTML_QuickForm_select
         }
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_hiddenselect($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $options, $attributes);
+    }
+
     // }}}
     // {{{ toHtml()
 
index 25de466..3762229 100644 (file)
@@ -114,9 +114,9 @@ class HTML_QuickForm_hierselect extends HTML_QuickForm_group
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_hierselect($elementName=null, $elementLabel=null, $attributes=null, $separator=null)
-    {
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null, $separator=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         if (isset($separator)) {
             $this->_separator = $separator;
@@ -125,6 +125,16 @@ class HTML_QuickForm_hierselect extends HTML_QuickForm_group
         $this->_appendName = true;
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_hierselect($elementName=null, $elementLabel=null, $attributes=null, $separator=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes, $separator);
+    }
+
     // }}}
     // {{{ setOptions()
 
index 10b773e..a8c6f01 100644 (file)
@@ -40,12 +40,21 @@ class HTML_QuickForm_html extends HTML_QuickForm_static
     * @access public
     * @return void
     */
-    function HTML_QuickForm_html($text = null)
-    {
-        $this->HTML_QuickForm_static(null, null, $text);
+    public function __construct($text = null) {
+        parent::__construct(null, null, $text);
         $this->_type = 'html';
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_html($text = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($text);
+    }
+
     // }}}
     // {{{ accept()
 
index a3cc2e3..3cdef2b 100644 (file)
@@ -44,13 +44,22 @@ class HTML_QuickForm_image extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_image($elementName=null, $src='', $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+    public function __construct($elementName=null, $src='', $attributes=null) {
+        parent::__construct($elementName, null, $attributes);
         $this->setType('image');
         $this->setSource($src);
     } // end class constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_image($elementName=null, $src='', $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $src, $attributes);
+    }
+
     // }}}
     // {{{ setSource()
 
index f182e7e..aa197d1 100644 (file)
@@ -45,11 +45,20 @@ class HTML_QuickForm_input extends HTML_QuickForm_element
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_input($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_input($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
+
     // }}}
     // {{{ setType()
 
index 947f76c..7278740 100644 (file)
@@ -57,15 +57,25 @@ class HTML_QuickForm_link extends HTML_QuickForm_static
      * @return    void
      * @throws    
      */
-    function HTML_QuickForm_link($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = false;
         $this->_type = 'link';
         $this->setHref($href);
         $this->_text = $text;
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_link($elementName=null, $elementLabel=null, $href=null, $text=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $href, $text, $attributes);
+    }
+
     // }}}
     // {{{ setName()
 
index a83d505..6d4c730 100644 (file)
@@ -46,11 +46,20 @@ class HTML_QuickForm_password extends HTML_QuickForm_input
      * @return    void
      * @throws    
      */
-    function HTML_QuickForm_password($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->setType('password');
     } //end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_password($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
     
     // }}}
     // {{{ setSize()
index 2632026..b3569fd 100644 (file)
@@ -57,9 +57,9 @@ class HTML_QuickForm_radio extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null)
-    {
-        $this->HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) {
+        // TODO MDL-52313 Replace with the call to parent::__construct().
+        HTML_QuickForm_element::__construct($elementName, $elementLabel, $attributes);
         if (isset($value)) {
             $this->setValue($value);
         }
@@ -68,6 +68,16 @@ class HTML_QuickForm_radio extends HTML_QuickForm_input
         $this->_text = $text;
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_radio($elementName=null, $elementLabel=null, $text=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text, $value, $attributes);
+    }
+
     // }}}
 
     function _generateId() {
index 3533653..62ee12f 100644 (file)
@@ -45,13 +45,22 @@ class HTML_QuickForm_reset extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_reset($elementName=null, $value=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, null, $attributes);
         $this->setValue($value);
         $this->setType('reset');
     } //end constructor
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_reset($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
+    }
+
     // }}}
     // {{{ freeze()
 
index f15ad8b..eda8438 100644 (file)
@@ -66,15 +66,24 @@ class HTML_QuickForm_select extends HTML_QuickForm_element {
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_type = 'select';
         if (isset($options)) {
             $this->load($options);
         }
     } //end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_select($elementName=null, $elementLabel=null, $options=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
     
     // }}}
     // {{{ apiVersion()
index 6987931..728eabd 100644 (file)
@@ -49,14 +49,23 @@ class HTML_QuickForm_static extends HTML_QuickForm_element {
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_static($elementName=null, $elementLabel=null, $text=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel);
+    public function __construct($elementName=null, $elementLabel=null, $text=null) {
+        parent::__construct($elementName, $elementLabel);
         $this->_persistantFreeze = false;
         $this->_type = 'static';
         $this->_text = $text;
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_static($elementName=null, $elementLabel=null, $text=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $text);
+    }
+
     // }}}
     // {{{ setName()
 
index e1d3e7d..6ca23a4 100644 (file)
@@ -44,13 +44,22 @@ class HTML_QuickForm_submit extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_submit($elementName=null, $value=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, null, $attributes);
+    public function __construct($elementName=null, $value=null, $attributes=null) {
+        parent::__construct($elementName, null, $attributes);
         $this->setValue($value);
         $this->setType('submit');
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_submit($elementName=null, $value=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $value, $attributes);
+    }
+
     // }}}
     // {{{ freeze()
 
index 9d6d9de..042e508 100644 (file)
@@ -46,12 +46,21 @@ class HTML_QuickForm_text extends HTML_QuickForm_input
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_text($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->setType('text');
     } //end constructor
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_text($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
         
     // }}}
     // {{{ setSize()
index 7aa0af2..9967f59 100644 (file)
@@ -55,13 +55,22 @@ class HTML_QuickForm_textarea extends HTML_QuickForm_element
      * @access    public
      * @return    void
      */
-    function HTML_QuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null)
-    {
-        HTML_QuickForm_element::HTML_QuickForm_element($elementName, $elementLabel, $attributes);
+    public function __construct($elementName=null, $elementLabel=null, $attributes=null) {
+        parent::__construct($elementName, $elementLabel, $attributes);
         $this->_persistantFreeze = true;
         $this->_type = 'textarea';
     } //end constructor
-    
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_textarea($elementName=null, $elementLabel=null, $attributes=null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementLabel, $attributes);
+    }
+
     // }}}
     // {{{ setName()
 
index dd01995..b8f972b 100644 (file)
@@ -44,14 +44,22 @@ class HTML_QuickForm_xbutton extends HTML_QuickForm_element
     * @param    mixed   Either a typical HTML attribute string or an associative array
     * @access   public
     */
-    function HTML_QuickForm_xbutton($elementName = null, $elementContent = null, $attributes = null)
-    {
-        $this->HTML_QuickForm_element($elementName, null, $attributes);
+    public function __construct($elementName = null, $elementContent = null, $attributes = null) {
+        parent::__construct($elementName, null, $attributes);
         $this->setContent($elementContent);
         $this->setPersistantFreeze(false);
         $this->_type = 'xbutton';
     }
 
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function HTML_QuickForm_xbutton($elementName = null, $elementContent = null, $attributes = null) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($elementName, $elementContent, $attributes);
+    }
 
     function toHtml()
     {
index 69b2655..4e7c901 100644 (file)
@@ -146,7 +146,7 @@ class PEAR
      * @access public
      * @return void
      */
-    function PEAR($error_class = null)
+    function __construct($error_class = null)
     {
         $classname = strtolower(get_class($this));
         if ($this->_debug) {
@@ -173,6 +173,18 @@ class PEAR
         }
     }
 
+    /**
+     * Only here for backwards compatibility.
+     * E.g. Archive_Tar calls $this->PEAR() in its constructor.
+     *
+     * @param string $error_class Which class to use for error objects,
+     *                            defaults to PEAR_Error.
+     */
+    public function PEAR($error_class = null)
+    {
+        $this->__construct($error_class);
+    }
+
     /**
      * Destructor (the emulated type of...).  Does nothing right now,
      * but is included for forward compatibility, so subclass
@@ -823,7 +835,7 @@ class PEAR_Error
      * @access public
      *
      */
-    function PEAR_Error($message = 'unknown error', $code = null,
+    function __construct($message = 'unknown error', $code = null,
                         $mode = null, $options = null, $userinfo = null)
     {
         if ($mode === null) {
@@ -896,6 +908,14 @@ class PEAR_Error
         }
     }
 
+    /**
+     * Old syntax of class constructor for backward compatibility.
+     */
+    public function PEAR_Error($message = 'unknown error', $code = null,
+                        $mode = null, $options = null, $userinfo = null) {
+        self::__construct($message, $code, $mode, $options, $userinfo);
+    }
+
     /**
      * Get the error mode from an error object.
      *
index 5b70ba4..4dc1fb4 100644 (file)
@@ -27,3 +27,10 @@ Most probably we will stop using this library in the future.
 MDL-20876 - replaced split() with explode() or preg_split() where appropriate
 MDL-40267 - Moodle core_text strlen functions used for range rule rule to be utf8 safe.
 MDL-46467 - $mform->hardfreeze causes labels to loose their for HTML attribute
+MDL-52081 - made all constructors PHP7 compatible
+
+
+Pear
+====
+Changed constructors in classes PEAR and PEAR_ERROR to be __construct(). This has
+been already changed upstream in 1.10.0, remove this line after upgrade.
\ No newline at end of file
diff --git a/lib/tests/fixtures/upload_users_profile.csv b/lib/tests/fixtures/upload_users_profile.csv
new file mode 100644 (file)
index 0000000..b15db76
--- /dev/null
@@ -0,0 +1,3 @@
+username,password,firstname,lastname,email,profile_field_superfield
+jonest,verysecret,Tom,Jones,jonest@someplace.edu,The big guy
+reznort,somesecret,Trent,Reznor,reznort@someplace.edu,Loves cats
index 78b2a2d..c976de3 100644 (file)
@@ -869,6 +869,14 @@ class core_moodlelib_testcase extends advanced_testcase {
             "tags that ...</blockquote></p></div>", shorten_text($text));
     }
 
+    public function test_shorten_text_with_tags_and_html_comment() {
+        $text = "<div class='frog'><p><blockquote><!--[if !IE]><!-->Long text with ".
+            "tags that will<!--<![endif]--> ".
+            "be chopped off but <b>should be added back again</b></blockquote></p></div>";
+        $this->assertEquals("<div class='frog'><p><blockquote><!--[if !IE]><!-->Long text with " .
+            "tags that ...<!--<![endif]--></blockquote></p></div>", shorten_text($text));
+    }
+
     public function test_shorten_text_with_entities() {
         // Remember to allow 3 chars for the final '...'.
         // ......123456789012345678901234567_____890...
index e93691c..0a33a15 100644 (file)
@@ -11,6 +11,18 @@ information provided here is intended especially for developers.
 * Ajax calls going through lib/ajax/* now validate the return values before sending
   the response. If the validation does not pass an exception is raised. This behaviour
   is consistent with web services.
+* Several changes in Moodle core, standard plugins and third party libraries to
+  ensure compatibility with PHP7. All plugins are recommended to perform testing
+  against PHP7 as well. The following changes may affect you:
+  * Class moodleform, moodleform_mod and some module classes have been changed to use
+    __construct() for the constructor. Calling parent constructors by the class
+    name will display debugging message. Incorrect: parent::moodleform(),
+    correct: parent::__construct()
+  * All form elements have also changed the constructor syntax. No changes are
+    needed for using form elements, however if plugin defines new form element it
+    needs to use correct syntax. For example, incorrect: parent::HTML_QuickForm_input(),
+    HTML_QuickForm_input::HTML_QuickForm_input(), $this->HTML_QuickForm_input().
+    Correct: HTML_QuickForm_input::__construct() or parent::__construct().
 
 === 3.0 ===
 
diff --git a/mod/assign/feedback/editpdf/fpdi/ASL20.txt b/mod/assign/feedback/editpdf/fpdi/ASL20.txt
deleted file mode 100644 (file)
index d645695..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/mod/assign/feedback/editpdf/fpdi/LICENSE b/mod/assign/feedback/editpdf/fpdi/LICENSE
new file mode 100644 (file)
index 0000000..7b4f530
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)\r
+\r
+Copyright (c) 2015 Setasign - Jan Slabon, https://www.setasign.com\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in\r
+all copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+THE SOFTWARE.
\ No newline at end of file
index e16ac05..b7e8966 100644 (file)
@@ -1,21 +1,12 @@
 <?php
-//
-//  FPDI - Version 1.5.4
-//
-//    Copyright 2004-2015 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
+/**
+ * This file is part of FPDI
+ *
+ * @package   FPDI
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)
+ * @license   http://opensource.org/licenses/mit-license The MIT License
+ * @version   1.6.1
+ */
 
 /**
  * Class FilterASCII85
@@ -66,8 +57,10 @@ class FilterASCII85
             if ($state == 5) {
                 $state = 0;
                 $r = 0;
-                for ($j = 0; $j < 5; ++$j)
-                    $r = $r * 85 + $chn[$j];
+                for ($j = 0; $j < 5; ++$j) {
+                    $r = (int)($r * 85 + $chn[$j]);
+                }
+
                 $out .= chr($r >> 24);
                 $out .= chr($r >> 16);
                 $out .= chr($r >> 8);
diff --git a/mod/assign/feedback/editpdf/fpdi/filters/FilterASCII85_FPDI.php b/mod/assign/feedback/editpdf/fpdi/filters/FilterASCII85_FPDI.php
deleted file mode 100644 (file)
index 03413eb..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php\r
-//\r
-//  FPDI - Version 1.4.4\r
-//\r
-//    Copyright 2004-2013 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
-\r
-require_once('FilterASCII85.php');\r
-\r
-class FilterASCII85_FPDI extends FilterASCII85 {\r
-\r
-    var $fpdi;\r
-    \r
-    function FilterASCII85_FPDI(&$fpdi) {\r
-        $this->fpdi =& $fpdi;\r
-    }\r
-\r
-    function error($msg) {\r
-        $this->fpdi->error($msg);\r
-    }\r
-}
\ No newline at end of file
index 37c5986..66ddae4 100644 (file)
@@ -1,21 +1,12 @@
 <?php\r
-//\r
-//  FPDI - Version 1.5.4\r
-//\r
-//    Copyright 2004-2015 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
+/**\r
+ * This file is part of FPDI\r
+ *\r
+ * @package   FPDI\r
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)\r
+ * @license   http://opensource.org/licenses/mit-license The MIT License\r
+ * @version   1.6.1\r
+ */\r
 \r
 /**\r
  * Class FilterASCIIHexDecode\r
index d2ebfeb..f855d22 100644 (file)
@@ -1,21 +1,12 @@
 <?php
-//
-//  FPDI - Version 1.5.4
-//
-//    Copyright 2004-2015 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
+/**
+ * This file is part of FPDI
+ *
+ * @package   FPDI
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)
+ * @license   http://opensource.org/licenses/mit-license The MIT License
+ * @version   1.6.1
+ */
 
 /**
  * Class FilterLZW
diff --git a/mod/assign/feedback/editpdf/fpdi/filters/FilterLZW_FPDI.php b/mod/assign/feedback/editpdf/fpdi/filters/FilterLZW_FPDI.php
deleted file mode 100644 (file)
index decc170..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php\r
-//\r
-//  FPDI - Version 1.4.4\r
-//\r
-//    Copyright 2004-2013 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
-\r
-require_once('FilterLZW.php');\r
-\r
-class FilterLZW_FPDI extends FilterLZW {\r
-\r
-    var $fpdi;\r
-\r
-    function FilterLZW_FPDI(&$fpdi) {\r
-        $this->fpdi =& $fpdi;\r
-    }\r
-    \r
-    function error($msg) {\r
-        $this->fpdi->error($msg);\r
-    }\r
-}
\ No newline at end of file
index dbaa1f2..de746dd 100644 (file)
@@ -1,21 +1,12 @@
 <?php
-//
-//  FPDI - Version 1.5.4
-//
-//    Copyright 2004-2015 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
+/**
+ * This file is part of FPDI
+ *
+ * @package   FPDI
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)
+ * @license   http://opensource.org/licenses/mit-license The MIT License
+ * @version   1.6.1
+ */
 
 if (!class_exists('fpdi_bridge')) {
     require_once('fpdi_bridge.php');
@@ -256,7 +247,7 @@ class FPDF_TPL extends fpdi_bridge
         );
 
         $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm',
-                $tplData['scaleX'], $tplData['scaleY'], $tplData['tx'] * $this->k, $tplData['ty'] * $this->k)
+            $tplData['scaleX'], $tplData['scaleY'], $tplData['tx'] * $this->k, $tplData['ty'] * $this->k)
         ); // Translate
         $this->_out(sprintf('%s%d Do Q', $this->tplPrefix, $tplIdx));
 
@@ -362,7 +353,7 @@ class FPDF_TPL extends fpdi_bridge
      * @see http://fpdf.org/en/doc/addpage.htm
      * @see http://www.tcpdf.org/doc/code/classTCPDF.html#a5171e20b366b74523709d84c349c1ced
      */
-    public function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false)
+    public function AddPage($orientation = '', $format = '', $rotationOrKeepmargins = false, $tocpage = false)
     {
         if (is_subclass_of($this, 'TCPDF')) {
             $args = func_get_args();
@@ -373,7 +364,7 @@ class FPDF_TPL extends fpdi_bridge
             throw new LogicException('Adding pages in templates is not possible!');
         }
 
-        parent::AddPage($orientation, $format);
+        parent::AddPage($orientation, $format, $rotationOrKeepmargins);
     }
 
     /**
index c81cd9f..8ecc661 100644 (file)
@@ -1,21 +1,12 @@
 <?php\r
-//\r
-//  FPDI - Version 1.5.4\r
-//\r
-//    Copyright 2004-2015 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
+/**\r
+ * This file is part of FPDI\r
+ *\r
+ * @package   FPDI\r
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)\r
+ * @license   http://opensource.org/licenses/mit-license The MIT License\r
+ * @version   1.6.1\r
+ */\r
 \r
 if (!class_exists('FPDF_TPL')) {\r
     require_once('fpdf_tpl.php');\r
@@ -31,7 +22,7 @@ class FPDI extends FPDF_TPL
      *\r
      * @string\r
      */\r
-    const VERSION = '1.5.3';\r
+    const VERSION = '1.6.1';\r
 \r
     /**\r
      * Actual filename\r
@@ -129,7 +120,7 @@ class FPDI extends FPDF_TPL
         if (!class_exists('fpdi_pdf_parser')) {\r
             require_once('fpdi_pdf_parser.php');\r
         }\r
-       return new fpdi_pdf_parser($filename);\r
+        return new fpdi_pdf_parser($filename);\r
     }\r
     \r
     /**\r
@@ -139,8 +130,8 @@ class FPDI extends FPDF_TPL
      */\r
     public function getPdfVersion()\r
     {\r
-               return $this->PDFVersion;\r
-       }\r
+        return $this->PDFVersion;\r
+    }\r
     \r
     /**\r
      * Set the PDF version.\r
@@ -151,7 +142,7 @@ class FPDI extends FPDF_TPL
     {\r
         $this->PDFVersion = sprintf('%.1F', $version);\r
     }\r
-       \r
+    \r
     /**\r
      * Import a page.\r
      *\r
@@ -243,7 +234,7 @@ class FPDI extends FPDF_TPL
         $rotation = $parser->getPageRotation($pageNo);\r
         $tpl['_rotationAngle'] = 0;\r
         if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {\r
-               $steps = $angle / 90;\r
+            $steps = $angle / 90;\r
                 \r
             $_w = $tpl['w'];\r
             $_h = $tpl['h'];\r
@@ -251,9 +242,9 @@ class FPDI extends FPDF_TPL
             $tpl['h'] = $steps % 2 == 0 ? $_h : $_w;\r
             \r
             if ($angle < 0)\r
-               $angle += 360;\r
+                $angle += 360;\r
             \r
-               $tpl['_rotationAngle'] = $angle * -1;\r
+            $tpl['_rotationAngle'] = $angle * -1;\r
         }\r
         \r
         $this->_importedPages[$pageKey] = $this->tpl;\r
@@ -301,29 +292,33 @@ class FPDI extends FPDF_TPL
             $size = array($size['w'], $size['h']);\r
             \r
             if (is_subclass_of($this, 'TCPDF')) {\r
-               $this->setPageFormat($size, $orientation);\r
+                $this->setPageFormat($size, $orientation);\r
             } else {\r
-               $size = $this->_getpagesize($size);\r
-               \r
-               if($orientation != $this->CurOrientation ||\r
+                $size = $this->_getpagesize($size);\r
+                \r
+                if($orientation != $this->CurOrientation ||\r
                     $size[0] != $this->CurPageSize[0] ||\r
                     $size[1] != $this->CurPageSize[1]\r
                 ) {\r
-                                       // New size or orientation\r
-                                       if ($orientation=='P') {\r
-                                               $this->w = $size[0];\r
-                                               $this->h = $size[1];\r
-                                       } else {\r
-                                               $this->w = $size[1];\r
-                                               $this->h = $size[0];\r
-                                       }\r
-                                       $this->wPt = $this->w * $this->k;\r
-                                       $this->hPt = $this->h * $this->k;\r
-                                       $this->PageBreakTrigger = $this->h - $this->bMargin;\r
-                                       $this->CurOrientation = $orientation;\r
-                                       $this->CurPageSize = $size;\r
-                                       $this->PageSizes[$this->page] = array($this->wPt, $this->hPt);\r
-                               }\r
+                    // New size or orientation\r
+                    if ($orientation=='P') {\r
+                        $this->w = $size[0];\r
+                        $this->h = $size[1];\r
+                    } else {\r
+                        $this->w = $size[1];\r
+                        $this->h = $size[0];\r
+                    }\r
+                    $this->wPt = $this->w * $this->k;\r
+                    $this->hPt = $this->h * $this->k;\r
+                    $this->PageBreakTrigger = $this->h - $this->bMargin;\r
+                    $this->CurOrientation = $orientation;\r
+                    $this->CurPageSize = $size;\r
+                    if (FPDF_VERSION >= 1.8) {\r
+                        $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt);\r
+                    } else {\r
+                        $this->PageSizes[$this->page] = array($this->wPt, $this->hPt);\r
+                    }\r
+                }\r
             } \r
         }\r
         \r
@@ -373,13 +368,13 @@ class FPDI extends FPDF_TPL
     protected function _putformxobjects()\r
     {\r
         $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';\r
-           reset($this->_tpls);\r
+        reset($this->_tpls);\r
         foreach($this->_tpls AS $tplIdx => $tpl) {\r
             $this->_newobj();\r
-               $currentN = $this->n; // TCPDF/Protection: rem current "n"\r
-               \r
-               $this->_tpls[$tplIdx]['n'] = $this->n;\r
-               $this->_out('<<' . $filter . '/Type /XObject');\r
+            $currentN = $this->n; // TCPDF/Protection: rem current "n"\r
+            \r
+            $this->_tpls[$tplIdx]['n'] = $this->n;\r
+            $this->_out('<<' . $filter . '/Type /XObject');\r
             $this->_out('/Subtype /Form');\r
             $this->_out('/FormType 1');\r
             \r
@@ -406,15 +401,15 @@ class FPDI extends FPDF_TPL
                     \r
                     switch($tpl['_rotationAngle']) {\r
                         case -90:\r
-                           $tx = -$tpl['box']['lly'];\r
-                           $ty = $tpl['box']['urx'];\r
-                           break;\r
+                            $tx = -$tpl['box']['lly'];\r
+                            $ty = $tpl['box']['urx'];\r
+                            break;\r
                         case -180:\r
                             $tx = $tpl['box']['urx'];\r
                             $ty = $tpl['box']['ury'];\r
                             break;\r
                         case -270:\r
-                               $tx = $tpl['box']['ury'];\r
+                            $tx = $tpl['box']['ury'];\r
                             $ty = -$tpl['box']['llx'];\r
                             break;\r
                     }\r
@@ -478,15 +473,15 @@ class FPDI extends FPDF_TPL
             $buffer = ($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];\r
 \r
             if (is_subclass_of($this, 'TCPDF')) {\r
-               $buffer = $this->_getrawstream($buffer);\r
-               $this->_out('/Length ' . strlen($buffer) . ' >>');\r
-               $this->_out("stream\n" . $buffer . "\nendstream");\r
+                $buffer = $this->_getrawstream($buffer);\r
+                $this->_out('/Length ' . strlen($buffer) . ' >>');\r
+                $this->_out("stream\n" . $buffer . "\nendstream");\r
             } else {\r
-                   $this->_out('/Length ' . strlen($buffer) . ' >>');\r
-                       $this->_putstream($buffer);\r
+                $this->_out('/Length ' . strlen($buffer) . ' >>');\r
+                $this->_putstream($buffer);\r
             }\r
-               $this->_out('endobj');\r
-               $this->n = $newN; // TCPDF: reset to new "n"\r
+            $this->_out('endobj');\r
+            $this->n = $newN; // TCPDF: reset to new "n"\r
         }\r
         \r
         $this->_putimportedobjects();\r
@@ -507,7 +502,7 @@ class FPDI extends FPDF_TPL
             $objId = ++$this->n;\r
         }\r
 \r
-        //Begin a new object\r
+        // Begin a new object\r
         if (!$onlyNewObj) {\r
             $this->offsets[$objId] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer);\r
             $this->_out($objId . ' 0 obj');\r
@@ -532,93 +527,92 @@ class FPDI extends FPDF_TPL
         \r
         switch ($value[0]) {\r
 \r
-               case pdf_parser::TYPE_TOKEN:\r
+            case pdf_parser::TYPE_TOKEN:\r
                 $this->_straightOut($value[1] . ' ');\r
-                       break;\r
-                   case pdf_parser::TYPE_NUMERIC:\r
-               case pdf_parser::TYPE_REAL:\r
+                break;\r
+            case pdf_parser::TYPE_NUMERIC:\r
+            case pdf_parser::TYPE_REAL:\r
                 if (is_float($value[1]) && $value[1] != 0) {\r
-                           $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');\r
-                       } else {\r
-                               $this->_straightOut($value[1] . ' ');\r
-                       }\r
-                       break;\r
-                       \r
-               case pdf_parser::TYPE_ARRAY:\r
-\r
-                       // An array. Output the proper\r
-                       // structure and move on.\r
-\r
-                       $this->_straightOut('[');\r
+                    $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');\r
+                } else {\r
+                    $this->_straightOut($value[1] . ' ');\r
+                }\r
+                break;\r
+                \r
+            case pdf_parser::TYPE_ARRAY:\r
+\r
+                // An array. Output the proper\r
+                // structure and move on.\r
+\r
+                $this->_straightOut('[');\r
                 for ($i = 0; $i < count($value[1]); $i++) {\r
-                               $this->_writeValue($value[1][$i]);\r
-                       }\r
+                    $this->_writeValue($value[1][$i]);\r
+                }\r
 \r
-                       $this->_out(']');\r
-                       break;\r
+                $this->_out(']');\r
+                break;\r
 \r
-               case pdf_parser::TYPE_DICTIONARY:\r
+            case pdf_parser::TYPE_DICTIONARY:\r
 \r
-                       // A dictionary.\r
-                       $this->_straightOut('<<');\r
+                // A dictionary.\r
+                $this->_straightOut('<<');\r
 \r
-                       reset ($value[1]);\r
+                reset ($value[1]);\r
 \r
-                       while (list($k, $v) = each($value[1])) {\r
-                               $this->_straightOut($k . ' ');\r
-                               $this->_writeValue($v);\r
-                       }\r
+                while (list($k, $v) = each($value[1])) {\r
+                    $this->_straightOut($k . ' ');\r
+                    $this->_writeValue($v);\r
+                }\r
 \r
-                       $this->_straightOut('>>');\r
-                       break;\r
+                $this->_straightOut('>>');\r
+                break;\r
 \r
-               case pdf_parser::TYPE_OBJREF:\r
+            case pdf_parser::TYPE_OBJREF:\r
 \r
-                       // An indirect object reference\r
-                       // Fill the object stack if needed\r
-                       $cpfn =& $this->currentParser->filename;\r
-                       if (!isset($this->_doneObjStack[$cpfn][$value[1]])) {\r
-                           $this->_newobj(false, true);\r
-                           $this->_objStack[$cpfn][$value[1]] = array($this->n, $value);\r
+                // An indirect object reference\r
+                // Fill the object stack if needed\r
+                $cpfn =& $this->currentParser->filename;\r
+                if (!isset($this->_doneObjStack[$cpfn][$value[1]])) {\r
+                    $this->_newobj(false, true);\r
+                    $this->_objStack[$cpfn][$value[1]] = array($this->n, $value);\r
                     $this->_doneObjStack[$cpfn][$value[1]] = array($this->n, $value);\r
                 }\r
                 $objId = $this->_doneObjStack[$cpfn][$value[1]][0];\r
 \r
-                       $this->_out($objId . ' 0 R');\r
-                       break;\r
+                $this->_out($objId . ' 0 R');\r
+                break;\r
 \r
-               case pdf_parser::TYPE_STRING:\r
+            case pdf_parser::TYPE_STRING:\r
 \r
-                       // A string.\r
+                // A string.\r
                 $this->_straightOut('(' . $value[1] . ')');\r
 \r
-                       break;\r
+                break;\r
 \r
-               case pdf_parser::TYPE_STREAM:\r
+            case pdf_parser::TYPE_STREAM:\r
 \r
-                       // A stream. First, output the\r
-                       // stream dictionary, then the\r
-                       // stream data itself.\r
+                // A stream. First, output the\r
+                // stream dictionary, then the\r
+                // stream data itself.\r
                 $this->_writeValue($value[1]);\r
-                       $this->_out('stream');\r
-                       $this->_out($value[2][1]);\r
-                       $this->_straightOut("endstream");\r
-                       break;\r
-                       \r
+                $this->_out('stream');\r
+                $this->_out($value[2][1]);\r
+                $this->_straightOut("endstream");\r
+                break;\r
+                \r
             case pdf_parser::TYPE_HEX:\r
                 $this->_straightOut('<' . $value[1] . '>');\r
                 break;\r
 \r
             case pdf_parser::TYPE_BOOLEAN:\r
-                   $this->_straightOut($value[1] ? 'true ' : 'false ');\r
-                   break;\r
+                $this->_straightOut($value[1] ? 'true ' : 'false ');\r
+                break;\r
             \r
-               case pdf_parser::TYPE_NULL:\r
+            case pdf_parser::TYPE_NULL:\r
                 // The null object.\r
-\r
-                       $this->_straightOut('null ');\r
-                       break;\r
-       }\r
+                $this->_straightOut('null ');\r
+                break;\r
+        }\r
     }\r
     \r
     \r
@@ -629,32 +623,32 @@ class FPDI extends FPDF_TPL
     {\r
         if (!is_subclass_of($this, 'TCPDF')) {\r
             if ($this->state == 2) {\r
-                       $this->pages[$this->page] .= $s;\r
+                $this->pages[$this->page] .= $s;\r
             } else {\r
-                       $this->buffer .= $s;\r
+                $this->buffer .= $s;\r
             }\r
 \r
         } else {\r
             if ($this->state == 2) {\r
-                               if ($this->inxobj) {\r
-                                       // we are inside an XObject template\r
-                                       $this->xobjects[$this->xobjid]['outdata'] .= $s;\r
-                               } else if ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {\r
-                                       // puts data before page footer\r
-                                       $pagebuff = $this->getPageBuffer($this->page);\r
-                                       $page = substr($pagebuff, 0, -$this->footerlen[$this->page]);\r
-                                       $footer = substr($pagebuff, -$this->footerlen[$this->page]);\r
-                                       $this->setPageBuffer($this->page, $page . $s . $footer);\r
-                                       // update footer position\r
-                                       $this->footerpos[$this->page] += strlen($s);\r
-                               } else {\r
-                                       // set page data\r
-                                       $this->setPageBuffer($this->page, $s, true);\r
-                               }\r
-                       } else if ($this->state > 0) {\r
-                               // set general data\r
-                               $this->setBuffer($s);\r
-                       }\r
+                if ($this->inxobj) {\r
+                    // we are inside an XObject template\r
+                    $this->xobjects[$this->xobjid]['outdata'] .= $s;\r
+                } else if ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {\r
+                    // puts data before page footer\r
+                    $pagebuff = $this->getPageBuffer($this->page);\r
+                    $page = substr($pagebuff, 0, -$this->footerlen[$this->page]);\r
+                    $footer = substr($pagebuff, -$this->footerlen[$this->page]);\r
+                    $this->setPageBuffer($this->page, $page . $s . $footer);\r
+                    // update footer position\r
+                    $this->footerpos[$this->page] += strlen($s);\r
+                } else {\r
+                    // set page data\r
+                    $this->setPageBuffer($this->page, $s, true);\r
+                }\r
+            } else if ($this->state > 0) {\r
+                // set general data\r
+                $this->setBuffer($s);\r
+            }\r
         }\r
     }\r
 \r
@@ -677,7 +671,7 @@ class FPDI extends FPDF_TPL
     protected function _closeParsers()\r
     {\r
         if ($this->state > 2) {\r
-               $this->cleanUp();\r
+            $this->cleanUp();\r
             return true;\r
         }\r
 \r
index dc69d2e..b2e43c4 100644 (file)
@@ -1,21 +1,12 @@
 <?php
-//
-//  FPDI - Version 1.5.4
-//
-//    Copyright 2004-2015 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
+/**
+ * This file is part of FPDI
+ *
+ * @package   FPDI
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)
+ * @license   http://opensource.org/licenses/mit-license The MIT License
+ * @version   1.6.1
+ */
 
 /**
  * This file is used as a bridge between TCPDF or FPDF
@@ -39,7 +30,7 @@ if (!class_exists('TCPDF', false)) {
     /**
      * Class fpdi_bridge
      *
-     * This has been modified to use the Moodle pdflib wrapper which in turn extends TCPDF
+     * This has been modified to use the Moodle pdf class which in turn extends the TCPDF class.
      */
     class fpdi_bridge extends pdf
     {
index 883b723..9e6d521 100644 (file)
@@ -1,21 +1,12 @@
 <?php\r
-//\r
-//  FPDI - Version 1.5.4\r
-//\r
-//    Copyright 2004-2015 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
+/**\r
+ * This file is part of FPDI\r
+ *\r
+ * @package   FPDI\r
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)\r
+ * @license   http://opensource.org/licenses/mit-license The MIT License\r
+ * @version   1.6.1\r
+ */\r
 \r
 if (!class_exists('pdf_parser')) {\r
     require_once('pdf_parser.php');\r
@@ -127,18 +118,18 @@ class fpdi_pdf_parser extends pdf_parser
      */\r
     protected function _getPageResources($obj)\r
     {\r
-       $obj = $this->resolveObject($obj);\r
+        $obj = $this->resolveObject($obj);\r
 \r
         // If the current object has a resources\r
-       // dictionary associated with it, we use\r
-       // it. Otherwise, we move back to its\r
-       // parent object.\r
+        // dictionary associated with it, we use\r
+        // it. Otherwise, we move back to its\r
+        // parent object.\r
         if (isset($obj[1][1]['/Resources'])) {\r
-               $res = $this->resolveObject($obj[1][1]['/Resources']);\r
-               if ($res[0] == pdf_parser::TYPE_OBJECT)\r
+            $res = $this->resolveObject($obj[1][1]['/Resources']);\r
+            if ($res[0] == pdf_parser::TYPE_OBJECT)\r
                 return $res[1];\r
             return $res;\r
-       }\r
+        }\r
 \r
         if (!isset($obj[1][1]['/Parent'])) {\r
             return false;\r
@@ -301,13 +292,13 @@ class fpdi_pdf_parser extends pdf_parser
      */\r
     protected function _getPageRotation($obj)\r
     {\r
-       $obj = $this->resolveObject($obj);\r
-       if (isset($obj[1][1]['/Rotate'])) {\r
-               $res = $this->resolveObject($obj[1][1]['/Rotate']);\r
-               if ($res[0] == pdf_parser::TYPE_OBJECT)\r
+        $obj = $this->resolveObject($obj);\r
+        if (isset($obj[1][1]['/Rotate'])) {\r
+            $res = $this->resolveObject($obj[1][1]['/Rotate']);\r
+            if ($res[0] == pdf_parser::TYPE_OBJECT)\r
                 return $res[1];\r
             return $res;\r
-       }\r
+        }\r
 \r
         if (!isset($obj[1][1]['/Parent'])) {\r
             return false;\r
@@ -330,7 +321,7 @@ class fpdi_pdf_parser extends pdf_parser
     protected function _readPages(&$pages, &$result)\r
     {\r
         // Get the kids dictionary\r
-       $_kids = $this->resolveObject($pages[1][1]['/Kids']);\r
+        $_kids = $this->resolveObject($pages[1][1]['/Kids']);\r
 \r
         if (!is_array($_kids)) {\r
             throw new Exception('Cannot find /Kids in current /Page-Dictionary');\r
@@ -343,14 +334,14 @@ class fpdi_pdf_parser extends pdf_parser
         $kids = $_kids[1];\r
 \r
         foreach ($kids as $v) {\r
-               $pg = $this->resolveObject($v);\r
+            $pg = $this->resolveObject($v);\r
             if ($pg[1][1]['/Type'][1] === '/Pages') {\r
                 // If one of the kids is an embedded\r
-                       // /Pages array, resolve it as well.\r
+                // /Pages array, resolve it as well.\r
                 $this->_readPages($pg, $result);\r
-               } else {\r
-                       $result[] = $pg;\r
-               }\r
-       }\r
+            } else {\r
+                $result[] = $pg;\r
+            }\r
+        }\r
     }\r
 }
\ No newline at end of file
index aa78f64..474aa72 100644 (file)
@@ -1,21 +1,12 @@
 <?php\r
-//\r
-//  FPDI - Version 1.5.4\r
-//\r
-//    Copyright 2004-2015 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
+/**\r
+ * This file is part of FPDI\r
+ *\r
+ * @package   FPDI\r
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)\r
+ * @license   http://opensource.org/licenses/mit-license The MIT License\r
+ * @version   1.6.1\r
+ */\r
 \r
 /**\r
  * Class pdf_context\r
index 1463b0a..490b135 100644 (file)
@@ -1,21 +1,12 @@
 <?php\r
-//\r
-//  FPDI - Version 1.5.4\r
-//\r
-//    Copyright 2004-2015 Setasign - Jan Slabon\r
-//\r
-//  Licensed under the Apache License, Version 2.0 (the "License");\r
-//  you may not use this file except in compliance with the License.\r
-//  You may obtain a copy of the License at\r
-//\r
-//      http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-//  Unless required by applicable law or agreed to in writing, software\r
-//  distributed under the License is distributed on an "AS IS" BASIS,\r
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-//  See the License for the specific language governing permissions and\r
-//  limitations under the License.\r
-//\r
+/**\r
+ * This file is part of FPDI\r
+ *\r
+ * @package   FPDI\r
+ * @copyright Copyright (c) 2015 Setasign - Jan Slabon (http://www.setasign.com)\r
+ * @license   http://opensource.org/licenses/mit-license The MIT License\r
+ * @version   1.6.1\r
+ */\r
 \r
 /**\r
  * Class pdf_parser\r
@@ -594,7 +585,7 @@ class pdf_parser
 \r
                 return array(self::TYPE_STREAM, $v);\r
 \r
-            default    :\r
+            default:\r
                 if (is_numeric($token)) {\r
                     // A numeric token. Make sure that\r
                     // it is not part of something else.\r
index bc1bae1..7cac3bb 100644 (file)
@@ -10,7 +10,7 @@ Information
 URL: http://www.setasign.de/products/pdf-php-solutions/fpdi/
 Download from: http://www.setasign.de/products/pdf-php-solutions/fpdi/downloads
 Documentation: http://www.setasign.de/products/pdf-php-solutions/fpdi/manuals/
-License: Apache Software License 2.0
+License: The MIT License (MIT)
 
 Installation
 ------------
@@ -19,6 +19,13 @@ Installation
 3) Update mod/assign/feedback/editpdf/fpdi/fpdi_bridge.php (or the replacement file) to extend 'pdf' instead of 'TCPDF'.
 4) Make a note below of any changes made.
 
+2015/12/04
+----------
+Updated to FPDI: 1.6.1
+
+1) Changed 'TCPDF' to 'pdf' (as stated above).
+2) License changed from Apache Software License 2.0 to The MIT License (MIT).
+
 2015/10/01
 ----------
 Updated to FPDI: 1.5.4
index 5ce0dd6..cf10e9b 100644 (file)
@@ -3,8 +3,8 @@
   <library>
     <location>fpdi</location>
     <name>FPDI</name>
-    <license>Apache</license>
-    <version>1.5.4</version>
-    <licenseversion>2.0</licenseversion>
+    <license>MIT</license>
+    <version>1.6.1</version>
+    <licenseversion></licenseversion>
   </library>
 </libraries>
index 90b4ff7..c0383f2 100644 (file)
@@ -13,11 +13,21 @@ class mod_data_export_form extends moodleform {
 
      // @param string $url: the url to post to
      // @param array $datafields: objects in this database
-    function mod_data_export_form($url, $datafields, $cm, $data) {
+    public function __construct($url, $datafields, $cm, $data) {
         $this->_datafields = $datafields;
         $this->_cm = $cm;
         $this->_data = $data;
-        parent::moodleform($url);
+        parent::__construct($url);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     *
+     * @deprecated since Moodle 3.1
+     */
+    public function mod_data_export_form($url, $datafields, $cm, $data) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($url, $datafields, $cm, $data);
     }
 
     function definition() {
index a6e1b4c..ddf5486 100644 (file)
@@ -199,7 +199,7 @@ class data_field_textarea extends data_field_base {
                 // the value will be retrieved by file_get_submitted_draft_itemid, do not need to save in DB
                 return true;
             } else {
-                $content->$names[2] = clean_param($value, PARAM_NOTAGS);  // content[1-4]
+                $content->{$names[2]} = clean_param($value, PARAM_NOTAGS);  // content[1-4]
             }
         } else {
             $content->content = clean_param($value, PARAM_CLEAN);
index 03b3763..43cf00e 100644 (file)
@@ -99,4 +99,12 @@ $functions = array(
         'type' => 'write',
         'capabilities' => 'mod/forum:startdiscussion'
     ),
+
+    'mod_forum_can_add_discussion' => array(
+        'classname' => 'mod_forum_external',
+        'methodname' => 'can_add_discussion',
+        'classpath' => 'mod/forum/externallib.php',
+        'description' => 'Check if the current user can add discussions in the given forum (and optionally for the given group).',
+        'type' => 'read'
+    ),
 );
index 69965c0..5b5cc91 100644 (file)
@@ -1262,4 +1262,70 @@ class mod_forum_external extends external_api {
         );
     }
 
+    /**
+     * Returns description of method parameters
+     *
+     * @return external_function_parameters
+     * @since Moodle 3.1
+     */
+    public static function can_add_discussion_parameters() {
+        return new external_function_parameters(
+            array(
+                'forumid' => new external_value(PARAM_INT, 'Forum instance ID'),
+                'groupid' => new external_value(PARAM_INT, 'The group to check, default to active group.
+                                                Use -1 to check if the user can post in all the groups.', VALUE_DEFAULT, null)
+            )
+        );
+    }
+
+    /**
+     * Check if the current user can add discussions in the given forum (and optionally for the given group).
+     *
+     * @param int $forumid the forum instance id
+     * @param int $groupid the group to check, default to active group. Use -1 to check if the user can post in all the groups.
+     * @return array of warnings and the status (true if the user can add discussions)
+     * @since Moodle 3.1
+     * @throws moodle_exception
+     */
+    public static function can_add_discussion($forumid, $groupid = null) {
+        global $DB, $CFG;
+        require_once($CFG->dirroot . "/mod/forum/lib.php");
+
+        $params = self::validate_parameters(self::can_add_discussion_parameters(),
+                                            array(
+                                                'forumid' => $forumid,
+                                                'groupid' => $groupid,
+                                            ));
+        $warnings = array();
+
+        // Request and permission validation.
+        $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST);
+        list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum');
+
+        $context = context_module::instance($cm->id);
+        self::validate_context($context);
+
+        $status = forum_user_can_post_discussion($forum, $params['groupid'], -1, $cm, $context);
+
+        $result = array();
+        $result['status'] = $status;
+        $result['warnings'] = $warnings;
+        return $result;
+    }
+
+    /**
+     * Returns description of method result value
+     *
+     * @return external_description
+     * @since Moodle 3.1
+     */
+    public static function can_add_discussion_returns() {
+        return new external_single_structure(
+            array(
+                'status' => new external_value(PARAM_BOOL, 'True if the user can add discussions, false otherwise.'),
+                'warnings' => new external_warnings()
+            )
+        );
+    }
+
 }
index 5981e5c..afe8d8b 100644 (file)
@@ -1010,4 +1010,37 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
 
     }
 
+    /*
+     * Test can_add_discussion. A basic test since all the API functions are already covered by unit tests.
+     */
+    public function test_can_add_discussion() {
+
+        $this->resetAfterTest(true);
+
+        // Create courses to add the modules.
+        $course = self::getDataGenerator()->create_course();
+
+        $user = self::getDataGenerator()->create_user();
+
+        // First forum with tracking off.
+        $record = new stdClass();
+        $record->course = $course->id;
+        $record->type = 'news';
+        $forum = self::getDataGenerator()->create_module('forum', $record);
+
+        // User with no permissions to add in a news forum.
+        self::setUser($user);
+        $this->getDataGenerator()->enrol_user($user->id, $course->id);
+
+        $result = mod_forum_external::can_add_discussion($forum->id);
+        $result = external_api::clean_returnvalue(mod_forum_external::can_add_discussion_returns(), $result);
+        $this->assertFalse($result['status']);
+
+        self::setAdminUser();
+        $result = mod_forum_external::can_add_discussion($forum->id);
+        $result = external_api::clean_returnvalue(mod_forum_external::can_add_discussion_returns(), $result);
+        $this->assertTrue($result['status']);
+
+    }
+
 }
index b57c320..20b04e5 100644 (file)
@@ -2014,4 +2014,104 @@ class mod_forum_lib_testcase extends advanced_testcase {
         self::assertCount(0, $discussions);
 
     }
+
+    /**
+     * Test forum_user_can_post_discussion
+     */
+    public function test_forum_user_can_post_discussion() {
+        global $CFG, $DB;
+
+        $this->resetAfterTest(true);
+
+        // Create course to add the module.
+        $course = self::getDataGenerator()->create_course(array('groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1));
+        $user = self::getDataGenerator()->create_user();
+        $this->getDataGenerator()->enrol_user($user->id, $course->id);
+
+        // Forum forcing separate gropus.
+        $record = new stdClass();
+        $record->course = $course->id;
+        $forum = self::getDataGenerator()->create_module('forum', $record, array('groupmode' => SEPARATEGROUPS));
+        $cm = get_coursemodule_from_instance('forum', $forum->id);
+        $context = context_module::instance($cm->id);
+
+        self::setUser($user);
+
+        // The user is not enroled in any group, try to post in a forum with separate groups.
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        // Create a group.
+        $group = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
+
+        // Try to post in a group the user is not enrolled.
+        $can = forum_user_can_post_discussion($forum, $group->id, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        // Add the user to a group.
+        groups_add_member($group->id, $user->id);
+
+        // Try to post in a group the user is not enrolled.
+        $can = forum_user_can_post_discussion($forum, $group->id + 1, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        // Now try to post in the user group. (null means it will guess the group).
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertTrue($can);
+
+        $can = forum_user_can_post_discussion($forum, $group->id, -1, $cm, $context);
+        $this->assertTrue($can);
+
+        // Test all groups.
+        $can = forum_user_can_post_discussion($forum, -1, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        $this->setAdminUser();
+        $can = forum_user_can_post_discussion($forum, -1, -1, $cm, $context);
+        $this->assertTrue($can);
+
+        // Change forum type.
+        $forum->type = 'news';
+        $DB->update_record('forum', $forum);
+
+        // Admin can post news.
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertTrue($can);
+
+        // Normal users don't.
+        self::setUser($user);
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        // Change forum type.
+        $forum->type = 'eachuser';
+        $DB->update_record('forum', $forum);
+
+        // I didn't post yet, so I should be able to post.
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertTrue($can);
+
+        // Post now.
+        $record = new stdClass();
+        $record->course = $course->id;
+        $record->userid = $user->id;
+        $record->forum = $forum->id;
+        $discussion = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
+
+        // I already posted, I shouldn't be able to post.
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertFalse($can);
+
+        // Last check with no groups, normal forum and course.
+        $course->groupmode = NOGROUPS;
+        $course->groupmodeforce = 0;
+        $DB->update_record('course', $course);
+
+        $forum->type = 'general';
+        $forum->groupmode = NOGROUPS;
+        $DB->update_record('forum', $forum);
+
+        $can = forum_user_can_post_discussion($forum, null, -1, $cm, $context);
+        $this->assertTrue($can);
+    }
 }
index b19e9d0..2b3ff68 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2015111600;       // The current module version (Date: YYYYMMDDXX)
+$plugin->version   = 2015111601;       // The current module version (Date: YYYYMMDDXX)
 $plugin->requires  = 2015111000;       // Requires this Moodle version
 $plugin->component = 'mod_forum';      // Full name of the plugin (used for diagnostics)
diff --git a/mod/glossary/classes/external.php b/mod/glossary/classes/external.php
new file mode 100644 (file)
index 0000000..65c8bf3
--- /dev/null
@@ -0,0 +1,160 @@
+<?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/>.
+
+/**
+ * Glossary module external API.
+ *
+ * @package    mod_glossary
+ * @category   external
+ * @copyright  2015 Costantino Cito <ccito@cvaconsulting.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+defined('MOODLE_INTERNAL') || die;
+require_once($CFG->libdir . '/externallib.php');
+
+/**
+ * Glossary module external functions.
+ *
+ * @package    mod_glossary
+ * @category   external
+ * @copyright  2015 Costantino Cito <ccito@cvaconsulting.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since      Moodle 3.1
+ */
+class mod_glossary_external extends external_api {
+
+    /**
+     * Describes the parameters for get_glossaries_by_courses.
+     *
+     * @return external_external_function_parameters
+     * @since Moodle 3.1
+     */
+    public static function get_glossaries_by_courses_parameters() {
+        return new external_function_parameters (
+            array(
+                'courseids' => new external_multiple_structure(
+                    new external_value(PARAM_INT, 'course id'),
+                    'Array of course IDs', VALUE_DEFAULT, array()
+                ),
+            )
+        );
+    }
+
+    /**
+     * Returns a list of glossaries in a provided list of courses.
+     *
+     * If no list is provided all glossaries that the user can view will be returned.
+     *
+     * @param array $courseids the course IDs.
+     * @return array of glossaries
+     * @since Moodle 3.1
+     */
+    public static function get_glossaries_by_courses($courseids = array()) {
+        $params = self::validate_parameters(self::get_glossaries_by_courses_parameters(), array('courseids' => $courseids));
+
+        $warnings = array();
+        $courses = array();
+        $courseids = $params['courseids'];
+
+        if (empty($courseids)) {
+            $courses = enrol_get_my_courses();
+            $courseids = array_keys($courses);
+        }
+
+        // Array to store the glossaries to return.
+        $glossaries = array();
+
+        // Ensure there are courseids to loop through.
+        if (!empty($courseids)) {
+            list($courses, $warnings) = external_util::validate_courses($courseids, $courses);
+
+            // Get the glossaries in these courses, this function checks users visibility permissions.
+            $glossaries = get_all_instances_in_courses('glossary', $courses);
+            foreach ($glossaries as $glossary) {
+                $context = context_module::instance($glossary->coursemodule);
+                $glossary->name = external_format_string($glossary->name, $context->id);
+                list($glossary->intro, $glossary->introformat) = external_format_text($glossary->intro, $glossary->introformat,
+                    $context->id, 'mod_glossary', 'intro', null);
+            }
+        }
+
+        $result = array();
+        $result['glossaries'] = $glossaries;
+        $result['warnings'] = $warnings;
+        return $result;
+    }
+
+    /**
+     * Describes the get_glossaries_by_courses return value.
+     *
+     * @return external_single_structure
+     * @since Moodle 3.1
+     */
+    public static function get_glossaries_by_courses_returns() {
+        return new external_single_structure(array(
+            'glossaries' => new external_multiple_structure(
+                new external_single_structure(array(
+                    'id' => new external_value(PARAM_INT, 'Glossary id'),
+                    'coursemodule' => new external_value(PARAM_INT, 'Course module id'),
+                    'course' => new external_value(PARAM_INT, 'Course id'),
+                    'name' => new external_value(PARAM_RAW, 'Glossary name'),
+                    'intro' => new external_value(PARAM_RAW, 'The Glossary intro'),
+                    'introformat' => new external_format_value('intro'),
+                    'allowduplicatedentries' => new external_value(PARAM_INT, 'If enabled, multiple entries can have the' .
+                        ' same concept name'),
+                    'displayformat' => new external_value(PARAM_TEXT, 'Display format type'),
+                    'mainglossary' => new external_value(PARAM_INT, 'If enabled this glossary is a main glossary.'),
+                    'showspecial' => new external_value(PARAM_INT, 'If enabled, participants can browse the glossary by' .
+                        ' special characters, such as @ and #'),
+                    'showalphabet' => new external_value(PARAM_INT, 'If enabled, participants can browse the glossary by' .
+                        ' letters of the alphabet'),
+                    'showall' => new external_value(PARAM_INT, 'If enabled, participants can browse all entries at once'),
+                    'allowcomments' => new external_value(PARAM_INT, 'If enabled, all participants with permission to' .
+                        ' create comments will be able to add comments to glossary entries'),
+                    'allowprintview' => new external_value(PARAM_INT, 'If enabled, students are provided with a link to a' .
+                        ' printer-friendly version of the glossary. The link is always available to teachers'),
+                    'usedynalink' => new external_value(PARAM_INT, 'If site-wide glossary auto-linking has been enabled' .
+                        ' by an administrator and this checkbox is ticked, the entry will be automatically linked' .
+                        ' wherever the concept words and phrases appear throughout the rest of the course.'),
+                    'defaultapproval' => new external_value(PARAM_INT, 'If set to no, entries require approving by a' .
+                        ' teacher before they are viewable by everyone.'),
+                    'approvaldisplayformat' => new external_value(PARAM_TEXT, 'When approving glossary items you may wish' .
+                        ' to use a different display format'),
+                    'globalglossary' => new external_value(PARAM_INT, ''),
+                    'entbypage' => new external_value(PARAM_INT, 'Entries shown per page'),
+                    'editalways' => new external_value(PARAM_INT, 'Always allow editing'),
+                    'rsstype' => new external_value(PARAM_INT, 'To enable the RSS feed for this activity, select either' .
+                        ' concepts with author or concepts without author to be included in the feed'),
+                    'rssarticles' => new external_value(PARAM_INT, 'This setting specifies the number of glossary entry' .
+                        ' concepts to include in the RSS feed. Between 5 and 20 generally acceptable'),
+                    'assessed' => new external_value(PARAM_INT, 'Aggregate type'),
+                    'assesstimestart' => new external_value(PARAM_INT, 'Restrict rating to items created after this'),
+                    'assesstimefinish' => new external_value(PARAM_INT, 'Restrict rating to items created before this'),
+                    'scale' => new external_value(PARAM_INT, 'Scale ID'),
+                    'timecreated' => new external_value(PARAM_INT, 'Time created'),
+                    'timemodified' => new external_value(PARAM_INT, 'Time modified'),
+                    'completionentries' => new external_value(PARAM_INT, 'Number of entries to complete'),
+                    'section' => new external_value(PARAM_INT, 'Section'),
+                    'visible' => new external_value(PARAM_INT, 'Visible'),
+                    'groupmode' => new external_value(PARAM_INT, 'Group mode'),
+                    'groupingid' => new external_value(PARAM_INT, 'Grouping ID'),
+                ), 'Glossaries')
+            ),
+            'warnings' => new external_warnings())
+        );
+    }
+}
diff --git a/mod/glossary/db/services.php b/mod/glossary/db/services.php
new file mode 100644 (file)
index 0000000..fe26d6c
--- /dev/null
@@ -0,0 +1,38 @@
+<?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/>.
+
+/**
+ * Glossary module external functions.
+ *
+ * @package    mod_glossary
+ * @category   external
+ * @copyright  2015 Frédéric Massart - FMCorz.net
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$functions = array(
+
+    'mod_glossary_get_glossaries_by_courses' => array(
+        'classname'     => 'mod_glossary_external',
+        'methodname'    => 'get_glossaries_by_courses',
+        'description'   => 'Retrieve a list of glossaries from several courses.',
+        'type'          => 'read',
+        'capabilities'  => 'mod/glossary:view'
+    ),
+
+);
diff --git a/mod/glossary/tests/external_test.php b/mod/glossary/tests/external_test.php
new file mode 100644 (file)
index 0000000..405ba93
--- /dev/null
@@ -0,0 +1,88 @@
+<?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/>.
+
+/**
+ * External glossary functions unit tests
+ *
+ * @package    mod_glossary
+ * @category   external
+ * @copyright  2015 Costantino Cito <ccito@cvaconsulting.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+global $CFG;
+require_once($CFG->dirroot . '/webservice/tests/helpers.php');
+
+/**
+ * External glossary functions unit tests
+ *
+ * @package    mod_glossary
+ * @category   external
+ * @copyright  2015 Costantino Cito <ccito@cvaconsulting.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class mod_glossary_external_testcase extends externallib_advanced_testcase {
+
+    /**
+     * Test get_glossaries_by_courses
+     */
+    public function test_get_glossaries_by_courses() {
+        $this->resetAfterTest(true);
+
+        // As admin.
+        $this->setAdminUser();
+        $c1 = self::getDataGenerator()->create_course();
+        $c2 = self::getDataGenerator()->create_course();
+        $g1 = self::getDataGenerator()->create_module('glossary', array('course' => $c1->id, 'name' => 'First Glossary'));
+        $g2 = self::getDataGenerator()->create_module('glossary', array('course' => $c1->id, 'name' => 'Second Glossary'));
+        $g3 = self::getDataGenerator()->create_module('glossary', array('course' => $c2->id, 'name' => 'Third Glossary'));
+
+        $s1 = $this->getDataGenerator()->create_user();
+        self::getDataGenerator()->enrol_user($s1->id,  $c1->id);
+
+        // Check results where student is enrolled.
+        $this->setUser($s1);
+        $glossaries = mod_glossary_external::get_glossaries_by_courses(array());
+        $glossaries = external_api::clean_returnvalue(mod_glossary_external::get_glossaries_by_courses_returns(), $glossaries);
+
+        $this->assertCount(2, $glossaries['glossaries']);
+        $this->assertEquals('First Glossary', $glossaries['glossaries'][0]['name']);
+        $this->assertEquals('Second Glossary', $glossaries['glossaries'][1]['name']);
+
+        // Check results with specific course IDs.
+        $glossaries = mod_glossary_external::get_glossaries_by_courses(array($c1->id, $c2->id));
+        $glossaries = external_api::clean_returnvalue(mod_glossary_external::get_glossaries_by_courses_returns(), $glossaries);
+
+        $this->assertCount(2, $glossaries['glossaries']);
+        $this->assertEquals('First Glossary', $glossaries['glossaries'][0]['name']);
+        $this->assertEquals('Second Glossary', $glossaries['glossaries'][1]['name']);
+
+        $this->assertEquals('course', $glossaries['warnings'][0]['item']);
+        $this->assertEquals($c2->id, $glossaries['warnings'][0]['itemid']);
+        $this->assertEquals('1', $glossaries['warnings'][0]['warningcode']);
+
+        // Now as admin.
+        $this->setAdminUser();
+
+        $glossaries = mod_glossary_external::get_glossaries_by_courses(array($c2->id));
+        $glossaries = external_api::clean_returnvalue(mod_glossary_external::get_glossaries_by_courses_returns(), $glossaries);
+
+        $this->assertCount(1, $glossaries['glossaries']);
+        $this->assertEquals('Third Glossary', $glossaries['glossaries'][0]['name']);
+    }
+
+}
index b776316..66ae9ad 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2015111600;       // The current module version (Date: YYYYMMDDXX)
+$plugin->version   = 2015111601;       // The current module version (Date: YYYYMMDDXX)
 $plugin->requires  = 2015111000;    // Requires this Moodle version
 $plugin->component = 'mod_glossary';   // Full name of the plugin (used for diagnostics)
 $plugin->cron      = 0;
index 5d3eb3a..d701c52 100644 (file)
@@ -33,9 +33,19 @@ class mod_lesson_mod_form extends moodleform_mod {
 
     protected $course = null;
 
-    public function mod_lesson_mod_form($current, $section, $cm, $course) {
+    public function __construct($current, $section, $cm, $course) {
         $this->course = $course;
-        parent::moodleform_mod($current, $section, $cm, $course);
+        parent::__construct($current, $section, $cm, $course);
+    }
+
+    /**
+     * Old syntax of class constructor. Deprecated in PHP7.
+     * 
+     * @deprecated since Moodle 3.1
+     */
+    public function mod_lesson_mod_form($current, $section, $cm, $course) {
+        debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
+        self::__construct($current, $section, $cm, $course);
     }
 
     function definition() {
index 5bd03d2..ef59fa0 100644 (file)
@@ -215,6 +215,8 @@ if (empty($pageid)) {
             }
         } elseif ($jumpto == LESSON_NEXTPAGE) {
             $lastpageseen = $lesson->get_next_page($attemptpage->nextpageid);
+        } else if ($jumpto == LESSON_CLUSTERJUMP) {
+            $lastpageseen = $lesson->cluster_jump($attempt->pageid);
         } else {
             $lastpageseen = $jumpto;
         }
index 2306de3..9840dba 100644 (file)
@@ -868,7 +868,7 @@ function lti_parse_custom_parameter($toolproxy, $tool, $params, $value, $islti2)
                             $value = $params[$val];
                         } else {
                             $valarr = explode('->', substr($val, 1), 2);
-                            $value = "{${$valarr[0]}->$valarr[1]}";
+                            $value = "{${$valarr[0]}->{$valarr[1]}}";
                             $value = str_replace('<br />' , ' ', $value);
                             $value = str_replace('<br>' , ' ', $value);
                             $value = format_string($value);
index 6b185aa..350e5aa 100644 (file)
@@ -63,8 +63,11 @@ require_once($CFG->dirroot . '/mod/lti/servicelib.php');
 class mod_lti_locallib_testcase extends advanced_testcase {
 
     public function test_split_custom_parameters() {
+        $this->resetAfterTest();
+
         $tool = new stdClass();
         $tool->enabledcapability = '';
+        $tool->parameter = '';
         $this->assertEquals(lti_split_custom_parameters(null, $tool, array(), "x=1\ny=2", false),
             array('custom_x' => '1', 'custom_y' => '2'));
 
@@ -76,6 +79,12 @@ class mod_lti_locallib_testcase extends advanced_testcase {
         $this->assertEquals(lti_split_custom_parameters(