<?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=CHRISF</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=CHRISF"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/CHRISF"/>
	<updated>2026-06-08T23:30:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Enrolment_API&amp;diff=37929</id>
		<title>Enrolment API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Enrolment_API&amp;diff=37929"/>
		<updated>2013-02-22T13:45:46Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: Example call to get_enrolled_users() was passing &amp;quot;true&amp;quot; to the $userfields argument&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since Moodle  2.0 there is a new concept of user enrolments, they are fully independent from the roles and capabilities. Capabilities are very often used in combination with enrolment status.&lt;br /&gt;
&lt;br /&gt;
==What is enrolment?==&lt;br /&gt;
&lt;br /&gt;
Enrolled users may fully participate in a course. Active user enrolment allows user to enter course. Only enrolled users may be group members. Grades are stored only for enrolled users.&lt;br /&gt;
&lt;br /&gt;
==Unenrolment==&lt;br /&gt;
&lt;br /&gt;
Unenrolment is irreversible operation that purges user participation information. Full unenrolment is suitable only if you do not need to preserve all course participation information including user grades.&lt;br /&gt;
&lt;br /&gt;
==Enrolment status==&lt;br /&gt;
&lt;br /&gt;
Instead of full unenrolment it is usually better to only &#039;&#039;suspend&#039;&#039; user enrolment. If there are other ways to enter the course (such guest access) it is recommended to remove user roles at the same time.&lt;br /&gt;
&lt;br /&gt;
==Activity participation==&lt;br /&gt;
&lt;br /&gt;
Activity developers decide the enrolment related behaviour of module.&lt;br /&gt;
&lt;br /&gt;
There are some general guidelines:&lt;br /&gt;
* Only users with active enrolments should receive notifications.&lt;br /&gt;
* Activities should display enrolled users with some capability as participants.&lt;br /&gt;
* By default only users with active enrolments should be displayed in reports.&lt;br /&gt;
* There should be option to display all enrolled users including suspended enrolments.&lt;br /&gt;
* For performance reasons invisible participation data should be purged on unenrolment.&lt;br /&gt;
* Contributions visible by other participants should be kept after unenrolment (such as forum posts).&lt;br /&gt;
&lt;br /&gt;
==API functions==&lt;br /&gt;
&lt;br /&gt;
===is_enrolled()===&lt;br /&gt;
Is user participating in the course? Returns true for students and teachers, false for administrators and other managers. User enrolments can be either active or suspended, suspended users can not enter the course (unless there is some kind of guest access allowed) or have moodle/course:view capability and are usually hidden in the UI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function is_enrolled(context $context, $user = null, $withcapability = &#039;&#039;, $onlyactive = false)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Good example is choice module where we have one slot for each participant, people that are not enrolled are not allowed to vote &amp;lt;code&amp;gt;is_enrolled($context, $USER, &#039;mod/choice:choose&#039;)&amp;lt;/code&amp;gt;. Another example is assignment where users need to be enrolled and have capability to submit assignemnts &amp;lt;code&amp;gt;is_enrolled($this-&amp;gt;context, $USER, &#039;mod/assignment:submit&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===get_enrolled_users()===&lt;br /&gt;
&lt;br /&gt;
Sometimes you need to know the list of users that can participate in some activity.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function get_enrolled_sql(context $context, $withcapability = &#039;&#039;, $groupid = 0, $onlyactive = false)&lt;br /&gt;
function get_enrolled_users(context $context, $withcapability = &#039;&#039;, $groupid = 0, $userfields = &#039;u.*&#039;, $orderby = &#039;&#039;, $limitfrom = 0, $limitnum = 0)&lt;br /&gt;
function count_enrolled_users(context $context, $withcapability = &#039;&#039;, $groupid = 0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example you want to know who is able to summit assignment right now:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$submissioncandidates = get_enrolled_users($modcontext, &#039;mod/assignment:submit&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The assignment module needs to hold data for all users that are enrolled including the users with suspended enrolments and without any roles. Module developers may decide to purge all user data when user is fully unenrolled.&lt;br /&gt;
&lt;br /&gt;
SQL select from get_enrolled_sql() is often used for performance reasons - you can use it in joins to get specific information for enrolled users only.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Enrolment plugins]]&lt;br /&gt;
* [[Enrolment usage overview]]&lt;br /&gt;
* [[New enrolments in 2.0]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Enrolment]]&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_2.3_release_notes&amp;diff=34388</id>
		<title>Moodle 2.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_2.3_release_notes&amp;diff=34388"/>
		<updated>2012-07-06T13:08:20Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
 &lt;br /&gt;
Release date: 25th June 2012&lt;br /&gt;
 &lt;br /&gt;
Here is [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%222.3%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 2.3].&lt;br /&gt;
 &lt;br /&gt;
Many thanks to [http://moodle.org/dev/contributions.php?version=2.3.x everyone that worked on the new features in this release], including those from [http://moodle.com/hq/team Moodle HQ], [http://www.open.ac.uk/ The Open University], [http://www.netspot.com.au/ NetSpot], [http://www.synergy-learning.com/ Synergy Learning], [http://www.luns.net.uk/ Lancaster University Network Services], [http://catalyst.net.nz/ Catalyst IT], [http://www.cvaconsulting.com/ CV&amp;amp;A Consulting] (funded by [http://www.esade.edu ESADE] and [http://www.il3.ub.edu IL3-UB]) and others.  More details can be found below under each major feature, or look at the list of bugs fixed above.&lt;br /&gt;
&lt;br /&gt;
A special thanks to our incredible &#039;&#039;&#039;&#039;Integration Team&#039;&#039;&#039;&#039; from Moodle HQ who worked tirelessly with all developers to review, test and help finish code for inclusion in Moodle core:&lt;br /&gt;
&lt;br /&gt;
* Eloy Lafuente&lt;br /&gt;
* Sam Hemelryk&lt;br /&gt;
* Dan Poltawski&lt;br /&gt;
* Aparup Bannerjee &lt;br /&gt;
&lt;br /&gt;
Finally, thanks to all our testers both within Moodle HQ and from the whole community, who have contributed to producing our most exciting and stable release yet!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
&lt;br /&gt;
* Minimum browser: Firefox 4, Internet Explorer 8, Safari 5, Google Chrome 11, Opera 9&lt;br /&gt;
* Moodle upgrade:  Moodle 2.2 or later (if upgrading from earlier versions, you must upgrade to 2.2 as a first step)&lt;br /&gt;
* Minimum DB versions: Postgres 8.3, MySQL 5.1.33 (MDL-33984), MSSQL 2005 or Oracle 10.2&lt;br /&gt;
* Minimum PHP version: PHP 5.3.2&lt;br /&gt;
&lt;br /&gt;
===Major new features===&lt;br /&gt;
&lt;br /&gt;
====Files usability====&lt;br /&gt;
&lt;br /&gt;
* MDL-31907 - A nicer-looking file picker with fewer clicks.&lt;br /&gt;
* Images now display as true thumbnails in the file picker and file manager.&lt;br /&gt;
* Other files have pretty icons for most file types.&lt;br /&gt;
* Files view can be easily toggled between icons view or a table view with sizes and dates, or a hierarchical list view.&lt;br /&gt;
* You can now drag and drop files directly from your desktop straight into file areas!&lt;br /&gt;
* File info (eg license information, sizes, dates) can be easily edited and viewed in a popup dialogue.&lt;br /&gt;
* Files can be created as &amp;quot;aliases/shortcuts&amp;quot; of other files.  This allows you to, for example, use a single file in your private files area multiple times in all your courses.  If you update the original file then all the aliases will automatically update!&lt;br /&gt;
* Aliases are easily identifiable in the file manager interface.&lt;br /&gt;
&lt;br /&gt;
Credits to Moodle HQ: Marina Glancy, Barbara Ramiro, Martin Dougiamas, David Mudrak, Dongsheng Cai and others.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[File:truthumbnailsiconsview.png|thumb|File picker icon view]]&lt;br /&gt;
| [[File:tableview.png|thumb|File picker table view]]&lt;br /&gt;
| [[File:hierarchicallistview.png|thumb|File picker hierarchical list view]]&lt;br /&gt;
|-&lt;br /&gt;
| [[File:popupdialogue.png|thumb|File info popup dialogue]]&lt;br /&gt;
| [[File:alias.png|thumb|Creating an alias]]&lt;br /&gt;
| [[File:shortcut1.png|thumb|Aliases are easily identifiable]]&lt;br /&gt;
|}&lt;br /&gt;
====Repository improvements====&lt;br /&gt;
&lt;br /&gt;
* MDL-32117 - New [https://docs.moodle.org/23/en/EQUELLA_repository EQUELLA repository] enabling users to make aliases (shortcuts) to EQUELLA files.&lt;br /&gt;
* MDL-28666 - If a repository supports it then it&#039;s possible to make an alias/shortcut to a file in an external repository.  If the file is updated in the repository, then this change is reflected in Moodle.  The file remains under Moodle access control however, and the original URL is not usually revealed. In the 2.3 core release, this is supported by private files, server files, file system, Box.net and EQUELLA repositories.&lt;br /&gt;
* The repository plugin is now able to take over the whole right-hand pane of the file picker and provide its own searching/browsing interface.&lt;br /&gt;
* MDL-31675 - Server files repository now available for database, forum and glossary activities.&lt;br /&gt;
&lt;br /&gt;
Credits to Moodle HQ: Dongsheng Cai, Marina Glancy, Martin Dougiamas, Petr Skoda&lt;br /&gt;
&lt;br /&gt;
====Improvements to course pages ====&lt;br /&gt;
&lt;br /&gt;
* MDL-32476 - Courses can now choose to show sections on individual pages&lt;br /&gt;
* MDL-31052 - All AJAX editing on the course pages has been modernised and cleaned up (YUI3).  It&#039;s on by default now too.&lt;br /&gt;
* MDL-31263 - Blocks can be dragged and dropped around the page (again)&lt;br /&gt;
* MDL-30617 - An optional new popup [https://docs.moodle.org/23/en/Course_homepage &amp;quot;Activity chooser&amp;quot;] has been added with full introduction, examples and links about each activity or resource module.&lt;br /&gt;
* MDL-22504 - You can now drag files straight into the course page and they will be added as resources.&lt;br /&gt;
* MDL-31215 - You can edit the name of any activity or resource directly on the course page without entering the settings (works particularly well with drag and drop).&lt;br /&gt;
* MDL-32771 - You can now add/remove sections directly from the [https://docs.moodle.org/23/en/Course_homepage course page].&lt;br /&gt;
&lt;br /&gt;
Credits to: Andrew Nicols and Ruslan Kabalin (LUNS) Davo Smith (Synergy Learning), Dan Poltawski and Martin Dougiamas (Moodle HQ)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| [[File:dragandrop.png|thumb|File drag and drop]]&lt;br /&gt;
| [[File:activity chooser.png|thumb|Activity chooser]]&lt;br /&gt;
|}&lt;br /&gt;
====Assignment module====&lt;br /&gt;
&lt;br /&gt;
* MDL-26997 - Complete rewrite of the assignment module from scratch, by [http://www.netspot.com.au/ NetSpot] (Moodle Partner in Australia)&lt;br /&gt;
* Assignment subtypes are no longer needed.  New plugins are possible for &lt;br /&gt;
* Old Assignment module is still installed, and works, but is not necessary &lt;br /&gt;
&lt;br /&gt;
Credits to Netspot: Damyon Wiese, Raymond Wijaya, Minh-Tam Nguyen&lt;br /&gt;
&lt;br /&gt;
* MDL-31731 - New [https://docs.moodle.org/23/en/Marking_guide marking guide] advanced grading method, where a teacher enters a comment per criterion and a mark up to a maximum&lt;br /&gt;
&lt;br /&gt;
Credits to Dan Marsden Catalyst IT (development); Lightwork Team at Massey University (concept); NetSpot Innovation Grant (funding)&lt;br /&gt;
&lt;br /&gt;
====Book module====&lt;br /&gt;
&lt;br /&gt;
* MDL-32709 - The most popular third-party resource module ever, [https://docs.moodle.org/23/en/Book_module Book] finally joins core.  Welcome!&lt;br /&gt;
&lt;br /&gt;
Credits to Petr Škoda, Moodle HQ&lt;br /&gt;
&lt;br /&gt;
====Quiz module====&lt;br /&gt;
 &lt;br /&gt;
* MDL-3030 - More robust handling of quiz attempts that are not submitted by the deadline.&lt;br /&gt;
* MDL-3054 &amp;amp; MDL-11047 - There is now an option for teacher to force students to answer the quiz questions strictly in order. As part of this, the quiz remembers which page the student was last on, and will take them back there when they resume an attempt.&lt;br /&gt;
&lt;br /&gt;
Credits to Tim Hunt, The Open University and Charles Fulton, Lafayette College&lt;br /&gt;
&lt;br /&gt;
====SCORM module====&lt;br /&gt;
&lt;br /&gt;
* MDL-29745 - New [https://docs.moodle.org/23/en/Using_SCORM SCORM graph report] plugin (credits to Ankit Agarwal, Moodle HQ and Dan Marsden, Catalyst IT)&lt;br /&gt;
* MDL-32937 - You can now drag a SCORM package straight into the course page and it will be added as SCORM activity (credits to Christopher Tombleson and Dan Marsden, Catalyst IT, and Davo Smith, Synergy Learning)&lt;br /&gt;
&lt;br /&gt;
====Workshop module====&lt;br /&gt;
&lt;br /&gt;
* MDL-26099 - [https://docs.moodle.org/23/en/Workshop_settings Option to make the workshop switch to the assessment phase] automatically after the submissions deadline (including automatic allocation of submissions for assessment)&lt;br /&gt;
* MDL-25660 - Workshop submission deadlines are shown in the calendar&lt;br /&gt;
* MDL-27508 - Improved support for pagination and filtering workshop submissions by group&lt;br /&gt;
* MDL-32638 - Workshop supports file browsing via Server files repository (including improved access control when serving submission files)&lt;br /&gt;
&lt;br /&gt;
Credits to David Mudrak, Moodle HQ&lt;br /&gt;
&lt;br /&gt;
====Available update notifications====&lt;br /&gt;
&lt;br /&gt;
*MDL-20438 - Admins are sent [https://docs.moodle.org/23/en/Notifications notification of any updates available] for core code and for any contributed plugins installed on the site (from the [http://moodle.org/plugins plugins directory]). Admins can also check for available updates using buttons on the notifications and plugins overview pages.&lt;br /&gt;
&lt;br /&gt;
Credits to David Mudrak, Moodle HQ&lt;br /&gt;
&lt;br /&gt;
===Other highlights===&lt;br /&gt;
&lt;br /&gt;
====Google Docs and Picasa plugins requirement====&lt;br /&gt;
&lt;br /&gt;
* MDL-29857 - Due to a change in Google&#039;s service, Moodle has switched to a more secure and more user-friendly system for communicating with Google called &#039;OAuth 2.0&#039;. An administrator must register their site with Google, as described in [https://docs.moodle.org/23/en/Google_OAuth_2.0_setup Google OAuth 2.0 setup] in order to obtain a client ID and secret for use in configuring all Google Docs and Picasa plugins (the Google Docs and Picasa repositories and the Google Docs and Picasa portfolios).&lt;br /&gt;
&lt;br /&gt;
Credits to Dan Poltawski, Moodle HQ&lt;br /&gt;
&lt;br /&gt;
====IMS Common Cartridge 1.1 Export====&lt;br /&gt;
&lt;br /&gt;
* MDL-33079 - In Moodle 2.2 we introduced IMS CC import.  Well, now you can also export to that format, via the normal Backup menu.  Just look for the IMS CC checkbox.&lt;br /&gt;
&lt;br /&gt;
====Miscellaneous====&lt;br /&gt;
&lt;br /&gt;
* MDL-31121 - Option in [https://docs.moodle.org/23/en/File_module_settings file resource settings] to display file size and/or type on course page (credits to Sam Marshall, The Open University)&lt;br /&gt;
* MDL-32009 - Admin option for uninstalling messaging outputs and report of messaging output statuses on plugins overview page&lt;br /&gt;
* MDL-29941 - Admin option to enable a [https://docs.moodle.org/23/en/CSS_optimiser CSS optimiser] that analyses and refactors CSS before caching it&lt;br /&gt;
* MDL-24419 - [https://docs.moodle.org/23/en/Conditional_activities_settings Conditional activities setting] enabling teachers to restrict access to a course section using similar logic to Conditional Activities (with thanks to the [http://www.unsw.edu.au/ University of New South Wales] for funding and [http://www.netspot.com.au/ NetSpot] for developing this feature and Sam Marshall at the [http://www.open.ac.uk OU] for integrating it to core) &lt;br /&gt;
* MDL-26901 - Option to add extra fonts to the [https://docs.moodle.org/23/en/Text_editor TinyMCE HTML editor]&lt;br /&gt;
* MDL-31315 - When editing a form, a warning will be displayed if trying to navigate away with content edited&lt;br /&gt;
* MDL-33401 - Managers are now allowed the capability to edit blocks (moodle/block:edit) by default for new installs. This does not affect existing installations.&lt;br /&gt;
* MDL-32005 - New group and groupings ID number setting for matching groups and groupings against external systems (credits to Andrew Nicols, LUNS)&lt;br /&gt;
* MDL-30482 - New [https://docs.moodle.org/23/en/Capabilities/mod/glossary:view view glossary entries capability]&lt;br /&gt;
* MDL-31158 - New [https://docs.moodle.org/23/en/Grade_settings recover grades default setting]&lt;br /&gt;
* MDL-11378 - New [https://docs.moodle.org/23/en/Messaging_settings SMTP security email setting]&lt;br /&gt;
&lt;br /&gt;
===Security issues===&lt;br /&gt;
 &lt;br /&gt;
All security issues that were fixed in 2.2.x and 2.1.x were also fixed in 2.3. &lt;br /&gt;
 &lt;br /&gt;
===For developers: API changes===&lt;br /&gt;
&lt;br /&gt;
Abbreviated descriptions of API changes are always kept up to date in the &amp;quot;upgrade.txt&amp;quot; within each plugin area.  We do this so that the information is always exactly right for the version of Moodle you are using. Changes in this release:&lt;br /&gt;
&lt;br /&gt;
;Blocks: http://git.moodle.org/gw?p=moodle.git;a=blob;f=blocks/upgrade.txt;hb=master&lt;br /&gt;
;Course formats: http://git.moodle.org/gw?p=moodle.git;a=blob;f=course/format/upgrade.txt;hb=master&lt;br /&gt;
;Filters: http://git.moodle.org/gw?p=moodle.git;a=blob;f=filter/upgrade.txt;hb=master&lt;br /&gt;
;Activity modules: http://git.moodle.org/gw?p=moodle.git;a=blob;f=mod/upgrade.txt;hb=master&lt;br /&gt;
;Quiz access rules: http://git.moodle.org/gw?p=moodle.git;a=blob;f=mod/quiz/accessrule/upgrade.txt;hb=master&lt;br /&gt;
;Quiz reports: http://git.moodle.org/gw?p=moodle.git;a=blob;f=mod/quiz/report/upgrade.txt;hb=master&lt;br /&gt;
;Portfolio plugins: http://git.moodle.org/gw?p=moodle.git;a=blob;f=portfolio/upgrade.txt;hb=master&lt;br /&gt;
;Question behaviour plugins: http://git.moodle.org/gw?p=moodle.git;a=blob;f=question/behaviour/upgrade.txt;hb=master&lt;br /&gt;
;Question behaviour plugins: http://git.moodle.org/gw?p=moodle.git;a=blob;f=question/format/upgrade.txt;hb=master&lt;br /&gt;
;Question types: http://git.moodle.org/gw?p=moodle.git;a=blob;f=question/type/upgrade.txt;hb=master&lt;br /&gt;
;Repository plugins: http://git.moodle.org/gw?p=moodle.git;a=blob;f=repository/upgrade.txt;hb=master&lt;br /&gt;
;Themes: http://git.moodle.org/gw?p=moodle.git;a=blob;f=theme/upgrade.txt;hb=master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Core API changes====&lt;br /&gt;
* MDL-31902 All xxx_get_participants() functions are removed from core&lt;br /&gt;
* As a part of MDL-32471, the signature of send_stored_file() has been [http://git.moodle.org/gw?p=moodle.git;a=commitdiff;h=796495fed29f12e4a81bd406558d8eeffd0e64ac modified]. The last two parameters $filename and $dontdie were replaced with a single array containing additional options for the file serving. The pluginfile callbacks in plugins are supposed to transfer these options from the caller to send_stored_file() - see the note below.&lt;br /&gt;
* MDL-28666 Files API changes, added ability to create file reference using file_storage::create_file_from_reference() method, update file record attributes using stored_file class&lt;br /&gt;
* MDL-28666 Repository API changes, added new APIs repository::get_file_reference(), repository::get_file_by_reference(), repository::get_reference_details(), repository::send_file(), the new APIs make serving files from external repository possible&lt;br /&gt;
* MDL-33446 Make sure that areas in your plugins where you DON&#039;T want content to change have support for file references turned OFF.  Some areas in Moodle core that do not support references are assignment submissions, workshop submissions, forum posts, and quiz essay questions - this is so that students are not able to update files from outside Moodle after any due date&lt;br /&gt;
* AJAX Flags: MDL-32509 and MDL-32908 The $CFG-&amp;gt;enablecourseajax  and $USER-&amp;gt;ajax fields have been removed. The fields was not widely respected and all &#039;advanced javascript&#039; should work in a progressive enhancement and accessible way. A site wide flag still exists but may be phased out in the future.&lt;br /&gt;
&lt;br /&gt;
====Plugin API changes====&lt;br /&gt;
&lt;br /&gt;
* As a part of MDL-32471, the API of the plugin function xyz_pluginfile() has been extended. There is a new array parameter passed to these callbacks containing additional options for the file serving. The array should be re-passed to send_stored_file(). The change is pretty trivial - see [http://git.moodle.org/gw?p=moodle.git;a=commitdiff;h=261cbbacc15ef1732a357d689908c91c15e0617a examples].&lt;br /&gt;
* Activity modules can now declare support for course drag and drop upload [[Implementing_Course_drag_and_drop_upload_support_in_a_module]]&lt;br /&gt;
&lt;br /&gt;
====Webservice changes====&lt;br /&gt;
Few changes could break existing web service clients in 2.3 - untill this version we tried not to break anything. However these changes will make the client&#039;s developer life easier, so we prefered to do them now than later. Please take in consideration these improvements and retest your clients:&lt;br /&gt;
* [https://docs.moodle.org/dev/Errors_handling_in_web_services Error codes and Warnings]&lt;br /&gt;
* All text fields have an additional format field as parameter and return value (MDL-32581)&lt;br /&gt;
* Thanks to the increasing number of contributions, we improved our [https://docs.moodle.org/dev/How_to_contribute_a_web_service_function_to_core contributor web service guide]&lt;br /&gt;
* From 2.3, all web service functions integrated in master will land (when possible) in supported minor versions (e.g. 2.3.1, 2.3.2...).&lt;br /&gt;
* Many [http://tracker.moodle.org/browse/MDL-31253 fixes] and new [http://tracker.moodle.org/browse/MDL-29934 API functions].&lt;br /&gt;
&lt;br /&gt;
====Unit tests====&lt;br /&gt;
&lt;br /&gt;
We have switched completely to using [[PHPUnit]] for all our unit tests now.  All existing simpletests have been rewritten, and new tests have been added.  &lt;br /&gt;
&lt;br /&gt;
We intend to move towards a completely unit-test-driven development methodology (where the tests are written first!) for significant new code, and we also encourage all developers to implement unit tests covering at least the core features of their code.&lt;br /&gt;
&lt;br /&gt;
Moodle HQ run these tests on an automated basis for all new code submitted for integration, as well as on each weekly release.&lt;br /&gt;
&lt;br /&gt;
==== Community hub changes ====&lt;br /&gt;
Some bug fixes and improvements in [http://tracker.moodle.org/browse/MDL-30247  core] and in the [http://tracker.moodle.org/browse/CONTRIB-3348 plugin]. Hub administrators must update their hub to the most recent version regarding CONTRIB-3646. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;==See also==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.moodle.org/23/en/Category:New_features User documentation of new features in Moodle 2.3]&lt;br /&gt;
* [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to Moodle 2.3] - information for admins who are upgrading from earlier versions&lt;br /&gt;
*[[Moodle 2.2 release notes]]&lt;br /&gt;
 &lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 2.3]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 2.3]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Talk:Core_APIs&amp;diff=32371</id>
		<title>Talk:Core APIs</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Talk:Core_APIs&amp;diff=32371"/>
		<updated>2012-02-20T15:07:34Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: /* Some early comments about this list of APIs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Some early comments about this list of APIs ===&lt;br /&gt;
&lt;br /&gt;
* Surely there is one reason for inventing this, completely bypassing the existing components (both for plugins, subplugins and subsystems). But I cannot really imagine it. Why not use direct mapping between components and APIs ? Code is going to use ones and docs are going to use another?&lt;br /&gt;
* More yet, I don&#039;t get why the list of APIs ignores everything that is provided with plugin abilitites. Aren&#039;t &amp;quot;auth&amp;quot; or &amp;quot;enrol&amp;quot; or &amp;quot;reports&amp;quot; valid core APIs? In fact I think that the parts of Moodle currently working under the &amp;quot;plugins umbrella&amp;quot; are the most formal APIs we have in codebase (at least the OOP ones).&lt;br /&gt;
* Some of the APIs in the list seem incorrect, inaccurate:&lt;br /&gt;
** database API. it should be split, for sure in ddl and dml APIs at least.&lt;br /&gt;
** time API. =&amp;gt; datetime, surely.&lt;br /&gt;
** renderer API =&amp;gt; is that really an API&lt;br /&gt;
** upgrade API =&amp;gt; WTF is that? I&#039;m specially interested on that, as far as it seems I&#039;m the man in charge of documenting it and I don&#039;t know what the hell it is (MDL-30971).&lt;br /&gt;
** grade and grading APIs =&amp;gt; Should we have also group and grouping APIs? (sorry, joking, hehe, but don&#039;t buy the difference).&lt;br /&gt;
** preference API : set/get/remove_user_preference() functions? Or also config ?&lt;br /&gt;
** admin API ?&lt;br /&gt;
** user API ?&lt;br /&gt;
** install/uninstall API ?&lt;br /&gt;
** ...&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
So, in summary, I don&#039;t get which benefits this new list provides, nor I think we are doing well by keeping apart some APIs because of them being &amp;quot;pluggable&amp;quot;, nor I think the APIs are well balanced at all. Just my 2cents (really not destructive, but constructive, although it sounds the opposite, guys).&lt;br /&gt;
&lt;br /&gt;
--[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 05:52, 5 January 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
Certainly I agree with Eloy on this one. Why introduce another list of the same API&#039;s we already have.&amp;lt;br /&amp;gt;&lt;br /&gt;
While they look 80% the difference between the code and documentation will cause real confusion for developers learning Moodle, especially in regards to terminology.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think we need to take great care that we don&#039;t come up with new terminology for things within Moodle.&amp;lt;br /&amp;gt;&lt;br /&gt;
As Eloy noted there are some things in the API list that don&#039;t make sense, I&#039;ve just gone through as part of MDL-30979 and updated the PHP docs for the Output API&#039;s. I assume that is what you mean by renderer API, hehe you&#039;ve confused me with that one?!&lt;br /&gt;
&lt;br /&gt;
Cheers&amp;lt;br /&amp;gt;&lt;br /&gt;
--[[User:Sam Hemelryk|Sam Hemelryk]] 09:48, 5 January 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
i think i also generally share the sentiments above, so here&#039;s my general &#039;exactly!&#039; for the above. &lt;br /&gt;
&lt;br /&gt;
definitely for ddl and dml being mashed together into database API is sad loss of definition. I think theres certainly room for more planned and in depth discussions about our terminologies. not to mention the phpdoc is still not clearly and somewhat agreeably defined in our documentation project where we&#039;re implementing this atm.&lt;br /&gt;
&lt;br /&gt;
(whee first talk page comment by me!) cheers!&lt;br /&gt;
&lt;br /&gt;
[[User:Aparup Banerjee|Aparup Banerjee]] 00:18, 6 January 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This new list is for documentation purposes only.  We need a new list because NO OLD LIST OF APIS EXISTS!   There *is* no table of contents that can group all the main functions available for *PLUGIN AUTHORS*.  This started as a subset of get_core_subsystems() and has had things added where necessary.&lt;br /&gt;
&lt;br /&gt;
Getting to specifics from above, based on discussion in HQ this morning and my thoughts:&lt;br /&gt;
&lt;br /&gt;
* database -&amp;gt; ddl and dml   AGREED, done.  &lt;br /&gt;
* time -&amp;gt; datetime   Is the reason because of PHPs name?  We don&#039;t use that name anywhere else?  &lt;br /&gt;
* renderer -&amp;gt; output   AGREED.  Either is fine for me.  &amp;quot;Renderer&amp;quot; was what EU people agreed on some weeks ago and it is a bit better for googling, but whatever.&lt;br /&gt;
* upgrade API : It&#039;s meant to be everything you can do in upgrade/install (including upgradelib.php and all the tricks we use), and I was thinking it included DDL too.  We can leave it until later if required.&lt;br /&gt;
* grade and grading APIs =&amp;gt; They are completely separate APIs.  The names are a little confusing but I think we need to reuse get_core_subsystems() were possible.&lt;br /&gt;
* preference API : set/get/remove_user_preference() functions, yes.&lt;br /&gt;
* admin API -&amp;gt; Yes, I guess we need to explain settings.php and friends.  Thanks.&lt;br /&gt;
* user API -&amp;gt; That&#039;s hard to identify.  I left it out for now as very few plugins needs to create/edit/delete users.  or courses.&lt;br /&gt;
* install/uninstall API -&amp;gt; Don&#039;t know about that.  install.xml and what else?&lt;br /&gt;
&lt;br /&gt;
--[[User:Martin Dougiamas|Martin Dougiamas]] 11:28, 6 January 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
Re: a User and a Course API, I think these would be very useful for those of us trying to integrate Moodle with our Student Information Systems.  I had a look at Jerome&#039;s Web Services API, but I think there have been some fundamental oversights in that implementation.  All of those functions require that you know the ID of things like users and courses, when an external system is not going to have that information.  It would be useful to be able to do things like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$user = get_user(array(&#039;username&#039;=&amp;gt;&#039;chrisf&#039;));&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;$course = get_course(array(&#039;idnumber&#039;=&amp;gt;&#039;CF101&#039;));&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;enrol_user(array(&#039;username&#039;=&amp;gt;&#039;chrisf&#039;), array(&#039;idnumber&#039;=&amp;gt;&#039;CF101&#039;) [,rolename])&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
The user and course tables contain columns for &amp;lt;code&amp;gt;idnumber&amp;lt;/code&amp;gt;, which seems uniquely suited to operations of this type.  I&#039;m kind of surprised no-one else seems to be looking for this kind of API.&lt;br /&gt;
&lt;br /&gt;
-- [[User:Chris Fryer|Chris Fryer]] 23:07, 20 February 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
=== About completion and availability (aka condition) ===&lt;br /&gt;
&lt;br /&gt;
Plz, take a look to MDL-30996 (and MDL-30995). IMO we need to clearly state the differences and uses, both between those 2 APIs and with the &amp;quot;course completion&amp;quot; one, that I don&#039;t know if should have its own API. This involves rethinking the names given for each API, and their occurrences/explanation both in phpdocs and Docs.&lt;br /&gt;
&lt;br /&gt;
--[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 19:47, 8 February 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
I agree, we should state differences and uses between completion and condition. Saying so, condition should not be changed to availability, because get_core_subsystem() return condition and it should be similar. I am not sure about course_completion, so no comments.&lt;br /&gt;
&lt;br /&gt;
--[[User:Rajesh Taneja (rajesh)|Rajesh Taneja (rajesh)]]&lt;br /&gt;
&lt;br /&gt;
: But, once again, we decided to have the APIs under the @category umbrella to have them *separated* (and free) from packages. So I don&#039;t find any problem naming them properly (and differently from their @package couterparts). They are just two *independent* ways to list/group things, so better if at least one of them is correct.&lt;br /&gt;
&lt;br /&gt;
:--[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 17:19, 9 February 2012 (WST)&lt;br /&gt;
&lt;br /&gt;
=== Some 2 little details about naming ===&lt;br /&gt;
&lt;br /&gt;
* Also, offtopic, it&#039;s a bit inconsistent to use &amp;quot;gerunds&amp;quot; for some APIs (rating, grading...), plurals for others (files..) and nouns/verbs (which is the official way, nouns?) for the rest.&lt;br /&gt;
&lt;br /&gt;
* Finally, Docs should match the name of the API completely, or at least offer one redirect from it, so anybody can make https://docs.moodle.org/dev/xxxx_API and arrive to the desired page. Sounds silly but surely it&#039;s useful to include jumps between system X and the Docs.&lt;br /&gt;
&lt;br /&gt;
--[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 19:58, 8 February 2012 (WST)&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Web_Services&amp;diff=26538</id>
		<title>Web Services</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Web_Services&amp;diff=26538"/>
		<updated>2011-06-30T10:19:01Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: Redirected page to Web services&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Web_services]]&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File_API_internals&amp;diff=8351</id>
		<title>File API internals</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File_API_internals&amp;diff=8351"/>
		<updated>2010-12-02T12:09:32Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}&lt;br /&gt;
{{Infobox Project&lt;br /&gt;
|name = File API&lt;br /&gt;
|state = Implemented&lt;br /&gt;
|tracker = MDL-14589&lt;br /&gt;
|discussion = n/a&lt;br /&gt;
|assignee = [[User:Petr Škoda (škoďák)|Petr Škoda (škoďák)]]&lt;br /&gt;
}}&lt;br /&gt;
{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
==Objectives==&lt;br /&gt;
&lt;br /&gt;
The goals of the new File API are: &lt;br /&gt;
&lt;br /&gt;
* allow files to be stored within Moodle, as part of the content (as we do now).&lt;br /&gt;
* use a consistent and flexible approach for all file handling throughout Moodle.&lt;br /&gt;
* give modules control over which users can access a file, using capabilities and other local rules.&lt;br /&gt;
* make it easy to determine which parts of Moodle use which files, to simplify operations like backup and restore.&lt;br /&gt;
* track where files originally came from.&lt;br /&gt;
* avoid redundant storage, when the same file is used twice.&lt;br /&gt;
* fully support Unicode file names, irrespective of the capabilities of the underlying file system.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
The File API is a set of core interfaces to allow the rest of Moodle to store, serve and manage files. It applies only to files that are part of the Moodle site&#039;s content. It is not used for internal files, such as those in the following subdirectories of dataroot: temp, lang, cache, environment, filter, search, sessions, upgradelogs, ...&lt;br /&gt;
&lt;br /&gt;
The API can be subdivided into the following parts:&lt;br /&gt;
; File storage&lt;br /&gt;
: Low level file storage without access control information. Stores the content of files on disc, with metadata in associated database tables. &lt;br /&gt;
; File serving&lt;br /&gt;
: Lets users accessing a Moodle site get the files (file.php, draftfile.php, pluginfile.php, userfile.php, etc.)&lt;br /&gt;
:* Serve the files on request&lt;br /&gt;
:* with appropriate security checks&lt;br /&gt;
; File related user interfaces&lt;br /&gt;
: Provides the interface for (lib/form/file.php, filemanager.php, filepicker.php and files/index.php, draftfiles.php)&lt;br /&gt;
:* Form elements allowing users to select a file using the Repository API, and have it stored within Moodle.&lt;br /&gt;
:* UI for users to manage their files, replacing the old course files UI&lt;br /&gt;
; File browsing API&lt;br /&gt;
: Allows code to browse and optionally manipulate the file areas&lt;br /&gt;
:* find information about available files in each area.&lt;br /&gt;
:* print links to files.&lt;br /&gt;
:* optionally move/rename/copy/delete/etc.&lt;br /&gt;
&lt;br /&gt;
== File API internals ==&lt;br /&gt;
&lt;br /&gt;
=== File storage on disk ===&lt;br /&gt;
&lt;br /&gt;
Files are stored in $CFG-&amp;gt;dataroot (also known as moodledata) in the filedir subfolder.&lt;br /&gt;
&lt;br /&gt;
Files are stored according to the SHA1 hash of their content. This means each file with particular contents is stored once, irrespective of how many times it is included in different places, even if it is referred to by different names. (This idea comes from the git version control system.) To relate a file on disc to a user-comprehensible path or filename, you need to use the &#039;&#039;files&#039;&#039; database table. See the next section.&lt;br /&gt;
&lt;br /&gt;
Suppose a file has SHA1 hash 081371cb102fa559e81993fddc230c79205232ce. Then it will be stored in on disc as moodledata/filedir/08/13/71/081371cb102fa559e81993fddc230c79205232ce.&lt;br /&gt;
&lt;br /&gt;
This means Moodle can not store two files with the same SHA1 hash, luckily it is extremely unlikely that this would ever happen. Technically it is also possible to implement reliable collision tests (with some performance cost), for now we just test file lengths in addition to SHA1 hash.&lt;br /&gt;
&lt;br /&gt;
=== Files table ===&lt;br /&gt;
&lt;br /&gt;
This table contains one entry for each usage of a file. Enough information is kept here so that the file can be fully identified and retrieved again if necessary. It is necessary because some databases have hard limit on index size.&lt;br /&gt;
&lt;br /&gt;
If, for example, the same image is used in a user&#039;s profile, and a forum post, then there will be two rows in this table, one for each use of the file, and Moodle will treat the two as separate files, even though the file is only stored once on disc.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Info&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;id&#039;&#039;&#039; &lt;br /&gt;
| int(10)  &lt;br /&gt;
| auto-incrementing&lt;br /&gt;
| The unique ID for this file.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;contenthash&#039;&#039;&#039;&lt;br /&gt;
| varchar(40)&lt;br /&gt;
|  &lt;br /&gt;
| The sha1 hash of content.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pathnamehash&#039;&#039;&#039;&lt;br /&gt;
| varchar(40)&lt;br /&gt;
| &lt;br /&gt;
| The sha1 hash of &amp;quot;/contextid/component/filearea/itemid/filepath/filename.ext&amp;quot; - prevents file duplicates and allows fast lookup.  It is necessary because some databases have hard limit on index size.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;contextid&#039;&#039;&#039; &lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| The context id defined in context table - identifies the instance of plugin owning the file.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;component&#039;&#039;&#039;&lt;br /&gt;
| varchar(50)&lt;br /&gt;
|&lt;br /&gt;
| Like &amp;quot;mod_forum&amp;quot;, &amp;quot;course&amp;quot;, &amp;quot;mod_assignment&amp;quot;, &amp;quot;backup&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;filearea&#039;&#039;&#039;&lt;br /&gt;
| varchar(50)&lt;br /&gt;
|&lt;br /&gt;
| Like &amp;quot;submissions&amp;quot;, &amp;quot;intro&amp;quot; and &amp;quot;content&amp;quot; (images and swf linked from summaries), etc.; &amp;quot;blogs&amp;quot; and &amp;quot;userfiles&amp;quot; are special case that live at the system context.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;itemid&#039;&#039;&#039;&lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| Some plugin specific item id (eg. forum post, blog entry or assignment submission or user id for user files)&lt;br /&gt;
|-&lt;br /&gt;
| filepath&lt;br /&gt;
| text&lt;br /&gt;
| &lt;br /&gt;
| relative path to file from module content root, useful in Scorm and Resource mod - most of the mods do not need this&lt;br /&gt;
|-&lt;br /&gt;
| filename&lt;br /&gt;
| varchar(255)&lt;br /&gt;
| &lt;br /&gt;
| The full Unicode name of this file (case sensitive)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;userid&#039;&#039;&#039;&lt;br /&gt;
| int(10)  &lt;br /&gt;
| NULL&lt;br /&gt;
| Optional - general user id field - meaning depending on plugin&lt;br /&gt;
|-&lt;br /&gt;
| filesize&lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| size of file - bytes&lt;br /&gt;
|-&lt;br /&gt;
| mimetype&lt;br /&gt;
| varchar(100)&lt;br /&gt;
| NULL&lt;br /&gt;
| type of file&lt;br /&gt;
|-&lt;br /&gt;
| status&lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| general file status flag - will be used for lost or infected files&lt;br /&gt;
|-&lt;br /&gt;
| source&lt;br /&gt;
| text&lt;br /&gt;
| &lt;br /&gt;
| file source - usually url&lt;br /&gt;
|-&lt;br /&gt;
| author&lt;br /&gt;
| varchar(255)&lt;br /&gt;
|&lt;br /&gt;
| original author of file, used when importing from other systems&lt;br /&gt;
|-&lt;br /&gt;
| license&lt;br /&gt;
| varchar(255)&lt;br /&gt;
|&lt;br /&gt;
| license type, empty means site default&lt;br /&gt;
|-&lt;br /&gt;
| timecreated&lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| The time this file was created&lt;br /&gt;
|-&lt;br /&gt;
| timemodified&lt;br /&gt;
| int(10)&lt;br /&gt;
| &lt;br /&gt;
| The last time the file was last modified&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Indexes:&lt;br /&gt;
* non-unique index on (contextid, component, filearea, itemid)&lt;br /&gt;
* non-unique index on (contenthash)&lt;br /&gt;
* unique index on (pathnamehash).&lt;br /&gt;
&lt;br /&gt;
The plugin type does not need to be specified because it can be derived from the context. Items like blog that do not have their own context will use their own file area inside a suitable context. In this case, the user context.&lt;br /&gt;
&lt;br /&gt;
Entries with filename = &#039;.&#039; represent directories. Directory entries like this are created automatically when a file is added within them.&lt;br /&gt;
&lt;br /&gt;
Note: &#039;files&#039; plural is used even thought that goes against the [[Database|coding guidelines]] because &#039;file&#039; is a reserved word in some SQL dialects.&lt;br /&gt;
&lt;br /&gt;
===Implementation of basic operations===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Each plugin may directly access only files in own context and areas!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Low level access API is defined in &#039;&#039;file_storage&#039;&#039; class which is obtained from &amp;lt;code&amp;gt;get_file_storage()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Storing a file====&lt;br /&gt;
&lt;br /&gt;
# Calculate the SHA1 hash of the file contents.&lt;br /&gt;
# Check if a file with this SHA1 hash already exists on disc in file directory or file trash. If not, store the file there.&lt;br /&gt;
# Add the record for this file to the files table using the low level address&lt;br /&gt;
&lt;br /&gt;
====Reading a file====&lt;br /&gt;
&lt;br /&gt;
# Fetch the record (which includes the SHA1 hash) for the file you want from the files table. You can fetch either all area files or quickly get one file with a specific contenthash.&lt;br /&gt;
# Retrieve the contents using the SHA1 hash from the file directory.&lt;br /&gt;
&lt;br /&gt;
====Deleting a file====&lt;br /&gt;
&lt;br /&gt;
# Delete the record from the files table.&lt;br /&gt;
# Verify if some other file is still needing the content, if not move the content file into file trash&lt;br /&gt;
# Later, admin/cron.php deletes content files from trash directory&lt;br /&gt;
&lt;br /&gt;
== File serving ==&lt;br /&gt;
&lt;br /&gt;
Deals with serving of files - browser requests file, Moodle sends it back. We have three main files. It is important to setup slasharguments on server properly (file.php/some/thing/xxx.jpg), any content that relies on relative links can not work without it (scorm, uploaded html pages, etc.).&lt;br /&gt;
&lt;br /&gt;
=== legacy file.php ===&lt;br /&gt;
&lt;br /&gt;
Serves legacy course files, the file name and parameter structure is critical for backwards compatibility of existing course content.&lt;br /&gt;
&lt;br /&gt;
 /file.php/courseid/dir/dir/filename.ext&lt;br /&gt;
&lt;br /&gt;
Internally the files are stored in &amp;lt;code&amp;gt;array(&#039;contextid&#039;=&amp;gt;$coursecontextid, &#039;component;=&amp;gt;&#039;course&#039;, &#039;filearea&#039;=&amp;gt;&#039;legacy&#039;, &#039;itemid&#039;=&amp;gt;0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The legacy course files are completely disabled in all new courses created in 2.0. The major problem here is to how to educate our users that they can not make huge piles of files in each course any more.&lt;br /&gt;
&lt;br /&gt;
=== pluginfile.php ===&lt;br /&gt;
All plugins should use this script to serve all files.&lt;br /&gt;
* plugins decide about access control&lt;br /&gt;
* optional XSS protection - student submitted files must not be served with normal headers, we have to force download instead; ideally there should be second wwwroot for serving of untrusted files&lt;br /&gt;
* links to these files are constructed on the fly from the relative links stored in database, this means that plugin may link only own files&lt;br /&gt;
&lt;br /&gt;
Absolute file links need to be rewritten if html editing allowed in plugin. The links are stored internally as relative links. Before editing or display the internal link representation is converted to absolute links using simple str_replace() @@thipluginlink/summary@@/image.jpg --&amp;gt; /pluginfile.php/assignmentcontextid/intro/image.jpg, it is converted back to internal links before saving.&lt;br /&gt;
&lt;br /&gt;
Script parameters are virtual file names, in most cases the parameters match the low level file storage, but they do not have to:&lt;br /&gt;
&lt;br /&gt;
 /pluginfile.php/contextid/areaname/arbitrary/params/or/dirs/filename.ext&lt;br /&gt;
&lt;br /&gt;
pluginfile.php detects the type of plugin from context table, fetches basic info (like $course or $cm if appropriate) and calls plugin function (or later method) which does the access control and finally sends the file to user. &#039;&#039;areaname&#039;&#039; separates files by type and divides the context into several subtrees - for example &#039;&#039;summary&#039;&#039; files (images used in module intros), post attachments, etc.&lt;br /&gt;
&lt;br /&gt;
==== Assignment example ====&lt;br /&gt;
&lt;br /&gt;
 /pluginfile.php/assignmentcontextid/mod_assignment/intro/someimage.jpg&lt;br /&gt;
 /pluginfile.php/assignmentcontextid/mod_assignment/submission/submissionid/attachmentname.ext&lt;br /&gt;
 /pluginfile.php/assignmentcontextid/mod_assignment/allsubmissions/groupid/allsubmissionfiles.zip&lt;br /&gt;
&lt;br /&gt;
The last line example of virtual file that should created on the fly, it is not implemented yet.&lt;br /&gt;
&lt;br /&gt;
====scorm example====&lt;br /&gt;
&lt;br /&gt;
 /pluginfile.php/scormcontextid/mod_scorm/intro/someimage.jpg&lt;br /&gt;
 /pluginfile.php/scormcontextid/mod_scorm/content/revisionnumber/dir/somescormfile.js&lt;br /&gt;
&lt;br /&gt;
The revision counter is incremented when any file changes in order to prevent caching problems.&lt;br /&gt;
&lt;br /&gt;
====quiz example====&lt;br /&gt;
&lt;br /&gt;
 pluginfile.php/quizcontextid/mod_quiz/intro/niceimage.jpg&lt;br /&gt;
&lt;br /&gt;
====questions example====&lt;br /&gt;
&lt;br /&gt;
This section was out of date. See [[File_storage_conversion_Quiz_and_Questions]] for the latest thinking.&lt;br /&gt;
&lt;br /&gt;
====blog example====&lt;br /&gt;
Blog entries or notes in general do not have context id (because they live in system context, SYSCONTEXTID below is the id of system context).&lt;br /&gt;
The note attachments are always served with XSS protection on, ideally we should use separate wwwroot for this. Access control can be hardcoded.&lt;br /&gt;
&lt;br /&gt;
 /pluginfile.php/SYSCONTEXTID/blog/attachment/blogentryid/attachmentname.ext&lt;br /&gt;
&lt;br /&gt;
Internally stored in &amp;lt;code&amp;gt;array(&#039;contextid&#039;=&amp;gt;SYSCONTEXTID, &#039;component&#039;=&amp;gt;&#039;blog&#039;, &#039;filearea&#039;=&amp;gt;&#039;attachment&#039;, &#039;itemid&#039;=&amp;gt;$blogentryid)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 /pluginfile.php/SYSCONTEXTID/blog/post/blogentryid/embeddedimage.ext&lt;br /&gt;
&lt;br /&gt;
Internally stored in &amp;lt;code&amp;gt;array(&#039;contextid&#039;=&amp;gt;SYSCONTEXTID, &#039;component&#039;=&amp;gt;&#039;blog&#039;, &#039;filearea&#039;=&amp;gt;&#039;post&#039;, &#039;itemid&#039;=&amp;gt;$blogentryid)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Temporary files ===&lt;br /&gt;
Temporary files are usually used during the lifetime of one script only.&lt;br /&gt;
uses:&lt;br /&gt;
* exports&lt;br /&gt;
* imports&lt;br /&gt;
* processing by executable files (latex, mimetex)&lt;br /&gt;
&lt;br /&gt;
These files should never use utf-8 file names.&lt;br /&gt;
&lt;br /&gt;
=== Legacy file storage and serving ===&lt;br /&gt;
Going to use good-old separate directories in $CFG-&amp;gt;dataroot.&lt;br /&gt;
&lt;br /&gt;
file serving and storage:&lt;br /&gt;
# user avatars - user/pix.php&lt;br /&gt;
# group avatars - user/pixgroup.php&lt;br /&gt;
# tex, algebra - filter/tex/* and filter/algebra/*&lt;br /&gt;
# rss cache (?full rss rewrite soon?) - backwards compatibility only rss/file.php&lt;br /&gt;
&lt;br /&gt;
only storage:&lt;br /&gt;
#sessions&lt;br /&gt;
&lt;br /&gt;
== File browsing API ==&lt;br /&gt;
&lt;br /&gt;
This is what other parts of Moodle use to access files that they do not own.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Class: file_browser ===&lt;br /&gt;
&lt;br /&gt;
=== Class: file_info and subclasses ===&lt;br /&gt;
&lt;br /&gt;
== File related user interfaces ==&lt;br /&gt;
&lt;br /&gt;
All files are obtained through from the file repositories.&lt;br /&gt;
&lt;br /&gt;
=== Formslib fields ===&lt;br /&gt;
* file picker&lt;br /&gt;
* file manager&lt;br /&gt;
* file upload (obsolete, do not use)&lt;br /&gt;
&lt;br /&gt;
=== Integration with the HTML editor ===&lt;br /&gt;
&lt;br /&gt;
Each instance of the HTML editor can be told to store related files in a particular file area.&lt;br /&gt;
&lt;br /&gt;
During editing, files are stored in a draft files area. Then when the form is submitted they are moved into the real file area.&lt;br /&gt;
&lt;br /&gt;
Files are selected using the repository file picker.&lt;br /&gt;
&lt;br /&gt;
=== Legacy file manager ===&lt;br /&gt;
&lt;br /&gt;
Available only for legacy reasons. It is not supposed to be used.&lt;br /&gt;
&lt;br /&gt;
All the contexts, file areas and files now form a single huge tree structure, although each user only has access to certain parts of that tree. The file manager (files/index.php) allow users to browse this tree, and manage files within it, according to the level of permissions they have.&lt;br /&gt;
&lt;br /&gt;
Single pane file manager is hard to implement without drag &amp;amp; drop which is notoriously problematic in web based applications. I propose to implement a two pane commander-style file manager. Two pane manager allows you to easily copy/move files between two different contexts (ex: courses).&lt;br /&gt;
&lt;br /&gt;
File manager must not interact directly with filesystem API, instead each module should return traversable tree of files and directories with both real and localised names (localised names are needed for dirs like backupdata).&lt;br /&gt;
&lt;br /&gt;
== Backwards compatibility ==&lt;br /&gt;
&lt;br /&gt;
=== Content backwards compatibility ===&lt;br /&gt;
&lt;br /&gt;
This should be preserved as much as possible. This will involve rewriting links in content during the upgrade to 2.0. &lt;br /&gt;
&lt;br /&gt;
Some new features (like resource sharing - if implemented) may not work with existing data that still uses files from course files area.&lt;br /&gt;
&lt;br /&gt;
There might be a breakage of links due to special characters stripping in uploaded files which will not match the links in uploaded html files any more. This should not be very common I hope.&lt;br /&gt;
&lt;br /&gt;
===Code backwards compatibility===&lt;br /&gt;
&lt;br /&gt;
Other Moodle code (for example plugins) will have to be converted to the new APIs. See [[Using_the_file_API]] for guidance.&lt;br /&gt;
&lt;br /&gt;
It is not possible to provide backwards-compatibility here. For example, the old $CFG-&amp;gt;dataroot/$courseid/ will no longer exist, and there is no way to emulate that, so we won&#039;t try.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Upgrade and migration ==&lt;br /&gt;
&lt;br /&gt;
When a site is upgraded to Moodle 2.0, all the files in moodledata will have to be migrated. This is going to be a pain, like DML/DDL was :-(&lt;br /&gt;
&lt;br /&gt;
The upgrade process should be interruptible (like the Unicode upgrade was) so it can be stopped/restarted any time.&lt;br /&gt;
&lt;br /&gt;
=== Migration of content ===&lt;br /&gt;
&lt;br /&gt;
* resources - move files to new resource content file area; can be done automatically for pdf, image resources; definitely not accurate for uploaded web pages&lt;br /&gt;
* questions - image file moved to new area, image tag appended to questions&lt;br /&gt;
* moddata files - the easiest part, just move to new storage&lt;br /&gt;
* coursefiles - there might be many outdated files :-( :-(&lt;br /&gt;
* rss feeds links in readers - will be broken, the new security related code would break it anyway&lt;br /&gt;
&lt;br /&gt;
=== Moving files to files table and file pool ===&lt;br /&gt;
&lt;br /&gt;
The migration process must be interruptable because it might take a very long time. The files would be moved from old location, the restarting would be straightforward.&lt;br /&gt;
&lt;br /&gt;
Proposed stages:&lt;br /&gt;
#migration of all course files except moddata - finish marked by some $CFG-&amp;gt;files_migrated=true; - this step breaks the old file manager and html editor integration&lt;br /&gt;
#migration of blog attachments&lt;br /&gt;
#migration of question files&lt;br /&gt;
#migration of moddata files - each module is responsible to copy data from converted coursefiles or directly from moddata which is not converted automatically&lt;br /&gt;
&lt;br /&gt;
Some people use symbolic links in coursefiles - we must make sure that those will be copied to new storage in both places, though they can not be linked any more - anybody wanting to have content synced will need to move the files to some repository and set up the sync again.&lt;br /&gt;
&lt;br /&gt;
::Talked about a double task here, when migrating course files to module areas:&lt;br /&gt;
::# Parse html files to detect all the dependencies and move them together.&lt;br /&gt;
::# Fallback in pluginfile.php so, if something isn&#039;t found in module filearea, search for it in course filearea, copying it and finally, serving it.&lt;br /&gt;
&lt;br /&gt;
:: Also we talked about the possibility of add a new setting to resource in order to define if it should work against old coursefiles or new autocontained file areas. Migrated resources will point to old coursefiles while new ones will enforce autocontained file areas.&lt;br /&gt;
&lt;br /&gt;
:: it seems that only resource files will be really complex (because allow arbitrary HTML inclusion). The rest (labels, intros... doesn&#039;t) and should be easier to parse.&lt;br /&gt;
&lt;br /&gt;
::[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 19:00, 29 June 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other issues ==&lt;br /&gt;
&lt;br /&gt;
=== Unicode support in zip format ===&lt;br /&gt;
&lt;br /&gt;
Zip format is an old standard for compressing files. It was created long before Unicode existed, and Unicode support was only recently added. There are several ways used for encoding of non-ASCII characters in path names, but unfortunately it is not very standardised. Most Windows packers use DOS encoding.&lt;br /&gt;
&lt;br /&gt;
Client software:&lt;br /&gt;
* Windows built-in compression - bundled with Windows, non-standard DOS encoding only&lt;br /&gt;
* WinZip - shareware, Unicode option (since v11.2)&lt;br /&gt;
* TotalCommander - shareware, single byte(DOS) encoding only&lt;br /&gt;
* 7-Zip - free, Unicode or DOS encoding depending on characters used in file name (since v4.58beta)&lt;br /&gt;
* Info-ZIP - free, uses some weird character set conversions&lt;br /&gt;
&lt;br /&gt;
PHP extraction:&lt;br /&gt;
* Info-ZIP binary execution - no Unicode support at all, mangles character sets in file names (depends on OS, see docs), files must be copied to temp directory before compression and after extraction&lt;br /&gt;
* PclZip PHP library - reads single byte encoded names only, problems with random problems and higher memory usage.&lt;br /&gt;
* Zip PHP extension - kind of works in latest PHP versions&lt;br /&gt;
&lt;br /&gt;
Large file support:&lt;br /&gt;
PHP running under 32bit operating systems does not support files &amp;gt;2GB (do not expect fix before PHP 6). This might be a potential problem for larger backups.&lt;br /&gt;
&lt;br /&gt;
Tar Alternative:&lt;br /&gt;
* tar with gzip compression - easy to implement in PHP + zlib extension (PclTar, Tar from PEAR or custom code)&lt;br /&gt;
* no problem with unicode in *nix, Windows again expects DOS encoding :-(&lt;br /&gt;
* seems suitable for backup/restore - yay!&lt;br /&gt;
&lt;br /&gt;
Summary:&lt;br /&gt;
# added zip processing class that fully hides the underlying library&lt;br /&gt;
# using single byte encoding &amp;quot;garbage in/garbage out&amp;quot; approach for encoding of files in zip archives; add new &#039;zipencoding&#039; string into lang packs (ex: cp852 DOS charset for Czech locale) and use it during extraction (we might support true unicode later when PHP Zip extension does that)&lt;br /&gt;
&lt;br /&gt;
== Not implemented yet ==&lt;br /&gt;
* antivirus scanning - this needs a different api because the upload of files is now handled via repository plugins&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Using the file API]]&lt;br /&gt;
* [[Repository API]]&lt;br /&gt;
* [[Portfolio API]]&lt;br /&gt;
* [[Resource module file API migration]]&lt;br /&gt;
* MDL-14589 - File API Meta issue&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;br /&gt;
[[Category:Files]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:ファイルAPI]]&lt;br /&gt;
[[ru:Development:File_API]]&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Chris_Fryer&amp;diff=20196</id>
		<title>User:Chris Fryer</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Chris_Fryer&amp;diff=20196"/>
		<updated>2007-07-25T09:22:02Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Systems administrator at the [http://clt.lse.ac.uk/ Centre for Learning Technology], London School of Economics.&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User_talk:Helen_Foster&amp;diff=22948</id>
		<title>User talk:Helen Foster</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User_talk:Helen_Foster&amp;diff=22948"/>
		<updated>2006-02-07T10:08:51Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: /* Documentation for different versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== More hierarchy ==&lt;br /&gt;
&lt;br /&gt;
Hi Helen, I think this wiki is very useful and I would like to thank you for the work you are putting into it. I like your navigation boxes on the module pages. I have a suggestion for extending these: I think it would be nice to have an extra link that allows one to go higher up in the hierarcy to [[Teacher_documentation]]. What do you think? --[[User:Delius|Delius]] 17:48, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:Hi Gustav, thanks for your kind words. Your contributions to the documentation are most welcome. Please feel free to edit [[Template:Quizzes]] or any other template page. You may also wish to consider further use of category pages e.g. [[:Category:Teacher]] for navigation. -- [[User:Helen|Helen]] 18:26, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== Do you monitor all talk pages? ==&lt;br /&gt;
&lt;br /&gt;
Helen, I have posted another question for you on [[Talk:mod/quiz/index]]. Do you get alerted to anything I put on any talk page or should I post on this page if I want you to see it? --[[User:Delius|Delius]] 18:01, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:Hi Gustav, please note that I often check [[Special:Recentchanges|Recent changes]] or the rss feed. --[[User:Helen|Helen]] 18:26, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
::Yes, the [[Special:Recentchanges|Recent changes]] page is very useful. You can tell that I have never used a wiki intensively before. Thanks for your tips. --[[User:Gustav|Gustav]] 18:35, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:::Hey, let&#039;s discover the wiki way together! :-) --[[User:Helen|Helen]] 00:24, 27 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
==Moodle profile==&lt;br /&gt;
&lt;br /&gt;
Helen- I think you should link to your moodle profile like Martin does (assuming you have one, which I assume &amp;lt;grin&amp;gt;). -- D.I. 29Jan06&lt;br /&gt;
Wow, you&#039;re fast.. .or I&#039;m confused. --D.I. 29Jan06&lt;br /&gt;
&lt;br /&gt;
:Hi D.I. thanks for your suggestion, which [[User:UrsHunkler|someone else]] seem to be following up! ;-) --[[User:Helen|Helen]] 05:00, 30 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== German moodle docs possible? ==&lt;br /&gt;
&lt;br /&gt;
Hello Helen,&lt;br /&gt;
&lt;br /&gt;
thank you very much for these nice and structured doc pages.&lt;br /&gt;
When do you plan to launch a german part of the docs.moodle.org pages?&lt;br /&gt;
I ask these question because i can translate some of the english doc pages to german.&lt;br /&gt;
&lt;br /&gt;
Greetings Christoph&lt;br /&gt;
&lt;br /&gt;
:Hi Christoph, thanks for your kind offer of translation. Please email &#039;&#039;docs AT moodle DOT org&#039;&#039; so I may get in touch with you easily when the German Moodle documentation is launched. --[[User:Helen|Helen]] 05:17, 30 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== German User Docs ==&lt;br /&gt;
&lt;br /&gt;
Thanks a lot, Helen, for all your work. &lt;br /&gt;
I would also like to help with the German version. &lt;br /&gt;
&lt;br /&gt;
Ulrike&lt;br /&gt;
&lt;br /&gt;
:Hi Ulrike, thanks for your kind offer too. MoodleDocs in other languages will happen soon, for sure! --[[User:Helen|Helen]] 08:30, 31 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== Documentation for different versions ==&lt;br /&gt;
&lt;br /&gt;
Helen&lt;br /&gt;
&lt;br /&gt;
Is there a mechanism for specifying which version of Moodle a particular document refers to?  If, for instance, a feature is only available in version 1.6, how would a 1.5.3 user know they couldn&#039;t follow these instructions?&lt;br /&gt;
&lt;br /&gt;
Equally, if something is done differently in two versions, how would we stop an edit war breaking out between 1.5.3 and 1.6 users?&lt;br /&gt;
&lt;br /&gt;
I appreciate this probably isn&#039;t an issue just yet, but it&#039;s possible it may become one in later versions.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
[[User:CHRISF|CHRISF]] 19:20, 1 February 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:Hi ChrisF, thanks for highlighting the issue of differences in Moodle versions. Perhaps a [[Template:Moodle 1.6|Moodle 1.6 template]], inserted using the code &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Moodle 1.6}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, may be used to show features specific to Moodle 1.6. What do you think? --[[User:Helen|Helen]] 04:22, 4 February 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
::Good idea.  I think that would clear it up nicely.  [[User:CHRISF|CHRISF]] 18:08, 7 February 2006 (WST)&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User_talk:Helen_Foster&amp;diff=22946</id>
		<title>User talk:Helen Foster</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User_talk:Helen_Foster&amp;diff=22946"/>
		<updated>2006-02-01T11:20:48Z</updated>

		<summary type="html">&lt;p&gt;CHRISF: Documentation for different versions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== More hierarchy ==&lt;br /&gt;
&lt;br /&gt;
Hi Helen, I think this wiki is very useful and I would like to thank you for the work you are putting into it. I like your navigation boxes on the module pages. I have a suggestion for extending these: I think it would be nice to have an extra link that allows one to go higher up in the hierarcy to [[Teacher_documentation]]. What do you think? --[[User:Delius|Delius]] 17:48, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:Hi Gustav, thanks for your kind words. Your contributions to the documentation are most welcome. Please feel free to edit [[Template:Quizzes]] or any other template page. You may also wish to consider further use of category pages e.g. [[:Category:Teacher]] for navigation. -- [[User:Helen|Helen]] 18:26, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== Do you monitor all talk pages? ==&lt;br /&gt;
&lt;br /&gt;
Helen, I have posted another question for you on [[Talk:mod/quiz/index]]. Do you get alerted to anything I put on any talk page or should I post on this page if I want you to see it? --[[User:Delius|Delius]] 18:01, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:Hi Gustav, please note that I often check [[Special:Recentchanges|Recent changes]] or the rss feed. --[[User:Helen|Helen]] 18:26, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
::Yes, the [[Special:Recentchanges|Recent changes]] page is very useful. You can tell that I have never used a wiki intensively before. Thanks for your tips. --[[User:Gustav|Gustav]] 18:35, 26 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
:::Hey, let&#039;s discover the wiki way together! :-) --[[User:Helen|Helen]] 00:24, 27 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
==Moodle profile==&lt;br /&gt;
&lt;br /&gt;
Helen- I think you should link to your moodle profile like Martin does (assuming you have one, which I assume &amp;lt;grin&amp;gt;). -- D.I. 29Jan06&lt;br /&gt;
Wow, you&#039;re fast.. .or I&#039;m confused. --D.I. 29Jan06&lt;br /&gt;
&lt;br /&gt;
:Hi D.I. thanks for your suggestion, which [[User:UrsHunkler|someone else]] seem to be following up! ;-) --[[User:Helen|Helen]] 05:00, 30 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== German moodle docs possible? ==&lt;br /&gt;
&lt;br /&gt;
Hello Helen,&lt;br /&gt;
&lt;br /&gt;
thank you very much for these nice and structured doc pages.&lt;br /&gt;
When do you plan to launch a german part of the docs.moodle.org pages?&lt;br /&gt;
I ask these question because i can translate some of the english doc pages to german.&lt;br /&gt;
&lt;br /&gt;
Greetings Christoph&lt;br /&gt;
&lt;br /&gt;
:Hi Christoph, thanks for your kind offer of translation. Please email &#039;&#039;docs AT moodle DOT org&#039;&#039; so I may get in touch with you easily when the German Moodle documentation is launched. --[[User:Helen|Helen]] 05:17, 30 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== German User Docs ==&lt;br /&gt;
&lt;br /&gt;
Thanks a lot, Helen, for all your work. &lt;br /&gt;
I would also like to help with the German version. &lt;br /&gt;
&lt;br /&gt;
Ulrike&lt;br /&gt;
&lt;br /&gt;
:Hi Ulrike, thanks for your kind offer too. MoodleDocs in other languages will happen soon, for sure! --[[User:Helen|Helen]] 08:30, 31 January 2006 (WST)&lt;br /&gt;
&lt;br /&gt;
== Documentation for different versions ==&lt;br /&gt;
&lt;br /&gt;
Helen&lt;br /&gt;
&lt;br /&gt;
Is there a mechanism for specifying which version of Moodle a particular document refers to?  If, for instance, a feature is only available in version 1.6, how would a 1.5.3 user know they couldn&#039;t follow these instructions?&lt;br /&gt;
&lt;br /&gt;
Equally, if something is done differently in two versions, how would we stop an edit war breaking out between 1.5.3 and 1.6 users?&lt;br /&gt;
&lt;br /&gt;
I appreciate thir probably isn&#039;t an issue just yet, but it&#039;s possible it may become one in later versions.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
[[User:CHRISF|CHRISF]] 19:20, 1 February 2006 (WST)&lt;/div&gt;</summary>
		<author><name>CHRISF</name></author>
	</entry>
</feed>