<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mina</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mina"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Mina"/>
	<updated>2026-07-30T06:29:20Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Plugins_directory_API&amp;diff=63946</id>
		<title>Plugins directory API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Plugins_directory_API&amp;diff=63946"/>
		<updated>2023-07-20T17:04:31Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Example cURL client fetching the list of maintained plugins */ Fix code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Plugins development}}&lt;br /&gt;
&lt;br /&gt;
The Plugins directory at http://moodle.org/plugins exposes some of its features via web services layer, allowing the community to develop custom tools and integrations with other services such as GitHub Actions or Travis CI.&lt;br /&gt;
&lt;br /&gt;
== Access token ==&lt;br /&gt;
&lt;br /&gt;
To use the web service described below, the caller (client) authenticates itself with an access token. In almost all cases, developers use their own personal token and let the scripts (clients) work on behalf of them.&lt;br /&gt;
&lt;br /&gt;
The easiest way to obtain the access token (and some other useful information) is to visit &#039;&#039;Plugins &amp;gt; API access&#039;&#039; page at moodle.org through the side Navigation block.&lt;br /&gt;
&lt;br /&gt;
The token can be alternatively obtained via the &#039;&#039;Preferences &amp;gt; Security keys&#039;&#039; or programatically via login/token.php script at moodle.org (however, tokens obtain that way have very short expiration in contrast with the ones generated at the dedicated page).&lt;br /&gt;
&lt;br /&gt;
== Plugins maintenance service ==&lt;br /&gt;
&lt;br /&gt;
The Plugins maintenance service (&amp;lt;tt&amp;gt;plugins_maintenance&amp;lt;/tt&amp;gt;) provides functions for the plugins maintainers. The service is declared as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&#039;Plugins maintenance&#039; =&amp;gt; [&lt;br /&gt;
    &#039;functions&#039; =&amp;gt; [&lt;br /&gt;
        &#039;local_plugins_get_maintained_plugins&#039;,&lt;br /&gt;
        &#039;local_plugins_add_version&#039;,&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;shortname&#039; =&amp;gt; &#039;plugins_maintenance&#039;,&lt;br /&gt;
    &#039;requiredcapability&#039; =&amp;gt; &#039;local/plugins:editownplugins&#039;,&lt;br /&gt;
    &#039;enabled&#039; =&amp;gt; true,&lt;br /&gt;
    &#039;restrictedusers&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;downloadfiles&#039; =&amp;gt; true,&lt;br /&gt;
    &#039;uploadfiles&#039; =&amp;gt; true,&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting the list of maintained plugins ===&lt;br /&gt;
&lt;br /&gt;
The first external function &amp;lt;tt&amp;gt;local_plugins_get_maintained_plugins&amp;lt;/tt&amp;gt; allows to read the list of all plugins and their recent versions the caller is maintainer of. It does not expect any parameters and its return structure is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return new external_multiple_structure(&lt;br /&gt;
    new external_single_structure([&lt;br /&gt;
        &#039;id&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Internal plugin identifier&#039;),&lt;br /&gt;
        &#039;name&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the plugin&#039;),&lt;br /&gt;
        &#039;shortdescription&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Short description&#039;),&lt;br /&gt;
        &#039;description&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;Description&#039;),&lt;br /&gt;
        &#039;descriptionformat&#039; =&amp;gt; new external_format_value(&#039;description&#039;),&lt;br /&gt;
        &#039;frankenstyle&#039; =&amp;gt; new external_value(PARAM_PLUGIN, &#039;Full component frankenstyle name&#039;),&lt;br /&gt;
        &#039;type&#039; =&amp;gt; new external_value(PARAM_ALPHANUMEXT, &#039;Plugin type&#039;),&lt;br /&gt;
        &#039;websiteurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Website URL&#039;),&lt;br /&gt;
        &#039;sourcecontrolurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Source control URL&#039;),&lt;br /&gt;
        &#039;bugtrackerurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Bug tracker URL&#039;),&lt;br /&gt;
        &#039;discussionurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Discussion URL&#039;),&lt;br /&gt;
        &#039;timecreated&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Timestamp of plugin submission&#039;),&lt;br /&gt;
        &#039;approved&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Approval status&#039;),&lt;br /&gt;
        &#039;visible&#039; =&amp;gt; new external_value(PARAM_BOOL, &#039;Visibility status&#039;),&lt;br /&gt;
        &#039;aggdownloads&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Stats aggregataion - downloads&#039;),&lt;br /&gt;
        &#039;aggfavs&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Stats aggregataion - favourites&#039;),&lt;br /&gt;
        &#039;aggsites&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Stats aggregataion - sites&#039;),&lt;br /&gt;
        &#039;statusamos&#039; =&amp;gt; new external_value(PARAM_INT, &#039;AMOS registration status&#039;),&lt;br /&gt;
        &#039;viewurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;View URL&#039;),&lt;br /&gt;
        &#039;currentversions&#039; =&amp;gt; new external_multiple_structure(&lt;br /&gt;
            new external_single_structure([&lt;br /&gt;
                &#039;id&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Internal version identifier&#039;),&lt;br /&gt;
                &#039;version&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Version number&#039;),&lt;br /&gt;
                &#039;releasename&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Release name&#039;),&lt;br /&gt;
                &#039;releasenotes&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;Release notes&#039;),&lt;br /&gt;
                &#039;releasenotesformat&#039; =&amp;gt; new external_format_value(&#039;releasenotes&#039;),&lt;br /&gt;
                &#039;maturity&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Maturity code&#039;),&lt;br /&gt;
                &#039;changelogurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Change log URL&#039;),&lt;br /&gt;
                &#039;altdownloadurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Alternative download URL&#039;),&lt;br /&gt;
                &#039;md5sum&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;MD5 hash of the ZIP content&#039;),&lt;br /&gt;
                &#039;vcssystem&#039; =&amp;gt; new external_value(PARAM_ALPHA, &#039;Version control system&#039;),&lt;br /&gt;
                &#039;vcssystemother&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the other version control system&#039;),&lt;br /&gt;
                &#039;vcsrepositoryurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Version control system URL&#039;),&lt;br /&gt;
                &#039;vcsbranch&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the branch with this version&#039;),&lt;br /&gt;
                &#039;vcstag&#039;  =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the tag with this version&#039;),&lt;br /&gt;
                &#039;timecreated&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Timestamp of version release&#039;),&lt;br /&gt;
                &#039;approved&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Approval status&#039;),&lt;br /&gt;
                &#039;visible&#039;  =&amp;gt; new external_value(PARAM_BOOL, &#039;Visibility status&#039;),&lt;br /&gt;
                &#039;supportedmoodle&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Comma separated list of support Moodle versions&#039;),&lt;br /&gt;
                &#039;downloadurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Download URL&#039;),&lt;br /&gt;
                &#039;viewurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;View URL&#039;),&lt;br /&gt;
                &#039;smurfresult&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Code prechecks results summary&#039;),&lt;br /&gt;
            ])&lt;br /&gt;
        ),&lt;br /&gt;
    ])&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example cURL client fetching the list of maintained plugins  ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Replace this with your own service access token.&lt;br /&gt;
TOKEN=&amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CURL=&amp;quot;curl -s&amp;quot;&lt;br /&gt;
ENDPOINT=https://moodle.org/webservice/rest/server.php&lt;br /&gt;
FUNCTION=local_plugins_get_maintained_plugins&lt;br /&gt;
&lt;br /&gt;
${CURL} ${ENDPOINT} --data-urlencode &amp;quot;wstoken=${TOKEN}&amp;quot; --data-urlencode &amp;quot;wsfunction=${FUNCTION}&amp;quot; \&lt;br /&gt;
    --data-urlencode &amp;quot;moodlewsrestformat=json&amp;quot; | jq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Releasing a new version ===&lt;br /&gt;
&lt;br /&gt;
The second function &amp;lt;tt&amp;gt;local_plugins_add_version&amp;lt;/tt&amp;gt; allows to release a new version to the plugin. The input parameters are described as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return new external_function_parameters([&lt;br /&gt;
    // The pluginid or frankenstyle must be provided (in this order of precedence).&lt;br /&gt;
    &#039;pluginid&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Internal identifier of the plugin&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;frankenstyle&#039; =&amp;gt; new external_value(PARAM_PLUGIN, &#039;Full component name of the plugin&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    // ZIP can be specified by draft area itemid (with single file in it), content or URL (in this order of precedence).&lt;br /&gt;
    &#039;zipdrafitemtid&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Itemid of user draft area with uploaded ZIP&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;zipcontentsbase64&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;ZIP file contents encoded with MIME base64&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;zipurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;ZIP file URL&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    // Following params may be auto-detected from the ZIP content.&lt;br /&gt;
    &#039;version&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Version number&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;releasename&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Release name&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;releasenotes&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;Release notes&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;releasenotesformat&#039; =&amp;gt; new external_format_value(&#039;releasenotes&#039;, VALUE_DEFAULT, FORMAT_MOODLE),&lt;br /&gt;
    &#039;maturity&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Maturity code&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;supportedmoodle&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Comma separated list of supported Moodle versions&#039;,&lt;br /&gt;
        VALUE_DEFAULT, null),&lt;br /&gt;
    // Other optional properties.&lt;br /&gt;
    &#039;changelogurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Change log URL&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;altdownloadurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Alternative download URL&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;vcssystem&#039; =&amp;gt; new external_value(PARAM_ALPHA, &#039;Version control system&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;vcssystemother&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the other version control system&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;vcsrepositoryurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Version control system URL&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;vcsbranch&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the branch with this version&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
    &#039;vcstag&#039;  =&amp;gt; new external_value(PARAM_TEXT, &#039;Name of the tag with this version&#039;, VALUE_DEFAULT, null),&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The API has been designed so that:&lt;br /&gt;
&lt;br /&gt;
* The actual ZIP can be taken from pre-uploaded file (standard way of using webservice/upload.php), or submitting the file contents directly, or providing an URL the ZIP should be fetched from.&lt;br /&gt;
* As many as possible parameters (such as list of supported Moodle versions, release name, release notes etc) default to the values specified in the ZIP itself.&lt;br /&gt;
* So it should be enough to specify just the plugin (either by numerical ID number of frankenstyle) and the ZIP with the new version. All other values are optional and can be used to override the auto-detected ones.&lt;br /&gt;
&lt;br /&gt;
When successful, the external function&#039;s response is described as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return new external_single_structure([&lt;br /&gt;
    &#039;id&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Internal identifier of the newly created version&#039;),&lt;br /&gt;
    &#039;md5sum&#039; =&amp;gt; new external_value(PARAM_TEXT, &#039;MD5 hash of the ZIP content&#039;),&lt;br /&gt;
    &#039;timecreated&#039; =&amp;gt; new external_value(PARAM_INT, &#039;Timestamp of version release&#039;),&lt;br /&gt;
    &#039;downloadurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;Download URL&#039;),&lt;br /&gt;
    &#039;viewurl&#039; =&amp;gt; new external_value(PARAM_URL, &#039;View URL&#039;),&lt;br /&gt;
    &#039;warnings&#039; =&amp;gt; new external_multiple_structure(&lt;br /&gt;
        new external_value(PARAM_RAW, &#039;Validation warnings&#039;)&lt;br /&gt;
    ),&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example CLI script to release a new version of a plugin ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Replace this with your own service access token.&lt;br /&gt;
TOKEN=&amp;quot;d41d8cd98f00b204e9800998ecf8427e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set the full component name of the plugin.&lt;br /&gt;
PLUGIN=mod_subcourse&lt;br /&gt;
# Path to the ZIP fle with the new version.&lt;br /&gt;
ZIP=version.zip&lt;br /&gt;
&lt;br /&gt;
CURL=&amp;quot;curl -s&amp;quot;&lt;br /&gt;
HOST=&amp;quot;https://moodle.org/&amp;quot;&lt;br /&gt;
ENDPOINT_REST=&amp;quot;${HOST}/webservice/rest/server.php&amp;quot;&lt;br /&gt;
ENDPOINT_UPLOAD=&amp;quot;${HOST}/webservice/upload.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ITEMID=$(${CURL} -F data=@${ZIP} &amp;quot;${ENDPOINT_UPLOAD}?token=${TOKEN}&amp;quot; | jq --raw-output &#039;.[0].itemid&#039;)&lt;br /&gt;
&lt;br /&gt;
${CURL} ${ENDPOINT_REST} --data-urlencode &amp;quot;wstoken=${TOKEN}&amp;quot; --data-urlencode &amp;quot;wsfunction=${FUNCTION}&amp;quot; --data-urlencode &amp;quot;moodlewsrestformat=json&amp;quot; \&lt;br /&gt;
    --data-urlencode &amp;quot;frankenstyle=${PLUGIN}&amp;quot; --data-urlencode &amp;quot;zipdrafitemtid=${ITEMID}&amp;quot; | jq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== GitHub Actions ====&lt;br /&gt;
&lt;br /&gt;
A new workflow can be configured at GitHub Actions to automatically release a new version in the Plugins directory once a tag is pushed to the repository. Please see https://github.com/moodlehq/moodle-plugin-release for details.&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Setting_up_development_environment&amp;diff=62042</id>
		<title>Setting up development environment</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Setting_up_development_environment&amp;diff=62042"/>
		<updated>2022-04-21T16:20:50Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* IDE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a quick guide which contains all the tools you&#039;ll need to configure your development environment:&lt;br /&gt;
&lt;br /&gt;
== Git ==&lt;br /&gt;
* [[Git_for_developers#Installing_Git_on_your_computer|Installation]]&lt;br /&gt;
* [[Git_for_developers#Setting-up the public repository|Setting-up GitHub]]&lt;br /&gt;
&lt;br /&gt;
== Apache + PHP ==&lt;br /&gt;
* Depending on your computer&#039;s OS:&lt;br /&gt;
** [https://docs.moodle.org/en/Installing_Moodle_on_Debian_based_distributions#Step_1:_Install_required_packages Debian]&lt;br /&gt;
** [https://docs.moodle.org/en/Installation_on_OS_X OS X]&lt;br /&gt;
** [https://docs.moodle.org/en/Windows_installation Windows]: [https://docs.moodle.org/en/Installing_Apache_on_Windows Apache] + [https://docs.moodle.org/en/Installing_PHP_on_Windows PHP]&lt;br /&gt;
* [https://docs.moodle.org/en/PHP#PHP_Extensions_and_libraries Extensions and libraries]&lt;br /&gt;
* Enable SSL for Apache ([https://docs.moodle.org/en/Transitioning_to_HTTPS Transitioning to HTTPS])&lt;br /&gt;
&lt;br /&gt;
More information: [https://docs.moodle.org/en/Category:Installation Category:Installation]&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
* Server:&lt;br /&gt;
** [https://docs.moodle.org/en/PostgreSQL PostgreSQL] (recommended)&lt;br /&gt;
** [https://docs.moodle.org/en/MariaDB MariaDB] (recommended)&lt;br /&gt;
** [https://docs.moodle.org/en/MySQL MySQL]&lt;br /&gt;
** [https://docs.moodle.org/en/MSSQL MSSQL]&lt;br /&gt;
** [https://docs.moodle.org/en/Oracle Oracle] (not recommended)&lt;br /&gt;
* Client:&lt;br /&gt;
** [https://www.adminer.org/ Adminer]&lt;br /&gt;
&lt;br /&gt;
== Moodle ==&lt;br /&gt;
&lt;br /&gt;
=== Manual installation ===&lt;br /&gt;
* [https://docs.moodle.org/en/Installation_quick_guide Quick guide]&lt;br /&gt;
&lt;br /&gt;
=== Moodle Development Kit (MDK) ===&lt;br /&gt;
Only for Linux and MacOS (not available for Windows)&lt;br /&gt;
* [https://github.com/FMCorz/mdk#user-content-for-development Setup]&lt;br /&gt;
** Sample to create some instances (both based on master, first using PostgreSQL and second MySQL:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
mdk create --install --engine pgsql --run mindev users makecourse&lt;br /&gt;
mdk create --install --engine mysqli --run mindev users makecourse -n stable_master-mysql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [[Running_acceptance_test#2._Set_up_Selenium | Behat]]&lt;br /&gt;
** JRE&lt;br /&gt;
** GoogleChrome driver (Firefox stopped working)&lt;br /&gt;
&lt;br /&gt;
=== Docker ===&lt;br /&gt;
* https://github.com/moodlehq/moodle-docker&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IDE ==&lt;br /&gt;
* [[Setting_up_Sublime2 | Sublime]]&lt;br /&gt;
* [[Setting_up_PhpStorm | PhpStorm]]&lt;br /&gt;
* [[Setting_up_Eclipse | Eclipse]]&lt;br /&gt;
* [[Setting_up_Netbeans | Netbeans]]&lt;br /&gt;
* [[Setting up ViM | ViM]]&lt;br /&gt;
&lt;br /&gt;
== COMMAND  LINE  ==&lt;br /&gt;
To   view  logs  in real time  on  linux  based  machines   you   can  use  at the command  line  : #  tail -  f&lt;br /&gt;
&lt;br /&gt;
Example:     #    tail -f  /var/log/apache2/error.log&lt;br /&gt;
&lt;br /&gt;
By  viewing logs in real time you  will find  it  easier  to correlate  actions    and   errors.&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
* [[Grunt#Install_grunt | Grunt]]&lt;br /&gt;
* [https://ngrok.com/download Ngrok], for getting your dev/private site publicly available (for sharing, for testing various integrations requiring public site, SSL or no...)&lt;br /&gt;
** Use [https://ngrok.com/docs#authtoken authtoken] for better experience&lt;br /&gt;
** [https://gist.github.com/andrewnicols/a338c43feca0a87a60248b8097de2ef5 MDK integration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools|Development environment]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61981</id>
		<title>Setting up PhpStorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61981"/>
		<updated>2022-04-16T15:54:32Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Code formatting */ Update settings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.jetbrains.com/phpstorm/ PhpStorm] is a commercial IDE, it is arguably the best IDE for PHP developers with features such as code completion, code inspection, phpunit support, Behat support, database editor, debugger, etc.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
===OS X===&lt;br /&gt;
&lt;br /&gt;
Do not install Java manually, download a PhpStorm package with bundled java instead.&lt;br /&gt;
&lt;br /&gt;
==General settings==&lt;br /&gt;
&lt;br /&gt;
* Uncheck &amp;quot;Missing @throws tag(s)&amp;quot; setting in &amp;quot;Preferences / Editor / Inspections / PHP / PHPDoc&amp;quot;&lt;br /&gt;
* Check &amp;quot;Strip trailing whitespace on Modified Lines&amp;quot; in &amp;quot;Preferences / Editor / General&amp;quot;&lt;br /&gt;
* Check &amp;quot;Show line numbers&amp;quot; in &amp;quot;Preferences / Editor / Appearance&amp;quot;&lt;br /&gt;
* Add Moodle database prefix by create file .phpstorm.meta.php in the project root directory, put the code below to enable PhpStorm recognized {table_name} as Database table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace PHPSTORM_META {&lt;br /&gt;
    override(&lt;br /&gt;
    // Virtual function to indicate that all SQL&lt;br /&gt;
    // injections will have the following replacement rules.&lt;br /&gt;
        sql_injection_subst(),&lt;br /&gt;
        map([&lt;br /&gt;
            &#039;{&#039; =&amp;gt; &amp;quot;mdl_&amp;quot;, // all `{` in injected SQL strings will be replaced with a prefix&lt;br /&gt;
            &#039;}&#039; =&amp;gt; &#039;&#039;,        // all `}` will be replaced with an empty string&lt;br /&gt;
        ]));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bug tracker integration==&lt;br /&gt;
&lt;br /&gt;
* Add tracker linking in &amp;quot;Preferences / Version control / Issue Navigation&amp;quot;&lt;br /&gt;
* Set Issue ID to &amp;quot;MDL-\d+|CONTRIB-\d+|MOBILE-\d+|MDLSITE-d+|MDLQA-\d+|UX-\d+|MDLNET-\d+|WPQA-\d+&amp;quot; and Issue link to &amp;quot;https://tracker.moodle.org/browse/$0&amp;quot; or just click on &#039;add Jira pattern&#039; and paste &amp;quot;https://tracker.moodle.org&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Code formatting==&lt;br /&gt;
&lt;br /&gt;
* Setup coding style to use all rules from [[Coding style]] in &amp;quot;Preferences / Code Style / PHP&amp;quot; (or simply import from https://github.com/enovation/moodle-utils/blob/master/phpstorm-config/Moodle.xml) - this will allow you to use automatic code formatting and it does nice code formatting on copy/paste.&lt;br /&gt;
* Set line separator to &amp;quot;Unix and OS X (\n)&amp;quot; in &amp;quot;Preferences / Code Style / General&amp;quot;.&lt;br /&gt;
* Set right margin to 132 or 180 in &amp;quot;Preferences / Code Style / General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Tips &amp;amp; Tricks==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/** @var admin_root $ADMIN */&amp;lt;/syntaxhighlight&amp;gt;  to autofill $ADMIN-&amp;gt;...&lt;br /&gt;
* Remove SQL syntax inspection errors for Moodle tables surrounded by curly brackets (like: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;SELECT * FROM {user}&amp;lt;/syntaxhighlight&amp;gt;)  by adding &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;\{(\w+)\}&amp;lt;/syntaxhighlight&amp;gt; to Tools &amp;gt; Databases &amp;gt; user parameters &lt;br /&gt;
(more info: https://blog.jetbrains.com/phpstorm/2014/11/database-language-injection-configuration/ , and a &amp;quot;feature request&amp;quot; to improve it: https://youtrack.jetbrains.com/issue/WI-4123 )&lt;br /&gt;
* You can deactivate warnings for specific exceptions (in particular the coding_exception, which is unlikely to be catched in your code) by going to Settings &amp;gt; PHP and add them to &#039;Unchecked Exceptions&#039; under the &#039;Analysis&#039; tab&lt;br /&gt;
&lt;br /&gt;
==Moodle code checker==&lt;br /&gt;
Follow the instructions in the [https://github.com/moodlehq/moodle-local_codechecker/blob/master/README.md#ide-integration README]&lt;br /&gt;
&lt;br /&gt;
==PHPUnit integration==&lt;br /&gt;
# Install [[PHPUnit]] via Composer &lt;br /&gt;
# Tell PHPStorm where is composer - go to &amp;quot;Preferences / PHP / Composer&amp;quot;, fill in &amp;quot;Path to PHP executable&amp;quot;, &amp;quot;Path to composer.phar&amp;quot;, &amp;quot;Path to composer.json&amp;quot; and make sure the option &amp;quot;Add packages as libraries&amp;quot; is enabled.&lt;br /&gt;
# Go to &amp;quot;Run / Edit configurations&amp;quot;&lt;br /&gt;
# Add PHPUnit configuration by clicking on &amp;quot;+&amp;quot;&lt;br /&gt;
# Click &amp;quot;Use alternative configuration file&amp;quot; and select your phpunit.xml file&lt;br /&gt;
# Go to &amp;quot;Run / Run ...&amp;quot; and select your new PHPUnit configuration to run&lt;br /&gt;
&lt;br /&gt;
==Database editor==&lt;br /&gt;
# Click on the &amp;quot;Database&amp;quot; tab to see the database window&lt;br /&gt;
# Click &amp;quot;+&amp;quot; in the top left and add &amp;quot;Database source&amp;quot; for your database&lt;br /&gt;
# Note: click on the link to download the necessary drivers directly from IDE&lt;br /&gt;
&lt;br /&gt;
==Javascript Development==&lt;br /&gt;
You can work on Javascript development by add Grunt configuration:&lt;br /&gt;
# Install Watchman - https://facebook.github.io/watchman/docs/install.html&lt;br /&gt;
# From the main Moodle directory open terminal and run: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g grunt-cli&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Open &amp;quot;Edit configuration&amp;quot;&lt;br /&gt;
# Add new Grunt Task&lt;br /&gt;
## Verify that the node version is set with proper version for the current Moodle version&lt;br /&gt;
## In Tasks select watch&lt;br /&gt;
# Save the Grunt task&lt;br /&gt;
# Verify that in config.php the setting is not comment&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;cachejs = false;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Click on run icon&lt;br /&gt;
# happy Javascript development&lt;br /&gt;
&lt;br /&gt;
==Debugging with Xdebug with docker containers==&lt;br /&gt;
&lt;br /&gt;
This is very helpful when developing locally and you need to go step by step on the execution path of something of your interest.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using [https://github.com/moodlehq/moodle-docker moodle-docker], please refer to its section about [https://github.com/moodlehq/moodle-docker#using-xdebug-for-live-debugging live debugging] before taking this section. If you are using a custom docker container, the web server container should be based on Debian-like to have the following instructions compatible.&lt;br /&gt;
&lt;br /&gt;
These are the steps for configuring Xdebug to live debugging your code:&lt;br /&gt;
&lt;br /&gt;
# Be sure containers are stopped.&lt;br /&gt;
# If you&#039;re using Docker on Mac or Windows, you can omit this step. So, only if you&#039;re using Docker on linux: Create a file named `add-host.docker.internal-to-etc-hosts` with execution rights on the Moodle root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y iproute2&lt;br /&gt;
apt clean&lt;br /&gt;
apt auto-clean&lt;br /&gt;
HOST_DOMAIN=&amp;quot;host.docker.internal&amp;quot;&lt;br /&gt;
ping -q -c1 $HOST_DOMAIN &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
if [ $? -ne 0 ]; then&lt;br /&gt;
  HOST_IP=$(ip route | awk &#039;NR==1 {print $3}&#039;)&lt;br /&gt;
  echo -e &amp;quot;$HOST_IP\t$HOST_DOMAIN&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Edit the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;base.yml&amp;lt;/syntaxhighlight&amp;gt; from the moodle-docker root (or equivalent from your custom docker container) to append these lines into the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver: environment:&amp;lt;/syntaxhighlight&amp;gt; section:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# The result for the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver&amp;lt;/syntaxhighlight&amp;gt; service should be like this (this example is from moodle-docker): &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  webserver:&lt;br /&gt;
    image: &amp;quot;moodlehq/moodle-php-apache:${MOODLE_DOCKER_PHP_VERSION}&amp;quot;&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
    volumes:&lt;br /&gt;
      - &amp;quot;${MOODLE_DOCKER_WWWROOT}:/var/www/html&amp;quot;&lt;br /&gt;
      - &amp;quot;${ASSETDIR}/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      MOODLE_DOCKER_DBTYPE: pgsql&lt;br /&gt;
      MOODLE_DOCKER_DBNAME: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBUSER: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBPASS: &amp;quot;m@0dl3ing&amp;quot;&lt;br /&gt;
      MOODLE_DOCKER_BROWSER: firefox&lt;br /&gt;
      MOODLE_DOCKER_WEB_HOST: &amp;quot;${MOODLE_DOCKER_WEB_HOST}&amp;quot;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Start the moodle-docker containers, or your custom ones.&lt;br /&gt;
# Only if you&#039;re using Docker on linux: From a PhpStorm terminal, run: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 ./add-host.docker.internal-to-etc-hosts&amp;lt;/syntaxhighlight&amp;gt;. You have to see how packages are installed.&lt;br /&gt;
# In any type of host (Mac, Windows or linux): Check that &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/etc/hosts&amp;lt;/syntaxhighlight&amp;gt; has a line with &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;host.docker.internal&amp;lt;/syntaxhighlight&amp;gt;. You can do that with the command &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 cat /etc/hosts&amp;lt;/syntaxhighlight&amp;gt; (if you have a custom container name, use the name for the webserver container). The result should be something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1     localhost ip6-localhost ip6-loopback&lt;br /&gt;
fe00::0 ip6-localnet&lt;br /&gt;
ff00::0 ip6-mcastprefix&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&lt;br /&gt;
172.20.0.6      17dff32616ac&lt;br /&gt;
172.20.0.1      host.docker.internal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Go to your PhpStorm and go to &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;Run -&amp;gt; Edit configurations&amp;lt;/syntaxhighlight&amp;gt; and select new &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;PHP Remove Debug&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Name: &amp;quot;xdebug localhost&amp;quot; (or what you want to)&lt;br /&gt;
# Configuration: check &amp;quot;Filter debug connection by IDE key&amp;quot;&lt;br /&gt;
# IDE key(session id): &amp;quot;phpstorm&amp;quot;&lt;br /&gt;
# Define a new server:&lt;br /&gt;
# Name: must be &amp;quot;moodle-local&amp;quot;&lt;br /&gt;
# Host: localhost&lt;br /&gt;
# Port: must be the port you&#039;re using for the web server.&lt;br /&gt;
# Debugger: use the default (Xdebug)&lt;br /&gt;
# Check &amp;quot;Use path mappings (...)&amp;quot;&lt;br /&gt;
# Set for your &amp;quot;Project files&amp;quot; Moodle root the &amp;quot;Absolute path on the server&amp;quot; as &amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
# Apply and OK on this screen. This screen will be closed.&lt;br /&gt;
# Apply and OK on the next screen. Settings screen will be closed.&lt;br /&gt;
# Now, test that live debugging works. To do so, please:&lt;br /&gt;
# Put a breakpoint on /index.php file.&lt;br /&gt;
# Press telephone icon with a red symbol with title &amp;quot;Start listening for PHP Debug Connections&amp;quot;: telephone should appear with some waves now.&lt;br /&gt;
# Open your browser and open your localhost Moodle site.&lt;br /&gt;
# Happy debugging ;-)&lt;br /&gt;
&lt;br /&gt;
Final note: Every time you start the webserver container, ONLY if you&#039;re using a linux host, you have to run the script for adding the host.docker.internal.&lt;br /&gt;
Final note 2: This method also works if your docker containers are in a different host from localhost: you just need to specify the proper server name and port.&lt;br /&gt;
Final note 3: This configuration also allows you to debug CLI scripts.&lt;br /&gt;
&lt;br /&gt;
==Useful plugins==&lt;br /&gt;
&lt;br /&gt;
# Php Inspections ​(EA Extended) - https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-/&lt;br /&gt;
# SonarLint - https://plugins.jetbrains.com/plugin/7973-sonarlint/&lt;br /&gt;
# Diff / Patch File Support - https://plugins.jetbrains.com/plugin/11957-diff--patch-file-support/&lt;br /&gt;
# Handlebars/Mustache - https://plugins.jetbrains.com/plugin/6884-handlebars-mustache/&lt;br /&gt;
# Markdown Navigator - https://plugins.jetbrains.com/plugin/7896-markdown-navigator/&lt;br /&gt;
# PHP composer.json support - https://plugins.jetbrains.com/plugin/7631-php-composer-json-support/&lt;br /&gt;
# PHP Advanced AutoComplete - https://plugins.jetbrains.com/plugin/7276-php-advanced-autocomplete/&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools|PhpStorm]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61980</id>
		<title>Setting up PhpStorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61980"/>
		<updated>2022-04-16T15:43:01Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* General settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.jetbrains.com/phpstorm/ PhpStorm] is a commercial IDE, it is arguably the best IDE for PHP developers with features such as code completion, code inspection, phpunit support, Behat support, database editor, debugger, etc.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
===OS X===&lt;br /&gt;
&lt;br /&gt;
Do not install Java manually, download a PhpStorm package with bundled java instead.&lt;br /&gt;
&lt;br /&gt;
==General settings==&lt;br /&gt;
&lt;br /&gt;
* Uncheck &amp;quot;Missing @throws tag(s)&amp;quot; setting in &amp;quot;Preferences / Editor / Inspections / PHP / PHPDoc&amp;quot;&lt;br /&gt;
* Check &amp;quot;Strip trailing whitespace on Modified Lines&amp;quot; in &amp;quot;Preferences / Editor / General&amp;quot;&lt;br /&gt;
* Check &amp;quot;Show line numbers&amp;quot; in &amp;quot;Preferences / Editor / Appearance&amp;quot;&lt;br /&gt;
* Add Moodle database prefix by create file .phpstorm.meta.php in the project root directory, put the code below to enable PhpStorm recognized {table_name} as Database table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace PHPSTORM_META {&lt;br /&gt;
    override(&lt;br /&gt;
    // Virtual function to indicate that all SQL&lt;br /&gt;
    // injections will have the following replacement rules.&lt;br /&gt;
        sql_injection_subst(),&lt;br /&gt;
        map([&lt;br /&gt;
            &#039;{&#039; =&amp;gt; &amp;quot;mdl_&amp;quot;, // all `{` in injected SQL strings will be replaced with a prefix&lt;br /&gt;
            &#039;}&#039; =&amp;gt; &#039;&#039;,        // all `}` will be replaced with an empty string&lt;br /&gt;
        ]));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bug tracker integration==&lt;br /&gt;
&lt;br /&gt;
* Add tracker linking in &amp;quot;Preferences / Version control / Issue Navigation&amp;quot;&lt;br /&gt;
* Set Issue ID to &amp;quot;MDL-\d+|CONTRIB-\d+|MOBILE-\d+|MDLSITE-d+|MDLQA-\d+|UX-\d+|MDLNET-\d+|WPQA-\d+&amp;quot; and Issue link to &amp;quot;https://tracker.moodle.org/browse/$0&amp;quot; or just click on &#039;add Jira pattern&#039; and paste &amp;quot;https://tracker.moodle.org&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Code formatting==&lt;br /&gt;
&lt;br /&gt;
* Setup coding style to use all rules from [[Coding style]] in &amp;quot;Preferences / Project Settings / Code Style / PHP&amp;quot; (or simply import from https://github.com/enovation/moodle-utils/blob/master/phpstorm-config/Moodle.xml) - this will allow you to use automatic code formatting and it does nice code formatting on copy/paste.&lt;br /&gt;
* Set line separator to &amp;quot;Unix and OS X (\n)&amp;quot; in &amp;quot;Preferences / Project Settings / Code Style / General&amp;quot;.&lt;br /&gt;
* Set right margin to 132 or 180 in &amp;quot;Preferences / Project Settings / Code Style / General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Tips &amp;amp; Tricks==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/** @var admin_root $ADMIN */&amp;lt;/syntaxhighlight&amp;gt;  to autofill $ADMIN-&amp;gt;...&lt;br /&gt;
* Remove SQL syntax inspection errors for Moodle tables surrounded by curly brackets (like: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;SELECT * FROM {user}&amp;lt;/syntaxhighlight&amp;gt;)  by adding &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;\{(\w+)\}&amp;lt;/syntaxhighlight&amp;gt; to Tools &amp;gt; Databases &amp;gt; user parameters &lt;br /&gt;
(more info: https://blog.jetbrains.com/phpstorm/2014/11/database-language-injection-configuration/ , and a &amp;quot;feature request&amp;quot; to improve it: https://youtrack.jetbrains.com/issue/WI-4123 )&lt;br /&gt;
* You can deactivate warnings for specific exceptions (in particular the coding_exception, which is unlikely to be catched in your code) by going to Settings &amp;gt; PHP and add them to &#039;Unchecked Exceptions&#039; under the &#039;Analysis&#039; tab&lt;br /&gt;
&lt;br /&gt;
==Moodle code checker==&lt;br /&gt;
Follow the instructions in the [https://github.com/moodlehq/moodle-local_codechecker/blob/master/README.md#ide-integration README]&lt;br /&gt;
&lt;br /&gt;
==PHPUnit integration==&lt;br /&gt;
# Install [[PHPUnit]] via Composer &lt;br /&gt;
# Tell PHPStorm where is composer - go to &amp;quot;Preferences / PHP / Composer&amp;quot;, fill in &amp;quot;Path to PHP executable&amp;quot;, &amp;quot;Path to composer.phar&amp;quot;, &amp;quot;Path to composer.json&amp;quot; and make sure the option &amp;quot;Add packages as libraries&amp;quot; is enabled.&lt;br /&gt;
# Go to &amp;quot;Run / Edit configurations&amp;quot;&lt;br /&gt;
# Add PHPUnit configuration by clicking on &amp;quot;+&amp;quot;&lt;br /&gt;
# Click &amp;quot;Use alternative configuration file&amp;quot; and select your phpunit.xml file&lt;br /&gt;
# Go to &amp;quot;Run / Run ...&amp;quot; and select your new PHPUnit configuration to run&lt;br /&gt;
&lt;br /&gt;
==Database editor==&lt;br /&gt;
# Click on the &amp;quot;Database&amp;quot; tab to see the database window&lt;br /&gt;
# Click &amp;quot;+&amp;quot; in the top left and add &amp;quot;Database source&amp;quot; for your database&lt;br /&gt;
# Note: click on the link to download the necessary drivers directly from IDE&lt;br /&gt;
&lt;br /&gt;
==Javascript Development==&lt;br /&gt;
You can work on Javascript development by add Grunt configuration:&lt;br /&gt;
# Install Watchman - https://facebook.github.io/watchman/docs/install.html&lt;br /&gt;
# From the main Moodle directory open terminal and run: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g grunt-cli&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Open &amp;quot;Edit configuration&amp;quot;&lt;br /&gt;
# Add new Grunt Task&lt;br /&gt;
## Verify that the node version is set with proper version for the current Moodle version&lt;br /&gt;
## In Tasks select watch&lt;br /&gt;
# Save the Grunt task&lt;br /&gt;
# Verify that in config.php the setting is not comment&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;cachejs = false;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Click on run icon&lt;br /&gt;
# happy Javascript development&lt;br /&gt;
&lt;br /&gt;
==Debugging with Xdebug with docker containers==&lt;br /&gt;
&lt;br /&gt;
This is very helpful when developing locally and you need to go step by step on the execution path of something of your interest.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using [https://github.com/moodlehq/moodle-docker moodle-docker], please refer to its section about [https://github.com/moodlehq/moodle-docker#using-xdebug-for-live-debugging live debugging] before taking this section. If you are using a custom docker container, the web server container should be based on Debian-like to have the following instructions compatible.&lt;br /&gt;
&lt;br /&gt;
These are the steps for configuring Xdebug to live debugging your code:&lt;br /&gt;
&lt;br /&gt;
# Be sure containers are stopped.&lt;br /&gt;
# If you&#039;re using Docker on Mac or Windows, you can omit this step. So, only if you&#039;re using Docker on linux: Create a file named `add-host.docker.internal-to-etc-hosts` with execution rights on the Moodle root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y iproute2&lt;br /&gt;
apt clean&lt;br /&gt;
apt auto-clean&lt;br /&gt;
HOST_DOMAIN=&amp;quot;host.docker.internal&amp;quot;&lt;br /&gt;
ping -q -c1 $HOST_DOMAIN &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
if [ $? -ne 0 ]; then&lt;br /&gt;
  HOST_IP=$(ip route | awk &#039;NR==1 {print $3}&#039;)&lt;br /&gt;
  echo -e &amp;quot;$HOST_IP\t$HOST_DOMAIN&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Edit the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;base.yml&amp;lt;/syntaxhighlight&amp;gt; from the moodle-docker root (or equivalent from your custom docker container) to append these lines into the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver: environment:&amp;lt;/syntaxhighlight&amp;gt; section:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# The result for the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver&amp;lt;/syntaxhighlight&amp;gt; service should be like this (this example is from moodle-docker): &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  webserver:&lt;br /&gt;
    image: &amp;quot;moodlehq/moodle-php-apache:${MOODLE_DOCKER_PHP_VERSION}&amp;quot;&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
    volumes:&lt;br /&gt;
      - &amp;quot;${MOODLE_DOCKER_WWWROOT}:/var/www/html&amp;quot;&lt;br /&gt;
      - &amp;quot;${ASSETDIR}/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      MOODLE_DOCKER_DBTYPE: pgsql&lt;br /&gt;
      MOODLE_DOCKER_DBNAME: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBUSER: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBPASS: &amp;quot;m@0dl3ing&amp;quot;&lt;br /&gt;
      MOODLE_DOCKER_BROWSER: firefox&lt;br /&gt;
      MOODLE_DOCKER_WEB_HOST: &amp;quot;${MOODLE_DOCKER_WEB_HOST}&amp;quot;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Start the moodle-docker containers, or your custom ones.&lt;br /&gt;
# Only if you&#039;re using Docker on linux: From a PhpStorm terminal, run: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 ./add-host.docker.internal-to-etc-hosts&amp;lt;/syntaxhighlight&amp;gt;. You have to see how packages are installed.&lt;br /&gt;
# In any type of host (Mac, Windows or linux): Check that &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/etc/hosts&amp;lt;/syntaxhighlight&amp;gt; has a line with &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;host.docker.internal&amp;lt;/syntaxhighlight&amp;gt;. You can do that with the command &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 cat /etc/hosts&amp;lt;/syntaxhighlight&amp;gt; (if you have a custom container name, use the name for the webserver container). The result should be something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1     localhost ip6-localhost ip6-loopback&lt;br /&gt;
fe00::0 ip6-localnet&lt;br /&gt;
ff00::0 ip6-mcastprefix&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&lt;br /&gt;
172.20.0.6      17dff32616ac&lt;br /&gt;
172.20.0.1      host.docker.internal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Go to your PhpStorm and go to &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;Run -&amp;gt; Edit configurations&amp;lt;/syntaxhighlight&amp;gt; and select new &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;PHP Remove Debug&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Name: &amp;quot;xdebug localhost&amp;quot; (or what you want to)&lt;br /&gt;
# Configuration: check &amp;quot;Filter debug connection by IDE key&amp;quot;&lt;br /&gt;
# IDE key(session id): &amp;quot;phpstorm&amp;quot;&lt;br /&gt;
# Define a new server:&lt;br /&gt;
# Name: must be &amp;quot;moodle-local&amp;quot;&lt;br /&gt;
# Host: localhost&lt;br /&gt;
# Port: must be the port you&#039;re using for the web server.&lt;br /&gt;
# Debugger: use the default (Xdebug)&lt;br /&gt;
# Check &amp;quot;Use path mappings (...)&amp;quot;&lt;br /&gt;
# Set for your &amp;quot;Project files&amp;quot; Moodle root the &amp;quot;Absolute path on the server&amp;quot; as &amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
# Apply and OK on this screen. This screen will be closed.&lt;br /&gt;
# Apply and OK on the next screen. Settings screen will be closed.&lt;br /&gt;
# Now, test that live debugging works. To do so, please:&lt;br /&gt;
# Put a breakpoint on /index.php file.&lt;br /&gt;
# Press telephone icon with a red symbol with title &amp;quot;Start listening for PHP Debug Connections&amp;quot;: telephone should appear with some waves now.&lt;br /&gt;
# Open your browser and open your localhost Moodle site.&lt;br /&gt;
# Happy debugging ;-)&lt;br /&gt;
&lt;br /&gt;
Final note: Every time you start the webserver container, ONLY if you&#039;re using a linux host, you have to run the script for adding the host.docker.internal.&lt;br /&gt;
Final note 2: This method also works if your docker containers are in a different host from localhost: you just need to specify the proper server name and port.&lt;br /&gt;
Final note 3: This configuration also allows you to debug CLI scripts.&lt;br /&gt;
&lt;br /&gt;
==Useful plugins==&lt;br /&gt;
&lt;br /&gt;
# Php Inspections ​(EA Extended) - https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-/&lt;br /&gt;
# SonarLint - https://plugins.jetbrains.com/plugin/7973-sonarlint/&lt;br /&gt;
# Diff / Patch File Support - https://plugins.jetbrains.com/plugin/11957-diff--patch-file-support/&lt;br /&gt;
# Handlebars/Mustache - https://plugins.jetbrains.com/plugin/6884-handlebars-mustache/&lt;br /&gt;
# Markdown Navigator - https://plugins.jetbrains.com/plugin/7896-markdown-navigator/&lt;br /&gt;
# PHP composer.json support - https://plugins.jetbrains.com/plugin/7631-php-composer-json-support/&lt;br /&gt;
# PHP Advanced AutoComplete - https://plugins.jetbrains.com/plugin/7276-php-advanced-autocomplete/&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools|PhpStorm]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61979</id>
		<title>Setting up PhpStorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Setting_up_PhpStorm&amp;diff=61979"/>
		<updated>2022-04-16T15:42:48Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* General settings */ Update settings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.jetbrains.com/phpstorm/ PhpStorm] is a commercial IDE, it is arguably the best IDE for PHP developers with features such as code completion, code inspection, phpunit support, Behat support, database editor, debugger, etc.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
===OS X===&lt;br /&gt;
&lt;br /&gt;
Do not install Java manually, download a PhpStorm package with bundled java instead.&lt;br /&gt;
&lt;br /&gt;
==General settings==&lt;br /&gt;
&lt;br /&gt;
* Uncheck &amp;quot;Missing @throws tag(s)&amp;quot; setting in &amp;quot;Preferences / Editor / Inspections / PHP / PHPDoc&amp;quot;&lt;br /&gt;
* Check &amp;quot;Strip trailing whitespace on Modified Lines&amp;quot; in &amp;quot;Preferences / Editor / General&amp;quot;&lt;br /&gt;
* Check &amp;quot;Show line numbers&amp;quot; in &amp;quot;Preferences / Editor / Appearance&amp;quot;&lt;br /&gt;
* Add Moodle database prefix by create file .phpstorm.meta.php in the project root directory, put the code below to enable PhpStorm recognized {table_name} as Database table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace PHPSTORM_META {&lt;br /&gt;
    override(&lt;br /&gt;
    // Virtual function to indicate that all SQL&lt;br /&gt;
    // injections will have the following replacement rules.&lt;br /&gt;
        sql_injection_subst(),&lt;br /&gt;
        map([&lt;br /&gt;
            &#039;{&#039; =&amp;gt; &amp;quot;mdl_&amp;quot;, // all `{` in injected SQL strings will be replaced with a prefix&lt;br /&gt;
            &#039;}&#039; =&amp;gt; &#039;&#039;,        // all `}` will be replaced with an empty string&lt;br /&gt;
        ]));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bug tracker integration==&lt;br /&gt;
&lt;br /&gt;
* Add tracker linking in &amp;quot;Preferences / Version control / Issue Navigation&amp;quot;&lt;br /&gt;
* Set Issue ID to &amp;quot;MDL-\d+|CONTRIB-\d+|MOBILE-\d+|MDLSITE-d+|MDLQA-\d+|UX-\d+|MDLNET-\d+|WPQA-\d+&amp;quot; and Issue link to &amp;quot;https://tracker.moodle.org/browse/$0&amp;quot; or just click on &#039;add Jira pattern&#039; and paste &amp;quot;https://tracker.moodle.org&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Code formatting==&lt;br /&gt;
&lt;br /&gt;
* Setup coding style to use all rules from [[Coding style]] in &amp;quot;Preferences / Project Settings / Code Style / PHP&amp;quot; (or simply import from https://github.com/enovation/moodle-utils/blob/master/phpstorm-config/Moodle.xml) - this will allow you to use automatic code formatting and it does nice code formatting on copy/paste.&lt;br /&gt;
* Set line separator to &amp;quot;Unix and OS X (\n)&amp;quot; in &amp;quot;Preferences / Project Settings / Code Style / General&amp;quot;.&lt;br /&gt;
* Set right margin to 132 or 180 in &amp;quot;Preferences / Project Settings / Code Style / General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Tips &amp;amp; Tricks==&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/** @var admin_root $ADMIN */&amp;lt;/syntaxhighlight&amp;gt;  to autofill $ADMIN-&amp;gt;...&lt;br /&gt;
* Remove SQL syntax inspection errors for Moodle tables surrounded by curly brackets (like: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;SELECT * FROM {user}&amp;lt;/syntaxhighlight&amp;gt;)  by adding &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;\{(\w+)\}&amp;lt;/syntaxhighlight&amp;gt; to Tools &amp;gt; Databases &amp;gt; user parameters &lt;br /&gt;
(more info: https://blog.jetbrains.com/phpstorm/2014/11/database-language-injection-configuration/ , and a &amp;quot;feature request&amp;quot; to improve it: https://youtrack.jetbrains.com/issue/WI-4123 )&lt;br /&gt;
* You can deactivate warnings for specific exceptions (in particular the coding_exception, which is unlikely to be catched in your code) by going to Settings &amp;gt; PHP and add them to &#039;Unchecked Exceptions&#039; under the &#039;Analysis&#039; tab&lt;br /&gt;
&lt;br /&gt;
==Moodle code checker==&lt;br /&gt;
Follow the instructions in the [https://github.com/moodlehq/moodle-local_codechecker/blob/master/README.md#ide-integration README]&lt;br /&gt;
&lt;br /&gt;
==PHPUnit integration==&lt;br /&gt;
# Install [[PHPUnit]] via Composer &lt;br /&gt;
# Tell PHPStorm where is composer - go to &amp;quot;Preferences / PHP / Composer&amp;quot;, fill in &amp;quot;Path to PHP executable&amp;quot;, &amp;quot;Path to composer.phar&amp;quot;, &amp;quot;Path to composer.json&amp;quot; and make sure the option &amp;quot;Add packages as libraries&amp;quot; is enabled.&lt;br /&gt;
# Go to &amp;quot;Run / Edit configurations&amp;quot;&lt;br /&gt;
# Add PHPUnit configuration by clicking on &amp;quot;+&amp;quot;&lt;br /&gt;
# Click &amp;quot;Use alternative configuration file&amp;quot; and select your phpunit.xml file&lt;br /&gt;
# Go to &amp;quot;Run / Run ...&amp;quot; and select your new PHPUnit configuration to run&lt;br /&gt;
&lt;br /&gt;
==Database editor==&lt;br /&gt;
# Click on the &amp;quot;Database&amp;quot; tab to see the database window&lt;br /&gt;
# Click &amp;quot;+&amp;quot; in the top left and add &amp;quot;Database source&amp;quot; for your database&lt;br /&gt;
# Note: click on the link to download the necessary drivers directly from IDE&lt;br /&gt;
&lt;br /&gt;
==Javascript Development==&lt;br /&gt;
You can work on Javascript development by add Grunt configuration:&lt;br /&gt;
# Install Watchman - https://facebook.github.io/watchman/docs/install.html&lt;br /&gt;
# From the main Moodle directory open terminal and run: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g grunt-cli&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Open &amp;quot;Edit configuration&amp;quot;&lt;br /&gt;
# Add new Grunt Task&lt;br /&gt;
## Verify that the node version is set with proper version for the current Moodle version&lt;br /&gt;
## In Tasks select watch&lt;br /&gt;
# Save the Grunt task&lt;br /&gt;
# Verify that in config.php the setting is not comment&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;cachejs = false;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Click on run icon&lt;br /&gt;
# happy Javascript development&lt;br /&gt;
&lt;br /&gt;
==Debugging with Xdebug with docker containers==&lt;br /&gt;
&lt;br /&gt;
This is very helpful when developing locally and you need to go step by step on the execution path of something of your interest.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using [https://github.com/moodlehq/moodle-docker moodle-docker], please refer to its section about [https://github.com/moodlehq/moodle-docker#using-xdebug-for-live-debugging live debugging] before taking this section. If you are using a custom docker container, the web server container should be based on Debian-like to have the following instructions compatible.&lt;br /&gt;
&lt;br /&gt;
These are the steps for configuring Xdebug to live debugging your code:&lt;br /&gt;
&lt;br /&gt;
# Be sure containers are stopped.&lt;br /&gt;
# If you&#039;re using Docker on Mac or Windows, you can omit this step. So, only if you&#039;re using Docker on linux: Create a file named `add-host.docker.internal-to-etc-hosts` with execution rights on the Moodle root:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y iproute2&lt;br /&gt;
apt clean&lt;br /&gt;
apt auto-clean&lt;br /&gt;
HOST_DOMAIN=&amp;quot;host.docker.internal&amp;quot;&lt;br /&gt;
ping -q -c1 $HOST_DOMAIN &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
if [ $? -ne 0 ]; then&lt;br /&gt;
  HOST_IP=$(ip route | awk &#039;NR==1 {print $3}&#039;)&lt;br /&gt;
  echo -e &amp;quot;$HOST_IP\t$HOST_DOMAIN&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Edit the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;base.yml&amp;lt;/syntaxhighlight&amp;gt; from the moodle-docker root (or equivalent from your custom docker container) to append these lines into the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver: environment:&amp;lt;/syntaxhighlight&amp;gt; section:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# The result for the &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;webserver&amp;lt;/syntaxhighlight&amp;gt; service should be like this (this example is from moodle-docker): &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  webserver:&lt;br /&gt;
    image: &amp;quot;moodlehq/moodle-php-apache:${MOODLE_DOCKER_PHP_VERSION}&amp;quot;&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
    volumes:&lt;br /&gt;
      - &amp;quot;${MOODLE_DOCKER_WWWROOT}:/var/www/html&amp;quot;&lt;br /&gt;
      - &amp;quot;${ASSETDIR}/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      MOODLE_DOCKER_DBTYPE: pgsql&lt;br /&gt;
      MOODLE_DOCKER_DBNAME: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBUSER: moodle&lt;br /&gt;
      MOODLE_DOCKER_DBPASS: &amp;quot;m@0dl3ing&amp;quot;&lt;br /&gt;
      MOODLE_DOCKER_BROWSER: firefox&lt;br /&gt;
      MOODLE_DOCKER_WEB_HOST: &amp;quot;${MOODLE_DOCKER_WEB_HOST}&amp;quot;&lt;br /&gt;
      XDEBUG_CONFIG:&lt;br /&gt;
        idekey=phpstorm&lt;br /&gt;
        remote_enable=1&lt;br /&gt;
        remote_mode=req&lt;br /&gt;
        remote_port=9000&lt;br /&gt;
        remote_host=host.docker.internal&lt;br /&gt;
        remote_connect_back=0&lt;br /&gt;
      PHP_IDE_CONFIG:&lt;br /&gt;
        serverName=moodle-local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Start the moodle-docker containers, or your custom ones.&lt;br /&gt;
# Only if you&#039;re using Docker on linux: From a PhpStorm terminal, run: &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 ./add-host.docker.internal-to-etc-hosts&amp;lt;/syntaxhighlight&amp;gt;. You have to see how packages are installed.&lt;br /&gt;
# In any type of host (Mac, Windows or linux): Check that &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;/etc/hosts&amp;lt;/syntaxhighlight&amp;gt; has a line with &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;host.docker.internal&amp;lt;/syntaxhighlight&amp;gt;. You can do that with the command &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;docker exec -it moodledocker_webserver_1 cat /etc/hosts&amp;lt;/syntaxhighlight&amp;gt; (if you have a custom container name, use the name for the webserver container). The result should be something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1     localhost ip6-localhost ip6-loopback&lt;br /&gt;
fe00::0 ip6-localnet&lt;br /&gt;
ff00::0 ip6-mcastprefix&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&lt;br /&gt;
172.20.0.6      17dff32616ac&lt;br /&gt;
172.20.0.1      host.docker.internal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Go to your PhpStorm and go to &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;Run -&amp;gt; Edit configurations&amp;lt;/syntaxhighlight&amp;gt; and select new &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;PHP Remove Debug&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Name: &amp;quot;xdebug localhost&amp;quot; (or what you want to)&lt;br /&gt;
# Configuration: check &amp;quot;Filter debug connection by IDE key&amp;quot;&lt;br /&gt;
# IDE key(session id): &amp;quot;phpstorm&amp;quot;&lt;br /&gt;
# Define a new server:&lt;br /&gt;
# Name: must be &amp;quot;moodle-local&amp;quot;&lt;br /&gt;
# Host: localhost&lt;br /&gt;
# Port: must be the port you&#039;re using for the web server.&lt;br /&gt;
# Debugger: use the default (Xdebug)&lt;br /&gt;
# Check &amp;quot;Use path mappings (...)&amp;quot;&lt;br /&gt;
# Set for your &amp;quot;Project files&amp;quot; Moodle root the &amp;quot;Absolute path on the server&amp;quot; as &amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
# Apply and OK on this screen. This screen will be closed.&lt;br /&gt;
# Apply and OK on the next screen. Settings screen will be closed.&lt;br /&gt;
# Now, test that live debugging works. To do so, please:&lt;br /&gt;
# Put a breakpoint on /index.php file.&lt;br /&gt;
# Press telephone icon with a red symbol with title &amp;quot;Start listening for PHP Debug Connections&amp;quot;: telephone should appear with some waves now.&lt;br /&gt;
# Open your browser and open your localhost Moodle site.&lt;br /&gt;
# Happy debugging ;-)&lt;br /&gt;
&lt;br /&gt;
Final note: Every time you start the webserver container, ONLY if you&#039;re using a linux host, you have to run the script for adding the host.docker.internal.&lt;br /&gt;
Final note 2: This method also works if your docker containers are in a different host from localhost: you just need to specify the proper server name and port.&lt;br /&gt;
Final note 3: This configuration also allows you to debug CLI scripts.&lt;br /&gt;
&lt;br /&gt;
==Useful plugins==&lt;br /&gt;
&lt;br /&gt;
# Php Inspections ​(EA Extended) - https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-/&lt;br /&gt;
# SonarLint - https://plugins.jetbrains.com/plugin/7973-sonarlint/&lt;br /&gt;
# Diff / Patch File Support - https://plugins.jetbrains.com/plugin/11957-diff--patch-file-support/&lt;br /&gt;
# Handlebars/Mustache - https://plugins.jetbrains.com/plugin/6884-handlebars-mustache/&lt;br /&gt;
# Markdown Navigator - https://plugins.jetbrains.com/plugin/7896-markdown-navigator/&lt;br /&gt;
# PHP composer.json support - https://plugins.jetbrains.com/plugin/7631-php-composer-json-support/&lt;br /&gt;
# PHP Advanced AutoComplete - https://plugins.jetbrains.com/plugin/7276-php-advanced-autocomplete/&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools|PhpStorm]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_versions&amp;diff=57729</id>
		<title>Moodle versions</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_versions&amp;diff=57729"/>
		<updated>2020-07-25T09:34:54Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Releases */ Fix link and date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Moodle versions and branches==&lt;br /&gt;
&lt;br /&gt;
Understanding the Moodle versioning scheme will help you when using our repositories to get your code (e.g. for an [[:en:Upgrading|upgrade]]).  Knowing the correct versions is also very useful when reporting bugs in our [http://tracker.moodle.org tracker].&lt;br /&gt;
&lt;br /&gt;
[[Image:versions.png|thumb|left|668px|Schema of Moodle source code branches, versions and maturity levels]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Major and minor versions ==&lt;br /&gt;
&lt;br /&gt;
Moodle version numbers consist of three numbers separated by a dot, for example 1.9.11 or 2.0.2. The first two numbers, like 1.9 or 2.0, represent the &#039;&#039;major version&#039;&#039;. The third number distinguishes &#039;&#039;minor versions&#039;&#039; within the same major version. When a new major version is released, it starts with the minor version set to 0 (zero). So Moodle 2.0.1 was the first minor update of Moodle 2.0.0.&lt;br /&gt;
&lt;br /&gt;
Generally, the Moodle HQ team maintains the two most recent major versions of Moodle (a notable exception to the rule was for Moodle 1.9 which was supported much longer).&lt;br /&gt;
&lt;br /&gt;
== Versions and branches ==&lt;br /&gt;
&lt;br /&gt;
Moodle developers use the source code management (SCM) system &#039;&#039;&#039;&#039;Git&#039;&#039;&#039;&#039; to track changes in the code. As in many SCMs, the history of changes in Git is represented via so called branches. You can consider a branch as a labeled sequence of source code changes.&lt;br /&gt;
&lt;br /&gt;
There is a branch created for every major version of Moodle. All Moodle 1.9 versions come from MOODLE_19_STABLE branch and all Moodle 2.0 versions come from MOODLE_20_STABLE branch. There is also a main development branch called master that holds the changes for the next future version. At the moment, the changes on the master branch will be included in Moodle 2.1 release.&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
Since version 2.0, Moodle aims to release the new major version every six months or so. See [[Roadmap]] page for a schedule.&lt;br /&gt;
&lt;br /&gt;
Minor versions are released every two months, including both bugs and security issues fixed. See [[Releases#General release calendar|Releases]] page for more details and information. &lt;br /&gt;
&lt;br /&gt;
In the meantime between two releases, Moodle HQ team publish updates for the most recent stable versions. These updates are published every week, usually on Thursday. They are known as &#039;&#039;weekly builds&#039;&#039; and are identified by a small increment in the version and a build date like [https://git.moodle.org/gw?p=moodle.git;a=commitdiff;h=d8b0be3eb38b8b7991af470776cfb15d30d43de6 20200723]. That is a timestamp in a form YYYYMMDD when the weekly build was released. These weekly builds are labelled with a version number suffixed with a plus sign. So 3.9.1+ denotes some weekly build extending the 3.9.1 minor release.&lt;br /&gt;
&lt;br /&gt;
== Source code maturity levels ==&lt;br /&gt;
&lt;br /&gt;
During its life cycle, the Moodle code branch goes through several maturity levels.&lt;br /&gt;
* At the beginning, the branch is considered as being in &#039;&#039;alpha&#039;&#039; state. During this period, new features are added to the branch. API and database structure may change as needed. These versions are intended mainly for developers as nothing is guaranteed (the version may or may not install and upgrade, for example).&lt;br /&gt;
* When it is decided that no new feature will be added to the branch (so called feature freeze), &#039;&#039;beta&#039;&#039; maturity level is reached. Developers focus on testing, bugs fixing and stabilizing the branch.&lt;br /&gt;
* When all known critical and blocker bugs are fixed and no new bugs are reported for some time of testing, a preview version of the branch can be released as so called release candidate. When the first release candidate version (RC1) has been published, &#039;&#039;release candidate&#039;&#039; maturity level is reached. During this period, several RC versions can be issued, for example 2.1RC1, 2.1RC2, 2.1RC3 etc.&lt;br /&gt;
* Finally, the new major version is released and the branch reaches &#039;&#039;stable&#039;&#039; maturity level. From now on, the database structure and API do not change on this branch. A corresponding MOODLE_xx_STABLE is created and minor versions and weekly builds are created off it.&lt;br /&gt;
&lt;br /&gt;
==Version numbers==&lt;br /&gt;
&lt;br /&gt;
Each plugin&#039;s version.php file can specify a minimum version of Moodle required for the plugin to work, for example&lt;br /&gt;
&lt;br /&gt;
 $plugin-&amp;gt;version = 2011080200;&lt;br /&gt;
 $plugin-&amp;gt;requires = 2011070101;&lt;br /&gt;
&lt;br /&gt;
For the version numbers related to each release, see the [[Releases]] page.&lt;br /&gt;
&lt;br /&gt;
==How to increment version numbers in core==&lt;br /&gt;
&lt;br /&gt;
In Moodle core, when we branch from master, we also branch version numbers. That means that no version number in a stable branch should ever be higher than on master (or a higher branched version). &lt;br /&gt;
&lt;br /&gt;
The version number is constructed as &#039;&#039;&#039;YYYYMMDDRR.XX&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;YYYYMMDD&#039;&#039;&#039; is the date of the branching point. If on master, a branch has not happened, so it should be set to the current date. Otherwise it should not be changed (left as it was)&lt;br /&gt;
* &#039;&#039;&#039;RR&#039;&#039;&#039; is the release increment. This is the incremental counter for changes on a single branch or day (if in master).&lt;br /&gt;
* &#039;&#039;&#039;XX&#039;&#039;&#039; is the micro increment. This &#039;fraction increment&#039; was introduced when after we realised that it might be possible to have more than 99 upgrade steps on a stable branch (in the RR increment). It tends to only be used in the main version number file.&lt;br /&gt;
&lt;br /&gt;
===Rules for  stable branches===&lt;br /&gt;
&lt;br /&gt;
* If a &#039;micro increment&#039; (.XX) exists&lt;br /&gt;
** Developers should only increment the &#039;micro increment&#039; &#039;XX&#039;&lt;br /&gt;
** The integration team reserve the use of &#039;RR&#039; to branch between point releases.&lt;br /&gt;
* If a &#039;micro increment&#039; (.XX) does not exist&lt;br /&gt;
** Please increment the RR.&lt;br /&gt;
&lt;br /&gt;
===Rules for master===&lt;br /&gt;
* You must increment the whole version number to the current date.&lt;br /&gt;
* So, on 6th February 2013, the version number is set to: &#039;&#039;&#039;2013020600.00&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Why we branch versions ===&lt;br /&gt;
Imagine the following problem scenario:&lt;br /&gt;
# Moodle 2.4 is released, mod_forum is set to version 2012120300&lt;br /&gt;
# In master only, Eloy updates drops a DB field in an upgrade step and sets the moodle version to 2013010100&lt;br /&gt;
# In 2.4.1 and master, Dan fixes a problem in a capability definition and sets the version in both branches to 2013010200. (note: Oh no! we&#039;ve incorrectly changed the branching date for the entire future 2.4.x!)&lt;br /&gt;
# Moodle 2.5 is released and the mod_forum is set to version 2013060100&lt;br /&gt;
# After the release,  Helen updates her Moodle from Moodle 2.4.1 to 2.5.&lt;br /&gt;
&lt;br /&gt;
The implications of Dan changing the 2.4.x version to 2013010200 in step 3, means that Eloy&#039;s upgrade step from 2 will never get run. &#039;&#039;&#039;This is very bad!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===I know that there are no changes between STABLE and master, can I set the version number as the same? ===&lt;br /&gt;
Not for core plugins, sorry. There are too many developers working on the same code and it prevents accidents if we avoid doing this for core.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Releases]]&lt;br /&gt;
* [[:en:Git for Administrators|Git for Administrators]]&lt;br /&gt;
* http://download.moodle.org&lt;br /&gt;
&lt;br /&gt;
[[es:Versiones de Moodle]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56909</id>
		<title>version.php</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56909"/>
		<updated>2020-02-05T21:53:53Z</updated>

		<summary type="html">&lt;p&gt;Mina: Add space to cope with coding style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an essential file expected to be located in the root directory of the plugin.&lt;br /&gt;
&lt;br /&gt;
It contains a number of properties, which are used during the plugin installation and upgrade process. It allows to make sure the plugin is compatible with the given Moodle site, as well as spotting whether an upgrade is needed.&lt;br /&gt;
&lt;br /&gt;
The file is a standard PHP file, starting with an opening &#039;&amp;amp;lt;?php&#039; tag and defining the following variables:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; There was an exception for [[Activity modules]]. In the past, activity modules used &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; in their version.php files. The &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; notation support for activity modules was added in Moodle 2.5 (MDL-38121) and became recommended. Support for legacy &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; was dropped in Moodle 3.0 (MDL-43896).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Support for &amp;lt;tt&amp;gt;$plugin-&amp;gt;supported =&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;$plugin-&amp;gt;incompatible =&amp;lt;/tt&amp;gt; was added in Moodle 3.9 (MDL-59562).&lt;br /&gt;
&lt;br /&gt;
== Plugin version properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Status&lt;br /&gt;
! Description and example&lt;br /&gt;
|- style=&amp;quot;vertical-align:top&amp;quot;&lt;br /&gt;
| style=&amp;quot;min-width:200px&amp;quot; | &#039;&#039;&#039;$plugin-&amp;gt;component&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| required&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
| The full [[Frankenstyle|frankenstyle]] component name in the form of plugintype_pluginname. It is used during the installation and upgrade process for diagnostics and validation purposes to make sure the plugin code has been deployed to the correct location within the Moodle code tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Required since Moodle 3.0, strongly recommended for earlier versions (MDL-48494).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;component = &#039;block_foobar&#039;; // Declare the type and name of this plugin.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;version&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| required&lt;br /&gt;
| The version number of the plugin. The format is partially date based with the form YYYYMMDDXX where XX is an incremental counter for the given year (YYYY), month (MM) and date (DD) of the plugin version&#039;s release. Every new plugin version must have this number increased in this file, which is detected by Moodle core and the upgrade process is triggered.&lt;br /&gt;
&lt;br /&gt;
In case of linear development (i.e. there is just one branch of the plugin maintained), the XX counter should stay with the initial 00 value unless multiple versions are released on the same date.&lt;br /&gt;
&lt;br /&gt;
If multiple stable branches of the plugin are maintained, the date part YYYYMMDD should be frozen at the branch forking date and the XX is used for incrementing the value on the given stable branch (allowing up to 100 updates on the given stable branch). The key point is that the version number is always increased both horizontally (within the same stable branch, more recent updates have higher XX than any previous one) and vertically (between any two stable branches, the more recent branch has YYYYMMDD00 higher than the older stable branch). Pay attention to this. It&#039;s easy to mess up and hard to fix.&lt;br /&gt;
&lt;br /&gt;
See [https://moodle.org/mod/forum/discuss.php?d=275635#p1184986] for an example of versioning scheme on multiple branches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;version = 2014052000; // Plugin released on 20th May 2014.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;requires&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| recommended&lt;br /&gt;
| Specifies the minimum version number of Moodle core that this plugin requires. It is not possible to install it to earlier Moodle version. Moodle core&#039;s version number is defined in the file version.php located in Moodle root directory, in the &amp;lt;tt&amp;gt;$version&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle core extends the version numbering scheme and has inbuilt support for decimal versioning (such as &amp;lt;tt&amp;gt;$version = 2014051200.01;&amp;lt;/tt&amp;gt;). The decimal part is used for incremental (weekly) builds. Plugins should not rely on a particular weekly build so they use just the whole number part of the Moodle core&#039;s version in this field.&lt;br /&gt;
&lt;br /&gt;
See [[Releases]] for the full list of Moodle core version numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;requires = 2014051200; // Moodle 2.7.0 is required.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;supported&#039;&#039;&#039;&lt;br /&gt;
| array of two ascending integers&lt;br /&gt;
| optional&lt;br /&gt;
| Specifies a range of branch numbers of supported versions, inclusive. Moodle versions that are outside of this range will produce a message notifying at install time, but will allow for installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;supported = [37, 39]; // Moodle 3.7.x, 3.8.x and 3.9.x are supported.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;incompatible&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| optional&lt;br /&gt;
| Specifies the latest incompatible Moodle major branch. Any Moodle versions including and above this will be prevented from installing the plugin, and a message will be given when attempting installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;incompatible = 36; // Moodle 3.6.x and later are incompatible.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;cron&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| discouraged*&lt;br /&gt;
| Allows to throttle the plugin&#039;s cron function calls. The set value represents a minimal required gap in seconds between two calls of the plugin&#039;s cron function. Note that the cron function is not supported in all plugin types (also note that, while the cron function &#039;&#039;&#039;is&#039;&#039;&#039; supported for authentication plugins, it is run every time the cron script runs, regardless of this value in version.php). This value is stored in the database. After changing this value, the version number must be incremented. For activity modules, if this value is not set or 0 the cron function is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Starting with Moodle 2.7, plugin developers are encouraged to use the [[Task API|scheduled task API]] instead of the cron function feature.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;cron = 300; // Do not execute this plugin&#039;s cron more often than every five minutes.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;maturity&#039;&#039;&#039;&lt;br /&gt;
| enum&lt;br /&gt;
| recommended&lt;br /&gt;
| Declares the maturity level of this plugin version, that is how stable it is. This affects the [[:en:Available update notifications|available update notifications]] feature in Moodle. Administrators can configure their site so that they are not notified about an available update unless it has certain maturity level declared.&lt;br /&gt;
&lt;br /&gt;
Supported value is any of the predefined constants &amp;lt;tt&amp;gt;MATURITY_ALPHA, MATURITY_BETA, MATURITY_RC&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MATURITY_STABLE&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;maturity = MATURITY_STABLE; // This is considered as ready for production sites.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;release&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| recommended&lt;br /&gt;
| Human readable version name that should help to identify each release of the plugin. It can be anything you like although it is recommended to choose a pattern and stick with it. Usually it is a simple version like &amp;lt;tt&amp;gt;2.1&amp;lt;/tt&amp;gt; but some plugin authors use more sophisticated schemes or follow the upstream release name if the plugin represents a wrapper for another program.&lt;br /&gt;
&lt;br /&gt;
It is a good practise to tag the code in the source code management system for each plugin release and then make the tag names matching this release name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;release = &#039;v2.7-r1&#039;; // This is our first revision for Moodle 2.7.x branch.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;dependencies&#039;&#039;&#039;&lt;br /&gt;
| array&lt;br /&gt;
| optional&lt;br /&gt;
| Allows to declare explicit dependency on other plugin(s) for this plugin to work. Moodle core checks these declared dependencies and will not allow the plugin installation and/or upgrade until all dependencies are satisfied.&lt;br /&gt;
&lt;br /&gt;
Each element in the array represents an dependency on another plugin. The key (string) in the array is the component (frankenstyle) name of the other plugin. The value (integer) is the version of the other plugin we require. The predefined constant &amp;lt;tt&amp;gt;ANY_VERSION&amp;lt;/tt&amp;gt; can be used if we do not depend on a particular version (we just need the other plugin present).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;dependencies = array(&lt;br /&gt;
    &#039;mod_foo&#039; =&amp;gt; ANY_VERSION,   // The Foo activity must be present (any version).&lt;br /&gt;
    &#039;enrol_bar&#039; =&amp;gt; 2014020300, // The Bar enrolment plugin version 2014020300 or higher must be present.&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File template ==&lt;br /&gt;
&lt;br /&gt;
Here is a template for the plugin&#039;s version.php file to copy and paste:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @package   plugintype_pluginname&lt;br /&gt;
 * @copyright 2020, You Name &amp;lt;your@email.address&amp;gt;&lt;br /&gt;
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;version = TODO;&lt;br /&gt;
$plugin-&amp;gt;requires = TODO;&lt;br /&gt;
$plugin-&amp;gt;supported = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;incompatible = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;component = &#039;TODO_FRANKENSTYLE&#039;;&lt;br /&gt;
$plugin-&amp;gt;maturity = MATURITY_STABLE;&lt;br /&gt;
$plugin-&amp;gt;release = &#039;TODO&#039;;&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;dependencies = [&lt;br /&gt;
    &#039;mod_forum&#039; =&amp;gt; ANY_VERSION,&lt;br /&gt;
    &#039;mod_data&#039; =&amp;gt; TODO&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle versions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56857</id>
		<title>version.php</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56857"/>
		<updated>2020-01-19T11:51:55Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Plugin version properties */ Add documentation about new `$plugin-&amp;gt;supported` and `$plugin-&amp;gt;incompatible` settings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an essential file expected to be located in the root directory of the plugin.&lt;br /&gt;
&lt;br /&gt;
It contains a number of properties, which are used during the plugin installation and upgrade process. It allows to make sure the plugin is compatible with the given Moodle site, as well as spotting whether an upgrade is needed.&lt;br /&gt;
&lt;br /&gt;
The file is a standard PHP file, starting with an opening &#039;&amp;amp;lt;?php&#039; tag and defining the following variables:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; There was an exception for [[Activity modules]]. In the past, activity modules used &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; in their version.php files. The &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; notation support for activity modules was added in Moodle 2.5 (MDL-38121) and became recommended. Support for legacy &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; was dropped in Moodle 3.0 (MDL-43896).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Support for &amp;lt;tt&amp;gt;$plugin-&amp;gt;supported =&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;$plugin-&amp;gt;incompatible =&amp;lt;/tt&amp;gt; was added in Moodle 3.9 (MDL-59562).&lt;br /&gt;
&lt;br /&gt;
== Plugin version properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Status&lt;br /&gt;
! Description and example&lt;br /&gt;
|- style=&amp;quot;vertical-align:top&amp;quot;&lt;br /&gt;
| style=&amp;quot;min-width:200px&amp;quot; | &#039;&#039;&#039;$plugin-&amp;gt;component&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| required&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
| The full [[Frankenstyle|frankenstyle]] component name in the form of plugintype_pluginname. It is used during the installation and upgrade process for diagnostics and validation purposes to make sure the plugin code has been deployed to the correct location within the Moodle code tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Required since Moodle 3.0, strongly recommended for earlier versions (MDL-48494).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;component = &#039;block_foobar&#039;; // Declare the type and name of this plugin.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;version&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| required&lt;br /&gt;
| The version number of the plugin. The format is partially date based with the form YYYYMMDDXX where XX is an incremental counter for the given year (YYYY), month (MM) and date (DD) of the plugin version&#039;s release. Every new plugin version must have this number increased in this file, which is detected by Moodle core and the upgrade process is triggered.&lt;br /&gt;
&lt;br /&gt;
In case of linear development (i.e. there is just one branch of the plugin maintained), the XX counter should stay with the initial 00 value unless multiple versions are released on the same date.&lt;br /&gt;
&lt;br /&gt;
If multiple stable branches of the plugin are maintained, the date part YYYYMMDD should be frozen at the branch forking date and the XX is used for incrementing the value on the given stable branch (allowing up to 100 updates on the given stable branch). The key point is that the version number is always increased both horizontally (within the same stable branch, more recent updates have higher XX than any previous one) and vertically (between any two stable branches, the more recent branch has YYYYMMDD00 higher than the older stable branch). Pay attention to this. It&#039;s easy to mess up and hard to fix.&lt;br /&gt;
&lt;br /&gt;
See [https://moodle.org/mod/forum/discuss.php?d=275635#p1184986] for an example of versioning scheme on multiple branches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;version = 2014052000; // Plugin released on 20th May 2014.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;requires&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| recommended&lt;br /&gt;
| Specifies the minimum version number of Moodle core that this plugin requires. It is not possible to install it to earlier Moodle version. Moodle core&#039;s version number is defined in the file version.php located in Moodle root directory, in the &amp;lt;tt&amp;gt;$version&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle core extends the version numbering scheme and has inbuilt support for decimal versioning (such as &amp;lt;tt&amp;gt;$version = 2014051200.01;&amp;lt;/tt&amp;gt;). The decimal part is used for incremental (weekly) builds. Plugins should not rely on a particular weekly build so they use just the whole number part of the Moodle core&#039;s version in this field.&lt;br /&gt;
&lt;br /&gt;
See [[Releases]] for the full list of Moodle core version numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;requires = 2014051200; // Moodle 2.7.0 is required.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;supported&#039;&#039;&#039;&lt;br /&gt;
| array of two ascending integers&lt;br /&gt;
| optional&lt;br /&gt;
| Specifies a range of branch numbers of supported versions, inclusive. Moodle versions that are outside of this range will produce a message notifying at install time, but will allow for installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;supported = [37,39]; // Moodle 3.7.x, 3.8.x and 3.9.x are supported.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;incompatible&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| optional&lt;br /&gt;
| Specifies the latest incompatible Moodle major branch. Any Moodle versions including and below this will be prevented from installing the plugin, and a message will be given when attempting installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;incompatible = 36; // Moodle 3.6.x and earlier are incompatible.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;cron&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| discouraged*&lt;br /&gt;
| Allows to throttle the plugin&#039;s cron function calls. The set value represents a minimal required gap in seconds between two calls of the plugin&#039;s cron function. Note that the cron function is not supported in all plugin types (also note that, while the cron function &#039;&#039;&#039;is&#039;&#039;&#039; supported for authentication plugins, it is run every time the cron script runs, regardless of this value in version.php). This value is stored in the database. After changing this value, the version number must be incremented. For activity modules, if this value is not set or 0 the cron function is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Starting with Moodle 2.7, plugin developers are encouraged to use the [[Task API|scheduled task API]] instead of the cron function feature.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;cron = 300; // Do not execute this plugin&#039;s cron more often than every five minutes.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;maturity&#039;&#039;&#039;&lt;br /&gt;
| enum&lt;br /&gt;
| recommended&lt;br /&gt;
| Declares the maturity level of this plugin version, that is how stable it is. This affects the [[:en:Available update notifications|available update notifications]] feature in Moodle. Administrators can configure their site so that they are not notified about an available update unless it has certain maturity level declared.&lt;br /&gt;
&lt;br /&gt;
Supported value is any of the predefined constants &amp;lt;tt&amp;gt;MATURITY_ALPHA, MATURITY_BETA, MATURITY_RC&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MATURITY_STABLE&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;maturity = MATURITY_STABLE; // This is considered as ready for production sites.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;release&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| recommended&lt;br /&gt;
| Human readable version name that should help to identify each release of the plugin. It can be anything you like although it is recommended to choose a pattern and stick with it. Usually it is a simple version like &amp;lt;tt&amp;gt;2.1&amp;lt;/tt&amp;gt; but some plugin authors use more sophisticated schemes or follow the upstream release name if the plugin represents a wrapper for another program.&lt;br /&gt;
&lt;br /&gt;
It is a good practise to tag the code in the source code management system for each plugin release and then make the tag names matching this release name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;release = &#039;v2.7-r1&#039;; // This is our first revision for Moodle 2.7.x branch.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;dependencies&#039;&#039;&#039;&lt;br /&gt;
| array&lt;br /&gt;
| optional&lt;br /&gt;
| Allows to declare explicit dependency on other plugin(s) for this plugin to work. Moodle core checks these declared dependencies and will not allow the plugin installation and/or upgrade until all dependencies are satisfied.&lt;br /&gt;
&lt;br /&gt;
Each element in the array represents an dependency on another plugin. The key (string) in the array is the component (frankenstyle) name of the other plugin. The value (integer) is the version of the other plugin we require. The predefined constant &amp;lt;tt&amp;gt;ANY_VERSION&amp;lt;/tt&amp;gt; can be used if we do not depend on a particular version (we just need the other plugin present).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;dependencies = array(&lt;br /&gt;
    &#039;mod_foo&#039; =&amp;gt; ANY_VERSION,   // The Foo activity must be present (any version).&lt;br /&gt;
    &#039;enrol_bar&#039; =&amp;gt; 2014020300, // The Bar enrolment plugin version 2014020300 or higher must be present.&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File template ==&lt;br /&gt;
&lt;br /&gt;
Here is a template for the plugin&#039;s version.php file to copy and paste:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @package   plugintype_pluginname&lt;br /&gt;
 * @copyright 2020, You Name &amp;lt;your@email.address&amp;gt;&lt;br /&gt;
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;version = TODO;&lt;br /&gt;
$plugin-&amp;gt;requires = TODO;&lt;br /&gt;
$plugin-&amp;gt;supported = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;incompatible = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;component = &#039;TODO_FRANKENSTYLE&#039;;&lt;br /&gt;
$plugin-&amp;gt;maturity = MATURITY_STABLE;&lt;br /&gt;
$plugin-&amp;gt;release = &#039;TODO&#039;;&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;dependencies = [&lt;br /&gt;
    &#039;mod_forum&#039; =&amp;gt; ANY_VERSION,&lt;br /&gt;
    &#039;mod_data&#039; =&amp;gt; TODO&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle versions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56856</id>
		<title>version.php</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56856"/>
		<updated>2020-01-19T11:26:56Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* File template */ Remove discouraged `$plugin-&amp;gt;cron` setting from template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an essential file expected to be located in the root directory of the plugin.&lt;br /&gt;
&lt;br /&gt;
It contains a number of properties, which are used during the plugin installation and upgrade process. It allows to make sure the plugin is compatible with the given Moodle site, as well as spotting whether an upgrade is needed.&lt;br /&gt;
&lt;br /&gt;
The file is a standard PHP file, starting with an opening &#039;&amp;amp;lt;?php&#039; tag and defining the following variables:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; There was an exception for [[Activity modules]]. In the past, activity modules used &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; in their version.php files. The &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; notation support for activity modules was added in Moodle 2.5 (MDL-38121) and became recommended. Support for legacy &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; was dropped in Moodle 3.0 (MDL-43896).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Support for &amp;lt;tt&amp;gt;$plugin-&amp;gt;supported =&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;$plugin-&amp;gt;incompatible =&amp;lt;/tt&amp;gt; was added in Moodle 3.9 (MDL-59562).&lt;br /&gt;
&lt;br /&gt;
== Plugin version properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Status&lt;br /&gt;
! Description and example&lt;br /&gt;
|- style=&amp;quot;vertical-align:top&amp;quot;&lt;br /&gt;
| style=&amp;quot;min-width:200px&amp;quot; | &#039;&#039;&#039;$plugin-&amp;gt;component&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| required&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
| The full [[Frankenstyle|frankenstyle]] component name in the form of plugintype_pluginname. It is used during the installation and upgrade process for diagnostics and validation purposes to make sure the plugin code has been deployed to the correct location within the Moodle code tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Required since Moodle 3.0, strongly recommended for earlier versions (MDL-48494).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;component = &#039;block_foobar&#039;; // Declare the type and name of this plugin.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;version&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| required&lt;br /&gt;
| The version number of the plugin. The format is partially date based with the form YYYYMMDDXX where XX is an incremental counter for the given year (YYYY), month (MM) and date (DD) of the plugin version&#039;s release. Every new plugin version must have this number increased in this file, which is detected by Moodle core and the upgrade process is triggered.&lt;br /&gt;
&lt;br /&gt;
In case of linear development (i.e. there is just one branch of the plugin maintained), the XX counter should stay with the initial 00 value unless multiple versions are released on the same date.&lt;br /&gt;
&lt;br /&gt;
If multiple stable branches of the plugin are maintained, the date part YYYYMMDD should be frozen at the branch forking date and the XX is used for incrementing the value on the given stable branch (allowing up to 100 updates on the given stable branch). The key point is that the version number is always increased both horizontally (within the same stable branch, more recent updates have higher XX than any previous one) and vertically (between any two stable branches, the more recent branch has YYYYMMDD00 higher than the older stable branch). Pay attention to this. It&#039;s easy to mess up and hard to fix.&lt;br /&gt;
&lt;br /&gt;
See [https://moodle.org/mod/forum/discuss.php?d=275635#p1184986] for an example of versioning scheme on multiple branches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;version = 2014052000; // Plugin released on 20th May 2014.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;requires&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| recommended&lt;br /&gt;
| Specifies the minimum version number of Moodle core that this plugin requires. It is not possible to install it to earlier Moodle version. Moodle core&#039;s version number is defined in the file version.php located in Moodle root directory, in the &amp;lt;tt&amp;gt;$version&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle core extends the version numbering scheme and has inbuilt support for decimal versioning (such as &amp;lt;tt&amp;gt;$version = 2014051200.01;&amp;lt;/tt&amp;gt;). The decimal part is used for incremental (weekly) builds. Plugins should not rely on a particular weekly build so they use just the whole number part of the Moodle core&#039;s version in this field.&lt;br /&gt;
&lt;br /&gt;
See [[Releases]] for the full list of Moodle core version numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;requires = 2014051200; // Moodle 2.7.0 is required.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;cron&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| discouraged*&lt;br /&gt;
| Allows to throttle the plugin&#039;s cron function calls. The set value represents a minimal required gap in seconds between two calls of the plugin&#039;s cron function. Note that the cron function is not supported in all plugin types (also note that, while the cron function &#039;&#039;&#039;is&#039;&#039;&#039; supported for authentication plugins, it is run every time the cron script runs, regardless of this value in version.php). This value is stored in the database. After changing this value, the version number must be incremented. For activity modules, if this value is not set or 0 the cron function is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Starting with Moodle 2.7, plugin developers are encouraged to use the [[Task API|scheduled task API]] instead of the cron function feature.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;cron = 300; // Do not execute this plugin&#039;s cron more often than every five minutes.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;maturity&#039;&#039;&#039;&lt;br /&gt;
| enum&lt;br /&gt;
| recommended&lt;br /&gt;
| Declares the maturity level of this plugin version, that is how stable it is. This affects the [[:en:Available update notifications|available update notifications]] feature in Moodle. Administrators can configure their site so that they are not notified about an available update unless it has certain maturity level declared.&lt;br /&gt;
&lt;br /&gt;
Supported value is any of the predefined constants &amp;lt;tt&amp;gt;MATURITY_ALPHA, MATURITY_BETA, MATURITY_RC&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MATURITY_STABLE&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;maturity = MATURITY_STABLE; // This is considered as ready for production sites.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;release&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| recommended&lt;br /&gt;
| Human readable version name that should help to identify each release of the plugin. It can be anything you like although it is recommended to choose a pattern and stick with it. Usually it is a simple version like &amp;lt;tt&amp;gt;2.1&amp;lt;/tt&amp;gt; but some plugin authors use more sophisticated schemes or follow the upstream release name if the plugin represents a wrapper for another program.&lt;br /&gt;
&lt;br /&gt;
It is a good practise to tag the code in the source code management system for each plugin release and then make the tag names matching this release name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;release = &#039;v2.7-r1&#039;; // This is our first revision for Moodle 2.7.x branch.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;dependencies&#039;&#039;&#039;&lt;br /&gt;
| array&lt;br /&gt;
| optional&lt;br /&gt;
| Allows to declare explicit dependency on other plugin(s) for this plugin to work. Moodle core checks these declared dependencies and will not allow the plugin installation and/or upgrade until all dependencies are satisfied.&lt;br /&gt;
&lt;br /&gt;
Each element in the array represents an dependency on another plugin. The key (string) in the array is the component (frankenstyle) name of the other plugin. The value (integer) is the version of the other plugin we require. The predefined constant &amp;lt;tt&amp;gt;ANY_VERSION&amp;lt;/tt&amp;gt; can be used if we do not depend on a particular version (we just need the other plugin present).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;dependencies = array(&lt;br /&gt;
    &#039;mod_foo&#039; =&amp;gt; ANY_VERSION,   // The Foo activity must be present (any version).&lt;br /&gt;
    &#039;enrol_bar&#039; =&amp;gt; 2014020300, // The Bar enrolment plugin version 2014020300 or higher must be present.&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File template ==&lt;br /&gt;
&lt;br /&gt;
Here is a template for the plugin&#039;s version.php file to copy and paste:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @package   plugintype_pluginname&lt;br /&gt;
 * @copyright 2020, You Name &amp;lt;your@email.address&amp;gt;&lt;br /&gt;
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;version = TODO;&lt;br /&gt;
$plugin-&amp;gt;requires = TODO;&lt;br /&gt;
$plugin-&amp;gt;supported = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;incompatible = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;component = &#039;TODO_FRANKENSTYLE&#039;;&lt;br /&gt;
$plugin-&amp;gt;maturity = MATURITY_STABLE;&lt;br /&gt;
$plugin-&amp;gt;release = &#039;TODO&#039;;&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;dependencies = [&lt;br /&gt;
    &#039;mod_forum&#039; =&amp;gt; ANY_VERSION,&lt;br /&gt;
    &#039;mod_data&#039; =&amp;gt; TODO&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle versions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56855</id>
		<title>version.php</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56855"/>
		<updated>2020-01-19T11:25:02Z</updated>

		<summary type="html">&lt;p&gt;Mina: Note added about new settings `$plugin-&amp;gt;supported` and `$plugin-&amp;gt;incompatible`&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an essential file expected to be located in the root directory of the plugin.&lt;br /&gt;
&lt;br /&gt;
It contains a number of properties, which are used during the plugin installation and upgrade process. It allows to make sure the plugin is compatible with the given Moodle site, as well as spotting whether an upgrade is needed.&lt;br /&gt;
&lt;br /&gt;
The file is a standard PHP file, starting with an opening &#039;&amp;amp;lt;?php&#039; tag and defining the following variables:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; There was an exception for [[Activity modules]]. In the past, activity modules used &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; in their version.php files. The &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; notation support for activity modules was added in Moodle 2.5 (MDL-38121) and became recommended. Support for legacy &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; was dropped in Moodle 3.0 (MDL-43896).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Support for &amp;lt;tt&amp;gt;$plugin-&amp;gt;supported =&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;$plugin-&amp;gt;incompatible =&amp;lt;/tt&amp;gt; was added in Moodle 3.9 (MDL-59562).&lt;br /&gt;
&lt;br /&gt;
== Plugin version properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Status&lt;br /&gt;
! Description and example&lt;br /&gt;
|- style=&amp;quot;vertical-align:top&amp;quot;&lt;br /&gt;
| style=&amp;quot;min-width:200px&amp;quot; | &#039;&#039;&#039;$plugin-&amp;gt;component&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| required&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
| The full [[Frankenstyle|frankenstyle]] component name in the form of plugintype_pluginname. It is used during the installation and upgrade process for diagnostics and validation purposes to make sure the plugin code has been deployed to the correct location within the Moodle code tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Required since Moodle 3.0, strongly recommended for earlier versions (MDL-48494).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;component = &#039;block_foobar&#039;; // Declare the type and name of this plugin.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;version&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| required&lt;br /&gt;
| The version number of the plugin. The format is partially date based with the form YYYYMMDDXX where XX is an incremental counter for the given year (YYYY), month (MM) and date (DD) of the plugin version&#039;s release. Every new plugin version must have this number increased in this file, which is detected by Moodle core and the upgrade process is triggered.&lt;br /&gt;
&lt;br /&gt;
In case of linear development (i.e. there is just one branch of the plugin maintained), the XX counter should stay with the initial 00 value unless multiple versions are released on the same date.&lt;br /&gt;
&lt;br /&gt;
If multiple stable branches of the plugin are maintained, the date part YYYYMMDD should be frozen at the branch forking date and the XX is used for incrementing the value on the given stable branch (allowing up to 100 updates on the given stable branch). The key point is that the version number is always increased both horizontally (within the same stable branch, more recent updates have higher XX than any previous one) and vertically (between any two stable branches, the more recent branch has YYYYMMDD00 higher than the older stable branch). Pay attention to this. It&#039;s easy to mess up and hard to fix.&lt;br /&gt;
&lt;br /&gt;
See [https://moodle.org/mod/forum/discuss.php?d=275635#p1184986] for an example of versioning scheme on multiple branches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;version = 2014052000; // Plugin released on 20th May 2014.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;requires&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| recommended&lt;br /&gt;
| Specifies the minimum version number of Moodle core that this plugin requires. It is not possible to install it to earlier Moodle version. Moodle core&#039;s version number is defined in the file version.php located in Moodle root directory, in the &amp;lt;tt&amp;gt;$version&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle core extends the version numbering scheme and has inbuilt support for decimal versioning (such as &amp;lt;tt&amp;gt;$version = 2014051200.01;&amp;lt;/tt&amp;gt;). The decimal part is used for incremental (weekly) builds. Plugins should not rely on a particular weekly build so they use just the whole number part of the Moodle core&#039;s version in this field.&lt;br /&gt;
&lt;br /&gt;
See [[Releases]] for the full list of Moodle core version numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;requires = 2014051200; // Moodle 2.7.0 is required.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;cron&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| discouraged*&lt;br /&gt;
| Allows to throttle the plugin&#039;s cron function calls. The set value represents a minimal required gap in seconds between two calls of the plugin&#039;s cron function. Note that the cron function is not supported in all plugin types (also note that, while the cron function &#039;&#039;&#039;is&#039;&#039;&#039; supported for authentication plugins, it is run every time the cron script runs, regardless of this value in version.php). This value is stored in the database. After changing this value, the version number must be incremented. For activity modules, if this value is not set or 0 the cron function is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Starting with Moodle 2.7, plugin developers are encouraged to use the [[Task API|scheduled task API]] instead of the cron function feature.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;cron = 300; // Do not execute this plugin&#039;s cron more often than every five minutes.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;maturity&#039;&#039;&#039;&lt;br /&gt;
| enum&lt;br /&gt;
| recommended&lt;br /&gt;
| Declares the maturity level of this plugin version, that is how stable it is. This affects the [[:en:Available update notifications|available update notifications]] feature in Moodle. Administrators can configure their site so that they are not notified about an available update unless it has certain maturity level declared.&lt;br /&gt;
&lt;br /&gt;
Supported value is any of the predefined constants &amp;lt;tt&amp;gt;MATURITY_ALPHA, MATURITY_BETA, MATURITY_RC&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MATURITY_STABLE&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;maturity = MATURITY_STABLE; // This is considered as ready for production sites.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;release&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| recommended&lt;br /&gt;
| Human readable version name that should help to identify each release of the plugin. It can be anything you like although it is recommended to choose a pattern and stick with it. Usually it is a simple version like &amp;lt;tt&amp;gt;2.1&amp;lt;/tt&amp;gt; but some plugin authors use more sophisticated schemes or follow the upstream release name if the plugin represents a wrapper for another program.&lt;br /&gt;
&lt;br /&gt;
It is a good practise to tag the code in the source code management system for each plugin release and then make the tag names matching this release name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;release = &#039;v2.7-r1&#039;; // This is our first revision for Moodle 2.7.x branch.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;dependencies&#039;&#039;&#039;&lt;br /&gt;
| array&lt;br /&gt;
| optional&lt;br /&gt;
| Allows to declare explicit dependency on other plugin(s) for this plugin to work. Moodle core checks these declared dependencies and will not allow the plugin installation and/or upgrade until all dependencies are satisfied.&lt;br /&gt;
&lt;br /&gt;
Each element in the array represents an dependency on another plugin. The key (string) in the array is the component (frankenstyle) name of the other plugin. The value (integer) is the version of the other plugin we require. The predefined constant &amp;lt;tt&amp;gt;ANY_VERSION&amp;lt;/tt&amp;gt; can be used if we do not depend on a particular version (we just need the other plugin present).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;dependencies = array(&lt;br /&gt;
    &#039;mod_foo&#039; =&amp;gt; ANY_VERSION,   // The Foo activity must be present (any version).&lt;br /&gt;
    &#039;enrol_bar&#039; =&amp;gt; 2014020300, // The Bar enrolment plugin version 2014020300 or higher must be present.&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File template ==&lt;br /&gt;
&lt;br /&gt;
Here is a template for the plugin&#039;s version.php file to copy and paste:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @package   plugintype_pluginname&lt;br /&gt;
 * @copyright 2018, You Name &amp;lt;your@email.address&amp;gt;&lt;br /&gt;
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;version = TODO;&lt;br /&gt;
$plugin-&amp;gt;requires = TODO;&lt;br /&gt;
$plugin-&amp;gt;supported = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;incompatible = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;cron = 0;&lt;br /&gt;
$plugin-&amp;gt;component = &#039;TODO_FRANKENSTYLE&#039;;&lt;br /&gt;
$plugin-&amp;gt;maturity = MATURITY_STABLE;&lt;br /&gt;
$plugin-&amp;gt;release = &#039;TODO&#039;;&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;dependencies = [&lt;br /&gt;
    &#039;mod_forum&#039; =&amp;gt; ANY_VERSION,&lt;br /&gt;
    &#039;mod_data&#039; =&amp;gt; TODO&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle versions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56854</id>
		<title>version.php</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=version.php&amp;diff=56854"/>
		<updated>2020-01-19T11:16:28Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* File template */ Document new settings introduced by MDL-59562&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an essential file expected to be located in the root directory of the plugin.&lt;br /&gt;
&lt;br /&gt;
It contains a number of properties, which are used during the plugin installation and upgrade process. It allows to make sure the plugin is compatible with the given Moodle site, as well as spotting whether an upgrade is needed.&lt;br /&gt;
&lt;br /&gt;
The file is a standard PHP file, starting with an opening &#039;&amp;amp;lt;?php&#039; tag and defining the following variables:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; There was an exception for [[Activity modules]]. In the past, activity modules used &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; in their version.php files. The &amp;lt;tt&amp;gt;$plugin-&amp;gt;&amp;lt;/tt&amp;gt; notation support for activity modules was added in Moodle 2.5 (MDL-38121) and became recommended. Support for legacy &amp;lt;tt&amp;gt;$module-&amp;gt;&amp;lt;/tt&amp;gt; was dropped in Moodle 3.0 (MDL-43896).&lt;br /&gt;
&lt;br /&gt;
== Plugin version properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Status&lt;br /&gt;
! Description and example&lt;br /&gt;
|- style=&amp;quot;vertical-align:top&amp;quot;&lt;br /&gt;
| style=&amp;quot;min-width:200px&amp;quot; | &#039;&#039;&#039;$plugin-&amp;gt;component&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| required&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
| The full [[Frankenstyle|frankenstyle]] component name in the form of plugintype_pluginname. It is used during the installation and upgrade process for diagnostics and validation purposes to make sure the plugin code has been deployed to the correct location within the Moodle code tree.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Required since Moodle 3.0, strongly recommended for earlier versions (MDL-48494).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;component = &#039;block_foobar&#039;; // Declare the type and name of this plugin.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;version&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| required&lt;br /&gt;
| The version number of the plugin. The format is partially date based with the form YYYYMMDDXX where XX is an incremental counter for the given year (YYYY), month (MM) and date (DD) of the plugin version&#039;s release. Every new plugin version must have this number increased in this file, which is detected by Moodle core and the upgrade process is triggered.&lt;br /&gt;
&lt;br /&gt;
In case of linear development (i.e. there is just one branch of the plugin maintained), the XX counter should stay with the initial 00 value unless multiple versions are released on the same date.&lt;br /&gt;
&lt;br /&gt;
If multiple stable branches of the plugin are maintained, the date part YYYYMMDD should be frozen at the branch forking date and the XX is used for incrementing the value on the given stable branch (allowing up to 100 updates on the given stable branch). The key point is that the version number is always increased both horizontally (within the same stable branch, more recent updates have higher XX than any previous one) and vertically (between any two stable branches, the more recent branch has YYYYMMDD00 higher than the older stable branch). Pay attention to this. It&#039;s easy to mess up and hard to fix.&lt;br /&gt;
&lt;br /&gt;
See [https://moodle.org/mod/forum/discuss.php?d=275635#p1184986] for an example of versioning scheme on multiple branches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;version = 2014052000; // Plugin released on 20th May 2014.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;requires&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| recommended&lt;br /&gt;
| Specifies the minimum version number of Moodle core that this plugin requires. It is not possible to install it to earlier Moodle version. Moodle core&#039;s version number is defined in the file version.php located in Moodle root directory, in the &amp;lt;tt&amp;gt;$version&amp;lt;/tt&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle core extends the version numbering scheme and has inbuilt support for decimal versioning (such as &amp;lt;tt&amp;gt;$version = 2014051200.01;&amp;lt;/tt&amp;gt;). The decimal part is used for incremental (weekly) builds. Plugins should not rely on a particular weekly build so they use just the whole number part of the Moodle core&#039;s version in this field.&lt;br /&gt;
&lt;br /&gt;
See [[Releases]] for the full list of Moodle core version numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;requires = 2014051200; // Moodle 2.7.0 is required.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;cron&#039;&#039;&#039;&lt;br /&gt;
| integer&lt;br /&gt;
| discouraged*&lt;br /&gt;
| Allows to throttle the plugin&#039;s cron function calls. The set value represents a minimal required gap in seconds between two calls of the plugin&#039;s cron function. Note that the cron function is not supported in all plugin types (also note that, while the cron function &#039;&#039;&#039;is&#039;&#039;&#039; supported for authentication plugins, it is run every time the cron script runs, regardless of this value in version.php). This value is stored in the database. After changing this value, the version number must be incremented. For activity modules, if this value is not set or 0 the cron function is disabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;) Starting with Moodle 2.7, plugin developers are encouraged to use the [[Task API|scheduled task API]] instead of the cron function feature.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;cron = 300; // Do not execute this plugin&#039;s cron more often than every five minutes.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;maturity&#039;&#039;&#039;&lt;br /&gt;
| enum&lt;br /&gt;
| recommended&lt;br /&gt;
| Declares the maturity level of this plugin version, that is how stable it is. This affects the [[:en:Available update notifications|available update notifications]] feature in Moodle. Administrators can configure their site so that they are not notified about an available update unless it has certain maturity level declared.&lt;br /&gt;
&lt;br /&gt;
Supported value is any of the predefined constants &amp;lt;tt&amp;gt;MATURITY_ALPHA, MATURITY_BETA, MATURITY_RC&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MATURITY_STABLE&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;maturity = MATURITY_STABLE; // This is considered as ready for production sites.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;release&#039;&#039;&#039;&lt;br /&gt;
| string&lt;br /&gt;
| recommended&lt;br /&gt;
| Human readable version name that should help to identify each release of the plugin. It can be anything you like although it is recommended to choose a pattern and stick with it. Usually it is a simple version like &amp;lt;tt&amp;gt;2.1&amp;lt;/tt&amp;gt; but some plugin authors use more sophisticated schemes or follow the upstream release name if the plugin represents a wrapper for another program.&lt;br /&gt;
&lt;br /&gt;
It is a good practise to tag the code in the source code management system for each plugin release and then make the tag names matching this release name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;release = &#039;v2.7-r1&#039;; // This is our first revision for Moodle 2.7.x branch.&amp;lt;/code&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;$plugin-&amp;gt;dependencies&#039;&#039;&#039;&lt;br /&gt;
| array&lt;br /&gt;
| optional&lt;br /&gt;
| Allows to declare explicit dependency on other plugin(s) for this plugin to work. Moodle core checks these declared dependencies and will not allow the plugin installation and/or upgrade until all dependencies are satisfied.&lt;br /&gt;
&lt;br /&gt;
Each element in the array represents an dependency on another plugin. The key (string) in the array is the component (frankenstyle) name of the other plugin. The value (integer) is the version of the other plugin we require. The predefined constant &amp;lt;tt&amp;gt;ANY_VERSION&amp;lt;/tt&amp;gt; can be used if we do not depend on a particular version (we just need the other plugin present).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;$plugin-&amp;gt;dependencies = array(&lt;br /&gt;
    &#039;mod_foo&#039; =&amp;gt; ANY_VERSION,   // The Foo activity must be present (any version).&lt;br /&gt;
    &#039;enrol_bar&#039; =&amp;gt; 2014020300, // The Bar enrolment plugin version 2014020300 or higher must be present.&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File template ==&lt;br /&gt;
&lt;br /&gt;
Here is a template for the plugin&#039;s version.php file to copy and paste:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @package   plugintype_pluginname&lt;br /&gt;
 * @copyright 2018, You Name &amp;lt;your@email.address&amp;gt;&lt;br /&gt;
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;version = TODO;&lt;br /&gt;
$plugin-&amp;gt;requires = TODO;&lt;br /&gt;
$plugin-&amp;gt;supported = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;incompatible = TODO;   // Available as of Moodle 3.9.0 or later.&lt;br /&gt;
$plugin-&amp;gt;cron = 0;&lt;br /&gt;
$plugin-&amp;gt;component = &#039;TODO_FRANKENSTYLE&#039;;&lt;br /&gt;
$plugin-&amp;gt;maturity = MATURITY_STABLE;&lt;br /&gt;
$plugin-&amp;gt;release = &#039;TODO&#039;;&lt;br /&gt;
&lt;br /&gt;
$plugin-&amp;gt;dependencies = [&lt;br /&gt;
    &#039;mod_forum&#039; =&amp;gt; ANY_VERSION,&lt;br /&gt;
    &#039;mod_data&#039; =&amp;gt; TODO&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle versions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Translating_plugins&amp;diff=55970</id>
		<title>Translating plugins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Translating_plugins&amp;diff=55970"/>
		<updated>2019-04-25T10:23:10Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Strings priority */ Fixed priority&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Translation}}&lt;br /&gt;
==Looking for translated plugins in the Moodle plugins database==&lt;br /&gt;
&lt;br /&gt;
* Almost all contributed plugins published in Moodle Plugins directory have been imported into [http://lang.moodle.org/ AMOS] and are ready to be translated.&lt;br /&gt;
* When a user is looking at the [https://moodle.org/plugins/ Moodle plugins database], in &#039; Description tab &amp;gt; Useful links section&#039; there is a link to &#039;Contribute translation for (your preferred language)&#039; that points to [http://lang.moodle.org/ AMOS].&lt;br /&gt;
* Have a look at an example for the very popular [https://moodle.org/plugins/view.php?plugin=mod_hotpot HotPot] plugin:&lt;br /&gt;
&lt;br /&gt;
[[File:Link to Plugin translations in Moodle plugins database.png|300px]]&lt;br /&gt;
&lt;br /&gt;
* You can click on the &#039;Contribute translation for (your preferred language)&#039; link.&lt;br /&gt;
* &#039;&#039;&#039;CURRENTLY:&#039;&#039;&#039; If you do not have an AMOS account, you would have to &#039;Create a new account&#039; by using the appropriate link.&lt;br /&gt;
* If you have a translator account in AMOS, you can use AMOS to contribute the translation.&lt;br /&gt;
* If you select all the language packs (except English fixes) and write &#039;pluginname&#039; in the box for &#039;String identifier&#039;, AMOS will display the name of the plugin in all available translations.&lt;br /&gt;
* Make sure that you have selected the Moodle branch(es) that you are interested in (eg, 2.5 in the image below).&lt;br /&gt;
&lt;br /&gt;
[[File:Plugins translations in AMOS.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* In the above example, there are a total of 123 different language packs registered in AMOS; 63 of these are missing a translation for HotPot, which means that there are 60 different language translations already available for the HotPot plugin, a fair number for this popular plugin :)&lt;br /&gt;
* When no translation is available for any/many language(s), the box named &#039;Translation&#039; will be empty for those languages.&lt;br /&gt;
* If a plugin name has been translated, there is a fair chance (but no certainty) that this plugin has been (completely) translated into that language. You can change the settings in AMOS and check for yourself.&lt;br /&gt;
&lt;br /&gt;
==Plugin translation priority==&lt;br /&gt;
* Please help Moodle users in other languages by translating your favourite plugins.&lt;br /&gt;
* Moodle has a continuously updated [https://moodle.org/plugins/report/index.php?report=favourites&amp;amp;p=0&amp;amp;l=50&amp;amp;s=favourited&amp;amp;d=DESC list of the most favourite plugins], which might be worth considering for translation  :)&lt;br /&gt;
* You can find the plugins with the largest number of downloads in the last three months at [https://moodle.org/plugins/stats.php https://moodle.org/plugins/stats.php]. These are the plugins most likely to be most useful when translated to your language. It would probably be a good idea to translate them first.&lt;br /&gt;
* Moodle has a list of plugins that have received the [https://moodle.org/plugins/browse.php?list=award&amp;amp;id=1 Reviewers&#039; choice award]. These are given by the plugins guardians and reviewers for particularly useful, well coded or otherwise interesting plugins. It would be very desirable/useful to have these translated.&lt;br /&gt;
* See the [https://moodle.org/mod/forum/discuss.php?d=325804 list of (year 2015) favorite plugins] by Gavin Henrick&lt;br /&gt;
* Special cases:&lt;br /&gt;
** All plugins with &#039;&#039;mobile&#039;&#039; in their name, and all [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=62 server side plugins] to support the  [https://docs.moodle.org/31/en/Moodle_Mobile Moodle mobile app]&lt;br /&gt;
** [https://moodle.org/plugins/local_moodlecloudsignup MoodleCloud strings] are used for accessing the [https://moodle.com/cloud/ MoodleCloud] free and paid hosting services.&lt;br /&gt;
&lt;br /&gt;
===Elementary school teaching===&lt;br /&gt;
If your Moodle site will serve kids, consider [https://docs.moodle.org/31/en/Language_packs#Can_I_make_a_language_pack_for_kids.3F making a language pack for kids].&lt;br /&gt;
&lt;br /&gt;
===Plugins for K-12 teaching===&lt;br /&gt;
For [https://en.wikipedia.org/wiki/K%E2%80%9312 K-12] teaching and learning environments, please consider translating the plugins that are included in the [https://moodle.com/cloud/school/?utm_source=Sendy&amp;amp;utm_medium=Email&amp;amp;utm_campaign=Newsletter_July2016 Moodle for School at MoodleCloud]: &lt;br /&gt;
* [https://moodle.org/plugins/mod_attendance Attendance]&lt;br /&gt;
* [http://bigbluebutton.org/ BigBlueButton]&lt;br /&gt;
* [https://moodle.org/plugins/mod_checklist Checklist]&lt;br /&gt;
* [https://moodle.org/plugins/atto_chemistry Chemistry editor]&lt;br /&gt;
* [https://moodle.org/plugins/mod_choicegroup Group choice]&lt;br /&gt;
* [https://moodle.org/plugins/block_xp Level up!]&lt;br /&gt;
* [https://moodle.org/plugins/mod_quizgame Quizventure]&lt;br /&gt;
* [https://moodle.org/plugins/tinymce_wordcount Word count]&lt;br /&gt;
&lt;br /&gt;
===Plugins for University teaching===&lt;br /&gt;
For universities, there is a [https://docs.moodle.org/31/en/Tertiary_education#Moodle_plugins_by.2Ffor_Universities list of plugins by/for Universities], and a [https://docs.moodle.org/31/en/Tertiary_education#Discipline-specific_plugins link to discipline-specific plugins], which might be worth translating.&lt;br /&gt;
&lt;br /&gt;
==Non-translatable strings==&lt;br /&gt;
While AMOS does a great job for translating the Moodle core and most Moodle plugin language strings, some English language strings are not available for translation with AMOS.&lt;br /&gt;
&lt;br /&gt;
===Plugins in the [https://moodle.org/plugins/browse.php?list=category&amp;amp;id=38 Other] category===&lt;br /&gt;
The plugins classified as &#039;[https://moodle.org/plugins/browse.php?list=category&amp;amp;id=38 Other] &#039; (Utilities, Experimental or Incubating) are not translatable by AMOS (see [http://lang.moodle.org/mod/forum/discuss.php?d=3113 this forum thread]). You can use the [[:en:Language customization|language customization]] tool within your Moodle (production or local) server to produce the .php file containing the translated language strings for your language and email this file to the particular &#039;other&#039; plugin maintainer, so that it can be included in the lang folder within the downloadable Zip file for the plugin.&lt;br /&gt;
&lt;br /&gt;
===Plugins with coding errors===&lt;br /&gt;
Some plugins (of types different from &#039;Other&#039;) available for download in the [https://moodle.org/plugins/ Moodle plugins directory] may not  have English language strings available for translation in [https://lang.moodle.org/ AMOS] because of [https://docs.moodle.org/dev/index.php?title=Plugin_contribution_checklist&amp;amp;redirect=no coding errors], that must be identified and fixed by the plugin maintainer, See [https://docs.moodle.org/dev/Plugin_contribution_checklist#Strings Plugin contribution checklist:Strings]:&lt;br /&gt;
* The plugin code must not rely on trailing and leading whitespace in strings.&lt;br /&gt;
* The string file must be considered as pure data file with the syntax $string[&#039;id&#039;] = &#039;value&#039;;&lt;br /&gt;
* No other PHP syntax such as [http://php.net/manual/en/language.operators.string.php concatenation], [http://php.net/manual/en/language.types.string.php heredoc and nowdoc] is supported by the tools that AMOS use when processing the strings (even if it may work in Moodle itself).&lt;br /&gt;
* Use neither string concatenation operators nor other PHP logic inside string files. Those should really be considered as plain data files with simple $string[&#039;key&#039;] = &#039;value&#039;; syntax, nothing more.&lt;br /&gt;
&lt;br /&gt;
===Plugins with hard-wired English language strings===&lt;br /&gt;
Sometimes you might have translated 100% of the strings available in AMOS for a given plugin, and you can still view the original English (non-translated) strings.&lt;br /&gt;
* Please check that you have purged your browser cache and the server cache, waited for one hour (for AMOS to update the language packs), and updated your language packs.&lt;br /&gt;
* If the problem persists, please write the plugin maintainer by clicking at the &#039;Bug tracker&#039; link shown in the given plugin&#039;s page in the [https://moodle.org/plugins/index.php Moodle plugins database]. &lt;br /&gt;
* If the plugin author has nested additional &#039;Lang&#039; folders inside any subdirectories within the plugin folder structure, the English language strings in these nested Lang folder will not be available for AMOS, and they would seem to be hard-wired. Please contact the plugin author.&lt;br /&gt;
* Most Moodle plugin authors have been very fast at replacing the English hard-coded strings with strings variables that can now be translated in AMOS.&lt;br /&gt;
* If you suspect the problem is in a core plugin, you can post an issue in the [https://lang.moodle.org/mod/forum/view.php?id=5 AMOS translation forum].&lt;br /&gt;
 &lt;br /&gt;
===Log descriptions can not be translated===&lt;br /&gt;
* See [https://docs.moodle.org/dev/Translation_FAQ#Why_are_log_descriptions_displayed_in_English.3F why log descriptions are not translated].&lt;br /&gt;
&lt;br /&gt;
===Items that must NOT be translated===&lt;br /&gt;
* See the [https://docs.moodle.org/dev/Translation_FAQ#Are_there_items_which_are_not_to_be_translated.3F Items that are not to be translated] in the [https://docs.moodle.org/dev/Translation_FAQ Translation FAQ]&lt;br /&gt;
&lt;br /&gt;
==If translations are available in AMOS for some Moodle branches but not available for other branches==&lt;br /&gt;
Sometimes a plugin may have its English language strings available for translations for some Moodle branches (e.g. 2.0 to 2.4), but not for other branches (e.g. 2.5 to 2.7), even though the plugin itself is indeed available for download for all branches (2.0 to 2.7) in the Moodle plugins database.&lt;br /&gt;
&lt;br /&gt;
Please see an example in [http://lang.moodle.org/mod/forum/discuss.php?d=3939 this post]. The cause is very likely a programming error (see &#039;Plugins with coding errors&#039; above), that must be fixed by the plugin maintainer.&lt;br /&gt;
&lt;br /&gt;
==What happens if a plugin ZIP file includes translation(s) inside the lang folder==&lt;br /&gt;
If a site has debugging on, there will be a warning message about &#039;Found language file&#039; when the user installs the plugin, but the installation may proceed.&lt;br /&gt;
&lt;br /&gt;
[[File:Found language file debugging message.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
The Language strings inside a properly installed downloaded plugin will overwrite the strings translations of the language pack, but they can be overwritten by the strings defined with the Language customization. &lt;br /&gt;
&lt;br /&gt;
===Strings priority===&lt;br /&gt;
When displaying text language strings, Moodle 2.x and 3.x will have the following priority:&lt;br /&gt;
# Strings defined by the [[:en:Language customization|language customization]] tool&lt;br /&gt;
# Strings defined in an installed child language pack (eg, the es_ve language pack)&lt;br /&gt;
# Strings defined in an installed parent language pack (eg, the es language pack)&lt;br /&gt;
# Strings enclosed inside the plugin_name/lang/xx/yy.php folder (where xx is a language code other than the en folder) from a downloaded and installed plugin ZIP file (eg, inside the /server/moodle/theme/adaptable/lang/es/theme_adaptable.php file)&lt;br /&gt;
# Original Australian English language strings shipped with the downloaded Moodle branch.&lt;br /&gt;
# Original Australian English language strings inside the /lang/en folder in the downloaded/updated plugin ZIP file&lt;br /&gt;
&lt;br /&gt;
Note: See the [https://moodle.org/plugins/local_string_override local String override plugin] that makes it possible for plugins to override existing translations regardless if they&#039;re bundled with Moodle or they&#039;re originated from a community plugin.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [http://lang.moodle.org/mod/forum/discuss.php?d=2485 Contributed plugins are now automatically imported into AMOS] announcement explaining the mechanism&lt;br /&gt;
* [https://docs.moodle.org/dev/Translation_FAQ#Are_there_items_which_are_not_to_be_translated.3F Items that are not to be translated] in the [https://docs.moodle.org/dev/Translation_FAQ Translation FAQ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.6_release_notes&amp;diff=55162</id>
		<title>Moodle 3.6 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.6_release_notes&amp;diff=55162"/>
		<updated>2018-12-02T10:57:32Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Privacy API update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released - scheduled for 03 December 2018&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.6%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.6].&lt;br /&gt;
&lt;br /&gt;
{{Note|If you are upgrading from a previous version, please see [[:en:Upgrading|Upgrading]] in the user docs. &#039;&#039;In particular, for sites using a custom theme or login form, from 3.6 onwards, the login form must include a new login token field. See [[Login token]] for details.}}&lt;br /&gt;
&lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
These are just the minimum supported versions. We recommend keeping all of your software and operating systems up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 3.1 or later&lt;br /&gt;
* PHP version: minimum PHP 7.0.0 &#039;&#039;Note: minimum PHP version has increased since Moodle 3.3&#039;&#039;. PHP 7.1.x and 7.2.x are supported too. [[Moodle and PHP7|PHP 7.3.x support]] is being implemented (@ MDL-63420) and &#039;&#039;&#039;not ready for production&#039;&#039;&#039; with this release.&lt;br /&gt;
* PHP extension &#039;&#039;&#039;intl&#039;&#039;&#039; is required since Moodle 3.4 (it was recommended in 2.0 onwards) &lt;br /&gt;
&lt;br /&gt;
=== Database requirements ===&lt;br /&gt;
&lt;br /&gt;
Moodle supports the following database servers. Again, version numbers are just the minimum supported version. We recommend running the latest stable version of any software.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Database&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
| 9.4&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.6&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microsoft.com/en-us/server-cloud/products/sql-server/ Microsoft SQL Server]&lt;br /&gt;
| 2008&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oracle.com/us/products/database/overview/index.html Oracle Database]&lt;br /&gt;
| 11.2&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
=== Browser support ===&lt;br /&gt;
Moodle is compatible with any standards compliant web browser. We regularly test Moodle with the following browsers:&lt;br /&gt;
&lt;br /&gt;
Desktop:&lt;br /&gt;
* Chrome&lt;br /&gt;
* Firefox&lt;br /&gt;
* Safari&lt;br /&gt;
* Edge&lt;br /&gt;
* Internet Explorer&lt;br /&gt;
&lt;br /&gt;
Mobile:&lt;br /&gt;
* MobileSafari&lt;br /&gt;
* Google Chrome&lt;br /&gt;
&lt;br /&gt;
For the best experience and optimum security, we recommend that you keep your browser up to date. https://whatbrowser.org&lt;br /&gt;
&lt;br /&gt;
Note: Legacy browsers with known compatibility issues with Moodle 3.6:&lt;br /&gt;
* Internet Explorer 10 and below&lt;br /&gt;
* Safari 7 and below&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
===Dashboard and Course overview===&lt;br /&gt;
* MDL-63044 and MDL-63337 - New [https://docs.moodle.org/36/en/Course_overview Course overview] and [https://docs.moodle.org/36/en/Timeline_block Timeline block]&lt;br /&gt;
* MDL-63062 - New [https://docs.moodle.org/36/en/Recently_accessed_courses_block Recently accessed courses block]&lt;br /&gt;
* MDL-63063 - New [https://docs.moodle.org/36/en/Recently_accessed_items_blockRecently accessed items block]&lt;br /&gt;
* MDL-63457 - Option to hide courses in the course overview block&lt;br /&gt;
* MDL-63058 - Option to star/unstar courses in the course overview block&lt;br /&gt;
* MDL-63064 - New [https://docs.moodle.org/36/en/Starred_courses_block Starred courses block]&lt;br /&gt;
* MDL-63352 - Dashboard retains user preferences for view options&lt;br /&gt;
* MDL-63793 - Course overview block retains user preferences for the number of courses to show&lt;br /&gt;
* MDL-61161 - Grace period when displaying &amp;quot;In progress&amp;quot; courses in course overview block&lt;br /&gt;
* MDL-63040 - Removal of Dashboard page header&lt;br /&gt;
&lt;br /&gt;
===GDPR and Privacy===&lt;br /&gt;
Note that some of these GDPR improvements have also been backported to Moodle 3.5.3,  3.4.6 and 3.3.9.&lt;br /&gt;
&lt;br /&gt;
* MDL-63116 - Data requests bulk actions&lt;br /&gt;
* MDL-62309 - Option to make site policies required or optional&lt;br /&gt;
* MDL-61652 - Capabilities for controlling who can download SAR data&lt;br /&gt;
* MDL-62563 - Data deletion of existing deleted users&lt;br /&gt;
* MDL-63897 - Pre-processing stage removed from data requests process&lt;br /&gt;
* MDL-62558 - Data retention summary (read-only)&lt;br /&gt;
* MDL-63726 - Option to remove the &amp;quot;Data retention summary&amp;quot; link in the footer&lt;br /&gt;
* MDL-62491 - HTML data request export format&lt;br /&gt;
* MDL-63401 - User expiry improvements&lt;br /&gt;
* MDL-63619 - Data purpose and category inheritance improvements&lt;br /&gt;
* MDL-62560 - Different data retention strategies for different roles in a purpose&lt;br /&gt;
* MDL-62554 - Ability to configure data registry to use module type defaults&lt;br /&gt;
* MDL-63009 - Site mentioned in email notifications of data requests&lt;br /&gt;
* MDL-6074 - Option to hide your name in the [https://docs.moodle.org/36/en/Online_users_block online users block]&lt;br /&gt;
&lt;br /&gt;
===Messaging===&lt;br /&gt;
* &#039;&#039;&#039;MDL-57272 and MDL-63280 - Group messaging&#039;&#039;&#039;&lt;br /&gt;
* MDL-63303 - New messaging UI with [https://docs.moodle.org/36/en/Messaging messaging drawer]&lt;br /&gt;
* MDL-63279 - Option to [https://docs.moodle.org/36/en/Messaging_settings disable site-wide messaging]&lt;br /&gt;
* MDL-63214 - Privacy setting for restricting who can message you&lt;br /&gt;
* MDL-63213 - Option to star messaging conversations&lt;br /&gt;
* MDL-63283 - Notifications not sent for group conversations&lt;br /&gt;
* MDL-63281 - Group members synchronised with messaging conversations members&lt;br /&gt;
&lt;br /&gt;
===Assignment===&lt;br /&gt;
* MDL-27520 - Assignment feedback can include media or other files&lt;br /&gt;
&lt;br /&gt;
===Quiz===&lt;br /&gt;
* MDL-62610 - Improved quiz statistics report usability for randomized questions&lt;br /&gt;
* MDL-62708 - Option to add ID numbers to questions and question categories&lt;br /&gt;
* MDL-63738 - Single questions can be exported from the question bank&lt;br /&gt;
&lt;br /&gt;
===Workshop===&lt;br /&gt;
* MDL-60820 - Teachers can specify workshop submission types&lt;br /&gt;
&lt;br /&gt;
===Repositories===&lt;br /&gt;
* MDL-58943 - Nextcloud integration, with a [https://docs.moodle.org/36/en/Nextcloud_repository Nextcloud repository] and [https://docs.moodle.org/36/en/OAuth_2_Nextcloud_service OAuth 2 Nextcloud service]&lt;br /&gt;
&lt;br /&gt;
===Open Badges===&lt;br /&gt;
* MDL-58454 - Support for Open Badges v2.0&lt;br /&gt;
&lt;br /&gt;
===Performance===&lt;br /&gt;
* MDL-54035 - Performance improvements to cache flags&lt;br /&gt;
* MDL-47962 - Glossary auto-linking filter performance improvements&lt;br /&gt;
&lt;br /&gt;
===Usability improvements===&lt;br /&gt;
* MDL-51177 - atto_htmlplus implemented to improve Atto editor HTML indenting&lt;br /&gt;
* MDL-45170 - Copy and paste of images from one WYSIWYG window to another&lt;br /&gt;
* MDL-61388 - Forum actions announced by screen reader when completed&lt;br /&gt;
* MDL-62899 - Global search displays a relevant icon next to link in results&lt;br /&gt;
* MDL-46415 - SVG/high resolution emoticons&lt;br /&gt;
* MDL-58000 - Larger badge images are used&lt;br /&gt;
&lt;br /&gt;
===Experimental===&lt;br /&gt;
* MDL-53566 - [https://docs.moodle.org/36/en/Context_freezing Context freezing] - setting read-only access for categories, courses, activities and their content&lt;br /&gt;
&lt;br /&gt;
==Other highlights==&lt;br /&gt;
&lt;br /&gt;
===Functional changes===&lt;br /&gt;
* MDL-17943 - &#039;Resend confirmation email&#039; button on login page&lt;br /&gt;
* MDL-14274 - IF conditions in grade calculations&lt;br /&gt;
* MDL-37624 - Calendar entries location support&lt;br /&gt;
* MDL-36754 - Images are displayed in forum notification emails&lt;br /&gt;
* MDL-59259 - Course format options may be specified in upload courses CSV file&lt;br /&gt;
* MDL-41265 - Page resource option to show/hide &amp;quot;Last modified&amp;quot;&lt;br /&gt;
* MDL-61378 - Forum post HTML structure improvements&lt;br /&gt;
* MDL-59454 - Option to download the list of course participants&lt;br /&gt;
* MDL-60520 - Analytics models can use different machine learning backends&lt;br /&gt;
* MDL-61573 - User menu: customusermenuitems map Font Awesome icons for non pix/t folders&lt;br /&gt;
* MDL-62320 - JSON added to the default MIME types list&lt;br /&gt;
* MDL-63431 - Atto media plugin title global attribute support&lt;br /&gt;
* MDL-60435 - Shibboleth authentication identity providers&lt;br /&gt;
* MDL-59169 - Grader report saves after edit with multiple tabs&lt;br /&gt;
* MDL-62960 - Drag and drop of course events respects the course start date&lt;br /&gt;
&lt;br /&gt;
===Security issues===&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=378731 MSA-18-0020] Login CSRF vulnerability in login form. Note that this fix has previously been disclosed following the release of Moodle 3.5.3, 3.4.6, 3.3.9 and 3.1.15.&lt;br /&gt;
&lt;br /&gt;
===For administrators===&lt;br /&gt;
* MDL-62334 - &#039;Add a new course&#039; link in Site administration&lt;br /&gt;
* MDL-63253 - Admin search results provide location of the found matching page&lt;br /&gt;
* MDL-63772 - Capability to control use of Atto Record RTC&lt;br /&gt;
* MDL-63708 - New blocks supported by the mobile app can be disabled&lt;br /&gt;
* MDL-52953 - Legacy log store deprecation&lt;br /&gt;
* MDL-59429 - Log changes to site administrators&lt;br /&gt;
* MDL-62651 - adhoc task runner&lt;br /&gt;
* MDL-62777 - Site upgrades via CLI display new default settings&lt;br /&gt;
* MDL-63603 - Indian Rupee added to [https://docs.moodle.org/36/en/PayPal_enrolment PayPal enrolment] currencies&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
* MDL-55188 - Old Events API final deprecation&lt;br /&gt;
* MDL-54741 - Phase 2 of deprecation of functions in lib/deprecatedlib.php&lt;br /&gt;
* MDL-51803 - Reusable element for drag and drop sortable table or list&lt;br /&gt;
* MDL-63329 - memcache session handler removal&lt;br /&gt;
* MDL-63658 - New Favourites subsystem&lt;br /&gt;
* MDL-63729 - Badges web services return new fields and data added by the Open Badges v2.0 specification&lt;br /&gt;
* MDL-50812 - core_useragent::get_browser_version_classes distinguishes between different browsers&lt;br /&gt;
&lt;br /&gt;
===Privacy API update===&lt;br /&gt;
&lt;br /&gt;
In addition to existing requirements, any plugin which implements the plugin provider interface must also implement the &amp;lt;tt&amp;gt;\core_privacy\local\request\core_userlist_provider&amp;lt;/tt&amp;gt; interface. Two new methods need to be implemented:&lt;br /&gt;
&lt;br /&gt;
* [[Privacy API#Retrieving_the_users_in_a_context|get_users_in_context()]]&lt;br /&gt;
* [[Privacy API#Delete_personal_information_for_several_users_in_a_specific_context|delete_data_for_users()]]&lt;br /&gt;
&lt;br /&gt;
However, the two above methods are not required for plugins that [[Privacy_API#Plugins_which_do_not_store_personal_data|implement the &amp;lt;tt&amp;gt;null_provider&amp;lt;/tt&amp;gt;]] only (i.e. which do not store personal data).&lt;br /&gt;
&lt;br /&gt;
Note that these changes are also required for latest Moodle 3.4.6 and 3.5.3 versions.&lt;br /&gt;
&lt;br /&gt;
===Behat scenario files===&lt;br /&gt;
&lt;br /&gt;
* MDL-57281 - The behat step &amp;lt;code&amp;gt;I navigate to &amp;quot;ITEM&amp;quot; node in &amp;quot;MAINNODE &amp;gt; PATH&amp;quot;&amp;lt;/code&amp;gt; has been deprecated and throws an exception with details on how to replace it. The recommended replacement steps work in all recent Moodle versions. The updated Behat will pass with Moodle 3.4 too.&lt;br /&gt;
&lt;br /&gt;
===Login token===&lt;br /&gt;
&lt;br /&gt;
If your plugin provides an alternative login form (e.g. it is a theme replacing the default login form template / renderer), the login form must include a new login token field. For details of required changes, see [[Login token]]. Note that this also affects latest stable branches too.&lt;br /&gt;
&lt;br /&gt;
===Component APIs upgrades===&lt;br /&gt;
&lt;br /&gt;
Please refer to the upgrade.txt files in the relevant component directory for changes in this particular Moodle release.&lt;br /&gt;
&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/admin/tool/log/upgrade.txt admin/tool/log/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/admin/tool/upgrade.txt admin/tool/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/auth/shibboleth/upgrade.txt auth/shibboleth/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/auth/upgrade.txt auth/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/badges/upgrade.txt badges/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/blocks/upgrade.txt blocks/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/cache/upgrade.txt cache/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/calendar/upgrade.txt calendar/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/course/format/upgrade.txt course/format/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/course/upgrade.txt course/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/enrol/upgrade.txt enrol/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/filter/upgrade.txt filter/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/grading/form/upgrade.txt grade/grading/form/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/report/upgrade.txt grade/report/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/upgrade.txt grade/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/lib/upgrade.txt lib/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/media/upgrade.txt media/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/message/upgrade.txt message/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/assign/upgrade.txt mod/assign/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/feedback/upgrade.txt mod/feedback/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/forum/upgrade.txt mod/forum/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/quiz/upgrade.txt mod/quiz/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/scorm/report/basic/upgrade.txt mod/scorm/report/basic/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/scorm/upgrade.txt mod/scorm/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/upgrade.txt mod/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/workshop/upgrade.txt mod/workshop/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/question/format/upgrade.txt question/format/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/report/upgrade.txt report/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/tag/upgrade.txt tag/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/theme/upgrade.txt theme/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/user/upgrade.txt user/upgrade.txt]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.5 release notes]]&lt;br /&gt;
 &lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.6]]&lt;br /&gt;
 &lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.6]]&lt;br /&gt;
[[es:Notas de Moodle 3.6]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.3_release_notes&amp;diff=53548</id>
		<title>Moodle 3.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.3_release_notes&amp;diff=53548"/>
		<updated>2017-12-21T13:58:51Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Server requirements */ Clarification about utf8mb4 requirement, see https://moodle.org/mod/forum/discuss.php?d=363207&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
 &lt;br /&gt;
Release date: 15 May 2017&lt;br /&gt;
 &lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.3%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.3].&lt;br /&gt;
&lt;br /&gt;
See our [https://docs.moodle.org/33/en/New_features New Features page] for a more user-friendly introduction to Moodle 3.3 with screenshots.&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from previous version, make sure you read the [https://docs.moodle.org/33/en/Upgrading Upgrading] documentation. &lt;br /&gt;
&lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
These are just the minimum supported versions. We recommend keeping all of your software up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 2.7 or later (if upgrading from earlier versions, you must upgrade to 2.7.14 as a first step)&lt;br /&gt;
* PHP version: minimum PHP 5.6.5. &#039;&#039;Note: minimum PHP version has increased since Moodle 3.1&#039;&#039;. PHP 7.0.x and 7.1.x are supported but have some [https://docs.moodle.org/dev/Moodle_and_PHP7#Can_I_use_PHP7_yet.3F engine limitations]. &lt;br /&gt;
* PHP extensions &#039;&#039;&#039;openssl&#039;&#039;&#039; and &#039;&#039;&#039;fileinfo&#039;&#039;&#039; are now required in Moodle 3.3 (they were recommended in 3.2)&lt;br /&gt;
* If you use PostgreSQL the minimum supported version is now 9.3 (was 9.1 in Moodle 3.2)&lt;br /&gt;
* If you use MySQL or MariaDB, make sure your database supports full UTF-8 (utf8mb4) if you install a new instance of Moodle. CLI script may be used to convert to utf8mb4 if you&#039;re upgrading. You may choose to keep using &#039;utf8_*&#039;, but then a warning will show that the database isn&#039;t using full UTF-8 support and suggest moving to &#039;utf8mb4_unicode_ci&#039;. See [[:en:MySQL full unicode support|MySQL full unicode support]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Database requirements ===&lt;br /&gt;
&lt;br /&gt;
Moodle supports the following database servers. Again, version numbers are just the minimum supported version. We recommend running the latest stable version of any software.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Database&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
| 9.3&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microsoft.com/en-us/server-cloud/products/sql-server/ Microsoft SQL Server]&lt;br /&gt;
| 2008&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oracle.com/us/products/database/overview/index.html Oracle Database]&lt;br /&gt;
| 10.2&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
=== Browser support ===&lt;br /&gt;
Moodle is compatible with any standards compliant web browser. We regularly test Moodle with the following browsers:&lt;br /&gt;
&lt;br /&gt;
Desktop:&lt;br /&gt;
* Chrome&lt;br /&gt;
* Firefox&lt;br /&gt;
* Safari&lt;br /&gt;
* Edge&lt;br /&gt;
* Internet Explorer&lt;br /&gt;
&lt;br /&gt;
Mobile:&lt;br /&gt;
* MobileSafari&lt;br /&gt;
* Google Chrome&lt;br /&gt;
&lt;br /&gt;
For the best experience and optimum security, we recommend that you keep your browser up to date. https://whatbrowser.org&lt;br /&gt;
&lt;br /&gt;
Note: Legacy browsers with known compatibility issues with Moodle 3.3:&lt;br /&gt;
* Internet Explorer 10 and below&lt;br /&gt;
* Safari 7 and below&lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
=== Highlights ===&lt;br /&gt;
&lt;br /&gt;
* MDL-55611 - New [https://docs.moodle.org/33/en/Course_overview Course overview] dashboard block featuring timeline of events&lt;br /&gt;
* MDL-58220 - Make use of [https://docs.moodle.org/33/en/OAuth_2_services OAuth 2 services] to allow users to [https://docs.moodle.org/33/en/OAuth_2_authentication authenticate with Google G-Suite or Microsoft Office accounts] and manage files from associated drives&lt;br /&gt;
* MDL-39913 - New [https://docs.moodle.org/33/en/Assignment_settings Assignment setting] for restricting submission file types&lt;br /&gt;
* MDL-4782 - [https://docs.moodle.org/33/en/Stealth_activities &amp;quot;Stealth mode&amp;quot;] for resources/activities in a course - not displayed on the course page but available for students&lt;br /&gt;
* MDL-40759 - New Font Awesome icon font for all icons in Moodle&lt;br /&gt;
&lt;br /&gt;
=== For teachers ===&lt;br /&gt;
&lt;br /&gt;
* MDL-58138 - [https://docs.moodle.org/33/en/Activity_completion_settings Activity completion settings] for setting activity completion defaults and bulk editing of completion requirements&lt;br /&gt;
* MDL-48771 - [https://docs.moodle.org/33/en/Building_Quiz Quiz activity]: Option to delete multiple questions&lt;br /&gt;
* MDL-53814 - Quiz activity: Question type icons are displayed in the quiz manual grading overview&lt;br /&gt;
* MDL-55459 - [https://docs.moodle.org/33/en/Assignment_settings Assignment activity]: Annotated PDF comments are collapsible&lt;br /&gt;
* MDL-23919 - [https://docs.moodle.org/33/en/Database_activity_settings Database activity]: The setting &amp;quot;Required entries&amp;quot; is now an activity completion condition&lt;br /&gt;
* MDL-57769 - Topic and weeks course formats: After a course is created, sections can be added and removed only from the course page (it is no longer possible to have &amp;quot;orphaned&amp;quot; activities)&lt;br /&gt;
* MDL-46929, MDL-57456, MDL-57457 - [https://docs.moodle.org/33/en/Using_Forum Forum posts], [https://docs.moodle.org/33/en/Using_Glossary glossary entries] and [https://docs.moodle.org/33/en/Book_settings book chapters] may be tagged&lt;br /&gt;
* MDL-56251 - For courses in weekly format, a new [https://docs.moodle.org/33/en/Course_settings course setting] allows for the course end date to be calculated automatically&lt;br /&gt;
* MDL-47354 - Allow the page size in the Single view report to be configurable&lt;br /&gt;
&lt;br /&gt;
=== Backup and restore ===&lt;br /&gt;
&lt;br /&gt;
* MDL-34859 - Add site defaults for all restore settings, improve UI around &amp;quot;Overwrite course configuration&amp;quot; select&lt;br /&gt;
* MDL-40838 - Allow to restore non-default enrollment methods without restoring users&lt;br /&gt;
* MDL-57769 - When restoring/importing big courses in Weeks and Topics formats into small existing courses ajust the number of sections automatically&lt;br /&gt;
&lt;br /&gt;
=== For administrators ===&lt;br /&gt;
&lt;br /&gt;
Please read carefully: [https://docs.moodle.org/33/en/Upgrading#Possible_issues_that_may_affect_you_in_Moodle_3.3 Possible issues that may affect you in Moodle 3.3]&lt;br /&gt;
&lt;br /&gt;
* MDL-46375 - Support for storing files not on the local drive (there are no open-source solutions at the moment, developer&#039;s help is required to implement custom cloud storage)&lt;br /&gt;
* MDL-55528, MDL-58280 - New [https://docs.moodle.org/33/en/Document_converters document converter] plugin type allows alternatives to unoconv, such as the [https://docs.moodle.org/33/en/Google_Drive_converter Google Drive converter]&lt;br /&gt;
* MDL-55980 - Run individual scheduled tasks from web interface&lt;br /&gt;
* MDL-57896 - CLI wrapper for get_config() and set_config() methods&lt;br /&gt;
* MDL-57789 - Use Cache-Control: immutable when serving files&lt;br /&gt;
* MDL-37765 - New capability to bypass access restrictions, separated from capability to view hidden activities&lt;br /&gt;
* MDL-57913 - Convert external database authentication synchronisation to scheduled task&lt;br /&gt;
&lt;br /&gt;
==== Plugins removal and deprecation ====&lt;br /&gt;
&lt;br /&gt;
* The repository Skydrive is deprecated; please migrate to the newer [https://docs.moodle.org/33/en/OneDrive_repository OneDrive repository]&lt;br /&gt;
* The Dashboard block Course overview is replaced with a new block [https://docs.moodle.org/33/en/Course_overview Course overview] which is a different plugin. If you want to use the old block, you need to download and install it from https://moodle.org/plugins/block_course_overview&lt;br /&gt;
&lt;br /&gt;
=== Mobile app support ===&lt;br /&gt;
&lt;br /&gt;
* MDL-57410 - Allow admins to add new external links to pages in the main menu of the Mobile app&lt;br /&gt;
* MDL-57408 - Add new settings for allowing renaming strings in the Mobile app&lt;br /&gt;
* MDL-49423 - Add new settings for disabling Mobile app functionalities&lt;br /&gt;
* MDL-57759 - Allow offline attempts via the Mobile app in the lesson module&lt;br /&gt;
* MDL-57162 - Support Native App install banners for Android as well as iOS for the mobile app&lt;br /&gt;
&lt;br /&gt;
=== Other improvements ===&lt;br /&gt;
&lt;br /&gt;
* MDL-33483 - Google Docs repository: Save Doc files in different formats to RTF&lt;br /&gt;
* MDL-42266 - Improve the list of maximum file size options for file uploads&lt;br /&gt;
* MDL-51853 - Calendar subscriptions from imported files should be editable&lt;br /&gt;
* MDL-41729 - Add ability to change passwords for users using Shibboleth&lt;br /&gt;
* MDL-57572, MDL-57570, MDL-57355 - Redis and static caches performance improvements if igbinary library is installed&lt;br /&gt;
* MDL-56808 - SCORM module: Performance improvements when running SCORM 1.2 packages&lt;br /&gt;
* MDL-57686 - Add support for PDO databases in external database authentication&lt;br /&gt;
* MDL-57638 - RSS Block: RSS feeds are more heavily cached and correctly respect skip values&lt;br /&gt;
&lt;br /&gt;
===For developers===&lt;br /&gt;
&lt;br /&gt;
* MDL-55528 - New plugin type &#039;fileconverter&#039; for file conversions, unoconv is now a plugin that can be replaced with scalable commercial solutions (see [[File Converters]])&lt;br /&gt;
* MDL-40759 - Font Awesome icon font is used for all icons in Moodle (see [[Moodle_icons#Font_awesome_icons|Moodle icons]])&lt;br /&gt;
* MDL-46375 - Support for storing files not on the local drive is implemented by allowing to override functionality of file_storage and stored_file classes (see [[File System API]])&lt;br /&gt;
* MDL-12689 - Convert all authentication plugins to use settings.php (see [https://github.com/moodle/moodle/blob/master/auth/upgrade.txt upgrade.txt])&lt;br /&gt;
* MDL-53978 - Add extra plugin callbacks for every major stage of page render (see [https://github.com/moodle/moodle/commit/5ebd1fb9768969956c9131df4274f9cdff7f0134 commit])&lt;br /&gt;
* MDL-58138 - Course modules may provide additional callbacks to participate in bulk editing of activities completion rules in a course&lt;br /&gt;
* MDL-58220 - Better office integration&lt;br /&gt;
* MDL-45584 - Multiple caches can be instantiated with the same definition but with different identifiers&lt;br /&gt;
* MDL-57769 - Course formats: Attribute &#039;numsections&#039; was removed from topics and weeks, other course formats may want to implement similar changes&lt;br /&gt;
* MDL-55956 - Priority field for the calendar events allowing to specify the priority of overrides&lt;br /&gt;
* MDL-58566 - New methods for retrieving calendar events&lt;br /&gt;
* MDL-55941 - New element to select first name of first/last names is implemented in tablelib or can be used by developers elsewhere ([https://github.com/moodle/moodle/blob/master/lib/templates/initials_bar.mustache template])&lt;br /&gt;
* MDL-56519 - Lint behat .feature files&lt;br /&gt;
* MDL-57273 - New classes (core\persistent, core\form\persistent, core\external\exporter, \core\external\persistent_exporter) used to represent a data-model and export that data in a standard format for webservices (previously was used in competencies) (see [[Persistent form]], [[Persistent]], [[Exporter]])&lt;br /&gt;
* MDL-57490 - Removed several legacy JS functions from javascript-static.js&lt;br /&gt;
* MDL-57690 - mcore YUI rollup is no longer included on every single Moodle page (see [[https://moodle.org/mod/forum/discuss.php?d=346520 forum post]])&lt;br /&gt;
&lt;br /&gt;
==== Upgrading plugins ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Check for changes in core APIs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read lib/upgrade.txt to check for the deprecations and core API changes, make sure you applied them to your plugin. Note that entries there are not sorted by priority but rather by integration time. Below is the list of upgrade.txt files that contain information about upgrading from Moodle 3.2 to Moodle 3.3 (note that if you upgrade from earlier versions there may be more files):&lt;br /&gt;
&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/lib/upgrade.txt lib/upgrade.txt] changes to various core APIs, deprecations, functions removal&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/admin/upgrade.txt admin/upgrade.txt] changes to administration-related functions&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/cache/upgrade.txt cache/upgrade.txt] changes to Cache API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/calendar/upgrade.txt calendar/upgrade.txt] changes to Calendar API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/competency/upgrade.txt competency/upgrade.txt] changes to Competency API&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/course/upgrade.txt course/upgrade.txt] changes to course-related functions&lt;br /&gt;
&lt;br /&gt;
For the next releases we are thinking about improving the format of upgrade.txt notes, please have your say on policy issue MDL-58879&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Check for changes in the API of your plugin type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Below is the list of plugin types that had API changes between Moodle 3.2 and 3.3:&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/auth/upgrade.txt auth/upgrade.txt] Authentication plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/blocks/upgrade.txt blocks/upgrade.txt] Block plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/course/format/upgrade.txt course/format/upgrade.txt] Course format plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/enrol/upgrade.txt enrol/upgrade.txt] Enrolment method plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/media/upgrade.txt media/upgrade.txt] Media player plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/mod/upgrade.txt mod/upgrade.txt] Activity module plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/question/type/upgrade.txt question/type/upgrade.txt] Question types plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/repository/upgrade.txt repository/upgrade.txt] Repository plugins&lt;br /&gt;
* [https://raw.githubusercontent.com/moodle/moodle/master/theme/upgrade.txt theme/upgrade.txt] Themes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Check for changes in the depended plugins&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If your plugin depends on another plugin or calls methods from another plugin, read upgrade.txt in this plugin directory (if it exists). Below is the list of standard plugins that had changes between Moodle 3.2 and 3.3:&lt;br /&gt;
&lt;br /&gt;
Due to changes in Authentication plugins settings all standard auth plugins were updated: [https://raw.githubusercontent.com/moodle/moodle/master/auth/cas/upgrade.txt auth_cas], [https://raw.githubusercontent.com/moodle/moodle/master/auth/db/upgrade.txt auth_db], [https://raw.githubusercontent.com/moodle/moodle/master/auth/email/upgrade.txt auth_email], [https://raw.githubusercontent.com/moodle/moodle/master/auth/fc/upgrade.txt auth_fc], [https://raw.githubusercontent.com/moodle/moodle/master/auth/imap/upgrade.txt auth_imap], [https://raw.githubusercontent.com/moodle/moodle/master/auth/ldap/upgrade.txt auth_ldap], [https://raw.githubusercontent.com/moodle/moodle/master/auth/manual/upgrade.txt auth_manual], [https://raw.githubusercontent.com/moodle/moodle/master/auth/mnet/upgrade.txt auth_mnet], [https://raw.githubusercontent.com/moodle/moodle/master/auth/nntp/upgrade.txt auth_nntp], [https://raw.githubusercontent.com/moodle/moodle/master/auth/none/upgrade.txt auth_none], [https://raw.githubusercontent.com/moodle/moodle/master/auth/pam/upgrade.txt auth_pam], [https://raw.githubusercontent.com/moodle/moodle/master/auth/pop3/upgrade.txt auth_pop3], [https://raw.githubusercontent.com/moodle/moodle/master/auth/shibboleth/upgrade.txt auth_shibboleth]&lt;br /&gt;
&lt;br /&gt;
Other standard plugins that were updated in 3.3: [https://raw.githubusercontent.com/moodle/moodle/master/admin/tool/lp/upgrade.txt tool_lp], [https://raw.githubusercontent.com/moodle/moodle/master/admin/tool/mobile/upgrade.txt tool_mobile], [https://raw.githubusercontent.com/moodle/moodle/master/enrol/ldap/upgrade.txt enrol_ldap], [https://raw.githubusercontent.com/moodle/moodle/master/mod/assign/upgrade.txt mod_assign], [https://raw.githubusercontent.com/moodle/moodle/master/mod/data/upgrade.txt mod_data], [https://raw.githubusercontent.com/moodle/moodle/master/mod/feedback/upgrade.txt mod_feedback], [https://raw.githubusercontent.com/moodle/moodle/master/mod/forum/upgrade.txt mod_forum], [https://raw.githubusercontent.com/moodle/moodle/master/mod/lesson/upgrade.txt mod_lesson]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Do a smoke test of your plugin with developer debugging mode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Run all behat and phpunit tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.2 release notes]]&lt;br /&gt;
 &lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.3]]&lt;br /&gt;
 &lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.3]]&lt;br /&gt;
[[es:Notas de Moodle 3.3]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Translating_plugins&amp;diff=52746</id>
		<title>Translating plugins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Translating_plugins&amp;diff=52746"/>
		<updated>2017-07-20T17:26:20Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Strings priority */ Priority corrected (see source code, function load_component_strings)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Translation}}&lt;br /&gt;
==Looking for translated plugins in the Moodle plugins database==&lt;br /&gt;
&lt;br /&gt;
* Almost all contributed plugins published in Moodle Plugins directory have been imported into [http://lang.moodle.org/ AMOS] and are ready to be translated.&lt;br /&gt;
* When a user is looking at the [https://moodle.org/plugins/ Moodle plugins database], in &#039; Description tab &amp;gt; Useful links section&#039; there is a link to &#039;Contribute translation for (your preferred language)&#039; that points to [http://lang.moodle.org/ AMOS].&lt;br /&gt;
* Have a look at an example for the very popular [https://moodle.org/plugins/view.php?plugin=mod_hotpot HotPot] plugin:&lt;br /&gt;
&lt;br /&gt;
[[File:Link to Plugin translations in Moodle plugins database.png|300px]]&lt;br /&gt;
&lt;br /&gt;
* You can click on the &#039;Contribute translation for (your preferred language)&#039; link.&lt;br /&gt;
* &#039;&#039;&#039;CURRENTLY:&#039;&#039;&#039; If you do not have an AMOS account, you would have to &#039;Create a new account&#039; by using the appropriate link.&lt;br /&gt;
* If you have a translator account in AMOS, you can use AMOS to contribute the translation.&lt;br /&gt;
* If you select all the language packs (except English fixes) and write &#039;pluginname&#039; in the box for &#039;String identifier&#039;, AMOS will display the name of the plugin in all available translations.&lt;br /&gt;
* Make sure that you have selected the Moodle branch(es) that you are interested in (eg, 2.5 in the image below).&lt;br /&gt;
&lt;br /&gt;
[[File:Plugins translations in AMOS.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* In the above example, there are a total of 123 different language packs registered in AMOS; 63 of these are missing a translation for HotPot, which means that there are 60 different language translations already available for the HotPot plugin, a fair number for this popular plugin :)&lt;br /&gt;
* When no translation is available for any/many language(s), the box named &#039;Translation&#039; will be empty for those languages.&lt;br /&gt;
* If a plugin name has been translated, there is a fair chance (but no certainty) that this plugin has been (completely) translated into that language. You can change the settings in AMOS and check for yourself.&lt;br /&gt;
&lt;br /&gt;
==Plugin translation priority==&lt;br /&gt;
* Please help Moodle users in other languages by translating your favourite plugins.&lt;br /&gt;
* Moodle has a continuously updated [https://moodle.org/plugins/report/index.php?report=favourites&amp;amp;p=0&amp;amp;l=50&amp;amp;s=favourited&amp;amp;d=DESC list of the most favourite plugins], which might be worth considering for translation  :)&lt;br /&gt;
* You can find the plugins with the largest number of downloads in the last three months at [https://moodle.org/plugins/stats.php https://moodle.org/plugins/stats.php]. These are the plugins most likely to be most useful when translated to your language. It would probably be a good idea to translate them first.&lt;br /&gt;
* Moodle has a list of plugins that have received the [https://moodle.org/plugins/browse.php?list=award&amp;amp;id=1 Reviewers&#039; choice award]. These are given by the plugins guardians and reviewers for particularly useful, well coded or otherwise interesting plugins. It would be very desirable/useful to have these translated.&lt;br /&gt;
* See the [https://moodle.org/mod/forum/discuss.php?d=325804 list of (year 2015) favorite plugins] by Gavin Henrick&lt;br /&gt;
* Special cases:&lt;br /&gt;
** All plugins with &#039;&#039;mobile&#039;&#039; in their name, and all [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=62 server side plugins] to support the  [https://docs.moodle.org/31/en/Moodle_Mobile Moodle mobile app]&lt;br /&gt;
** [https://moodle.org/plugins/local_moodlecloudsignup MoodleCloud strings] are used for accessing the [https://moodle.com/cloud/ MoodleCloud] free and paid hosting services.&lt;br /&gt;
&lt;br /&gt;
===Elementary school teaching===&lt;br /&gt;
If your Moodle site will serve kids, consider [https://docs.moodle.org/31/en/Language_packs#Can_I_make_a_language_pack_for_kids.3F making a language pack for kids].&lt;br /&gt;
&lt;br /&gt;
===Plugins for K-12 teaching===&lt;br /&gt;
For [https://en.wikipedia.org/wiki/K%E2%80%9312 K-12] teaching and learning environments, please consider translating the plugins that are included in the [https://moodle.com/cloud/school/?utm_source=Sendy&amp;amp;utm_medium=Email&amp;amp;utm_campaign=Newsletter_July2016 Moodle for School at MoodleCloud]: &lt;br /&gt;
* [https://moodle.org/plugins/mod_attendance Attendance]&lt;br /&gt;
* [http://bigbluebutton.org/ BigBlueButton]&lt;br /&gt;
* [https://moodle.org/plugins/mod_checklist Checklist]&lt;br /&gt;
* [https://moodle.org/plugins/atto_chemistry Chemistry editor]&lt;br /&gt;
* [https://moodle.org/plugins/mod_choicegroup Group choice]&lt;br /&gt;
* [https://moodle.org/plugins/block_xp Level up!]&lt;br /&gt;
* [https://moodle.org/plugins/mod_quizgame Quizventure]&lt;br /&gt;
* [https://moodle.org/plugins/tinymce_wordcount Word count]&lt;br /&gt;
&lt;br /&gt;
===Plugins for University teaching===&lt;br /&gt;
For universities, there is a [https://docs.moodle.org/31/en/Tertiary_education#Moodle_plugins_by.2Ffor_Universities list of plugins by/for Universities], and a [https://docs.moodle.org/31/en/Tertiary_education#Discipline-specific_plugins link to discipline-specific plugins], which might be worth translating.&lt;br /&gt;
&lt;br /&gt;
==Non-translatable strings==&lt;br /&gt;
While AMOS does a great job for translating the Moodle core and most Moodle plugin language strings, some English language strings are not available for translation with AMOS.&lt;br /&gt;
&lt;br /&gt;
===Plugins in the [https://moodle.org/plugins/browse.php?list=category&amp;amp;id=38 Other] category===&lt;br /&gt;
The plugins classified as &#039;[https://moodle.org/plugins/browse.php?list=category&amp;amp;id=38 Other] &#039; (Utilities, Experimental or Incubating) are not translatable by AMOS (see [http://lang.moodle.org/mod/forum/discuss.php?d=3113 this forum thread]). You can use the [[:en:Language customization|language customization]] tool within your Moodle (production or local) server to produce the .php file containing the translated language strings for your language and email this file to the particular &#039;other&#039; plugin maintainer, so that it can be included in the lang folder within the downloadable Zip file for the plugin.&lt;br /&gt;
&lt;br /&gt;
===Plugins with coding errors===&lt;br /&gt;
Some plugins (of types different from &#039;Other&#039;) available for download in the [https://moodle.org/plugins/ Moodle plugins directory] may not  have English language strings available for translation in [https://lang.moodle.org/ AMOS] because of [https://docs.moodle.org/dev/index.php?title=Plugin_contribution_checklist&amp;amp;redirect=no coding errors], that must be identified and fixed by the plugin maintainer, See [https://docs.moodle.org/dev/Plugin_contribution_checklist#Strings Plugin contribution checklist:Strings]:&lt;br /&gt;
* The plugin code must not rely on trailing and leading whitespace in strings.&lt;br /&gt;
* The string file must be considered as pure data file with the syntax $string[&#039;id&#039;] = &#039;value&#039;;&lt;br /&gt;
* No other PHP syntax such as [http://php.net/manual/en/language.operators.string.php concatenation], [http://php.net/manual/en/language.types.string.php heredoc and nowdoc] is supported by the tools that AMOS use when processing the strings (even if it may work in Moodle itself).&lt;br /&gt;
* Use neither string concatenation operators nor other PHP logic inside string files. Those should really be considered as plain data files with simple $string[&#039;key&#039;] = &#039;value&#039;; syntax, nothing more.&lt;br /&gt;
&lt;br /&gt;
===Plugins with hard-wired English language strings===&lt;br /&gt;
Sometimes you might have translated 100% of the strings available in AMOS for a given plugin, and you can still view the original English (non-translated) strings.&lt;br /&gt;
* Please check that you have purged your browser cache and the server cache, waited for one hour (for AMOS to update the language packs), and updated your language packs.&lt;br /&gt;
* If the problem persists, please write the plugin maintainer by clicking at the &#039;Bug tracker&#039; link shown in the given plugin&#039;s page in the [https://moodle.org/plugins/index.php Moodle plugins database]. &lt;br /&gt;
* If the plugin author has nested additional &#039;Lang&#039; folders inside any subdirectories within the plugin folder structure, the English language strings in these nested Lang folder will not be available for AMOS, and they would seem to be hard-wired. Please contact the plugin author.&lt;br /&gt;
* Most Moodle plugin authors have been very fast at replacing the English hard-coded strings with strings variables that can now be translated in AMOS.&lt;br /&gt;
* If you suspect the problem is in a core plugin, you can post an issue in the [https://lang.moodle.org/mod/forum/view.php?id=5 AMOS translation forum].&lt;br /&gt;
 &lt;br /&gt;
===Log descriptions can not be translated===&lt;br /&gt;
* See [https://docs.moodle.org/dev/Translation_FAQ#Why_are_log_descriptions_displayed_in_English.3F why log descriptions are not translated].&lt;br /&gt;
&lt;br /&gt;
===Items that must NOT be translated===&lt;br /&gt;
* See the [https://docs.moodle.org/dev/Translation_FAQ#Are_there_items_which_are_not_to_be_translated.3F Items that are not to be translated] in the [https://docs.moodle.org/dev/Translation_FAQ Translation FAQ]&lt;br /&gt;
&lt;br /&gt;
==If translations are available in AMOS for some Moodle branches but not available for other branches==&lt;br /&gt;
Sometimes a plugin may have its English language strings available for translations for some Moodle branches (e.g. 2.0 to 2.4), but not for other branches (e.g. 2.5 to 2.7), even though the plugin itself is indeed available for download for all branches (2.0 to 2.7) in the Moodle plugins database.&lt;br /&gt;
&lt;br /&gt;
Please see an example in [http://lang.moodle.org/mod/forum/discuss.php?d=3939 this post]. The cause is very likely a programming error (see &#039;Plugins with coding errors&#039; above), that must be fixed by the plugin maintainer.&lt;br /&gt;
&lt;br /&gt;
==What happens if a plugin ZIP file includes translation(s) inside the lang folder==&lt;br /&gt;
If a site has debugging on, there will be a warning message about &#039;Found language file&#039; when the user installs the plugin, but the installation may proceed.&lt;br /&gt;
&lt;br /&gt;
[[File:Found language file debugging message.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
The Language strings inside a properly installed downloaded plugin will overwrite the strings translations of the language pack, but they can be overwritten by the strings defined with the Language customization. &lt;br /&gt;
&lt;br /&gt;
===Strings priority===&lt;br /&gt;
When displaying text language strings, Moodle 2.x and 3.x will have the following priority:&lt;br /&gt;
# Strings defined by the [[:en:Language customization|language customization]] tool&lt;br /&gt;
# Strings defined in an installed child language pack (eg, the es_ve language pack)&lt;br /&gt;
# Strings enclosed inside the plugin_name/lang/xx/yy.php folder (where xx is a language code other than the en folder) from a downloaded and installed plugin ZIP file (eg, inside the /server/moodle/theme/adaptable/lang/es/theme_adaptable.php file)&lt;br /&gt;
# Strings defined in an installed parent language pack (eg, the es language pack)&lt;br /&gt;
# Original Australian English language strings shipped with the downloaded Moodle branch.&lt;br /&gt;
# Original Australian English language strings inside the /lang/en folder in the downloaded/updated plugin ZIP file&lt;br /&gt;
&lt;br /&gt;
Note: See the [https://moodle.org/plugins/local_string_override local String override plugin] that makes it possible for plugins to override existing translations regardless if they&#039;re bundled with Moodle or they&#039;re originated from a community plugin.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [http://lang.moodle.org/mod/forum/discuss.php?d=2485 Contributed plugins are now automatically imported into AMOS] announcement explaining the mechanism&lt;br /&gt;
* [https://docs.moodle.org/dev/Translation_FAQ#Are_there_items_which_are_not_to_be_translated.3F Items that are not to be translated] in the [https://docs.moodle.org/dev/Translation_FAQ Translation FAQ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Accessibility&amp;diff=51579</id>
		<title>Accessibility</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Accessibility&amp;diff=51579"/>
		<updated>2016-12-13T08:53:56Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Web standards, guidelines and legislation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Websites built with &#039;&#039;&#039;accessibility&#039;&#039;&#039; in mind are flexible in meeting different user needs, preferences and situations. Though these methods can increase [[Usability|usability]] for everyone who uses the Web they are often legally required to be implemented in a specific effort to prevent discrimination against people with disabilities.&lt;br /&gt;
&lt;br /&gt;
== Starting points ==&lt;br /&gt;
&lt;br /&gt;
These are some readable introductions to accessibility that cover; what accessibility is, why it is important, as well as practical advice.&lt;br /&gt;
* [http://www.w3.org/WAI/intro/accessibility.php Web Accessibility Initiative&#039;s &#039;&#039;Introduction to Web Accessibility&#039;&#039;]&lt;br /&gt;
* [http://diveintoaccessibility.info/ Mark Pilgrim&#039;s &#039;&#039;Dive into Accessibility&#039;&#039;]&lt;br /&gt;
* [http://joeclark.org/book/ Joe Clark&#039;s &#039;&#039;Building Accessible Websites&#039;&#039; book] &lt;br /&gt;
&lt;br /&gt;
== Moodle Accessibility Collaboration Group ==&lt;br /&gt;
To improve the accessibility/usability of this learning management system, we have established this collaboration group to work together with Moodle developers, administrators, IT professionals, and other interested entities and individuals. We welcome anyone who is interested in improving the accessibility of Moodle to join this group. You don’t need to be a technical guru or accessibility expert to join; however, it is expected that you are familiar with the basics of accessibility and are willing to dedicate a few hours each month to this collaboration effort.&lt;br /&gt;
&lt;br /&gt;
Visit http://collaborate.athenpro.org/group/moodle to join the mailing list.&lt;br /&gt;
&lt;br /&gt;
We meet in regional groups once a month to discuss accessibility priorities for each region. Regions meet at the following times:&lt;br /&gt;
&lt;br /&gt;
* North America: We meet on the 1st Monday of each month at 10am USA Pacific Daylight Saving Time/5pm UTC. (Time zone converter: http://www.worldtimebuddy.com/) &lt;br /&gt;
* Europe: Looking for leadership and members&lt;br /&gt;
* Asia Pacific: Looking for leadership and members&lt;br /&gt;
* Latin America: Looking for leadership and members&lt;br /&gt;
&lt;br /&gt;
To review past regional meetings or to see up coming meetings visit http://collaborate.athenpro.org/group/moodle/teleconferences/&lt;br /&gt;
&lt;br /&gt;
== Moodle-related accessibility coding guidelines ==&lt;br /&gt;
&lt;br /&gt;
; Use CSS, but still use headings, strong and emphasis&lt;br /&gt;
: It is generally a good idea to separate a document&#039;s content HTML from how it is presented using CSS. There are some tags that affect a document&#039;s presentation but also contribute to the structure and meaning of the content. These tags should remain in HTML. This includes heading tags &amp;lt;code&amp;gt;&amp;lt;h1&amp;gt;, &amp;lt;h2&amp;gt;, &amp;lt;h3&amp;gt;...&amp;lt;/code&amp;gt;, which are used to form the document&#039;s hierarchical structure, and &amp;lt;code&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;/code&amp;gt; tags, which are used to add meaning to sections of text.&lt;br /&gt;
; Avoid using background images for important information&lt;br /&gt;
: Users of non-visual browsers cannot see images. They can read the &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; tags of normal images, but background images are not presented like normal images.&lt;br /&gt;
; Image &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; attributes&lt;br /&gt;
* An &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; attribute is required (even if empty) on all images.&lt;br /&gt;
* If a link is wrapping an &amp;lt;code&amp;gt;&amp;lt;img&amp;gt;&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;&amp;lt;img&amp;gt;&amp;lt;/code&amp;gt; does not need a &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; attribute if the link has one.&lt;br /&gt;
* The &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; for an image and the &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; for its surrounding link should usually differ. An image &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; attribute provides a text equivalent to an image, whereas a &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; attribute adds supplementary information about the purpose or action associated with an image link. Simply repeating the same text in &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; attributes adds little and can be annoying for screen reader users.&lt;br /&gt;
; Links and buttons should be selectable and easily click-able&lt;br /&gt;
* An image used as an icon for a user to click should be large enough so that the user can click on it easily.&lt;br /&gt;
* Users should be able to navigate to all links and buttons using the keyboard.&lt;br /&gt;
* Generally we should avoid having two buttons/links that achieve the same action in the same area. This can be annoying and confusing for users of screen readers.&lt;br /&gt;
; Support dynamic interaction with [[ARIA]] attributes&lt;br /&gt;
: Events triggered by AJAX and JavaScript can be less obvious to users of non-visual browsers. [[ARIA]] attributes can assist users of such browsers to follow a dynamic change.&lt;br /&gt;
; Use labels with inputs&lt;br /&gt;
: Context can easily be lost without a visual presentation. Labels are needed on all input input elements (except button) to describe their purpose in a form. Labels should be unique on a page. Repeated elements should have a unique label that identifies the element within its context.&lt;br /&gt;
; Use appropriate page titles&lt;br /&gt;
: A page title is a starting point for a screen reader. Page titles should be unique and should make sense for the page. Avoid generic page titles.&lt;br /&gt;
; All pages should be navigable using just a keyboard&lt;br /&gt;
: It should be possible navigate to all points on a page just using a keyboard. Important events triggered by a mouse event should be able to be triggered when the item receives focus through keyboard navigation.&lt;br /&gt;
; Avoid using colour alone to express meaning&lt;br /&gt;
: Colour-blind users need additional information to gain meaning if colour is used as the emphasising feature. Also keep in mind that colours can have differing significance in different cultures, so colours should be configurable either through settings or language files.&lt;br /&gt;
; Use sufficient color contrast when adding color to text. See Tracker ticket MDL 522391: https://tracker.moodle.org/browse/MDL-52391. &lt;br /&gt;
; Role for button-type links&lt;br /&gt;
: If a link acts as a button (not forwarding to another page, which is often the case when combined with Javascript), it should declare the &#039;&#039;role&#039;&#039; attribute &#039;&#039;button&#039;&#039;. Also, as a button is usually triggered by the Space bar, the Javascript should add proper event listeners on the link to accept this key. Read more at [https://developer.mozilla.org/en-US/docs/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role Mozilla Developer Network]&lt;br /&gt;
&lt;br /&gt;
== Web standards, guidelines and legislation ==&lt;br /&gt;
&lt;br /&gt;
=== International ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/WAI/ Web Accessibility Initiative]&lt;br /&gt;
** [http://www.w3.org/WAI/intro/wcag.php Web Content Accessibility Guidelines (WCAG)]&lt;br /&gt;
** [http://www.w3.org/WAI/intro/wcag20 Web Content Accessibility Guidelines 2.0 (draft)]&lt;br /&gt;
*** An article on the [http://www.alistapart.com/articles/tohellwithwcag2 problems with WCAG2] from A List Apart&lt;br /&gt;
** [http://www.w3.org/TR/WCAG20-TECHS/client-side-script.html Client-side scripting guidelines]&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/WAI/intro/aria.php W3C ARIA]&lt;br /&gt;
&lt;br /&gt;
* [http://webaim.org/techniques/forms/controls WebAIM Form Accessibility guidelines]&lt;br /&gt;
* [http://webaim.org/techniques/aria/ WebAIM ARIA guidelines]&lt;br /&gt;
&lt;br /&gt;
=== USA ===&lt;br /&gt;
* [http://www.section508.gov/ Section 508]&lt;br /&gt;
&lt;br /&gt;
=== UK ===&lt;br /&gt;
* [http://www.legislation.gov.uk/ukpga/2010/15/contents Equality Act 2010], in particular:&lt;br /&gt;
** [http://www.legislation.gov.uk/ukpga/2010/15/section/20 Section 20 - Duty to make adjustments]&lt;br /&gt;
** [http://www.legislation.gov.uk/ukpga/2010/15/section/29 Section 29 - Provision of services, etc.]&lt;br /&gt;
** [http://www.legislation.gov.uk/ukpga/2010/15/schedule/25 Schedule 25 - Information society services].&lt;br /&gt;
: See also the [http://www.equalityhumanrights.com/uploaded_files/EqualityAct/servicescode.pdf Equality Act 2010 Statutory Code of Practice] (PDF) for Services, public functions and associations.&lt;br /&gt;
* [http://www.equalityhumanrights.com/advice-and-guidance/public-sector-equality-duty/ Public sector equality duty] created by the Equality Act 2010.&lt;br /&gt;
* [http://www.parliament.the-stationery-office.co.uk/pa/ld200001/ldbills/003/2001003.htm SENDA - Special Educational Needs and Disability Act/Bill]&lt;br /&gt;
* [http://www.opsi.gov.uk/acts/acts1995/1995050.htm Disability Discrimination Act 1995] (now merged ino the Equality Act 2010).&lt;br /&gt;
* [https://www.access8878.co.uk/getting-started-with-bs-8878/16-steps.aspx BS 8878:2010 – 16 Steps for an accessible web product]&lt;br /&gt;
&lt;br /&gt;
=== Germany ===&lt;br /&gt;
* [http://www.einfach-fuer-alle.de/artikel/bitv/ Barrierefreie Informationstechnik-Verordnung - BITV]&lt;br /&gt;
&lt;br /&gt;
=== France ===&lt;br /&gt;
* [https://references.modernisation.gouv.fr/rgaa-accessibilite/ Référentiel Général d’Accessibilité des Administrations - RGAA]&lt;br /&gt;
&lt;br /&gt;
===European Union===&lt;br /&gt;
* [https://ec.europa.eu/digital-agenda/en/news/proposal-directive-european-parliament-and-council-accessibility-public-sector-bodies-websites Proposal for a Directive of the European Parliament and of the Council] on the accessibility of public sector bodies&#039; websites.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Firefox extensions ===&lt;br /&gt;
* [http://firefox.cita.uiuc.edu/ Firefox Accessibility Extension] by the Illinois Center for Information Technology and Web Accessibility (iCITA)&lt;br /&gt;
* [[Web developer extension]] for [[Firefox]]&lt;br /&gt;
* [[Blank_Your_Monitor_and_Easy_Reading_extension_for_Firefox|Blank Your Monitor and Easy Reading Extension]] for Firefox&lt;br /&gt;
* [http://www.deque.com/products/worldspace-fireeyes/download-worldspace-fireeyes|FireEye plugin for Firebug]&lt;br /&gt;
* [https://addons.mozilla.org/en-us/firefox/addon/wcag-contrast-checker|Color contrast plugin for Firefox]&lt;br /&gt;
&lt;br /&gt;
=== Chrome extension ===&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/color-contrast-analyzer/dagdlcijhfbmgkjokkjicnnfimlebcll Color Contrast Analyzer]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/high-contrast/djcfdncoelnlbldjfhinnjlhdjlikmph High contrast]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/chromelens/idikgljglpfilbhaboonnpnnincjhjkd/related ChromeLens]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/see/dkihcccbkkakkbpikjmpnbamkgbjfdcn SEE]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/accessibility-developer-t/fpkknkljclfencbdbgkenhalefipecmb Accessibility developer tools]&lt;br /&gt;
&lt;br /&gt;
=== Accessibility validation tools ===&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/accessibility-developer-t/fpkknkljclfencbdbgkenhalefipecmb?hl=en Chrome Accessibility Developer Tooks]&lt;br /&gt;
* [[W3C validation]] (for [[HTML in Moodle]], [[CSS]] and [[RSS]]) &lt;br /&gt;
* [http://wave.webaim.org/ Web accessibility evaluation tool]&lt;br /&gt;
* [http://cynthiasays.com/ Cynthia Says accessibility checker]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/axe/lhdoppojpmngadmnindnejefpokejbdd AXE]&lt;br /&gt;
* [https://chrome.google.com/webstore/detail/wave-evaluation-tool/jbbplnpkjmmeebjpijfedlgcdilocofh WAVE]&lt;br /&gt;
&lt;br /&gt;
=== Screen readers ===&lt;br /&gt;
* [http://www.standards-schmandards.com/projects/fangs/ Fangs – the screen reader emulator] for Firefox&lt;br /&gt;
* [http://www.nvda-project.org/ NVDA NonVisual Desktop Access] - open source screen reader for Windows &lt;br /&gt;
* [http://webaim.org/projects/screenreadersurvey4// WebAIM Screen reader survey] (Predominance of tools, browsers, OSs used by accessibility users)&lt;br /&gt;
* [http://www.chromevox.com/index.html ChromeVox] - Available in several languages for Linux, Windows and Mac OS, only on Chrome browser. (Android mobile users can use [https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback TalkBack])&lt;br /&gt;
&lt;br /&gt;
See also this [http://www.w3.org/WAI/ER/tools/complete long list of accessibility tools].&lt;br /&gt;
&lt;br /&gt;
See a [http://www.youtube.com/playlist?list=PLmQqs2jGU8Pr7e-3Fz2PoN6AabEkEBRYX live demonstration of a number of accessibility tools].&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://webstandards.org/action/atf/manifesto/ Web Standards.org&#039;s &#039;&#039;Accessibility Task Force Manifesto&#039;&#039;]&lt;br /&gt;
* [http://alistapart.com/topics/userscience/accessibility/ Accessibility articles from &#039;&#039;A List Apart&#039;&#039;]&lt;br /&gt;
* [http://diveintomark.org/archives/2003/08/29/semantics Mark Pilgrim&#039;s &#039;&#039;Won’t somebody please think of the gerbils?&#039;&#039;]&lt;br /&gt;
: [http://diveintoaccessibility.org/ Dive Into Accessibility] by Mark Pilgrim&lt;br /&gt;
* [http://joeclark.org/access/webaccess/ Joe Clark&#039;s writings on accessibility]&lt;br /&gt;
: [http://joeclark.org/book/ Building Accessible Websites] by Joe Clark (online version)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Web_accessibility Wikipedia article on &#039;&#039;Web Accessibility&#039;&#039;]&lt;br /&gt;
* [http://juicystudio.com/article/validity-accessibility.php &#039;&#039;Validity and Accessibility&#039;&#039;]&lt;br /&gt;
* [http://www.edtec.unsw.edu.au/inter/support/accessibility/access_vids.cfm Videos showing as student accessing another Learning Management System via Screen Reader software]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[:en:Accessibility|Accessibility statement]] - in current Moodle versions&lt;br /&gt;
* [[Semantic HTML]]&lt;br /&gt;
* [[Moodle Accessibility Specification]]&lt;br /&gt;
* See [[Usability FAQ]] for the related concept of usability.&lt;br /&gt;
* http://moodle.org/mod/forum/discuss.php?d=127807#p559951 (Old, 2009, might not be relevant any more)&lt;br /&gt;
* The [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] provides some extensive information and discussion on accessibility.&lt;br /&gt;
* [http://www.easy.pro.br/ EASY: Interface Between The Virtual Environment Moodle Learning and People with Visual Impairments]&lt;br /&gt;
* [http://www.bbc.co.uk/blogs/bbcinternet/2008/03/homepage_accessibilty.html BBC blog post on how their Web 2.0 homepage was made accessible]&lt;br /&gt;
* [http://www.bbc.co.uk/accessibility/ BBC Accessibility Help]&lt;br /&gt;
* [http://tracker.moodle.org/browse/MDL-7396 Accessibility Compliance in Moodle 1.8]&lt;br /&gt;
* [http://tracker.moodle.org/browse/MDL-7860 Compliance with Italian Legislation on Accessibility]&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=project%20%3D%20MDL%20AND%20status%20%3D%20Open%20AND%20component%20%3D%20Accessibility%20ORDER%20BY%20affectedVersion%20DESC Open accessibility issues on the Tracker]&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding guidelines|Accessibility]]&lt;br /&gt;
[[Category:Accessibility]]&lt;br /&gt;
&lt;br /&gt;
[[es:dev/Accesibilidad]]&lt;br /&gt;
[[fr:Accessibilité]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Languages_subsystem_improvements_2.0&amp;diff=16403</id>
		<title>Languages subsystem improvements 2.0</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Languages_subsystem_improvements_2.0&amp;diff=16403"/>
		<updated>2009-12-09T08:02:23Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Translation tool as an activity module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}&lt;br /&gt;
{{Infobox Project&lt;br /&gt;
|name = Languages subsystem improvements&lt;br /&gt;
|state = Research and planning&lt;br /&gt;
|tracker = MDL-18797 MDL-15252&lt;br /&gt;
|discussion = [http://moodle.org/mod/forum/discuss.php?d=118707]&lt;br /&gt;
|assignee = [[User:David Mudrak|David Mudrak]]&lt;br /&gt;
}}&lt;br /&gt;
{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
This is an initial proposal of changes to the language strings processing in Moodle.&lt;br /&gt;
&lt;br /&gt;
== Current issues ==&lt;br /&gt;
&lt;br /&gt;
; String files are not branched : We must keep all strings from all branches in place for backwards compatibility and we are unable to easily clean up language packs. Some say the branching and merging is too big toast for our translators.&lt;br /&gt;
; Plural forms, gender forms and other grammar : We are unable to handle plurals at all. For example, handling [http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html plural forms in gettext] is traditional, well tested and robust way (see MDL-4790). MDL-12433 by Sam Marshal shows alternative approach based on logical expressions.&lt;br /&gt;
; Strings can&#039;t be modified : It is difficult to notify translators that some string was modified (expanded, fixed, changed) - as in [http://git.moodle.org/gw?p=moodle.git;a=commit;h=d033b1288713625a733ce5fcbce5e7b5a1f6d5d1 this case], for example. The current work around it the policy of adding another string with the same suffixed name (like &#039;license2&#039;). Would be nice if such strings were tagged/highlighted in the translation UI.&lt;br /&gt;
; We do not use standard formats : Translators can&#039;t use specialized tools for translation (PO/gettext editors, community translation portals). Also, I am not aware of any benchmarking showing the performance differences between out native $string[] format compared to, for example, standard .po format.&lt;br /&gt;
; More syntax checks are required : So the translators do not brake Moodle functionality (see MDL-12433)&lt;br /&gt;
; Language packs are PHP code, but stored in moodledata: This increases the severity of some security exploits. It means that any exploit that lets you write files to an arbitrary location in moodledata suddenly lets you execute arbitrary PHP code on the server. On the other hand, it would be nice to be able to allow complex logic when evaluating dynamic strings (ie such containing $a param/params).&lt;br /&gt;
; Right-to-left languages : There are problems reported in RTL languages when using online tools (including the our current one) which lead to putting placeholders like a$ and a$-&amp;gt;lastname into the string definition.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
# Do not reinvent the wheel. Keep &amp;quot;do one thing and do it well&amp;quot; principle. Keep it simple and stupid. Have the translation process a simple as possible (translators are not geeks).&lt;br /&gt;
# Make simple things easy and hard things possible&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== Key design questions ==&lt;br /&gt;
&lt;br /&gt;
; What is the data structure for storing the master copies of the lang packs that translators work on : At the moment it is plain PHP array, editable via translation UI or directly. Petr proposes a change to keeping these strings in database, sort of syncable with some central repo. Whatever the format is, we must be able to store some metadata - the timestamp of the last modification, the author name, proposed alternatives, comments etc (see rosetta translation tool at launchpad for the example of possible metadata)&lt;br /&gt;
; What is the UI for translators, what are the processes of contributing and how the translations are redistributed to Moodle sites : Out translators should not be forced to use the only one possible tool. We should consider switching to a standardized common format (like PO or XLIFF) that is supported by a variety of advanced tools (equipped with translation memory, connected with dictionaries, i18n portals etc).&lt;br /&gt;
; What is the data structure Moodle uses at runtime : This is just a performance optimization (implementation detail), should be independent on the native format that humans work with so it could be modified anytime in the future. For example, see the system proposed by Tim based on calling class methods (inspired by Perl&#039;s Maketext).&lt;br /&gt;
; What is the format of a lang string, and how are placeholders substituted : This is the most important issue we have at the moment but as it is strongly tied together with the runtime format, it can be changed any time. On the other hand, both the UI and storage format must support it.&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous suggestions===&lt;br /&gt;
&lt;br /&gt;
* Store downloaded lang packs in a new location $CFG-&amp;gt;langpacks, which defaults to $CFG-&amp;gt;datadir/lang. Paranoid admins can change this to a different location that is normally read-only for the web server, but which they will switch to read/write when then are performing an upgrade, doing lang editing, or installing a lang pack. The UI should therefore check whether $CFG-&amp;gt;langpacks is writable before starting any of these operations, and explain the situation to admins if it is not.&lt;br /&gt;
* Use sort of template syntax so translators can replace static strings with a template. Syntax can be similar to what Smarty and other templating engines use. So far we should be fine with a basic set of {if} {else}, eq, gt, lt and some math oparators (including modulo). Such templates would be compiled into proper PHP code once during lang pack compilation. Strict rules shall apply so it should reduce the risk of executing malicious code.&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
&lt;br /&gt;
# Developers add new strings to the core&lt;br /&gt;
# Translators translate untranslated core strings and publish their work&lt;br /&gt;
# Admins want to locally modify the language pack&lt;br /&gt;
# Contributors add new string to the contributed code&lt;br /&gt;
# Translators translate untranslated contrib strings and publish their work&lt;br /&gt;
# Admins don&#039;t want PHP code stored in moodledata.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Research ==&lt;br /&gt;
&lt;br /&gt;
This is the list of projects, resources and tools being explored&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/~ferreira/Locale-Maketext-1.13_82/lib/Locale/Maketext/TPJ13.pod Great CPAN article about software localization]. Plain string based lexicon is not enough. Strings can be translated by functions only. &amp;quot;A phrase is a function; a phrasebook is a bunch of functions.&amp;quot;&lt;br /&gt;
* [http://en.wikipedia.org/wiki/XLIFF XLIFF] - XML Localization Interchange File Format&lt;br /&gt;
* [http://translate.sourceforge.net/wiki/virtaal/index Virtaal] - promising, we could have XLIFF &amp;lt;-&amp;gt; .php conversion&lt;br /&gt;
* [http://launchpad.net/+tour/translation Launchpad] - translation portal used by Ubuntu and many other projects. Would require BSD licensing, therefore IMO not suitable as we could not import our current GPL&#039;ed translation. Seems to be pretty slow during the process.&lt;br /&gt;
* [http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html Plural forms in gettext]&lt;br /&gt;
* [http://framework.zend.com/manual/en/zend.translate.html Zend_Translate reference guide]&lt;br /&gt;
* MDL-12433 - Sam Marshal&#039;s proposal&lt;br /&gt;
* MediaWiki approach: [http://www.mediawiki.org/wiki/Manual:$wgGrammarForms Grammar forms] and plurals: &amp;lt;code&amp;gt;{{plural:1|is|are}} {{plural:2|is|are}}&amp;lt;/code&amp;gt; (Example of how mediawiki outputs the correct given pluralization form depending on the count. Plural transformations are used for languages like Russian based on &amp;quot;count mod 10&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Functional proposals ==&lt;br /&gt;
&lt;br /&gt;
=== Overall strings processing flow ===&lt;br /&gt;
&lt;br /&gt;
(Follow the attached UML flow diagram) [[Image:languages20_overview1.png|thumb|right|UML: Overall string processing flow]]&lt;br /&gt;
&lt;br /&gt;
* All string definitions are kept in a central repository in some storage format which supports branching. Officially maintained language packs are referred to as &#039;&#039;master&#039;&#039; in this proposal. Every language pack can have its &#039;&#039;parent&#039;&#039; defined. The English language pack can be seen as the greatest common parent of all language packs.&lt;br /&gt;
* During upgrade or on demand, the relevant branch of master language packs are fetched (downloaded) automatically from the central repository. Together with the selected language, all its parents, grandparent, great-grandparents, ... etc are downloaded, too.&lt;br /&gt;
* Administrators can keep local modifications (customizations) of any master pack. We call them &#039;&#039;local&#039;&#039; language packs.&lt;br /&gt;
* Immediately after upgrade (or again, on demand), the string definitions are merged from all available sources. The merge logic is so that the sources for any given string are evaluated in the order like: fr_ca_local, fr_ca, fr_local, fr, en_local, en. Strings are merged for the performance reasons so that the searching for the string to use (local, parent, master, English etc.) is done just once and we do not need to load all possible sources on runtime. After the merge, we have a single place to look for the string definition for every installed language.&lt;br /&gt;
* Together with the merge, strings are compiled into a runtime format that may be optimised in the future. Humans do not modify the compiled format. Strings must be re-merged and re-compiled after any update of master or local packs. During the compilation, syntax checks are performed.&lt;br /&gt;
* The runtime format we will start with will be very similar with the current one. Strings are defined as array elements indexed by the string identifier. The arrays are defined in separate files for every module. We can, however, modify this in the future. For example, we can divide string definitions into files not by the module name but by the real usage frequency. Strings that are used very often (like at every page) would go into common file which can be loaded during bootstrap. This would reduce memory usage and number of I/O operations.&lt;br /&gt;
* The only valid placeholder in runtime format is &amp;lt;code&amp;gt;{$a}&amp;lt;/code&amp;gt; for strings and numbers and &amp;lt;code&amp;gt;{$a-&amp;gt;foobar}&amp;lt;/code&amp;gt; for objects.&lt;br /&gt;
* Around 90% of our strings do not contain any placeholder and they will be immediately returned by get_string().&lt;br /&gt;
* If the string contains one or more placeholders, they are replaced with their eval()-uated result. We can safely eval() the whole string definition because the string compiler makes sure that the placeholders are the only executable/evaluable code. All other malicious code and $variables are properly quoted/escaped/htmlentitled.&lt;br /&gt;
* If the string is defined as NULL, corresponding function defined in the language pack library is called, passing $a as parameter. So &amp;lt;code&amp;gt;get_string(&#039;foo&#039;, &#039;bar&#039;, $a);&amp;lt;/code&amp;gt; would return the value returned by eg &amp;lt;code&amp;gt;lang_cs_bar_foo($a)&amp;lt;/code&amp;gt; if the current language is Czech. Power translators may use such functions to properly handle plural forms and other grammar aspects.&lt;br /&gt;
&lt;br /&gt;
=== Mental model of branching for translators ===&lt;br /&gt;
&lt;br /&gt;
(Follow the attached scheme) [[Image:lang20branchingmentalmodel.png|thumb|right|Mental model of branching]]&lt;br /&gt;
&lt;br /&gt;
It may not be trivial to understand the principle of &#039;&#039;branching&#039;&#039; and &#039;&#039;merging&#039;&#039; as they seem to be quite geeky tech terms. Maybe the following model based on layers can be more suitable for good translators. Basically, strings are seen as being part of a layer. For every Moodle release, a new layer is put on the top of all other layers. The get_string() at every release looks at its layer for the string definition. If the string is defined on that layer, the first underlying layer the string is defined at is used. So, for example:&lt;br /&gt;
* stringid01 was defined in Moodle 1.9 (it was part of the Moodle language pack before we did the big Moodle 2.0 cleanup). It remains the same for all following releases.&lt;br /&gt;
* stringid02 was defined in Moodle 1.9. Then it changed in Moodle 2.0 and then again in Moodle 2.3. In Moodle 2.1 and 2.2, the version defined in 2.0 is used.&lt;br /&gt;
* stringid03 was introduced in Moodle 2.0. There is no need to translate it for the previous releases because it does not exist there.&lt;br /&gt;
* stringid04 is similar to stringid02. It appeared sometimes/somewhere in Moodle 1.x (until Moodle 2.0, we did not branch), was changed in 2.1 and then again in 2.2&lt;br /&gt;
* stringid05 was dropped in Moodle 2.0 and is not part of the language pack any more. There is no need to translate it for Moodle 2.x&lt;br /&gt;
* stringid06 was introduced in Moodle 2.3&lt;br /&gt;
* stringid07 was dropped in Moodle 2.0 but then it reincarnated in Moodle 2.2 and is the part of the languages again since then (even its definition could change)&lt;br /&gt;
* stringid08 (you now should be able to explain yourself ... :-)&lt;br /&gt;
&lt;br /&gt;
=== Translation tool as an activity module ===&lt;br /&gt;
&lt;br /&gt;
* MDL-18797&lt;br /&gt;
* lives in contrib, translators and administrators wanting to customize the language pack install it&lt;br /&gt;
:: -- [[User:Nicolas Martignoni|Nicolas Martignoni]] 08:02, 9 December 2009 (UTC): IMHO translation tool have to live in core, not in contrib, as translators should have total confidence in its functionalities (contrib is frequently associated with &amp;quot;unstable&amp;quot; and/or &amp;quot;not maintained&amp;quot;). Moreover, such a tool has to be always up-to-date.&lt;br /&gt;
* various capabilities to propose (submit) alternative translations, to integrate proposals, rate them, export them, send to upstream etc.&lt;br /&gt;
* such activity can be used by individuals, translation teams, can handle community-based models etc.&lt;br /&gt;
* strings are saved in DB with all metadata, history etc.&lt;br /&gt;
* XLIFF used as exchange format with upstream&lt;br /&gt;
* CVS access replaced with a web service at a dedicated lang.moodle.org server&lt;br /&gt;
&lt;br /&gt;
== Implementation proposals ==&lt;br /&gt;
&lt;br /&gt;
[http://moodle.org/mod/forum/discuss.php?d=118707#p542197 Petr&#039;s proposal] to store strings in one central database and to disable direct commits.&lt;br /&gt;
: --[[User:David Mudrak|David Mudrak]] 22:43, 23 November 2009 (UTC): I disagree with the &amp;quot;no change meaning&amp;quot; rule. IMO if we have a system how to track changes and mainly how to inform translators that their translation is outdated, we can fix/update/extend English string as needed. Together with branching, this will lead to a nice &amp;quot;reduced&amp;quot; packs without redundancy. Also note we must find a way how to combine this approach with the grammar issues (plural forms etc) that will probably have to be solved as proper PHP functions/class methods...&lt;br /&gt;
&lt;br /&gt;
=== File format translators work with ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Translation tool a the process ===&lt;br /&gt;
&lt;br /&gt;
See MDL-15252 (Cleanup of English language pack) and the discussion at http://moodle.org/mod/forum/discuss.php?d=118707 for Koen&#039;s proposition. Branching issue, the translation process and other aspects discussed there.&lt;br /&gt;
&lt;br /&gt;
From Martin in Dev chat:  &#039;&#039;if you want crazy ideas, how about get_string returns some special tags and those tags get converted to ajax on the GUI so that translators can translate directly in the main Moodle GUI?&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What a cool idea. Could be a special mode you have to turn on in the admin screens. Perhaps even if you turned this mode on, it would still only be active for people with certain roles, or perhaps when it was turned on, it would have to apply to all roles, so that you could edit strings for not-logged-in users. Anyway, when this mode was on, it would:&lt;br /&gt;
&lt;br /&gt;
# Adds &amp;amp;lt;span class=&amp;quot;moodle-lang-string&amp;quot; id=&amp;quot;lang_string|admin|langedit&amp;quot;&amp;gt;Language editing&amp;lt;/span&amp;gt; around each string on the page - to use one example.&lt;br /&gt;
# $PAGE-&amp;gt;requires-&amp;gt;js an extra JS file that adds an on-click handler to all such spans, so that when you click on it, it pops up the language editing UI in a YUI dialogue.&lt;br /&gt;
&lt;br /&gt;
:: [[User:David Mudrak|David Mudrak]] 14:07, 23 November 2009 (UTC): the solution based on wrapping &amp;amp;lt;span&amp;amp;gt; around every string was already considered and dropped. It may badly break XHTML as the string itself may appear as a value of an HTML tag&#039;s attribute: &amp;lt;code&amp;gt;&amp;amp;lt;img title=&amp;quot;&amp;amp;lt;span class=&amp;quot;moodle-lang-string&amp;quot; ...&amp;lt;/code&amp;gt;. We are unable to say the scope where the string will appear.&lt;br /&gt;
:: David&#039;s contra-proposal: get_string() could track all strings used at the current page and the AJAX form to edit them all could be rendered before the footer(). Or &#039;Edit system text on this page&#039; link would appear there.&lt;br /&gt;
&lt;br /&gt;
=== Runtime file format===&lt;br /&gt;
&lt;br /&gt;
* [[Languages:Tim&#039;s crazy proposal based on maketext]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [http://live.gnome.org/TranslationProject/GitHowTo How to use Git for GNOME translators]&lt;br /&gt;
* [http://translate.sourceforge.net/wiki/ Nice site with tools, localisation problems and alternatives...]&lt;br /&gt;
&lt;br /&gt;
[[Category:Language]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Languages:Tim%27s_crazy_proposal_based_on_maketext&amp;diff=16414</id>
		<title>Languages:Tim&#039;s crazy proposal based on maketext</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Languages:Tim%27s_crazy_proposal_based_on_maketext&amp;diff=16414"/>
		<updated>2009-11-23T12:07:50Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Proposed runtime lang file syntax */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;They say that the border between madness and genius is is very narrow. Here goes.&lt;br /&gt;
&lt;br /&gt;
The best article I know about the problems of localising software is http://search.cpan.org/~ferreira/Locale-Maketext-1.13_82/lib/Locale/Maketext/TPJ13.pod. I particularly like the narrative in the first half. Also, I must warn you that I have not read much about localisation, so my endorsement may not mean much.&lt;br /&gt;
&lt;br /&gt;
OK, so the key point it makes is that really, a language string like &amp;quot;There have been $a quiz attempts&amp;quot; is really a function (in the mathematical sense of a mapping, not necessarily as a programming language construct). Depending on $a, we want it to output&lt;br /&gt;
* There have been no quiz attempts&lt;br /&gt;
* There has been one quiz attempt&lt;br /&gt;
* There have been 42 quiz attempts&lt;br /&gt;
&lt;br /&gt;
So the question is, why not make it a function in the programming language construct sense as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Two representations==&lt;br /&gt;
&lt;br /&gt;
Up to Moodle 1.9, the files Moodle used at runtime were exactly the same as the files that translators edited. That was convenient, but limited us to a human-readable and editable format. Also, it meant that Moodle had to do a lot of searching at runtime.&lt;br /&gt;
&lt;br /&gt;
In Moodle 2.0 we are already proposing to split the representations, which lets us optimise the runtime format to be pretty much whatever we like, without making the format edited by translators impossible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proposed runtime lang file syntax==&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;tt&amp;gt;moodledata/lang/&amp;lt;/tt&amp;gt; there are subfolders like &amp;lt;tt&amp;gt;en/&amp;lt;/tt&amp;gt; (note we lose the legacy &amp;lt;tt&amp;gt;_utf8&amp;lt;/tt&amp;gt;) that contains files like &amp;lt;tt&amp;gt;mod_quiz.php&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;core_moodle.php&amp;lt;/tt&amp;gt;, that is, using the new component naming convention.&lt;br /&gt;
&lt;br /&gt;
Suppose we have a hypothetical plugin &amp;lt;tt&amp;gt;admin/report/dylan&amp;lt;/tt&amp;gt; with its current lang file &amp;lt;tt&amp;gt;admin/report/dylan/lang/en_utf8/report_dylan.php&amp;lt;/tt&amp;gt; that contains:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$string[&#039;howmanyroads&#039;] = &#039;How many roads must a man walk down?&#039;;&lt;br /&gt;
$string[&#039;roadsx&#039;] = &#039;Roads: $a&#039;;&lt;br /&gt;
$string[&#039;xroadsfromytowns&#039;] = &#039;$a-&amp;gt;numroads roads from at least $a-&amp;gt;numcities different cities.&#039;;&lt;br /&gt;
// Can&#039;t really handle pluralisation in that last one in Moodle :-(&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In my new proposal, &amp;lt;tt&amp;gt;moodledata/lang/en/report_dylan.php&amp;lt;/tt&amp;gt; will contain:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class strings_en_report_capability extends strings_base {&lt;br /&gt;
    protected static $helper = lang_helper_en::get(); // Get singleton instance.&lt;br /&gt;
    public function howmanyroads($a) { return &#039;How many roads must a man walk down?&#039;; }&lt;br /&gt;
    public function roadsx($a) { return self::$helper-&amp;gt;quant($a, &#039;road&#039;); }&lt;br /&gt;
    public function xroadsfromytowns($a) { &lt;br /&gt;
        return self::$helper-&amp;gt;quant($a-&amp;gt;numroads, &#039;road&#039;) . &#039; from at least &#039; .&lt;br /&gt;
                self::$helper-&amp;gt;quant($a-&amp;gt; numcities, &#039;different city&#039;, &#039;different cities&#039;) . &#039;.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
(I manually line-wrapped that last example to make it readable. in reality, remember that this file is being automatically compiled from some more human-readiable source.)&lt;br /&gt;
&lt;br /&gt;
Also note that &amp;lt;tt&amp;gt;moodledata/lang/fr/report_dylan.php&amp;lt;/tt&amp;gt; will look like:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include_once($CFG-&amp;gt;langdir . &#039;/en/report_dylan.php&#039;);&lt;br /&gt;
class strings_fr_report_capability extends strings_en_report_capability {&lt;br /&gt;
    protected static $helper = lang_helper_fr::get(); // Get singleton instance.&lt;br /&gt;
    public function howmanyroads() { return &#039;Combien de rue ...&#039;; }&lt;br /&gt;
    // etc.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;tt&amp;gt;moodledata/lang/fr_ca/report_dylan.php&amp;lt;/tt&amp;gt; is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include_once($CFG-&amp;gt;langdir . &#039;/fr/report_dylan.php&#039;);&lt;br /&gt;
class strings_fr_ca_report_capability extends strings_en_report_capability {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using that runtime format==&lt;br /&gt;
&lt;br /&gt;
Then, &amp;lt;tt&amp;gt;string_manager()&amp;lt;/tt&amp;gt; becomes:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class string_manager {&lt;br /&gt;
    protected $stringclasses = array();&lt;br /&gt;
    public function get_string($identifier, $component = &#039;&#039;, $a = null) {&lt;br /&gt;
        $component = $this-&amp;gt;fix_legacy_component_names($component);&lt;br /&gt;
        $this-&amp;gt;get_string_class(current_language(), $component)-&amp;gt;$identifier($a);&lt;br /&gt;
    }&lt;br /&gt;
    protected function get_string_class($lang, $component) {&lt;br /&gt;
        global $CFG;&lt;br /&gt;
        if (!isset($this-&amp;gt;stringclasses[$lang][$component])) {&lt;br /&gt;
            $this-&amp;gt;stringclasses[$lang][$component] = &lt;br /&gt;
                    $this-&amp;gt;load_string_class($lang, $component)();&lt;br /&gt;
        }&lt;br /&gt;
        return $this-&amp;gt;stringclasses[$lang][$component];&lt;br /&gt;
    }&lt;br /&gt;
    protected function load_string_class($lang, $component) {&lt;br /&gt;
        $file = &amp;quot;$CFG-&amp;gt;langdir/$lang/$component.php&amp;quot;;&lt;br /&gt;
        $class = &amp;quot;strings_{$lang}_{$component}&amp;quot;;&lt;br /&gt;
        if ($CFG-&amp;gt;langediting &amp;amp;&amp;amp; !$this-&amp;gt;is_up_to_date($file)) {&lt;br /&gt;
            compile_lang_strings($lang, $component);&lt;br /&gt;
        }&lt;br /&gt;
        if (!is_readable($file)) {&lt;br /&gt;
            return new strings_base(); // See below.&lt;br /&gt;
        }&lt;br /&gt;
        include_once($file);&lt;br /&gt;
        if (!class_exists()) {&lt;br /&gt;
            throw new coding_exception($file . &#039; did not define the &#039; . $class .&lt;br /&gt;
                    &#039;class. There must be a bug in compile_lang_strings.&#039;);&lt;br /&gt;
        }&lt;br /&gt;
        return new $class();&lt;br /&gt;
    }&lt;br /&gt;
    // A few other methods omitted.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that if you have a developer/translator flag on (&amp;lt;tt&amp;gt;$CFG-&amp;gt;langediting&amp;lt;/tt&amp;gt;) then &amp;lt;tt&amp;gt; is_up_to_date&amp;lt;/tt&amp;gt; checks various file timestamps, so that lang files can automatically be recompiled as needed for those people, without hurting runtime performance for production sites. &lt;br /&gt;
&lt;br /&gt;
As a final bit of magic, we have&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class strings_base {&lt;br /&gt;
    public function __call($name, $arguments) {&lt;br /&gt;
        return &amp;quot;[[$name]]&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that the strings_en_report_capability inherited form this. This gives us our classing missing string fallback. Also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
class lang_helper_en {&lt;br /&gt;
    private static $inst = null;&lt;br /&gt;
    public static get() {&lt;br /&gt;
        if (!$inst) {&lt;br /&gt;
            $inst = new lang_helper_en();&lt;br /&gt;
        }&lt;br /&gt;
        return $inst;&lt;br /&gt;
    }&lt;br /&gt;
    public function quant($number, $singular, $plural = &#039;&#039;) {&lt;br /&gt;
        if ($number = 1) {&lt;br /&gt;
            return &amp;quot;$number $singular&amp;quot;;&lt;br /&gt;
        } else if ($plural) {&lt;br /&gt;
            return &amp;quot;$number $plural&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return &amp;quot;$number {$singular}s&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Other helper functions.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Problems==&lt;br /&gt;
&lt;br /&gt;
I think this gives us the fastest possible runtime performance (particularly when combined with a PHP accelerator. Of course, it leaves open the following problems:&lt;br /&gt;
* what string format do translators to edit? (I suggest we copy the maketext format.)&lt;br /&gt;
* can we write the &amp;lt;tt&amp;gt;compile_lang_strings&amp;lt;/tt&amp;gt; function?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Languages]]&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;br /&gt;
[[Category:Language]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Languages_subsystem_improvements_2.0&amp;diff=16388</id>
		<title>Languages subsystem improvements 2.0</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Languages_subsystem_improvements_2.0&amp;diff=16388"/>
		<updated>2009-11-22T18:22:53Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Current issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Languages subsystem improvements&lt;br /&gt;
|state = Research and planning&lt;br /&gt;
|tracker = n/a&lt;br /&gt;
|discussion = n/a&lt;br /&gt;
|assignee = [[User:David Mudrak|David Mudrak]]&lt;br /&gt;
}}&lt;br /&gt;
{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
This is an initial proposal of changes to the language strings processing in Moodle.&lt;br /&gt;
&lt;br /&gt;
== Current issues ==&lt;br /&gt;
&lt;br /&gt;
; String files are not branched : We must keep all strings from all branches in place for backwards compatibility and we are unable to easily clean up language packs. Some say the branching and merging is too big toast for our translators.&lt;br /&gt;
; Plural forms, gender forms and other grammar : We are unable to handle plurals at all. For example, handling [http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html plural forms in gettext] is traditional, well tested and robust way (see MDL-4790). MDL-12433 by Sam Marshal shows alternative approach based on logical expressions.&lt;br /&gt;
; Strings can&#039;t be modified : It is difficult to notify translators that some string was modified (expanded, fixed, changed). The current work around it the policy of adding another string with the same suffixed name (like &#039;license2&#039;). Would be nice if such strings were tagged/highlighted in the translation UI.&lt;br /&gt;
; We do not use standard formats : Translators can&#039;t use specialized tools for translation (PO/gettext editors, community translation portals). Also, I am not aware of any benchmarking showing the performance differences between out native $string[] format compared to, for example, standard .po format.&lt;br /&gt;
; More syntax checks are required : So the translators do not brake Moodle functionality (see MDL-12433)&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
# Do not reinvent the wheel. Keep &amp;quot;do one thing and do it well&amp;quot; principle. Keep it simple and stupid.&lt;br /&gt;
# Make simple things easy and hard things possible&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Key design questions ==&lt;br /&gt;
&lt;br /&gt;
; What is the data structure for storing the master copies of the lang packs that translators work on : At the moment it is plain PHP array, editable via translation UI or directly. Petr proposes a change to keeping these strings in database, sort of syncable with some central repo. Whatever the format is, we must be able to store some metadata - the timestamp of the last modification, the author name, proposed alternatives, comments etc (see rosetta translation tool at launchpad for the example of possible metadata)&lt;br /&gt;
; What is the UI for translators, what are the processes of contributing and how the translations are redistributed to Moodle sites : Out translators should not be forced to use the only one possible tool. We should consider switching to a standardized common format (like PO or XLIFF) that is supported by a variety of advanced tools (equipped with translation memory, connected with dictionaries, i18n portals etc).&lt;br /&gt;
; What is the data structure Moodle uses at runtime : This is just a performance optimization (implementation detail), should be independent on the native format that humans work with so it could be modified anytime in the future. For example, see the system proposed by Tim based on calling class methods (inspired by Perl&#039;s Maketext).&lt;br /&gt;
; What is the format of a lang string, and how are placeholders substituted : This is the most important issue we have at the moment but as it is strongly tied together with the runtime format, it can be changed any time. On the other hand, both the UI and storage format must support it.&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
&lt;br /&gt;
# Developers add new strings to the core&lt;br /&gt;
# Translators translate untranslated core strings and publish their work&lt;br /&gt;
# Admins want to locally modify the language pack&lt;br /&gt;
# Contributors add new string to the contributed code&lt;br /&gt;
# Translators translate untranslated contrib strings and publish their work&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Research ==&lt;br /&gt;
&lt;br /&gt;
This is the list of projects, resources and tools being explored&lt;br /&gt;
&lt;br /&gt;
* [http://search.cpan.org/~ferreira/Locale-Maketext-1.13_82/lib/Locale/Maketext/TPJ13.pod Great CPAN article about software localization]. Plain string based lexicon is not enough. Strings can be translated by functions only. &amp;quot;A phrase is a function; a phrasebook is a bunch of functions.&amp;quot;&lt;br /&gt;
* [http://en.wikipedia.org/wiki/XLIFF XLIFF] - XML Localization Interchange File Format&lt;br /&gt;
* [http://translate.sourceforge.net/wiki/virtaal/index Virtaal] - promising, we could have XLIFF &amp;lt;-&amp;gt; .php conversion&lt;br /&gt;
* [http://launchpad.net/+tour/translation Launchpad] - translation portal used by Ubuntu and many other projects. Would require BSD licensing, therefore IMO not suitable as we could not import our current GPL&#039;ed translation. Seems to be pretty slow during the process.&lt;br /&gt;
* [http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html Plural forms in gettext]&lt;br /&gt;
* [http://framework.zend.com/manual/en/zend.translate.html Zend_Translate reference guide]&lt;br /&gt;
* MDL-12433 - Sam Marshal&#039;s proposal&lt;br /&gt;
* MediaWiki approach: [http://www.mediawiki.org/wiki/Manual:$wgGrammarForms Grammar forms] and plurals: &amp;lt;code&amp;gt;{{plural:1|is|are}} {{plural:2|is|are}}&amp;lt;/code&amp;gt; (Example of how mediawiki outputs the correct given pluralization form depending on the count. Plural transformations are used for languages like Russian based on &amp;quot;count mod 10&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Proposals ==&lt;br /&gt;
&lt;br /&gt;
* [[Languages:Tim&#039;s crazy proposal based on maketext]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [http://live.gnome.org/TranslationProject/GitHowTo How to use Git for GNOME translators]&lt;br /&gt;
* [http://translate.sourceforge.net/wiki/ Nice site with tools, localisation problems and alternatives...]&lt;br /&gt;
&lt;br /&gt;
[[Category:Language]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Finding_your_way_into_the_Moodle_code&amp;diff=7152</id>
		<title>Finding your way into the Moodle code</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Finding_your_way_into_the_Moodle_code&amp;diff=7152"/>
		<updated>2008-03-29T11:09:05Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* PHP for commplete novices */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is aimed at people totally new to Moodle development, who may, or may not, have previous programming experience. It is a few tips to help you get started with the mass of Moodle code.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add more tips here, but I think it is also good if we can keep this article quite short.&lt;br /&gt;
&lt;br /&gt;
==Developer documentation==&lt;br /&gt;
&lt;br /&gt;
If you have not already found it, the main source of developer documentation is [[Developer_documentation]].&lt;br /&gt;
&lt;br /&gt;
==PHP for complete novices==&lt;br /&gt;
&lt;br /&gt;
Moodle is written in [http://www.php.net PHP] - a relatively easy language to learn. &lt;br /&gt;
&lt;br /&gt;
===How it works===&lt;br /&gt;
When your browser requests a webpage, you are asking for a file. The computer (server) you connect to at the other end of the internet normally sends back a file of [http://en.wikipedia.org/wiki/Html HTML] (which you need to get familiar with if you are not already) that your browser then converts into a webpage. HTML documents are static, meaning that they exist on the server in the same form as they are sent to you. PHP on the other hand is dynamic - the form it exists in on the server is different from what is ultimately sent to you, which may be different for different people. When a PHP file is requested, the server runs the instructions it contains and sends the output (HTML) to you in the normal way. PHP code can either be inserted into part of an HTML document, or can exist in files with nothing but PHP. You can recognise it by its start (&amp;amp;lt;?php) and end (?&amp;amp;gt;) tags&lt;br /&gt;
&lt;br /&gt;
PHP almost always uses a database to store information. That way, the PHP forms a template, that gets filled with whatever information is appropriate to the user e.g. there is a space at the top right of this page for a username, but it is different for everyone. &lt;br /&gt;
&lt;br /&gt;
In the following examples, the numbered line indicates what the intention of the developer is and the text in the box with the blue dashed outline is the code that would actually be written in the php file. Notice that the php lines always end with a ; symbol to indicate the end of a command.&lt;br /&gt;
&lt;br /&gt;
The PHP code for the username box will say some thing like:&lt;br /&gt;
&lt;br /&gt;
1. start a box by printing &amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
  echo &amp;quot;&amp;amp;lt;div&amp;amp;gt;&amp;quot;;&lt;br /&gt;
2. set the font colour to blue by printing &amp;amp;lt;font color=&amp;quot;#002bb8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  echo &amp;quot;&amp;amp;lt;font color=&amp;quot;#002bb8&amp;quot;&amp;amp;gt;&amp;quot;;&lt;br /&gt;
3. get the username for user number x from the database&lt;br /&gt;
  $username=fullname(123);&lt;br /&gt;
4. print that username &lt;br /&gt;
  echo $username;&lt;br /&gt;
5. end font colour by printing &amp;amp;lt;/font&amp;amp;gt;&lt;br /&gt;
  echo &amp;quot;&amp;amp;lt;/font&amp;amp;gt;&amp;quot;;&lt;br /&gt;
6. end div by printing &amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
  echo &amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
End result (HTML that will be sent to your browser):&lt;br /&gt;
  &amp;amp;lt;div&amp;amp;gt;&lt;br /&gt;
   &amp;amp;lt;font color=&amp;quot;#002bb8&amp;quot;&amp;amp;gt;&lt;br /&gt;
     Joe Bloggs&lt;br /&gt;
   &amp;amp;lt;/font&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Variables===&lt;br /&gt;
&lt;br /&gt;
In the above example, $username is a variable. It is effectively algebra, where a word of some sort (starting with a dollar sign) represents a piece of data, in this case the username returned by the database.&lt;br /&gt;
&lt;br /&gt;
===Functions===&lt;br /&gt;
&lt;br /&gt;
In the above example, fullname() is a function. This means a collection of commands (which in this case accesses the user table of the database and returns the name) that have been defined elsewhere, which can be run using a shorthand reference. This saves writing them out hundreds of times in different places. Functions are often written down in large library files, so that they can be used whenever they are needed.&lt;br /&gt;
&lt;br /&gt;
===Including other files===&lt;br /&gt;
&lt;br /&gt;
Moodle is a very complex program. Instead of just one page with a list of commands, it uses a great many files linked together using the [http://uk.php.net/include/ include] or [http://uk.php.net/manual/en/function.require-once.php require_once] commands. This means that when you request e.g. the front page, there will be commands such as the following:&lt;br /&gt;
&lt;br /&gt;
  require_once(&#039;config.php&#039;);&lt;br /&gt;
&lt;br /&gt;
which means &#039;if its not been done already for this page request, go and get config.php and run all of its instructions before continuing&#039;. In this way, a single Moodle webpage can sometimes include as many as 150 separate files on the server. This is how the library files are made available - you include the library and can then use any of the functions that the library contains e.g. fullname().&lt;br /&gt;
&lt;br /&gt;
===Libraries and functions===&lt;br /&gt;
&lt;br /&gt;
To make the username commands above into a function, we would write them like this:&lt;br /&gt;
&lt;br /&gt;
  function print_username_box($useridnumber) {&lt;br /&gt;
    echo &amp;quot;&amp;amp;lt;div&amp;amp;gt;&amp;quot;;&lt;br /&gt;
    echo &amp;quot;&amp;amp;lt;font color=&amp;quot;#002bb8&amp;quot;&amp;amp;gt;&amp;quot;;&lt;br /&gt;
    $username=fullname($useridnumber);&lt;br /&gt;
    echo $username;&lt;br /&gt;
    echo &amp;quot;&amp;amp;lt;/font&amp;amp;gt;&amp;quot;;&lt;br /&gt;
    echo &amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Now, whenever the commands are needed, the developer simply writes&lt;br /&gt;
  print_username_box(123);&lt;br /&gt;
&lt;br /&gt;
==Finding a way in==&lt;br /&gt;
&lt;br /&gt;
For finding where to start, you need to know that when you are looking at, for example, http://moodle.org/mod/forum/discuss.php?d=82799, then the code for that is in /mod/forum/discuss.php, and you just need to follow through what it does.&lt;br /&gt;
&lt;br /&gt;
It calls functions in the main Moodle libraries, and the three most important are:&lt;br /&gt;
&lt;br /&gt;
*lib/moodlelib.php - general stuff.&lt;br /&gt;
*lib/weblib.php - things to do with output of HTML&lt;br /&gt;
*lib/dmllib.php - things to do with getting data in and out of the database.&lt;br /&gt;
&lt;br /&gt;
==Understanding what you find==&lt;br /&gt;
&lt;br /&gt;
As you look at the code, it is often a good idea, to insert statements like &lt;br /&gt;
 debugging(&#039;In function require_login&#039;);&lt;br /&gt;
which will print the message above if it gets far enough so you know the code has not stalled before there, or&lt;br /&gt;
 print_object($course);&lt;br /&gt;
which will print out a variable, showing you what it contains. &lt;br /&gt;
&lt;br /&gt;
Variable like $course are often objects with lots of fields. Seeing what they contain will help you understand what is going on. The first of these prints out whatever text you give it, and information about the sequence of function calls that the code took to get there. (It only works if you go to &#039;&#039;Administration &amp;gt; Server &amp;gt; [[Debugging]]&#039;&#039;, and turn the debug level to ALL or DEVELOPER.)&lt;br /&gt;
&lt;br /&gt;
==Tools can help==&lt;br /&gt;
&lt;br /&gt;
Finally, it is helpful to have an editor that lets you jump around the code. For example, I like Eclipse, and if I hold down CTRL and click on the name of a function, it immediately jumps me to where that function if defined. Most good editors (including Emacs and vi/Vim) can do this. ([[Setting_up_Eclipse]])&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* First posted at http://moodle.org/mod/forum/discuss.php?d=82799#p366264&lt;br /&gt;
* [[Developer_documentation]]&lt;br /&gt;
* [[Overview]]&lt;br /&gt;
* [[ctags]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Coding&amp;diff=948</id>
		<title>Coding</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Coding&amp;diff=948"/>
		<updated>2008-03-19T17:11:16Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* General rules */ Infos added about p() and s() functions. See MDL-13975&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any collaborative project needs consistency and stability to stay strong.&lt;br /&gt;
&lt;br /&gt;
These &#039;&#039;&#039;coding guidelines&#039;&#039;&#039; are to provide a goal for all Moodle code to strive to. It&#039;s true that some of the older existing code falls short in a few areas, but it will all be fixed eventually. All new code definitely must adhere to these standards as closely as possible.&lt;br /&gt;
&lt;br /&gt;
==General rules==&lt;br /&gt;
&lt;br /&gt;
# All code files should use the .php extension.&lt;br /&gt;
# All template files should use the .html extension.&lt;br /&gt;
# All text files should use Unix-style text format (most text editors have this as an option).&lt;br /&gt;
# All php tags must be &#039;full&#039; tags like &amp;lt;?php ?&amp;gt; ... not &#039;short&#039; tags like &amp;lt;? ?&amp;gt;.&lt;br /&gt;
# All existing copyright notices must be retained. You can add your own if necessary.&lt;br /&gt;
# Each file should include (require_once) the main config.php file.&lt;br /&gt;
# Any other include/require should use an absolute path beginning with $CFG-&amp;gt;dirroot or  $CFG-&amp;gt;libdir, not relative includes, which [http://uk.php.net/manual/en/function.include.php sometimes behave strangely under PHP].&lt;br /&gt;
# Each file should check that the user is authenticated correctly, using require_login() and has_capability() or require_capability().&lt;br /&gt;
# All access to databases should use the functions in &#039;&#039;lib/dmllib.php&#039;&#039; whenever possible - this allows compatibility across a wide range of databases. You should find that almost anything is possible using these functions. If you must write SQL code then make sure it is: cross-platform; restricted to specific functions within your code (usually a lib.php file); and clearly marked.&lt;br /&gt;
# Don&#039;t create or use global variables except for the standard $CFG, $SESSION, $THEME, $SITE, $COURSE and $USER.&lt;br /&gt;
# All variables should be initialised or at least tested for existence using isset() or empty() before they are used.&lt;br /&gt;
# All strings should be translatable - create new texts in the &amp;quot;lang/en_utf8&amp;quot; files with concise English lowercase names and retrieve them from your code using get_string() or print_string(). Never delete strings to ensure backwards compatibility of the language packs is maintained.&lt;br /&gt;
# Don&#039;t use p() and s() functions to print language strings. Those functions are not designed to print html with tags. Use echo() instead.&lt;br /&gt;
# All errors should be printed using print_error() to maximise translation and help for users (it automatically links to the docs wiki).&lt;br /&gt;
# All help files should be translatable - create new texts in the &amp;quot;lang/en_utf8/help&amp;quot; directory and call them using helpbutton(). If you need to update a help file:&lt;br /&gt;
#* with a minor change, where an old translation of the file would still make sense, then it&#039;s OK to make the change but you should notify translation AT moodle DOT org.&lt;br /&gt;
#* for a major change you should create a new file by adding an incrementing number (eg filename2.html) so that translators can easily see it&#039;s a new version of the file. Obviously the new code and the help index files should also be modified to point to the newest versions.&lt;br /&gt;
# Incoming data from the browser (sent via GET or POST) automatically has magic_quotes applied (regardless of the PHP settings) so that you can safely insert it straight into the database. All other raw data (from files, or from databases) must be escaped with addslashes() before inserting it into the database. Because this is so often done incorrectly, there is more explanation on this issue of adding and stripping slashes on a [[Developer:Slashes|separate page]].&lt;br /&gt;
# VERY IMPORTANT: All texts within Moodle, especially those that have come from users, should be printed using the format_text() function. This ensures that text is filtered and cleaned correctly. More information can be found on the page about [[Output_functions|output functions]].&lt;br /&gt;
# User actions should be logged using the [[Logs|add_to_log()]] function. These logs are used for [[Settings#Show_activity_reports|activity reports]] and [[Logs]].&lt;br /&gt;
# When generating a HTML link, always make it relative to the full site root, i.e. link to  &#039;&#039;$CFG-&amp;gt;wwwroot/mod/blonk/view.php?id=99&#039;&#039; rather than just &#039;&#039;view.php?id=99&#039;&#039;. This means that your code will work if called by a script in another folder, among other things.&lt;br /&gt;
&lt;br /&gt;
==Coding style==&lt;br /&gt;
&lt;br /&gt;
I know it can be a little annoying to change your style if you&#039;re used to something else, but balance that annoyance against the annoyance of all the people trying later on to make sense of Moodle code with mixed styles. There are obviously many good points for and against any style that people use, but the current style just is, so please stick to it.&lt;br /&gt;
&lt;br /&gt;
1. Indenting should be consistently 4 spaces. Don&#039;t use tabs AT ALL.&lt;br /&gt;
&lt;br /&gt;
2. Variable names should always be easy-to-read, meaningful lowercase English words. If you really need more than one word then run them together, but keep them short as possible. Use plural names for arrays of objects.&lt;br /&gt;
&lt;br /&gt;
      GOOD: $quiz&lt;br /&gt;
      GOOD: $errorstring&lt;br /&gt;
      GOOD: $assignments (for an array of objects)&lt;br /&gt;
      GOOD: $i (but only in little loops)&lt;br /&gt;
&lt;br /&gt;
      BAD: $Quiz&lt;br /&gt;
      BAD: $aReallyLongVariableNameWithoutAGoodReason&lt;br /&gt;
      BAD: $error_string&lt;br /&gt;
&lt;br /&gt;
3. Constants should always be in upper case, and always start with the name of the module. They should have words separated by underscores.&lt;br /&gt;
&lt;br /&gt;
      define(&amp;quot;FORUM_MODE_FLATOLDEST&amp;quot;, 1);&lt;br /&gt;
4. Function names should be simple English lowercase words, and start with the name of the module to avoid conflicts between modules. Words should be separated by underscores. Parameters should always have sensible defaults if possible. Note there is no space between the function name and the following (brackets).&lt;br /&gt;
&lt;br /&gt;
      function forum_set_display_mode($mode=0) {&lt;br /&gt;
          global $USER, $CFG;&lt;br /&gt;
          &lt;br /&gt;
          if ($mode) {&lt;br /&gt;
              $USER-&amp;gt;mode = $mode;&lt;br /&gt;
          } else if (empty($USER-&amp;gt;mode)) {&lt;br /&gt;
              $USER-&amp;gt;mode = $CFG-&amp;gt;forum_displaymode;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
5. Blocks must always be enclosed in curly braces (even if there is only one line). Moodle uses this style:&lt;br /&gt;
&lt;br /&gt;
      if ($quiz-&amp;gt;attempts) {&lt;br /&gt;
          if ($numattempts &amp;gt; $quiz-&amp;gt;attempts) {&lt;br /&gt;
              error($strtoomanyattempts, &amp;quot;view.php?id=$cm-&amp;gt;id&amp;quot;);&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
6. Strings should be defined using single quotes where possible, so that [http://php.net/types.string less memory is used].&lt;br /&gt;
&lt;br /&gt;
      $var = &#039;some text without any variables&#039;;&lt;br /&gt;
      $var = &#039;with special characters like a new line &#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
      $var = &#039;a very, very long string with a &#039;.$single.&#039; variable in it&#039;;&lt;br /&gt;
      $var = &amp;quot;some $text with $many variables $within it&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
7. Comments should be added as much as is practical, to explain the code flow and the purpose of functions and variables.&lt;br /&gt;
&lt;br /&gt;
* Every function (and class) should use the popular [http://www.phpdoc.org/ phpDoc format]. This allows code documentation to be generated automatically.&lt;br /&gt;
* Inline comments should use the // style, laid out neatly so that it fits among the code and lines up with it.&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
      * The description should be first, with asterisks laid out exactly&lt;br /&gt;
      * like this example. If you want to refer to a another function,&lt;br /&gt;
      * do it like this: {@link clean_param()}. Then, add descriptions&lt;br /&gt;
      * for each parameter as follows.&lt;br /&gt;
      *&lt;br /&gt;
      * @param int $postid The PHP type is followed by the variable name&lt;br /&gt;
      * @param array $scale The PHP type is followed by the variable name&lt;br /&gt;
      * @param array $ratings The PHP type is followed by the variable name&lt;br /&gt;
      * @return mixed&lt;br /&gt;
      */&lt;br /&gt;
      function forum_get_ratings_mean($postid, $scale, $ratings=NULL) {&lt;br /&gt;
          if (!$ratings) {&lt;br /&gt;
              $ratings = array();     // Initialize the empty array&lt;br /&gt;
              if ($rates = get_records(&amp;quot;forum_ratings&amp;quot;, &amp;quot;post&amp;quot;, $postid)) {&lt;br /&gt;
                  // Process each rating in turn&lt;br /&gt;
                  foreach ($rates as $rate) {&lt;br /&gt;
      ....etc&lt;br /&gt;
&lt;br /&gt;
8. Space should be used liberally - don&#039;t be afraid to spread things out a little to gain some clarity. Generally, there should be one space between brackets and normal statements, but no space between brackets and variables or functions:&lt;br /&gt;
&lt;br /&gt;
      foreach ($objects as $key =&amp;gt; $thing) {&lt;br /&gt;
          process($thing);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if ($x == $y) {&lt;br /&gt;
          $a = $b;&lt;br /&gt;
      } else if ($x == $z) {&lt;br /&gt;
          $a = $c;&lt;br /&gt;
      } else {&lt;br /&gt;
          $a = $d;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
9. When making a COPY of an object, always use the php5 clone() function (otherwise you may end up with just a reference to the first object).  Moodle will make sure this works consistently on php4 too.&lt;br /&gt;
&lt;br /&gt;
      BAD:   $b = $a;&lt;br /&gt;
      GOOD:  $b = clone($a);&lt;br /&gt;
&lt;br /&gt;
If the thing you want to copy is not an object, but may contain objects (eg an array of objects) then use fullclone() instead.&lt;br /&gt;
&lt;br /&gt;
==Database structures==&lt;br /&gt;
&lt;br /&gt;
To help you create tables that meet these guidelines, we recommend you use the built in [[XMLDB_defining_an_XML_structure#The_XMLDB_editor|database definition (XMLDB) editor]].&lt;br /&gt;
&lt;br /&gt;
# Every table must have an auto-incrementing id field (INT10) as primary index. (see [[IdColumnReasons]])&lt;br /&gt;
# The main table containing instances of each module must have the same name as the module (eg widget) and contain the following minimum fields:&lt;br /&gt;
#* id - as described above&lt;br /&gt;
#* course - the id of the course that each instance belongs to&lt;br /&gt;
#* name - the full name of each instance of the module&lt;br /&gt;
# Other tables associated with a module that contain information about &#039;things&#039; should be named widget_things (note the plural).&lt;br /&gt;
# Table and column names should avoid using [[Database reserved words|reserved words in any database]]. Please check them before creation.&lt;br /&gt;
# Column names should be always lowercase, simple and short, following the same rules as for variable names.&lt;br /&gt;
# Where possible, columns that contain a reference to the id field of another table (eg widget) should be called widgetid. (Note that this convention is newish and not followed in some older tables)&lt;br /&gt;
# Boolean fields should be implemented as small integer fields (eg INT4) containing 0 or 1, to allow for later expansion of values if necessary.&lt;br /&gt;
# Most tables should have a timemodified field (INT10) which is updated with a current timestamp obtained with the PHP time() function.&lt;br /&gt;
# Always define a default value for each field (and make it sensible)&lt;br /&gt;
# Each table name should start with the database prefix ($CFG-&amp;gt;prefix). In a lot of cases, this is taken care of for you automatically. Also, under Postgres, the name of every index must start with the prefix too.&lt;br /&gt;
# In order to guarantee [[XMLDB problems#Table and column aliases - the AS keyword|cross-db compatibility]] follow these simple rules about the use of the &#039;&#039;&#039;AS&#039;&#039;&#039; keyword (only if you need table/colum aliases, of course):&lt;br /&gt;
#* &#039;&#039;&#039;Don&#039;t use&#039;&#039;&#039; the &#039;&#039;&#039;AS&#039;&#039;&#039; keyword for &#039;&#039;&#039;table aliases&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Do use&#039;&#039;&#039; the &#039;&#039;&#039;AS&#039;&#039;&#039; keyword for &#039;&#039;&#039;column aliases&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Never&#039;&#039;&#039; create UNIQUE KEYs (constraints) at all. Instead use UNIQUE INDEXes. In the future, if we decide to add referential integrity to Moodle and we need UNIQUE KEYs they will be used, but not now. Please note that the XMLDB editor allows you to specify both XMLDB-only UNIQUE and FOREIGN constraints (and that&#039;s good, in order to have the XML well defined) but only underlying INDEXes will be generated. &lt;br /&gt;
# Those XMLDB-only UNIQUE KEYs (read previous point) only must be defined if such field/fields &#039;&#039;&#039;are going to be the target&#039;&#039;&#039; for some (XMLDB-only too) FOREIGN KEY. Else, create them as simple UNIQUE INDEXes.&lt;br /&gt;
# Tables associated &#039;&#039;&#039;with one block&#039;&#039;&#039; must follow this convention with their names: &#039;&#039;&#039;$CFG-&amp;gt;prefix + &amp;quot;block_&amp;quot; + name_of_the_block + anything_else&#039;&#039;&#039;. For example, assuming that $CFG-&amp;gt;prefix is &#039;mdl_&#039;, all the tables for the block &amp;quot;rss_client&amp;quot; must start by &#039;mdl_block_rss_client&#039; (being possible to add more words at the end, i.e. &#039;mdl_block_rss_client_anothertable&#039;...). This rule will be 100% enforced with Moodle 2.0, giving time to developers until then. See [http://tracker.moodle.org/browse/MDL-6786 Task 6786] for more info about this.&lt;br /&gt;
# &#039;&#039;&#039;Never&#039;&#039;&#039; make database changes in the STABLE branches.  If we did, then users upgrading from one stable version to the next would have duplicate changes occurring, which may cause serious errors.&lt;br /&gt;
# When refering to integer variable in SQL queries, do not surround the value in quotes. For example, get_records_select(&#039;question&#039;, &amp;quot;category=$catid&amp;quot;) is right. get_records_select(&#039;question&#039;, &amp;quot;category=&#039;$catid&#039;&amp;quot;) is wrong. It hides bugs where $catid is undefined. ([http://moodle.org/mod/forum/discuss.php?d=80629 This thread explains].)&lt;br /&gt;
&lt;br /&gt;
==Security issues (and handling form and URL data)==&lt;br /&gt;
&lt;br /&gt;
# Do not rely on &#039;register_globals&#039;. Every variable must be properly initialised in every code file. It must be obvious where the variable came from.&lt;br /&gt;
# Initialise all arrays and objects, even if empty. $a = array() or $obj = new stdClass();.&lt;br /&gt;
# Do not use the optional_variable() function (this function is now deprecated). Use the optional_param() function instead. Pick the correct PARAM_XXXX value for the data type you expect.&lt;br /&gt;
# Do not use the require_variable() function (this function is now deprecated). Use the required_param() function instead. Pick the correct PARAM_XXXX value for the data type you expect.&lt;br /&gt;
# Use data_submitted(), with care. Data must still be cleaned before use.&lt;br /&gt;
# Do not use $_GET, $_POST or $_REQUEST. Use the appropriate required_param() or optional_param() appropriate to your need.&lt;br /&gt;
# Do not check for an action using something like if (isset($_GET[&#039;something&#039;])). Use, e.g., $something = optional_param( &#039;something&#039;,-1,PARAM_INT ) and then perform proper test for it being in its expected range of values e.g., if ($something&amp;gt;=0) {....&lt;br /&gt;
# Wherever possible group all your required_param(), optional_param() and other variables initialisation at the beginning of each file to make them easy to find.&lt;br /&gt;
# Use &#039;sesskey&#039; mechanism to protect form handling routines from attack. Basic example of use: when form is generated, include &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;sesskey&amp;quot; value=&amp;quot;&amp;lt;?php echo sesskey(); ?&amp;gt;&amp;quot; /&amp;gt;. When you process the form check with if (!confirm_sesskey()) {error(&#039;Bad Session Key&#039;);}.&lt;br /&gt;
# All filenames must be &#039;cleaned&#039; using the clean_filename() function, if this has not been done already by appropriate use of required_param() or optional_param()&lt;br /&gt;
# Any data read from the database must have [[Developer:Slashes|addslashes()]] applied to it before it can be written back. A whole object of data can be hit at once with addslashes_object().&lt;br /&gt;
# Wherever possible, data to be stored in the database must come from POST data (from a form with method=&amp;quot;POST&amp;quot;) as opposed to GET data (ie, data from the URL line).&lt;br /&gt;
# Do not use data from $_SERVER if you can avoid it. This has portability issues.&lt;br /&gt;
# If it hasn&#039;t been done somewhere else, make sure all data written to the database has been through the clean_param() function using the appropriate PARAM_XXXX for the datatype.&lt;br /&gt;
# If you write custom SQL code, make very sure it is correct. In particular watch out for missing quotes around values. Possible SQL &#039;injection&#039; exploit.&lt;br /&gt;
# Check all data (particularly that written to the database) in every file it is used. Do not expect or rely on it being done somewhere else.&lt;br /&gt;
# Blocks of code to be included should contain a definite PHP structure (e.g, a class declaration, function definition(s) etc.) - straight blocks of code promote uninitialised variable usage.&lt;br /&gt;
# If you need to use shell_exec() (or any other shell invoking function), make sure you clean parameters first with escapeshellcmd()/escapeshellarg (otherwise, we open up for shell injection attacks).&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding]]&lt;br /&gt;
&lt;br /&gt;
[[es:Manual de Estilo de Código]]&lt;br /&gt;
[[ja:コーディング]]&lt;br /&gt;
[[zh:代码指南]]&lt;br /&gt;
[[pl:Kodowanie]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Talk:Language_pack_untranslated_strings&amp;diff=27226</id>
		<title>Talk:Language pack untranslated strings</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Talk:Language_pack_untranslated_strings&amp;diff=27226"/>
		<updated>2007-12-02T20:55:42Z</updated>

		<summary type="html">&lt;p&gt;Mina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi Koen,&lt;br /&gt;
&lt;br /&gt;
Do you have a automated tool to get these stats?&lt;br /&gt;
&lt;br /&gt;
--[[User:Nicolas Martignoni|Nicolas Martignoni]] 04:18, 30 November 2007 (CST)&lt;br /&gt;
&lt;br /&gt;
:No, unfortunately not. I created it for the GHOP project - to get a view for students where there is work in the language packs to be done. --[[User:koen roggemans|koen roggemans]] 05:13, 30 November 2007 (CST)&lt;br /&gt;
&lt;br /&gt;
:::Nicolas, congratulations on having zero untranslated strings in the French language pack - great work! :-) --[[User:Helen Foster|Helen Foster]] 06:19, 30 November 2007 (CST)&lt;br /&gt;
&lt;br /&gt;
::::Thanks, Helen, the french team is doing his best for Moodle ;-) --[[User:Nicolas Martignoni|Nicolas Martignoni]] 14:55, 2 December 2007 (CST)&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Talk:Language_pack_untranslated_strings&amp;diff=27223</id>
		<title>Talk:Language pack untranslated strings</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Talk:Language_pack_untranslated_strings&amp;diff=27223"/>
		<updated>2007-11-30T10:18:55Z</updated>

		<summary type="html">&lt;p&gt;Mina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi Koen,&lt;br /&gt;
&lt;br /&gt;
Do you have a automated tool to get these stats?&lt;br /&gt;
&lt;br /&gt;
--[[User:Nicolas Martignoni|Nicolas Martignoni]] 04:18, 30 November 2007 (CST)&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=719</id>
		<title>Activity modules</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=719"/>
		<updated>2007-10-28T21:05:17Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Activity modules&#039;&#039;&#039; reside in the &#039;mod&#039; directory. Each module is in a separate subdirectory and consists of the following mandatory elements (plus extra scripts unique to each module):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;mod.html&#039;&#039; - a form to set up or update an instance of this module&lt;br /&gt;
* &#039;&#039;version.php&#039;&#039; - defines some meta-info and provides upgrading code&lt;br /&gt;
* &#039;&#039;icon.gif&#039;&#039; - a 16x16 icon for the module&lt;br /&gt;
* &#039;&#039;db/&#039;&#039; - SQL dumps of all the required db tables and data (for each database type)&lt;br /&gt;
* &#039;&#039;index.php&#039;&#039; - a page to list all instances in a course&lt;br /&gt;
* &#039;&#039;view.php&#039;&#039; - a page to view a particular instance&lt;br /&gt;
* &#039;&#039;lib.php&#039;&#039; - any/all functions defined by the module should be in here. If the modulename is called widget, then the required functions include:&lt;br /&gt;
:* widget_install() - will be called during the installation of the module&lt;br /&gt;
:* widget_add_instance() - code to add a new instance of widget&lt;br /&gt;
:* widget_update_instance() - code to update an existing instance&lt;br /&gt;
:* widget_delete_instance() - code to delete an instance&lt;br /&gt;
:* widget_user_outline() - given an instance, return a summary of a user&#039;s contribution&lt;br /&gt;
:* widget_user_complete() - given an instance, print details of a user&#039;s contribution&lt;br /&gt;
:* Other functions available but not required are:&lt;br /&gt;
:** widget_delete_course() - code to clean up anything that would be leftover after all instances are deleted&lt;br /&gt;
:** widget_process_options() - code to pre-process the form data from module settings&lt;br /&gt;
:** [[Implementing Reset course functionality in a module|widget_reset_course_form() and widget_delete_userdata()]] - used to implement [[Reset course]] feature.&lt;br /&gt;
:* To avoid possible conflict, any module functions should be named starting with widget_ and any constants you define should start with WIDGET_&lt;br /&gt;
* &#039;&#039;config.html&#039;&#039; - (optional) a form to set up or update global settings of this module&lt;br /&gt;
* &#039;&#039;lang/en_utf8/resource_widget.php&#039;&#039; - (optional) Lastly, each module will have some language files that contain strings for that module.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: When creating a new module, the new name of the module must not contain numbers or other special characters! &lt;br /&gt;
&lt;br /&gt;
You should also make sure that your activity module provides appropriate support for groups and metacourses. &lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* Tracker issue [http://tracker.moodle.org/browse/CONTRIB-52 CONTRIB-52 Improvements to make NEWMODULE really useful] - including download link for new module template supporting roles, formslib etc. (unfinished) &lt;br /&gt;
* http://download.moodle.org/plugins16/mod/NEWMODULE.zip - new module template for versions of Moodle prior to 1.7. Please follow the README instructions inside the zip.&lt;br /&gt;
* Using Moodle [http://moodle.org/course/view.php?id=5 Activity modules] forum&lt;br /&gt;
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=66165 A new resource type: where do I put the language strings?] forum discussion&lt;br /&gt;
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=65986 New Module Template Code for Moodle 1.7] forum discussion&lt;br /&gt;
&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
&lt;br /&gt;
[[es:Módulos de actividades (desarrollador)]]&lt;br /&gt;
[[fr:Modules (développeur)]&lt;br /&gt;
[[ja:モジュール (開発者)]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=718</id>
		<title>Activity modules</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Activity_modules&amp;diff=718"/>
		<updated>2007-10-28T21:04:22Z</updated>

		<summary type="html">&lt;p&gt;Mina: French link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Activity modules&#039;&#039;&#039; reside in the &#039;mod&#039; directory. Each module is in a separate subdirectory and consists of the following mandatory elements (plus extra scripts unique to each module):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;mod.html&#039;&#039; - a form to set up or update an instance of this module&lt;br /&gt;
* &#039;&#039;version.php&#039;&#039; - defines some meta-info and provides upgrading code&lt;br /&gt;
* &#039;&#039;icon.gif&#039;&#039; - a 16x16 icon for the module&lt;br /&gt;
* &#039;&#039;db/&#039;&#039; - SQL dumps of all the required db tables and data (for each database type)&lt;br /&gt;
* &#039;&#039;index.php&#039;&#039; - a page to list all instances in a course&lt;br /&gt;
* &#039;&#039;view.php&#039;&#039; - a page to view a particular instance&lt;br /&gt;
* &#039;&#039;lib.php&#039;&#039; - any/all functions defined by the module should be in here. If the modulename is called widget, then the required functions include:&lt;br /&gt;
:* widget_install() - will be called during the installation of the module&lt;br /&gt;
:* widget_add_instance() - code to add a new instance of widget&lt;br /&gt;
:* widget_update_instance() - code to update an existing instance&lt;br /&gt;
:* widget_delete_instance() - code to delete an instance&lt;br /&gt;
:* widget_user_outline() - given an instance, return a summary of a user&#039;s contribution&lt;br /&gt;
:* widget_user_complete() - given an instance, print details of a user&#039;s contribution&lt;br /&gt;
:* Other functions available but not required are:&lt;br /&gt;
:** widget_delete_course() - code to clean up anything that would be leftover after all instances are deleted&lt;br /&gt;
:** widget_process_options() - code to pre-process the form data from module settings&lt;br /&gt;
:** [[Implementing Reset course functionality in a module|widget_reset_course_form() and widget_delete_userdata()]] - used to implement [[Reset course]] feature.&lt;br /&gt;
:* To avoid possible conflict, any module functions should be named starting with widget_ and any constants you define should start with WIDGET_&lt;br /&gt;
* &#039;&#039;config.html&#039;&#039; - (optional) a form to set up or update global settings of this module&lt;br /&gt;
* &#039;&#039;lang/en_utf8/resource_widget.php&#039;&#039; - (optional) Lastly, each module will have some language files that contain strings for that module.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: When creating a new module, the new name of the module must not contain numbers or other special characters! &lt;br /&gt;
&lt;br /&gt;
You should also make sure that your activity module provides appropriate support for groups and metacourses. &lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* Tracker issue [http://tracker.moodle.org/browse/CONTRIB-52 CONTRIB-52 Improvements to make NEWMODULE really useful] - including download link for new module template supporting roles, formslib etc. (unfinished) &lt;br /&gt;
* http://download.moodle.org/plugins16/mod/NEWMODULE.zip - new module template for versions of Moodle prior to 1.7. Please follow the README instructions inside the zip.&lt;br /&gt;
* Using Moodle [http://moodle.org/course/view.php?id=5 Activity modules] forum&lt;br /&gt;
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=66165 A new resource type: where do I put the language strings?] forum discussion&lt;br /&gt;
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=65986 New Module Template Code for Moodle 1.7] forum discussion&lt;br /&gt;
&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
[[Category:Modules]]&lt;br /&gt;
&lt;br /&gt;
[[es:Módulos de actividades (desarrollador)]]&lt;br /&gt;
[[fr:Développement:Modules]&lt;br /&gt;
[[ja:モジュール (開発者)]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=26015</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=26015"/>
		<updated>2007-07-09T07:04:58Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Moodle 1.8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release History==&lt;br /&gt;
&lt;br /&gt;
See [[Release_Notes|Release Notes]] for more details.&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
*Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
:: 1.0.6.1 - 6 Nov&lt;br /&gt;
:: 1.0.6.2 - 11 Nov&lt;br /&gt;
:: 1.0.6.3 - 14 Nov&lt;br /&gt;
:: 1.0.6.4 - 25 Nov&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
*Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
*Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005 &lt;br /&gt;
*Moodle 1.4.5 - 7 May 2005&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*Moodle 1.5   - 5 June 2005&lt;br /&gt;
*Moodle 1.5.1 - 8 July 2005&lt;br /&gt;
*Moodle 1.5.2 - 16 July 2005&lt;br /&gt;
*Moodle 1.5.3 - 11 November 2005&lt;br /&gt;
*Moodle 1.5.4 - 21 May 2006&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*Moodle 1.6   - 20 June 2006&lt;br /&gt;
*Moodle 1.6.1 - 20 July 2006&lt;br /&gt;
*Moodle 1.6.2 - 12 September 2006&lt;br /&gt;
*Moodle 1.6.3 - 10 October 2006&lt;br /&gt;
*Moodle 1.6.4 - 17 January 2007&lt;br /&gt;
*Moodle 1.6.5 - 30 March 2007&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*Moodle 1.7 - 7 November 2006&lt;br /&gt;
*Moodle 1.7.1 - 17 January 2007&lt;br /&gt;
*Moodle 1.7.2 - 30 March 2007&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.8==&lt;br /&gt;
*Moodle 1.8 - 30 March 2007&lt;br /&gt;
*Moodle 1.8.1 - 14 June 2007&lt;br /&gt;
*Moodle 1.8.2 - 8 July 2007&lt;br /&gt;
&lt;br /&gt;
[[Category:Administrator]]&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:Historia de las versiones]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Roadmap&amp;diff=26113</id>
		<title>Roadmap</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Roadmap&amp;diff=26113"/>
		<updated>2006-07-05T14:10:21Z</updated>

		<summary type="html">&lt;p&gt;Mina: French link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This roadmap collects the best information about upcoming features in Moodle.   It is not 100% certain - features may change according to available funding and developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Version 1.7 - Expected August 2006 ==&lt;br /&gt;
&lt;br /&gt;
* [[Roles]] - Moodle.com&lt;br /&gt;
::This new system will allow the creation of custom roles at site, course and activity level&lt;br /&gt;
* [[Accessibility]] - Moodle.com &lt;br /&gt;
::Full compliance with all major accessibility standards&lt;br /&gt;
* [[XML Database Schema]] - Moodle.com &lt;br /&gt;
::Conversion to full database independence using new XML schema for ADOdb.  This will give us support for MS SQL, Oracle etc.&lt;br /&gt;
* [[Repository API]] - Open University&lt;br /&gt;
::Abstract all file operations to an API that allows plugins for different external repositories&lt;br /&gt;
* [[Gradebook]] - Arab Open University&lt;br /&gt;
::The gradebook system will be revamped for performance, switching from our older &amp;quot;pull&amp;quot; model to a &amp;quot;push&amp;quot; model where all modules will now publish grades as necessary into a central table.&lt;br /&gt;
* [[Multi Authentication]] - Iñaki Arenaza?&lt;br /&gt;
* [[Learning Design export]] - Moodle.com and Open University of The Netherlands&lt;br /&gt;
::We plan to have a very simple export for any Moodle course into IMS LD format, as a proof of concept and to help the community start learning about IMS LD.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0 - Expected early 2007 ==&lt;br /&gt;
&lt;br /&gt;
* [[IMS Learning Design]] - Moodle.com&lt;br /&gt;
::Support for importing/exporting LD, converting Moodle activities and sequences of activities into a standard format for sharing, and importing standard sequences into Moodle courses&lt;br /&gt;
* [[Conditional activities]] - Moodle.com&lt;br /&gt;
::Allowing dependencies and forced paths through the content&lt;br /&gt;
* [[Metadata]] - Moodle.com&lt;br /&gt;
::Build on the keywords in 1.6 to provide metadata for all activities and courses, linkable to standard lists of metadata such as State-based learning outomes and curricula&lt;br /&gt;
* [[Web Services API]]&lt;br /&gt;
::Providing remote control and access of Moodle services by other systems, as well as sharing of information between Moodle sites with trust relationships.&lt;br /&gt;
* [[Student Information API]]&lt;br /&gt;
::API for integrating external systems for managing student information&lt;br /&gt;
* [[Community hub]] - Moodle.com &lt;br /&gt;
::Leverage above improvements into a system to network Moodles together&lt;br /&gt;
&lt;br /&gt;
== Version 2.1 ==&lt;br /&gt;
&lt;br /&gt;
* [[Site groups|Groups]] &lt;br /&gt;
::Groups can also be defined at the site level, and activities can be assigned to course groups&lt;br /&gt;
* [[Portfolio API]]&lt;br /&gt;
::Interface Moodle activities and repositories to help produce portfolios for internal assessment AND external publication&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
[[es:Planificación]]&lt;br /&gt;
[[fr:Planification]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19777</id>
		<title>User:Nicolas Martignoni</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19777"/>
		<updated>2006-06-02T19:13:08Z</updated>

		<summary type="html">&lt;p&gt;Mina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Translation of Moodle in french&lt;br /&gt;
* Sysop of french [[:fr:Accueil|Moodle Docs]]&lt;br /&gt;
* My [http://moodle.org/user/view.php?id=6406&amp;amp;course=5 user profile] on moodle.org&lt;br /&gt;
&lt;br /&gt;
=== Some useful pages ===&lt;br /&gt;
&lt;br /&gt;
* [[Special:Allpages%26from%3D%26namespace%3D10|Templates]]&lt;br /&gt;
* [[Special:Categories|Categories]]&lt;br /&gt;
* [[Special:Disambiguations|Disambiguations]]&lt;br /&gt;
&lt;br /&gt;
[[fr:User:Nicolas Martignoni]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19776</id>
		<title>User:Nicolas Martignoni</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19776"/>
		<updated>2006-04-23T08:48:30Z</updated>

		<summary type="html">&lt;p&gt;Mina: /* Some useful pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Translation of Moodle in french&lt;br /&gt;
* Sysop of french [[:fr:Accueil|Moodle Docs]]&lt;br /&gt;
* My [http://moodle.org/user/view.php?id=6406&amp;amp;course=5 user profile] on moodle.org&lt;br /&gt;
&lt;br /&gt;
=== Some useful pages ===&lt;br /&gt;
&lt;br /&gt;
* [[Special:Allpages%26from%3D%26namespace%3D10|Templates]]&lt;br /&gt;
* [[Special:Categories|Categories]]&lt;br /&gt;
* [[Special:Disambiguations|Disambiguations]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Latest_release_notes&amp;diff=25058</id>
		<title>Latest release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Latest_release_notes&amp;diff=25058"/>
		<updated>2006-04-10T12:30:11Z</updated>

		<summary type="html">&lt;p&gt;Mina: Link to french Moodle Docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{About Moodle}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.6 (Coming soon, currently in Beta testing status)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
&lt;br /&gt;
* [[UTF-8 migration|Unicode]]&lt;br /&gt;
::Moodle is now 100% Unicode, which means any language can be mixed together and an end to a number of problems that different character sets caused us.&lt;br /&gt;
* [[MoodleDocs development|Documentation]]&lt;br /&gt;
::A new one-stop wiki site for ALL Moodle documentation, including links from Moodle itself&lt;br /&gt;
* [[Database module]]&lt;br /&gt;
::A new activity module that allows collaborative collection of structured data, useful for many things!&lt;br /&gt;
* [[LAMS]]&lt;br /&gt;
::Integrated via a course format and an activity module&lt;br /&gt;
* [[Blogs]]&lt;br /&gt;
::Allows reflection on an ongoing basis.  Entries are marked and can be viewed by user, course, group, site etc.  Contains first new support for [[Tags]].  &lt;br /&gt;
* [[Reports]]&lt;br /&gt;
::All reports are now centralised under Course reports and Admin reports.  New reports can be written as plugins and dropped in very easily.  One big new report is the new course-based statistics system from Catalyst.&lt;br /&gt;
* [[My Moodle]]&lt;br /&gt;
::A dashboard interface that allows an overview for each user of all their courses etc.&lt;br /&gt;
* [[Hive integration]]&lt;br /&gt;
::This initial integration with Hive allows teachers to upload, browse, search and select [[Resources|resources]] within the external repository.&lt;br /&gt;
* [[Multiple groups]]&lt;br /&gt;
::Users can be part of multiple groups within a course&lt;br /&gt;
* [[IMS content package]] resource type&lt;br /&gt;
::Supports the loading of any content package as a resource, plus special support for a repository of NLN materials&lt;br /&gt;
* [[Course backup|Granularised backup]]&lt;br /&gt;
* [[Chameleon|Chameleon theme]]&lt;br /&gt;
:: An interactive Moodle theme&lt;br /&gt;
* [[Enrolment plugins|Multi enrolment]]&lt;br /&gt;
::Moodle&#039;s enrolment plugins can be used simultaneously on the same site. Also new [[IMS Enterprise]] enrolment plugin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;See also&#039;&#039;&#039;&lt;br /&gt;
*[[Special:Whatlinkshere/Template:Moodle_1.6|List of pages including Moodle 1.6 features]]&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5.3 (11th November, 2005)==&lt;br /&gt;
&lt;br /&gt;
(Because this release contains important security fixes, we highly advise that sites using any previous version of Moodle upgrade to this version as soon as possible.)&lt;br /&gt;
&lt;br /&gt;
===A few new things===&lt;br /&gt;
&lt;br /&gt;
* We now have SCORM 1.3 (SCORM 2004) support!&lt;br /&gt;
* Much improved Assignment grading interface, including &amp;quot;quick grading&amp;quot; options&lt;br /&gt;
* A new Single-Sign-On API is available&lt;br /&gt;
&lt;br /&gt;
===Various fixes===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Contains warnings when Moodle is used on an PHP configuration known to be insecure&lt;br /&gt;
* Contains fixes for some recently reported security problems (see [http://security.moodle.org/ security.moodle.org])&lt;br /&gt;
* Backups now runs a lot faster medium/large installs. Many issues fixed in this area&lt;br /&gt;
* Listing of directory sizes can be made much faster on Linux/Unix servers, thanks to a performance fix you can enable from Admin-&amp;gt;Variables: &amp;quot;path_to_du&amp;quot;&lt;br /&gt;
* We now log more meaningful IP addresses when the server or the clients are working behind a proxy&lt;br /&gt;
* Fixed some issues with PHP accelerators&lt;br /&gt;
* Upgrade scripts have been refined and work much better for PostgreSQL installations&lt;br /&gt;
* General PostgreSQL port code cleanup&lt;br /&gt;
* Upgrading to 1.5.3 will fix any legacy Journal to Online Assignment upgrade issues&lt;br /&gt;
* RSS libraries now support RSS 2.0 categories, see bug 3654&lt;br /&gt;
* Better accesibilty in file uploads, see bug 3662&lt;br /&gt;
* Better support for site-wide HTTPS, see bug 3848&lt;br /&gt;
* We now send away bots (like Googlebot) from that try mangled URLs, see bug 3958&lt;br /&gt;
* Better DST support for non-logged-in users&lt;br /&gt;
* Better DST support for repeat events in Calendar&lt;br /&gt;
* Small fixes to the lesson, choice and grade modules&lt;br /&gt;
* Minor CSS improvements to formal_white and orangewhite themes&lt;br /&gt;
* Better pagination in course listing and loglive pages&lt;br /&gt;
* Fixed an IE-only bug related to HTMLArea content where user-edited tables could float and hide part of the UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fixes to change password/forgotten password with external auth&lt;br /&gt;
* Data fetched from external DB or LDAP is now truncated correctly&lt;br /&gt;
* Fixed bug 4305 -- better login block behaviour when using secureforms&lt;br /&gt;
* Better support for utf-8 user data from external auth&lt;br /&gt;
* LDAP: General fixes covering sync_users script and logging of errors&lt;br /&gt;
* LDAP: Fixed bug 3141 - Can&#039;t update external data with LDAP authentication&lt;br /&gt;
* LDAP: Fixed bug 3992 - LDAP password including a quote does not work - credits go to Kita&lt;br /&gt;
* LDAP: Better support for ActiveDirectory.&lt;br /&gt;
* LDAP: Fixed bug #3594&lt;br /&gt;
* LDAP: Better handling of multi-source field mapping&lt;br /&gt;
* LDAP: Fix for using DN as idnumber - thanks fo Jeff Graham - http://moodle.org/mod/forum/discuss.php?d=28840&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enrolment and metacourses&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Metacourses: Prevent normal users to gain access to meta courses via manual enrolment&lt;br /&gt;
* Metacourses: better support for MySQL v3.23.x&lt;br /&gt;
* DB: Enrolment lookups now work reliably with Moodle on MySQL and Postgres&lt;br /&gt;
* DB: Non-MySQL databases work again as external enrolment databases&lt;br /&gt;
* LDAP: Fixed a wrong call to add_teacher in LDAP plugin.&lt;br /&gt;
* LDAP: Servers being down or unavailable no longer prevent logins&lt;br /&gt;
* LDAP: Course auto-creation works again&lt;br /&gt;
* LDAP: Fixed several bugs reported by Jeff Graham and Barron Koralesky -- including bugs 3912 and 3974&lt;br /&gt;
* LDAP: We can now bind non-anonymously to LDAP&lt;br /&gt;
* Authorize.net: several fixes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Resources&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Bugfix: Avoid linking to empty or unlinkable activity names&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Forums&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Big and small optimizations to tracking of read/unread messages, specially for PostgreSQL&lt;br /&gt;
* Fixed some PostgreSQL bugs&lt;br /&gt;
* Some more actions are now supported by backup/restore when processing log records, see bug 3582&lt;br /&gt;
* Now message forum RSS feeds are including category data -- useful under some RSS agregators able to group messages, see bug 3654&lt;br /&gt;
* Fixed paging on forum search&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blocks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Several performance improvements&lt;br /&gt;
* Fixes to the upgrade process, including PostgreSQL syntax and lower memory usage&lt;br /&gt;
* Brought in several bugfixes from 1.6dev&lt;br /&gt;
* Fixed bug 3478: Cannot add RSS feed as course creator&lt;br /&gt;
* Fixed bug 3793: Prevent warning message when configuring a glossary_random block in a course which has no glossaries&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quiz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Some CSS style fixes&lt;br /&gt;
* Better compatibility with themes that contain forms in the headers&lt;br /&gt;
* Highlighting of correct answers can now be turned off&lt;br /&gt;
* Fixed bug 3986: Too many random questions. (mindforge)&lt;br /&gt;
* Fixed missing action icons&lt;br /&gt;
* Fixed bug 3899 and removed some &#039;missing course object&#039; messages&lt;br /&gt;
* Fixed bug 3950: Ee-attempt button inconsistency for multi-attempt quizzes&lt;br /&gt;
* Fixed bug 3953: Quiz/report.php pagesize can be set to 0, credits to Jean-Michel&lt;br /&gt;
* Fixed potential data data corruption bug 3915&lt;br /&gt;
* Fixed bug 3884: Quiz correct highlights missing for 2 of 3 options.&lt;br /&gt;
* Fix for the Student review highlight doesn&#039;t seem to work bug&lt;br /&gt;
* Fixed bug 3804: Differences in question types between 1.5 and 1.6&lt;br /&gt;
* Fixed bug 3822: don&#039;t count previews as attempts&lt;br /&gt;
* Fixed bug 3807: Question numbering issue&lt;br /&gt;
* Fixes for the item analysis plug-in, assembled by Jean-Michel&lt;br /&gt;
* Now we reset the timeout counter to avoid timeouts&lt;br /&gt;
* Several improvements contributed by Jean-Michel Vedrine. You can now change the number of attempts per page displayed on screen, and download results to Excel/text file, including detailed grades&lt;br /&gt;
* Fixed export bug with non-English languages&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SCORM&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* We now support SCORM 1.3 (SCORM 2004)!&lt;br /&gt;
* Fixed a bug with next and prev SCO search&lt;br /&gt;
* Fixed bugs related to masteryscore&lt;br /&gt;
* Fixed a problem in AICC course tracking&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Now paging of older versions is showed and working properly, see bug 3750&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filters&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Mediaplugin filter now finds multi-line links in HTML code&lt;br /&gt;
* Censor filter: Added original word as title to the blacked-out version. The filter can obscure actual important words by mistake (eg Dickens) and there needs to be some way to recover the meaning&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5.2 (16th July, 2005) ==&lt;br /&gt;
&lt;br /&gt;
=== Various fixes ===&lt;br /&gt;
&lt;br /&gt;
*  Journal -&amp;gt; Assignment upgrade now works properly :-/&lt;br /&gt;
* Assignment submodules now upgrade as expected&lt;br /&gt;
* Various other bugs with new Assignments fixed&lt;br /&gt;
* Journal module is now disabled by default on new installations&lt;br /&gt;
* Login page is now 100% HTTPS if required&lt;br /&gt;
* Various small standard theme tweaks&lt;br /&gt;
* Fix for recent matching questions display bug in Quiz&lt;br /&gt;
* Language editor no longer creates empty files when not necessary (caused country list bug)&lt;br /&gt;
* Fixed some manifest parsing problems in SCORM module&lt;br /&gt;
* Multilang filter now deals with pack names that contain numbers&lt;br /&gt;
* Files are now force-downloaded (fixes IE problems and some security issues)&lt;br /&gt;
* Relinking debugging output is escaped&lt;br /&gt;
* Large MP3 player now displays ID3 tags properly again&lt;br /&gt;
* Some chat daemon improvements&lt;br /&gt;
&lt;br /&gt;
=== Some new things ===&lt;br /&gt;
&lt;br /&gt;
* Orangewhite theme optimised for use on PDA&lt;br /&gt;
* Forum user posts page can be called without userid&lt;br /&gt;
* Altavista BabelFish now allowed in as guest when Google is&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5.1 (8th July, 2005) ==&lt;br /&gt;
&lt;br /&gt;
===Various fixes===&lt;br /&gt;
&lt;br /&gt;
* Several potential security problems solved&lt;br /&gt;
* Allowobjectembed setting now works correctly&lt;br /&gt;
* Speed problem on IE, caused by tab hover fixed.&lt;br /&gt;
* Cut and paste in editor on Firefox has a more helpful warning message&lt;br /&gt;
* Fixed a session problem when logged on as admin during upgrade from very old Moodle version&lt;br /&gt;
* Fixed editing problem in Main menu of site&lt;br /&gt;
* Minor CSS display problems in a few areas were fixed&lt;br /&gt;
* Fixed the adding of a single discussion forum&lt;br /&gt;
* Fixed Lesson problems with calculating grades, and dates&lt;br /&gt;
* Fixed Lesson problems with entering a cluster after a page&lt;br /&gt;
* Censor filter was fixed to make it work better with old themes&lt;br /&gt;
&lt;br /&gt;
===Some new things===&lt;br /&gt;
&lt;br /&gt;
* New theme: Wood&lt;br /&gt;
* Metal theme updated for 1.5&lt;br /&gt;
* Many language updates for most languages, including a new language: Khmer&lt;br /&gt;
* Block classes can now run custom code when an instance is created/deleted (this is useful for blocks that need to set up non-trivial data structures)&lt;br /&gt;
* Wizard for Calculated Questions in Quiz was rewritten&lt;br /&gt;
* Backup/Restore module selection is now improved and much easier&lt;br /&gt;
* Backup/Restore module has much improved relinking support, it&#039;s now faster and easier to implement in new modules&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5 (5th June, 2005) ==&lt;br /&gt;
&lt;br /&gt;
Here you can find the release notes of the current stable version of Moodle. &#039;&#039;&#039;If you experience any bugs in this release, please report them at [http://moodle.org/bugs moodle.org/bugs] so we can fix them in the next release.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Headline features ===&lt;br /&gt;
&lt;br /&gt;
* Web pages are compliant with XHTML Transitional 1.0&lt;br /&gt;
* Improved &#039;&#039;&#039;Accessibility&#039;&#039;&#039;, aiming for compliance with WAI (W3C), SENDA (UK) and Section 508 (US) criteria.&lt;br /&gt;
* Very strong &#039;&#039;&#039;new Themes system&#039;&#039;&#039;, allowing cascading themes, user themes, course themes, with very fine control of every page in Moodle via CSS.&lt;br /&gt;
* Integrated &#039;&#039;&#039;Messaging&#039;&#039;&#039; feature for direct communication between all users in the site, featuring realtime popup windows, notification, email copies, blocking, history, WYSIWYG editor, etc&lt;br /&gt;
* Forum read/unread tracking with highlights allows you to see new postings at a glance and to control how these are displayed (per forum, per user or per site).&lt;br /&gt;
* New &#039;&#039;&#039;Blocks&#039;&#039;&#039; system, allowing multiple copies of blocks and better block configuration&lt;br /&gt;
* Full support for &#039;&#039;&#039;Daylight Savings Time&#039;&#039;&#039; in every locality around the globe, so everyone always see the correct local time for all events.&lt;br /&gt;
* New &#039;&#039;&#039;extended gradebook&#039;&#039;&#039; allowing custom weighting of different activities, setting extra grades (or taking out others) and improved display and sorting options&lt;br /&gt;
* Users can be required to agree to a &#039;&#039;&#039;Site Policy&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Other major system-wide improvements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Admin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* New &amp;quot;maintenance mode&amp;quot; allows the admin to temporarily disable a site (during upgrades, for example).&lt;br /&gt;
* Moodle can automatically download a new list of timezones from moodle.org or elsewhere and install it to the database (Olson files are supported too)&lt;br /&gt;
* New version of Moodle MySQL Admin module (available separately)&lt;br /&gt;
* New calendar options page provides user interface to configure the behavior of the calendar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* New Shibboleth Support&lt;br /&gt;
* New CAS Support&lt;br /&gt;
* New PAM Support&lt;br /&gt;
* Improved LDAP integration, so that LDAP can now control course creation, group assignments. Increased performance and scalability performing user synchronisation.&lt;br /&gt;
* Certain user fields can be locked by the admin when using external authentication&lt;br /&gt;
* Improved session handling now detects &amp;quot;crossover&amp;quot; sessions that we have found in some buggy PHP installations and prevents them&lt;br /&gt;
* Sessions can now be stored in the database (good for clustered installations!)&lt;br /&gt;
* Users can be forced to change their password&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Files&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Standardised file browsing in all areas&lt;br /&gt;
* Improved uploading, with support for automated Virus scanning of new documents using ClamAV.&lt;br /&gt;
* Slasharguments now work also on IIS (upgrade to PHP 4.3.11 needed for ISAPI)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filters&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Standardised filter library makes it trivial to write new filters that require searching and highlighting of text.&lt;br /&gt;
* Huge efficiency improvements for complex filters like the Glossary filter&lt;br /&gt;
* New Tidy filter uses the W3C Tidy program to (optionally) clean all user-entered texts throughout the site and convert it to valid XHTML code&lt;br /&gt;
* Improved censorship filter, now &amp;quot;blacks out&amp;quot; words using styles and uses a word list from the language packs.&lt;br /&gt;
* Improved Flash MP3 player, now shows progress bar while downloading and playing&lt;br /&gt;
* Improved Multi-language filter is faster, more forgiving of syntax errors, and uses new editor-friendly syntax: &amp;lt;span lang=&amp;quot;en&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Auto-linking filters (glossary, activities) can work to link all the occurrences (old behaviour), once for each text block or only once for the whole page ($CFG-&amp;gt;filtermatchonepertext, $CFG-&amp;gt;filtermatchoneperpage).&lt;br /&gt;
* More text can now be filtered in Moodle, including activity names, headings and other such small texts. This makes it possible to design completely multi-lingual sites in Moodle that fully appears in the user&#039;s chosen language.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Themes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Modules can provide standard styles&lt;br /&gt;
* Themes can override required styles of other themes&lt;br /&gt;
* Users and courses can choose their own themes if the admin allows it&lt;br /&gt;
* Implementation of tabs interface on many pages&lt;br /&gt;
* Modules, Blocks and Languages can define their own standard styles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTML Editor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The toolbuttons offered in the editor toolbar are now configurable by the admin&lt;br /&gt;
* Search and Replace text within the editor text area (with optional use of regular expressions)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Course management&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Transparent Blackboard 5.5 course importing (partial 6.0 support)&lt;br /&gt;
* The new meta-courses allow to get users automatically enroled in a general course (the metacourse) when enroled in any of the metacourse-linked courses&lt;br /&gt;
* New tool to copy content from a course to other.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New blocks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* HTML block: allowing to place arbitrary content (text, images links) in any course mainpage&lt;br /&gt;
* Remote RSS feed: allows to display external news channels inside a Moodle course&lt;br /&gt;
* Glossary Selection: to choose and display content from a Moodle glossary in course mainpage&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Calendar&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Major speed improvements for sites with a large number of courses using groups&lt;br /&gt;
* Repeating events can now be modified or deleted all at the same time or separately as before&lt;br /&gt;
* New &amp;quot;remember filter settings&amp;quot; preference that allows calendar filters to remember their status between logins&lt;br /&gt;
&lt;br /&gt;
=== Activity module improvements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assignment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Completely refactored into a new class-based design, allowing new plugin-assignment types&lt;br /&gt;
* New Online Text assignment type that doesn&#039;t require files and allows inline comments when grading - this new type effectively replaces the old Journal module&lt;br /&gt;
* Vastly improved grading interface for handling large classes&lt;br /&gt;
* New configuration options to disable late submission and to e-mail alerts to teachers when students submit new work&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Streamlined interface looks smoother, works faster, even without using the optional server daemon&lt;br /&gt;
* Blocks can now be added to chat pages (e.g. for additional information)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Choice&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Rewritten to allow any number of choices&lt;br /&gt;
* The number of users per choice can be limited, which allows it to be used as tool for &amp;quot;signing up&amp;quot; to an array of options.&lt;br /&gt;
* You can now download the results of the choice to XLS or a TXT file&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Forum&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Powerful new Google-like forum searching tools&lt;br /&gt;
* Forum read/unread tracking - unread messages are highlighted on the course page, forum page, discussion listing and the discussion view&lt;br /&gt;
* The tracking system may be disabled by teachers/users&lt;br /&gt;
* User profiles show all posts by a user, as well as all discussions&lt;br /&gt;
* When admins edit user messages, a notice is attached&lt;br /&gt;
* Discussion listing shows the last user who posted to each discussion and when it was, with a direct link to that post&lt;br /&gt;
* In group-enabled forums the discussion listing shows the group the thread applies to, with a link to the group description page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Glossary&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* New setting to enable/disable the print view of each glossary.&lt;br /&gt;
* New search system looks for words everywhere (instead of doing exact phrase match).&lt;br /&gt;
* More information is sent to logs to be able to track activity better.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Journal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The Journal module has not changed since 1.4, and is now deprecated. The upgrade procedure will convert all your Journal activities into Online Assignments, and hide all the old Journal activities. If you don&#039;t want this to happen, then define this in your config.php: $CFG-&amp;gt;noconvertjournals = true;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lesson&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Now supports timed Lessons&lt;br /&gt;
* Can create practice Lessons (grades are not stored)&lt;br /&gt;
* Option for students to view points earned while taking the Lesson&lt;br /&gt;
* Allow students to review their answers before submitting the Lesson&lt;br /&gt;
* New Slide Show Mode (only branch tables are displayed as slides)&lt;br /&gt;
* New Left Menu (for enabled branch tables only)&lt;br /&gt;
* Lessons can now be Password Protected&lt;br /&gt;
* A Tree View can be used for the Lesson creation screen&lt;br /&gt;
* Students can post their high scores&lt;br /&gt;
* New option to save a Lesson&#039;s settings as defaults for new lessons in the same course&lt;br /&gt;
* Can delete a student&#039;s attempts&lt;br /&gt;
* New page Jumps:&lt;br /&gt;
** Previous Page&lt;br /&gt;
** Unseen question within a branch&lt;br /&gt;
** Random question within a branch&lt;br /&gt;
** Unseen question within a cluster&lt;br /&gt;
* Added functionality to view Lesson statistics&lt;br /&gt;
* New question type: Essay. Teachers can view each essay and write comments, assign a grade, and then email it all to the student&lt;br /&gt;
* New question creation interface&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quiz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Can handle adaptive questions, i.e., questions that allow the student to interact with them repeatedly within the same quiz attempt and that can change in response to student answers.&lt;br /&gt;
* Student can be allowed to try a question again immediately within the same quiz attempt until they get the answer right.&lt;br /&gt;
* There is a penalty mechanism that deducts a specified fraction of the mark for each wrong attempt at a question.&lt;br /&gt;
* Allows questions rendered and scored externally (e.g., by mathematical assessment engines) to be integrated seamlessly into Moodle quizzes via the RQP web services protocol.&lt;br /&gt;
* Is prepared for the handling of IMS QTI questions once web services for these become available.&lt;br /&gt;
* New tabbed teacher interface for previewing, editing, and reviewing quizzes.&lt;br /&gt;
* New &amp;quot;improved security&amp;quot; mode shows quiz in a separate full-screen window, with many browser features disabled&lt;br /&gt;
* Quizzes can be presented to students in several pages. The number of questions per page is selectable by the teacher.&lt;br /&gt;
* Blocks can now be added to quiz pages (to show results table, or additional information etc)&lt;br /&gt;
* Better and cleaner interface for question selection and management in the database. Selected questions can be added to quiz, moved to other categories or deleted en mass.&lt;br /&gt;
* Random questions are now added to the quiz question list with a dedicated button, leaving a cleaner interface at questions database without phantom placeholders&lt;br /&gt;
* Final grade can be a fractional number, with teacher-defined decimal figures&lt;br /&gt;
* Improved results page with user-selectable display of columns, cleaner sorting and new mark display options&lt;br /&gt;
* Questions can be edited with one click from the improved quiz preview and question preview screens.&lt;br /&gt;
* Questions can be copied with one click, to allow question variations to be created with ease.&lt;br /&gt;
* Revamped question categories structures and editing interface.&lt;br /&gt;
* Categories now can contain nested subcategories and can be re-ordered.&lt;br /&gt;
* It is possible to select whether questions from categories, and or their subcategories are displayed on the question edit page.&lt;br /&gt;
* It is now possible to select whether to add random questions from a parent category alone, or from a parent category and its sub-categories.&lt;br /&gt;
* Quiz creators are prevented from changing the question set of quizes that have had student responses.&lt;br /&gt;
* Recognition, and rejection, of overlapping/redundant questions has been improved.&lt;br /&gt;
* The display of questions in longer quiz categories on the quiz editing page is now paginated.&lt;br /&gt;
* New export types - IMS QTI (2.0) and xhtml. Improvements &amp;amp; fixes to others.&lt;br /&gt;
* New import type - Hot Potato. Improvements &amp;amp; fixes to others.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Scorm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The module is now fully conformant with the SCORM 1.2 standard.&lt;br /&gt;
* User result data storage and reporting was improved.&lt;br /&gt;
* AICC packages can now be imported.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Survey&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Graph formatting has been improved (labels are more readable)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Changes to wiki pages are now monitored and displayed in Recent Activity block&lt;br /&gt;
* Several under the hood improvements to backup/restore and other routines that enhance the reliability of wikis&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
*[[Old releases|1.4.5 release notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[es:Notas de versiones]]&lt;br /&gt;
[[fr:Notes de mise à jour]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19775</id>
		<title>User:Nicolas Martignoni</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Nicolas_Martignoni&amp;diff=19775"/>
		<updated>2006-03-27T06:27:32Z</updated>

		<summary type="html">&lt;p&gt;Mina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Translation of Moodle in french&lt;br /&gt;
* Sysop of french [[:fr:Accueil|Moodle Docs]]&lt;br /&gt;
* My [http://moodle.org/user/view.php?id=6406&amp;amp;course=5 user profile] on moodle.org&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Tests&amp;diff=3222</id>
		<title>Tests</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Tests&amp;diff=3222"/>
		<updated>2006-03-16T10:54:50Z</updated>

		<summary type="html">&lt;p&gt;Mina: Add category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is currently under construction. More testing plans will be added. You are more than welcome to add any test plan. When we have enough test plans, we would like some help from the community to test each new Moodle release.&lt;br /&gt;
&lt;br /&gt;
This test plan is far from perfect, please feel free to correct any mistake or add some scenarios :-)&lt;br /&gt;
&lt;br /&gt;
These scenarios should be run in Moodle Test Course that can be downloaded [http://download.moodle.org/testcourse/Moodle-tests-course-20060316-1232.zip here]&lt;br /&gt;
&lt;br /&gt;
Here are some general rules:&lt;br /&gt;
&lt;br /&gt;
*Test Case Naming conventions:&lt;br /&gt;
      [AAA] 	: 3 Alphabets that represents the module name&lt;br /&gt;
      [000]	: 3 Digits numbers that number the question&lt;br /&gt;
      [A]	: Potential actor = S: student, T: teacher, A: admin&lt;br /&gt;
&lt;br /&gt;
The testing plans are categorized by modules:&lt;br /&gt;
* [[Tests/Assignment]]&lt;br /&gt;
* [[Tests/Chat]]&lt;br /&gt;
* [[Tests/Choice]]&lt;br /&gt;
* [[Tests/Forum]]&lt;br /&gt;
* [[Tests/Quiz]]&lt;br /&gt;
* [[Tests/Resource]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[es:Juegos de pruebas]]&lt;/div&gt;</summary>
		<author><name>Mina</name></author>
	</entry>
</feed>