<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/21/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Arunjohnruben</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/21/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Arunjohnruben"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/Special:Contributions/Arunjohnruben"/>
	<updated>2026-04-08T07:44:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/21/en/index.php?title=Development:Quiz_attempt&amp;diff=59983</id>
		<title>Development:Quiz attempt</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/index.php?title=Development:Quiz_attempt&amp;diff=59983"/>
		<updated>2009-07-16T10:18:17Z</updated>

		<summary type="html">&lt;p&gt;Arunjohnruben: added an &amp;#039;i&amp;#039; to a word&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quiz developer docs}}The attempt.php script is one of the most complicated scripts of the quiz module. It is responsible for displaying questions to a user, to evaluate and grade the users&#039; responses and additionally it needs to take various quiz settings into account and change the behaviour of the script accordingly. This script, which is vital for the functioning of the quiz module, is explained in this document in some detail in order to provide some context and examples for the use of the question/state model and to illustrate some of the functions provided in locallib.php.&lt;br /&gt;
&lt;br /&gt;
In addition to the immediate benefit of explaining what happens in attempt.php, this piece of documentation should provide an entry point to the quiz module code. A number of functions are used in attempt.php that are likely to be used in other scripts as well.&lt;br /&gt;
&lt;br /&gt;
Although the attempt.php script is useful for understanding how user interactions are handled, in order to gain an understanding of the teacher interface for editing quizzes and questions you should look at edit.php.&lt;br /&gt;
&lt;br /&gt;
This file describes the situation up to Moodle 1.9. For Moodle 2.0 and later, Attempt.php was split into several bits as shown on [[Development:Quiz_user_interface_overview]]. However, the code still does the same things, just in smaller, better organised pieces. (See also http://moodle.org/mod/forum/discuss.php?d=68922.)&lt;br /&gt;
&lt;br /&gt;
== A simplified perspective ==&lt;br /&gt;
&lt;br /&gt;
From a simple functional point of view, the responsibilities of attempt.php is the handling of attempts at a quiz. This includes displaying questions and storing data provided or generated by the users. The interaction could be limited to opening the page and thus creating a new attempt and submitting the responses back to the server, which causes the responses to be graded. While the script is actually more sophisticated and allows to interrupt and continue attempts, this two step scenario provides a good starting point and covers the core functionality.&lt;br /&gt;
&lt;br /&gt;
=== Starting a new attempt ===&lt;br /&gt;
&lt;br /&gt;
When a new attempt is started the attempt object is created by the function &amp;lt;code&amp;gt;quiz_create_attempt()&amp;lt;/code&amp;gt; (line 183). It returns an empty &amp;lt;code&amp;gt; $attempt&amp;lt;/code&amp;gt; object, which is stored in the database immediately to record the fact that the student has seen the questions.&lt;br /&gt;
&lt;br /&gt;
The next step is to load up all questions and to create initial states for all of them. Loading up the questions is a two step process: first the question records are extracted from the database, then the function &amp;lt;code&amp;gt; quiz_get_questions_options()&amp;lt;/code&amp;gt; is called. This attaches the name_prefix field and calls the questiontype specific &amp;lt;code&amp;gt;get_question_options()&amp;lt;/code&amp;gt; method for each question record in order to add any required data.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
     // Load the questions&lt;br /&gt;
     if (!$questions = get_records_sql($sql)) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
     // Load the question type specific information&lt;br /&gt;
     if (!quiz_get_question_options($questions)) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
     // Restore the question sessions to their most recent states&lt;br /&gt;
     // creating new sessions where required&lt;br /&gt;
     if (!$states = quiz_get_states($questions, $attempt)) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
After all questions are correctly initialised a state object is created for each by the function &amp;lt;code&amp;gt;quiz_get_states()&amp;lt;/code&amp;gt;. This function is responsible for providing a state for each question and creates a new state if there isn&#039;t one to be restored. Any newly states are added to the database right away.&lt;br /&gt;
&lt;br /&gt;
At this point all the required data has been generated or loaded, so the last step is to print the page. The printing happens towards the end of the attempt.php script and, apart from a simple call to &amp;lt;code&amp;gt;print_heading()&amp;lt;/code&amp;gt; (line 409), is done in a loop through all the question records by calling &amp;lt;code&amp;gt; quiz_print_quiz_question()&amp;lt;/code&amp;gt; (line 461), which is just a shorthand for calling the questiontype specific &amp;lt;code&amp;gt;print_question()&amp;lt;/code&amp;gt; method. So, quite conveniently, each question is responsible for printing itself. To round up the printing, submit buttons and a footer are printed to the bottom of the page.&lt;br /&gt;
&lt;br /&gt;
=== Processing responses ===&lt;br /&gt;
&lt;br /&gt;
The next logical step after creating and displaying an attempt is that the user enters answers for all questions and submits them for marking. Now it is not necessary to create a new attempt, because there is already an open existing one in the database and the same holds for each question&#039;s state. So this time the attempt record is loaded from the database. The questions are loaded in the same way, by querying for the question records an then attaching any required questiontype specific fields by calling the function &amp;lt;code&amp;gt; quiz_get_question_options()&amp;lt;/code&amp;gt;. Now the call to the function &amp;lt;code&amp;gt; quiz_get_states()&amp;lt;/code&amp;gt; does actually restore the states from the database rather than generate new ones, so the same code works for the two scenarios, creating and closing an attempt.&lt;br /&gt;
&lt;br /&gt;
Now that all data concerning the attempt under discussion has been loaded, the responses submitted by the student come to the scene. For each question they need to be evaluated and graded. The first step here is to determine how to deal with each question and the associated responses. In the simplified case this is clear; all responses need to be graded, the grades stored and then the attempt needs to be closed. However, there are more complicated cases, so the function &amp;lt;code&amp;gt; quiz_extract_responses()&amp;lt;/code&amp;gt; is called to create the &amp;lt;code&amp;gt;$actions&amp;lt;/code&amp;gt; array, which acts as a set of instructions for the function &amp;lt;code&amp;gt;quiz_process_responses()&amp;lt;/code&amp;gt;, a quite complicated function, which encapsulates the entire response processing for one question and calls out to the questiontype specific &amp;lt;code&amp;gt;grade_responses()&amp;lt;/code&amp;gt; method for grading.&lt;br /&gt;
&lt;br /&gt;
After all submitted responses have been processed, the questions are rendered in the new states. An exception is if the student has requested to close the attempt (or if it is closed automatically due to a time limit). In this case the attempt is closed by setting the &amp;lt;code&amp;gt;timefinish&amp;lt;/code&amp;gt; field to the current time. After this the user is redirected to review.php, which, depending on the quiz review settings, shows the questions including the student&#039;s responses, feedback, grades and correct answers.&lt;br /&gt;
&lt;br /&gt;
== A more complicated perspective ==&lt;br /&gt;
&lt;br /&gt;
Before an attempt may be started there are a series of mandatory and optional checks, to determine if the user is allowed to attempt the quiz. In addition to these checks, the page display and functionality are slightly different for users with and without teacher privileges. Also, when the quiz is set to start in &amp;quot;secure&amp;quot; mode (the $quiz-&amp;gt;popup option), the printing of the page is slightly different. Including all of these scenarios evidently complicates the structure of the attempt.php script, deviating from the simple scenario described above.&lt;br /&gt;
&lt;br /&gt;
First of all, access to the quiz is denied to guests. Additionally it is possible to restrict access to an IP range ($quiz-&amp;gt;subnet) and to set up a password for the quiz ($quiz-&amp;gt;password). In both cases users that can&#039;t pass the required tests are denied access.&lt;br /&gt;
&lt;br /&gt;
When a teacher &amp;quot;attempts&amp;quot; a quiz there is a tab navigation facility at the top of the page, which allows the teacher to jump between reviewing, previewing and editing the quiz (and possibly even more options). The teacher interface also contains a button to start a new attempt, which is not present on the student interface. Teachers&#039; attempts are automatically marked as previews, which means that old attempts are automatically deleted when a new attempt is started. It also prevents previews to show up in the students&#039; answers review and preview attempts don&#039;t block the possibility of editing the quiz, while students&#039; attempts do.&lt;br /&gt;
&lt;br /&gt;
Further complication is introduced by the feature to allow multiple pages with questions and navigation between these pages. This requieres mechanisms to determine which questions are on which page, which page is currently displayed and which page needs to be viewed next. This is not too hard to achieve, however, one subtlety should be noted: when the attempt is closed it is necessary to load all questions and their most recent states before they are marked, whereas in the case of navigation only the questions and related states of the page that was displayed before are loaded, processed and saved; and the questions and states for the next page are loaded.&lt;br /&gt;
&lt;br /&gt;
Towards the end of the script there are two blocks of code that are responsible for timed quizzes ($quiz-&amp;gt;timelimit). The first block prints the start element of the form using javascript to make sure that javascript is enabled (which obviously doesn&#039;t help a lot, because the quiz is printed as usual, only the submit won&#039;t work). The second block includes the file jstimer.php, which prints a timer that counts down and causes an auto-submit when time is up.&lt;br /&gt;
[[Category:Quiz]]&lt;/div&gt;</summary>
		<author><name>Arunjohnruben</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/21/en/index.php?title=Development:Installing_and_upgrading_plugin_database_tables&amp;diff=59743</id>
		<title>Development:Installing and upgrading plugin database tables</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/index.php?title=Development:Installing_and_upgrading_plugin_database_tables&amp;diff=59743"/>
		<updated>2009-07-13T05:33:28Z</updated>

		<summary type="html">&lt;p&gt;Arunjohnruben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you have done the right thing, Moodle will automatically create the database tables for your plugin when you visit the Admin notifications page (.../admin/index.php). This process is controlled by three files within your plugin:&lt;br /&gt;
;version.php : This records the version of the plugin code&lt;br /&gt;
;db/install.xml : This is used when someone installs your plugin for the first time.&lt;br /&gt;
;db/upgrade.php : This is used when someone who had an older version of your plugin installed upgrades to the latest version.&lt;br /&gt;
&lt;br /&gt;
In addition, Moodle also stores in the database the currently installed version of each plugin.&lt;br /&gt;
&lt;br /&gt;
In Moodle 1.9 and before, this is stored in the mdl_config table, in a row with the name &#039;&#039;plugintype&#039;&#039;_&#039;&#039;pluginname&#039;&#039;_version. For example qtype_myqtype_version. The exception to this rule are modules and blocks. Installed module version numbers are stored in the mdl_modules table. Block version numbers are in mdl_block.&lt;br /&gt;
&lt;br /&gt;
In Moodle 2.0 an beyond, plugin version numbers are stored in the mdl_config_plugins table, with &#039;&#039;plugintype&#039;&#039;_&#039;&#039;pluginname&#039;&#039; in the plugin column, and &#039;version&#039; in the name column - with the same exception for modules and blocks.&lt;br /&gt;
&lt;br /&gt;
==A specific example==&lt;br /&gt;
&lt;br /&gt;
For the rest of this document, I will use a particular example, because it should make the explanation easier. You should be able to see how to generalise it.&lt;br /&gt;
&lt;br /&gt;
We will suppose you that you are making a new question type myqtype. This is plugin type qtype, and the code will be in the question/type/myqtype folder. The currently installed version number will be stored in the qtype_myqtype_version row of the mdl_config table.&lt;br /&gt;
&lt;br /&gt;
In addition, we will just consider the first two releases of the plugin. The first release will have version number 2008080100, and will just use one database table mdl_question_myqtype, with two columns col1 and col2. Then we will suppose that the second release is 2008080200, and that requires an extra column, newcol, to be added to the mdl_question_myqtype table.&lt;br /&gt;
&lt;br /&gt;
==The files you need for the first release==&lt;br /&gt;
&lt;br /&gt;
In what follows, the bits of code you need to replace are &#039;&#039;&#039;in bold&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;version.php&lt;br /&gt;
 $plugin-&amp;gt;version  = 2008080100;&lt;br /&gt;
 $plugin-&amp;gt;requires = &#039;&#039;&#039;XXXXXXXXXX; // Copy the current value from the top-level version.php file.&#039;&#039;&#039;&lt;br /&gt;
;db/install.xml&lt;br /&gt;
:This file, which you should [[XMLDB editor|create with the XMLDB editor]], should contain the definition for your mdl_question_myqtype table, with the two columns col1 and col2.&lt;br /&gt;
&lt;br /&gt;
At this stage, you do not need a db/upgrade.php file.&lt;br /&gt;
&lt;br /&gt;
==The files you need for the second release==&lt;br /&gt;
&lt;br /&gt;
;version.php&lt;br /&gt;
 $plugin-&amp;gt;version  = 2008080200;&lt;br /&gt;
 $plugin-&amp;gt;requires = &#039;&#039;&#039;XXXXXXXXXX; // Copy the current value from the top-level version.php file.&#039;&#039;&#039;&lt;br /&gt;
;db/install.xml : This file should now contain the updated definition for your mdl_question_myqtype table, with three columns col1, col2 and newcol. You modify this file using the XMLDB editor.&lt;br /&gt;
;db/upgrade.php&lt;br /&gt;
:This file should contain the code that people need to run to upgrade from version 2008080100 of your plugin. That is, the code to add a column newcol to the mdl_question_myqtype table. You don&#039;t have to write this code yourself as the XMLDB editor will generate it for you. The upgrade.php file should contain a single function xmldb_qtype_myqtype_upgrade that looks a bit like:&lt;br /&gt;
 function xmldb_qtype_myqtype_upgrade($oldversion = 0) {&lt;br /&gt;
     $result = true;&lt;br /&gt;
 &lt;br /&gt;
     /// Add a new column newcol to the mdl_question_myqtype&lt;br /&gt;
     if ($result &amp;amp;&amp;amp; $oldversion &amp;lt; 2008080200) {&lt;br /&gt;
         &#039;&#039;&#039;// Code to add the column, generated by the &#039;View PHP Code&#039; option of the XMLDB editor.&#039;&#039;&#039;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return $result;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hint: If you are modifying or adding a field/table, get the XMLDB editor to generate the PHP update code for you &#039;&#039;&#039;after&#039;&#039;&#039; making the changes in the editor. If you are deleting one, you need to generate the PHP code &#039;&#039;&#039;before&#039;&#039;&#039; making the change - or you won&#039;t be able to select the field/table to write the code for, because it no longer exists.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==What happens when a user installs or upgrades your plugin==&lt;br /&gt;
&lt;br /&gt;
The process is triggered when an administrator goes to the Admin notifications page (.../admin/index.php). The code that does the work is the upgrade_plugins function in lib/adminlib.php and reading this code is the best way to find out exactly what happens. In pseudo-code, what it does is:&lt;br /&gt;
&lt;br /&gt;
 For each plugin of this type (e.g. all qtype plugins) {&lt;br /&gt;
     // For the body of this loop, suppose the current plugin being processed is myqtype.&lt;br /&gt;
 &lt;br /&gt;
     Check that question/type/myqtype/version.php, .../db/upgrade.php and .../db/install.php exist.&lt;br /&gt;
 &lt;br /&gt;
     if ($CFG-&amp;gt;qtype_myqtype_version exists, and is less than the number in version.php) {&lt;br /&gt;
         Call the upgrade function xmldb_qtype_myqtype_upgrade from&lt;br /&gt;
                 upgrade.php, passing the old version number ($CFG-&amp;gt;qtype_myqtype_version)&lt;br /&gt;
                 which says what is currently installed&lt;br /&gt;
         Update $CFG-&amp;gt;qtype_myqtype_version to the latest number from version.php&lt;br /&gt;
                 to record what is currently installed&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     else if ($CFG-&amp;gt;qtype_myqtype_version does not exist) {&lt;br /&gt;
         Create the tables from the definitions in install.xml&lt;br /&gt;
         Update $CFG-&amp;gt;qtype_myqtype_version to the latest number from version.php&lt;br /&gt;
                 to record what is currently installed&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Of course, it is a bit more complex that than. However, the code in the upgrade_plugins is quite clear, and I encourage you to go and have a look at it so you can see all the details of how it works.&lt;br /&gt;
&lt;br /&gt;
Let us now look at some worked examples:&lt;br /&gt;
&lt;br /&gt;
===User installs version 2008080100 of myqtype===&lt;br /&gt;
&lt;br /&gt;
To start with, the mdl_question_myqtype does not exist, and there will not be a qtype_myqtype_version row in the mdl_config table.&lt;br /&gt;
&lt;br /&gt;
# The user will unzip myqtype.zip into the question/type folder.&lt;br /&gt;
# The user will visit the Admin notifications page.&lt;br /&gt;
# This will trigger Moodle to search for plugings to upgrade. It will find that the code for the qtype_myqtype plugin is now present, but there is no trace of it in the database, so it will install the plugin from the install.xml file.&lt;br /&gt;
&lt;br /&gt;
At the end of this process, the mdl_question_myqtype table will exist with the two columns col1 and col2; and the qtype_myqtype_version row in the mdl_config table will contain 2008080100.&lt;br /&gt;
&lt;br /&gt;
===User upgrades from version 2008080100 to version 2008080200 of myqtype===&lt;br /&gt;
&lt;br /&gt;
To start with, the mdl_question_myqtype table will exist with the two columns col1 and col2; and the qtype_myqtype_version row in the mdl_config table will contain 2008080100.&lt;br /&gt;
&lt;br /&gt;
# The user will delete the old question/type/myqtype folder.&lt;br /&gt;
# The user will unzip the new myqtype.zip into the question/type folder.&lt;br /&gt;
# The user will visit the Admin notifications page.&lt;br /&gt;
# This will trigger Moodle to search for plugings to upgrade. It will find that the code for version 2008080200 the qtype_myqtype plugin is now present, but the installed version of the the database tables (qtype_myqtype_version) is 2008080100. Therefore, it will call xmldb_qtype_myqtype_upgrade from upgrade.php, passing 2008080100 as the $oldversion argument.&lt;br /&gt;
&lt;br /&gt;
At the end of this process, the mdl_question_myqtype table will now have three columns col1, col2 and newcol; and the qtype_myqtype_version row in the mdl_config table will contain 2008080200.&lt;br /&gt;
&lt;br /&gt;
===User installs version 2008080200 of myqtype into a clean Moodle install===&lt;br /&gt;
&lt;br /&gt;
To start with, the mdl_question_myqtype does not exist, and there will not be a qtype_myqtype_version row in the mdl_config table.&lt;br /&gt;
&lt;br /&gt;
# The user will unzip the 2008080200 version of myqtype.zip into the question/type folder.&lt;br /&gt;
# The user will visit the Admin notifications page.&lt;br /&gt;
# This will trigger Moodle to search for plugings to upgrade. It will find that the code for the qtype_myqtype plugin is now present, but there is no trace of it in the database, so it will install the plugin from the install.xml file.&lt;br /&gt;
&lt;br /&gt;
At the end of this process, the mdl_question_myqtype table will exist with three columns col1, col2 and newcol; and the qtype_myqtype_version row in the mdl_config table will contain 2008080200.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
The first time a user installs any version of your plugin, the install.xml file will be used to create all the required database tables. Therefore install.xml should always contain the definition of the up-to-date database structure. Moodle recognises this situation because there is a version.php file on disc, but there is no &#039;&#039;plugintype&#039;&#039;_&#039;&#039;pluginname&#039;&#039;_version value in the mdl_config table.&lt;br /&gt;
&lt;br /&gt;
If the user already had a version of your plugin installed, and then upgrades to a newer version, Moodle will detect this because the version.php file will contain a newer version number than the &#039;&#039;plugintype&#039;&#039;_&#039;&#039;pluginname&#039;&#039;_version value in the mdl_config table. In this case, Moodle will run the code in the upgrade.php file, passing in the old version number, so that the correct bits of upgrade can be run, as controlled by the if ($oldversion &amp;lt; XXXXXXXXXX) blocks of code.&lt;br /&gt;
&lt;br /&gt;
The contents of the install.xml and upgrade.php files should be generated using the XMLDB editor.&lt;br /&gt;
&lt;br /&gt;
==Database upgrades and stable branches==&lt;br /&gt;
&lt;br /&gt;
The simple rule is, never make any database changes on a stable branch. You only need to read this section in the rare situations where a database change on the stable branch is unavoidable.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning!!! advanced material follows.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Suppose, in order to fix a bug, you need to make a database change in Moodle 1.9.3+ (which must also be merged into HEAD). The root of the problem is that people may upgrade their Moodle in three different ways, which &lt;br /&gt;
&lt;br /&gt;
* Upgrade from &amp;lt;=1.9.3 to 1.9.4 - this executes the ugprade script on the 1.9 branch.&lt;br /&gt;
* Upgrade from &amp;lt;=1.9.3 directly to &amp;gt;=2.0 - this executes the upgrade script on the HEAD branch.&lt;br /&gt;
* Upgrade from 1.9.4 to &amp;gt;=2.0 - in this case, you must ensure that the upgrade on HEAD is not executed.&lt;br /&gt;
&lt;br /&gt;
The normal way to do this is ensure that your database upgrade is idempotent. That is, it does not matter if you do it twice. So for example, instead of doing&lt;br /&gt;
&lt;br /&gt;
        $dbman-&amp;gt;create_table($table);&lt;br /&gt;
&lt;br /&gt;
you should do&lt;br /&gt;
&lt;br /&gt;
        if (!$dbman-&amp;gt;table_exists($table)) {&lt;br /&gt;
            $dbman-&amp;gt;create_table($table);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
You should also think about what version numbers to put in your version.php file on each branch. Above all, test carefully.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Development:XMLDB_Documentation|XMLDB_Documentation]]&lt;br /&gt;
* [[Development:Coding|Coding guidelines]]&lt;br /&gt;
* [[Development:DDL functions|DDL functions]]&lt;br /&gt;
* [[Development:XMLDB defining an XML structure|install.xml file documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
[[Category:XMLDB]]&lt;br /&gt;
[[Category:Installation]]&lt;/div&gt;</summary>
		<author><name>Arunjohnruben</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/21/en/index.php?title=Development:Quiz_user_interface_overview&amp;diff=59691</id>
		<title>Development:Quiz user interface overview</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/index.php?title=Development:Quiz_user_interface_overview&amp;diff=59691"/>
		<updated>2009-07-11T08:21:22Z</updated>

		<summary type="html">&lt;p&gt;Arunjohnruben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quiz developer docs}}This diagram summarises the various pages that make up the quiz user interface. Or at least what the situation will be in Moodle 2.0 - a proposed refactor got delayed. The changes compared to previous version are indicated in the diagram - but because of the delay, it has 1.9 where it should have 2.0.&lt;br /&gt;
&lt;br /&gt;
[[Image:Quiz_interface_overview.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Quiz]]&lt;/div&gt;</summary>
		<author><name>Arunjohnruben</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/21/en/index.php?title=Development:NEWMODULE_Documentation&amp;diff=59445</id>
		<title>Development:NEWMODULE Documentation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/index.php?title=Development:NEWMODULE_Documentation&amp;diff=59445"/>
		<updated>2009-07-07T09:43:16Z</updated>

		<summary type="html">&lt;p&gt;Arunjohnruben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Work in progress}}&lt;br /&gt;
{{New_Module}}&lt;br /&gt;
&lt;br /&gt;
This first draft of Moodle Docs page about the creation of  a new module is divided into the following sections:&lt;br /&gt;
&lt;br /&gt;
*[[Development:NEWMODULE Tutorial]]&lt;br /&gt;
*[[Development:NEWMODULE Reference]]&lt;br /&gt;
*[[Development:NEWMODULE FAQ]]&lt;br /&gt;
*[[Development:NEWMODULE Adding capabilities]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Danielle, did you know about [[Development:Modules]], which is linked to from [[Developer_documentation#Make_a_new_plugin]]? You may be better off editing that, rather than starting a new page. However don&#039;t let me discourage you. That documentation is very limited, and badly needs to be expanded, so it is absolutely brilliant that you want to work on it.--[[User:Tim Hunt|Tim Hunt]] 12:03, 28 March 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
::Good point Tim! Anyway... I think we can use this as temporary root for Daniele&#039;s work and then, simply, move things to their final place. Let&#039;s see how this evolves. -- [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 12:33, 28 March 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[http://lyceum.open.ac.uk/temp/creating_moodle_modules.ppt My powerpoint about creating moodle modules] is a bit old (1.8) and maybe not that comprehensible but I use it when I&#039;m trying to explain things to people. It includes a list of all the things you need to have in a module, except the ones I forgot (backuplib iirc is missing). [[User:sam marshall|sam marshall]] 12:52, 28 March 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
::That&#039;s really great, Sam. For sure that presentation will help.Thanks! -- [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 13:08, 28 March 2008 (CDT)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [http://dev.moodle.org/course/view.php?id=2 Moodle Developers&#039; Course]&lt;br /&gt;
* [[Development:Modules]]&lt;br /&gt;
* [[Development:Places to search for lang strings|Where to put language strings for your plugin]]&lt;br /&gt;
* [[Development:Installing and upgrading plugin database tables|Defining the database tables for your plugin]]&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;br /&gt;
[[Category:Developer|Modules]]&lt;/div&gt;</summary>
		<author><name>Arunjohnruben</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/21/en/index.php?title=error/debug/codingerror&amp;diff=59271</id>
		<title>error/debug/codingerror</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/21/en/index.php?title=error/debug/codingerror&amp;diff=59271"/>
		<updated>2009-07-03T08:56:36Z</updated>

		<summary type="html">&lt;p&gt;Arunjohnruben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When trying to move a course into another category&lt;/div&gt;</summary>
		<author><name>Arunjohnruben</name></author>
	</entry>
</feed>