<?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=Danmarsden</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=Danmarsden"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Danmarsden"/>
	<updated>2026-08-13T15:59:24Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=63725</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=63725"/>
		<updated>2022-12-07T20:50:12Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Ideas for future development (outside initial scope) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = https://tracker.moodle.org/browse/MDL-76243&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=422700&lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then stiches it all back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
[[File:improveannotation-assign-mockup.png|Mockup of new grading interface]]&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content. Initially this would only support in-browser editing with the full pdf being sent back to the server for storing.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API &lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
== Other ideas for future development ==&lt;br /&gt;
* Allow students to annotate their own files (MDL-68243)&lt;br /&gt;
* Some PDF files are quite large and sending the full edited pdf back to the server is in-efficient, the highkite library supports being run server side using nodejs - investigate using an optional server-side process to save annotations.&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=reportbuilder/API&amp;diff=63683</id>
		<title>reportbuilder/API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=reportbuilder/API&amp;diff=63683"/>
		<updated>2022-11-15T06:41:34Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: This has confused multiple staff members at Catalyst - it relates to old Totara backport of Rerportbuilder and is often the first page found in google - redirecting it to the correct Moodle API page as this content is no longer relevant.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Report_builder_API]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58918</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58918"/>
		<updated>2021-05-27T21:56:19Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add details about possible server-side storage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = pending&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=422700&lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then stiches it all back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
[[File:improveannotation-assign-mockup.png|Mockup of new grading interface]]&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content. Initially this would only support in-browser editing with the full pdf being sent back to the server for storing.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API &lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
&lt;br /&gt;
== Ideas for future development (outside initial scope) ==&lt;br /&gt;
* Some PDF files are quite large and sending the full edited pdf back to the server is in-efficient, the highkite library supports being run server side using nodejs - investigate using an optional server-side process to save annotations.&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58916</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58916"/>
		<updated>2021-05-26T21:14:17Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: improve language used around existing process.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = pending&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=422700&lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then stiches it all back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
[[File:improveannotation-assign-mockup.png|Mockup of new grading interface]]&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API.&lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
&lt;br /&gt;
== Ideas for future development (outside initial scope) ==&lt;br /&gt;
&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58914</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58914"/>
		<updated>2021-05-26T08:45:25Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: adding discussion link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = pending&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=422700&lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
[[File:improveannotation-assign-mockup.png|Mockup of new grading interface]]&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API.&lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
&lt;br /&gt;
== Ideas for future development (outside initial scope) ==&lt;br /&gt;
&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58894</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58894"/>
		<updated>2021-05-23T22:26:05Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add mockup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = pending&lt;br /&gt;
|discussion = &lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
[[File:improveannotation-assign-mockup.png|Mockup of new grading interface]]&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API.&lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
&lt;br /&gt;
== Ideas for future development (outside initial scope) ==&lt;br /&gt;
&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:improveannotation-assign-mockup.png&amp;diff=58893</id>
		<title>File:improveannotation-assign-mockup.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:improveannotation-assign-mockup.png&amp;diff=58893"/>
		<updated>2021-05-23T22:24:55Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: Proposal for improving annotation, shows assignment UI with new grading UI and new pdf rendering.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal for improving annotation, shows assignment UI with new grading UI and new pdf rendering.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58892</id>
		<title>Improve Annotation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Improve_Annotation&amp;diff=58892"/>
		<updated>2021-05-23T22:21:57Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: Created page with &amp;quot;{{Infobox Project |state = Proposal |name = Improve Annotation |tracker = pending |discussion =  |assignee = Catalyst IT }}  == Introduction == This is a proposal for improvin...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|state = Proposal&lt;br /&gt;
|name = Improve Annotation&lt;br /&gt;
|tracker = pending&lt;br /&gt;
|discussion = &lt;br /&gt;
|assignee = Catalyst IT&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This is a proposal for improving Annotation in Moodle by [https://www.catalyst.net.nz Catalyst IT] - thanks to [https://www.xjtlu.edu.cn Xi’an Jiaotong-Liverpool University] for providing support with researching this project.&lt;br /&gt;
&lt;br /&gt;
The “uploadpdf” assignment feedback plugin allows teachers to annotate assignments during the grading process. We would like to improve the user experience for annotation by allowing the teacher to scroll through the pages like a normal document and implement an “Undo” feature, allowing a teacher to undo previous changes like the deletion of an object.&lt;br /&gt;
&lt;br /&gt;
The existing annotation feature in Moodle is built using the YUI Javascript library which has not been maintained by the original developers since 2014 and has been generally deprecated in Moodle (no new YUI code has been generally allowed in Moodle since 2.9).&lt;br /&gt;
&lt;br /&gt;
Moodle has also been improving the core grade API and recently in Moodle 3.8 added a new user interface within the forum activity for grading with the intention of using this same interface for the assignment grading interface but has not yet implemented this in assignment yet.&lt;br /&gt;
&lt;br /&gt;
Investing significant development effort on the existing annotation plugin would be unwise due to the existing use of YUI and we believe it would be more useful to develop a brand new annotation tool in Moodle.&lt;br /&gt;
&lt;br /&gt;
There is also potential for annotation of content to be useful outside the assignment activity – for example in essay questions, forum, workshop activities and 3rd party plugins like mod_annotatepdf so we propose that annotation functionality is added to the core Grade API so that it can be re-used anywhere in Moodle where grades are also used.&lt;br /&gt;
&lt;br /&gt;
== External libraries ==&lt;br /&gt;
=== Rendering the PDF ===&lt;br /&gt;
Moodle uses a combination of libraries to convert a document to a pdf, then converts the pdf into an image per page to allow annotation and then back into a pdf again so that it can be downloaded - this is complex, results in accessibility issues and bugs like MDL-64431.&lt;br /&gt;
&lt;br /&gt;
We propose that we that we render the PDF directly in the browser using Mozilla&#039;s [https://github.com/mozilla/pdf.js pdf.js], and then add an annotation UI on top which stores the annotations directly in the PDF.&lt;br /&gt;
&lt;br /&gt;
=== Annotating the PDF ===&lt;br /&gt;
Ideally we wouldn&#039;t implement our own Annotation library like we have done in the existing plugin, however there doesn’t appear to be many well maintained open source annotation libraries that we can re-use in Moodle.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/highkite/pdfAnnotate – This seems to be the most promising, however it is in early development stage, stores annotations within the pdf itself, Supports the main components that uploadpdf tool currently supports except the “stamp” and doesn’t seem to have built-in undo/redo support. Doesn’t implement a UI, but Moodle would be providing this anyway. Other advantage of using a JS library with annotations stored within the document itself is that there is potential for this to be re-used within an offline mobile app. Using this library would also mean a decision to only support annotations on pdf documents which I think is ok. The developer behind this project has expressed an interest in helping us use this.&lt;br /&gt;
&lt;br /&gt;
*Apache Annotator https://annotator.apache.org/ - Incubating project - allows annotation on any html content which would be a nice idea to allow annotations directly on forum posts etc, however at this state the project only allows you to select text or css selectors – annoation in Moodle requires more flexibility – drawing/circles etc.&lt;br /&gt;
&lt;br /&gt;
* http://annotatorjs.org/ - Unmaintained since 2017hypothes.is – uses a python-based back-end to store annotations.&lt;br /&gt;
&lt;br /&gt;
* https://github.com/bhargavacc/pdf-annotation – unmaintained since 2016&lt;br /&gt;
&lt;br /&gt;
* https://github.com/instructure/pdf-annotate.js – unmaintained since 2018, requires a storage layer for annotations.&lt;br /&gt;
&lt;br /&gt;
* https://moodle.org/plugins/mod_pdfannotator - (3rd party Moodle plugin) Uses Mozilla&#039;s pdf.js already, uses https://github.com/instructure/pdf-annotate.js for performing annotations - doesn&#039;t contain undo/redo features.&lt;br /&gt;
&lt;br /&gt;
== Prototype / mock-ups ==&lt;br /&gt;
See below for a mockup of a possible pdf annotation interface using the new grading UI from the forum activity.&lt;br /&gt;
&lt;br /&gt;
Note: Moodle’s existing interface provides the ability to rotate the image clockwise or anti-clockwise, and the addition of a new “undo” button may require some changes to help make it clear.&lt;br /&gt;
&lt;br /&gt;
== Development tasks ==&lt;br /&gt;
# Implement Behat tests for the forum grading panel (https://tracker.moodle.org/browse/MDL-66666) to help prevent any regressions while reworking the grading UI.&lt;br /&gt;
# Re-work the Forum grading UI so that it is a core function that other activities can re-use.&lt;br /&gt;
# Create a new centralised annotation API initally using https://github.com/highkite/pdfAnnotate with a nice Moodle UI (images/buttons etc) but leaving room for the annotation API to be extended further in future with other interfaces like Apache annotator for html content.&lt;br /&gt;
# Create a new assignment feedback plugin that re-uses the new core grading UI (based on forum) and integrates the core annotation API.&lt;br /&gt;
# Add support for “stamps” (custom images) within the pdfAnnotate library.&lt;br /&gt;
# Add support for undo process within the pdfAnnotate library and Moodle’s UI.&lt;br /&gt;
&lt;br /&gt;
== Ideas for future development (outside initial scope) ==&lt;br /&gt;
&lt;br /&gt;
* Add support for annotations to other areas like essay quiz questions, Workshop activity etc.&lt;br /&gt;
* Add support for devices like the iPad Pencil.&lt;br /&gt;
* Add support to allow grading to occur offline (embedding the JS library within our Mobile app).&lt;br /&gt;
* Add support for Apache annotator for annotating html content.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=56945</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=56945"/>
		<updated>2020-02-23T23:24:02Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Potential projects */ remove scorm project idea - scorm decreasing in use, lets find something more useful/interesting to spend time on!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
* Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
* When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you go through the [[Tutorial]].&lt;br /&gt;
* If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
* If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
* As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]]. Once you become confident enough, please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Acceptance tests for the Moodle app ===&lt;br /&gt;
&lt;br /&gt;
Since Moodle 3.7 it will be possible to write and run acceptance tests for the Moodle app.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Write new acceptance tests for the Moodle app&lt;br /&gt;
&lt;br /&gt;
Requirement for GSOC prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests hosted [https://github.com/moodlehq/moodle-local_moodlemobileapp here] following this documentation: [[Acceptance testing for the mobile app]]. Students must record and submit a video of the tests running on a local machine as part of the GSOC application process.&lt;br /&gt;
* We also require students to create an additional simple test based [https://github.com/moodlehq/moodle-local_moodlemobileapp on the existing ones]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Behat (PHP)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Front-end editor for the plugin skeleton generator ===&lt;br /&gt;
&lt;br /&gt;
This is a follow-up project for a [[GSOC/2016#Plugin skeleton generator|successful GSOC 2016 project]] that resulted in a new tool allowing developers to quickly generate a skeleton (scaffolding, template) for a new Moodle plugin. The tool proved to be a helpful helper with significant impact on the quality of Moodle plugins code. This follow-up project aims at further improvements of the skeleton generator. The primary goal is to implement a developer-friendly user interface / front-end editor allowing to configure the plugin&#039;s properties (recipe file) easily. The UI should guide the developer through the process of designing and defining the plugin properties and facilitate the whole process.&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP + JS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=56798</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=56798"/>
		<updated>2020-01-08T19:51:55Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
* Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
* When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you go through the [[Tutorial]].&lt;br /&gt;
* If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
* If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
* As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]]. Once you become confident enough, please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
* Choose where to send users after completing SCORM (MDL-61677)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Acceptance tests for the Moodle app ===&lt;br /&gt;
&lt;br /&gt;
Since Moodle 3.7 it will be possible to write and run acceptance tests for the Moodle app.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Write new acceptance tests for the Moodle app&lt;br /&gt;
&lt;br /&gt;
Requirement for GSOC prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests hosted [https://github.com/moodlehq/moodle-local_moodlemobileapp here] following this documentation: [[Acceptance testing for the mobile app]]. Students must record and submit a video of the tests running on a local machine as part of the GSOC application process.&lt;br /&gt;
* We also require students to create an additional simple test based [https://github.com/moodlehq/moodle-local_moodlemobileapp on the existing ones]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Behat (PHP)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Front-end editor for the plugin skeleton generator ===&lt;br /&gt;
&lt;br /&gt;
This is a follow-up project for a [[GSOC/2016#Plugin skeleton generator|successful GSOC 2016 project]] that resulted in a new tool allowing developers to quickly generate a skeleton (scaffolding, template) for a new Moodle plugin. The tool proved to be a helpful helper with significant impact on the quality of Moodle plugins code. This follow-up project aims at further improvements of the skeleton generator. The primary goal is to implement a developer-friendly user interface / front-end editor allowing to configure the plugin&#039;s properties (recipe file) easily. The UI should guide the developer through the process of designing and defining the plugin properties and facilitate the whole process.&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP + JS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
=== Add multi-class capabilities to Moodle&#039;s machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities by supporting multi-class classification, so we could write models like &amp;quot;very low grade&amp;quot;, &amp;quot;low grade&amp;quot;, &amp;quot;pass&amp;quot;, &amp;quot;best student ever&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support multi-class classification problems. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-58992&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
=== Add regressors to core machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities to support regression, so we can write models that estimate linear values instead of classes.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support regression. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-60523&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55756</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55756"/>
		<updated>2019-03-18T21:19:44Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Attendance password rotation/expiry */ update description of project a bit to make it a bit more clear.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
* Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
* When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you go through the [[Tutorial]].&lt;br /&gt;
* If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
* If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
* As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]]. Once you become confident enough, please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
* Choose where to send users after completing SCORM (MDL-61677)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Acceptance tests for the Moodle app ===&lt;br /&gt;
&lt;br /&gt;
Since Moodle 3.7 it will be possible to write and run acceptance tests for the Moodle app.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Write new acceptance tests for the Moodle app&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Acceptance testing for the mobile app]], students must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional simple test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Behat (PHP)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Front-end editor for the plugin skeleton generator ===&lt;br /&gt;
&lt;br /&gt;
This is a follow-up project for a [[GSOC/2016#Plugin skeleton generator|successful GSOC 2016 project]] that resulted in a new tool allowing developers to quickly generate a skeleton (scaffolding, template) for a new Moodle plugin. The tool proved to be a helpful helper with significant impact on the quality of Moodle plugins code. This follow-up project aims at further improvements of the skeleton generator. The primary goal is to implement a developer-friendly user interface / front-end editor allowing to configure the plugin&#039;s properties (recipe file) easily. The UI should guide the developer through the process of designing and defining the plugin properties and facilitate the whole process.&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP + JS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
=== Add multi-class capabilities to Moodle&#039;s machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities by supporting multi-class classification, so we could write models like &amp;quot;very low grade&amp;quot;, &amp;quot;low grade&amp;quot;, &amp;quot;pass&amp;quot;, &amp;quot;best student ever&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support multi-class classification problems. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-58992&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
=== Add regressors to core machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities to support regression, so we can write models that estimate linear values instead of classes.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support regression. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-60523&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
===Attendance password rotation/expiry ===&lt;br /&gt;
The attendance plugin provides the ability for teachers to display a QR code to allow students to take their own attendance, the QR code is currently static for the current session and does not change. &lt;br /&gt;
&lt;br /&gt;
A new process should be implemented that frequently changes the displayed QR code and expires the old QR code, making it difficult for the QR code to be shared outside the session. As part of your project application, please suggest your ideas on how to minimise the impact of server performance while dealing with rotating QR codes.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://github.com/danmarsden/moodle-mod_attendance/issues/351&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55684</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55684"/>
		<updated>2019-03-10T21:01:22Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Potential projects */ add attendance QR code expiry project&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
* Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
* When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you go through the [[Tutorial]].&lt;br /&gt;
* If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
* If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
* As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]]. Once you become confident enough, please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
* Choose where to send users after completing SCORM (MDL-61677)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Acceptance tests for the Moodle app ===&lt;br /&gt;
&lt;br /&gt;
Since Moodle 3.7 it will be possible to write and run acceptance tests for the Moodle app.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Write new acceptance tests for the Moodle app&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Acceptance testing for the mobile app]], students must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional simple test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Behat (PHP)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Front-end editor for the plugin skeleton generator ===&lt;br /&gt;
&lt;br /&gt;
This is a follow-up project for a [[GSOC/2016#Plugin skeleton generator|successful GSOC 2016 project]] that resulted in a new tool allowing developers to quickly generate a skeleton (scaffolding, template) for a new Moodle plugin. The tool proved to be a helpful helper with significant impact on the quality of Moodle plugins code. This follow-up project aims at further improvements of the skeleton generator. The primary goal is to implement a developer-friendly user interface / front-end editor allowing to configure the plugin&#039;s properties (recipe file) easily. The UI should guide the developer through the process of designing and defining the plugin properties and facilitate the whole process.&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP + JS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
=== Add multi-class capabilities to Moodle&#039;s machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities by supporting multi-class classification, so we could write models like &amp;quot;very low grade&amp;quot;, &amp;quot;low grade&amp;quot;, &amp;quot;pass&amp;quot;, &amp;quot;best student ever&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support multi-class classification problems. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-58992&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
=== Add regressors to core machine learning backends ===&lt;br /&gt;
&lt;br /&gt;
Moodle includes an analytics API that uses machine learning for binary classification. This is enough for classification problems like &amp;quot;student at risk&amp;quot; vs &amp;quot;student not at risk&amp;quot;. We want to expand this API capabilities to support regression, so we can write models that estimate linear values instead of classes.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Modify the two machine learning backends included in Moodle core to support regression. This includes the PHP ML backend (based on php-ml library) and the Python ML backend (Tensorflow).&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://tracker.moodle.org/browse/MDL-60523&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP + Python + basic understanding of machine learning algorithms and TensorFlow&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium/High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=122326 David Monllaó]&lt;br /&gt;
&lt;br /&gt;
===Attendance password rotation/expiry ===&lt;br /&gt;
The attendance plugin provides the ability for teachers to display a QR code to allow students to take their own attendance. This QR code should frequently change (on-screen) and the passwords used in the QR code should expire within a short term, making it difficult for the QR code to be shared outside the session.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Tracker issue:&#039;&#039;&#039; https://github.com/danmarsden/moodle-mod_attendance/issues/351&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55369</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=55369"/>
		<updated>2019-01-07T20:18:52Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: remove mobile support for attendance project - already completed.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
* Choose where to send users after completing SCORM (MDL-61677)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Migrate end-to-end testing support in the Mobile app to Ionic 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 167 e2e tests in the Mobile app (see detailed information [https://magician03.github.io/2017/08/21/gsoc-moodle-final-phase/ here]). &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the existing end-to-end testing support in the Mobile app to Ionic 3 (the original tests were implemented for Ionic 1/AngularJS). &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Update all the tests so they can run in the new version of the framework (Ionic 3)&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Moodle Mobile End To End Testing]], student must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (Angular and Ionic 3)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students: &lt;br /&gt;
* We require prospective students to  set-up a local development environment of the Mobile app (and run it locally) following this documentation: [[Setting_up_your_development_environment_for_Moodle_Mobile_2]], students must provide a video or detailed screenshots including a detailed explanation of what they did to run the app locally.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Plugins_Development_Guide&amp;diff=54903</id>
		<title>Moodle App Plugins Development Guide</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Plugins_Development_Guide&amp;diff=54903"/>
		<updated>2018-10-25T23:24:43Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Moodle plugins with mobile support */ add attendance to list of plugins that support mobile app.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}&lt;br /&gt;
&lt;br /&gt;
==Context==&lt;br /&gt;
Since Moodle 3.1 it is possible to support different types of Moodle plugins in the Mobile app via the [[Moodle Mobile Remote add-ons|Remote add-ons]] functionality.&lt;br /&gt;
&lt;br /&gt;
Remote add-ons allow a developer to add complete support to their plugins in the Mobile app, but they have some disadvantages:&lt;br /&gt;
* Remote add-ons are not easy to develop and test since they are required to be developed as an Angular JS/Ionic module.&lt;br /&gt;
* A zip file containing the plugin must be downloaded from the server to be lazy-loaded.&lt;br /&gt;
* It is not easy to maintain or upgrade them.&lt;br /&gt;
* Developers had to set up a local Mobile development environment&lt;br /&gt;
&lt;br /&gt;
In order to allow plugin developers to make their plugins compatible with the app, the Mobile team has been thinking in a new way to extend the mobile app features following these premises:&lt;br /&gt;
* It has to be easy to develop&lt;br /&gt;
* It should work without developing Angular/Ionic code&lt;br /&gt;
* It has to be easy to maintain&lt;br /&gt;
* It has to be supported since Moodle 3.1 at least&lt;br /&gt;
* Should support all the different types of Moodle plugins supported by the app&lt;br /&gt;
* Should work in any type of device&lt;br /&gt;
* Should not require JavaScript at all, although in some cases it will be needed. In the latter case, we’ll try to simplify the required JavaScript&lt;br /&gt;
&lt;br /&gt;
==New approach==&lt;br /&gt;
&lt;br /&gt;
We published an initial draft specification, and last month we started its implementation. During the implementation process we decided to make the following changes to the initial plans in order to make developers life easier:&lt;br /&gt;
&lt;br /&gt;
* There will be just one way to support plugins in the app.&lt;br /&gt;
* This new way will allow developers to support plugins using PHP code, templates and Ionic markup (html components).&lt;br /&gt;
* The use of JavaScript will be optional (but some type of advanced plugins may require it)&lt;br /&gt;
* Developers won’t need to set up a Mobile development environment, they will be able to test using the latest version of the official app (although setting up a local Mobile environment is recommended for complex plugins).&lt;br /&gt;
&lt;br /&gt;
This means that remote add-ons won’t be necessary anymore, and developers won’t have to learn Ionic 3 / Angular and set up a new mobile development environment to migrate them.&lt;br /&gt;
&lt;br /&gt;
Important notes:&lt;br /&gt;
* Moodle Mobile 3.5 (to be released June 2018) will be the first version of the Mobile app supporting this new type of plugins.&lt;br /&gt;
* Remote add-ons will have to be migrated to the new simpler way (following this documentation)&lt;br /&gt;
* These features are natively supported in Moodle 3.5, but for previous versions you will need to install the Moodle Mobile Additional Features plugin.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
The overall idea is to allow Moodle plugins to extend different areas in the app with &#039;&#039;just PHP server side&#039;&#039; code and Ionic 3 markup (custom html elements that are called components) using a set of custom Ionic directives and components.&lt;br /&gt;
&lt;br /&gt;
Developers will have to:&lt;br /&gt;
# Create a db/mobile.php file in their plugins. In this file developers will be able to indicate which areas of the app they want to extend, for example, adding a new option in the main menu, implementing an activity module not supported, including a new option in the course menu, including a new option in the user profile, etc. All the areas supported are described further in this document.&lt;br /&gt;
# Create new functions in a reserved namespace that will return the content of the new options. The content should be returned rendered (html). The template should use [https://ionicframework.com/docs/components/ Ionic components] so that it looks native (custom html elements) but it can be generated using mustache templates. &lt;br /&gt;
&lt;br /&gt;
Let’s clarify some points:&lt;br /&gt;
&lt;br /&gt;
* You don’t need to create new Web Service functions (although you will be able to use them for advanced features). You just need plain php functions that will be placed in a reserved namespace.&lt;br /&gt;
* Those functions will be exported via the Web Service function tool_mobile_get_content&lt;br /&gt;
* As arguments of your functions you will always receive the userid, some relevant details of the app (app version, current language in the app, etc…) and some specific data depending on the type of plugin (courseid, cmid, …).&lt;br /&gt;
* We provide a list of custom Ionic components and directives (html tags) that will provide dynamic behaviour, like indicating that you are linking a file that can be downloaded, or to allow a transition to new pages into the app calling a specific function in the server, submit form data to the server  etc..&lt;br /&gt;
&lt;br /&gt;
==Types of plugins==&lt;br /&gt;
&lt;br /&gt;
We could classify all the plugins in 3 different types:&lt;br /&gt;
&lt;br /&gt;
===Templates generated and downloaded when the user opens the plugins===&lt;br /&gt;
&lt;br /&gt;
[[File:Templates_downloaded_when_requested.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
With this type of plugin, the template of your plugin will be generated and downloaded when the user opens your plugin in the app. This means that your function will receive some context params. For example, if you&#039;re developing a course module plugin you will receive the courseid and the cmid (course module ID). You can see the list of delegates that support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
===Templates downloaded on login and rendered using JS data===&lt;br /&gt;
&lt;br /&gt;
[[File:Templates_downloaded_on_login.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
With this type of plugin, the template for your plugin will be downloaded when the user logins in the app and will be stored in the device. This means that your function will not receive any context params, and you need to return a generic template that will be built with JS data like the ones in the Mobile app. When the user opens a page that includes your plugin, your template will receive the required JS data and your template will be rendered. You can see the list of delegates that support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
===Pure Javascript plugins===&lt;br /&gt;
&lt;br /&gt;
You can always implement your whole plugin yourself using Javascript instead of using our API. In fact, this is required if you want to implement some features like capturing links in the Mobile app. You can see the list of delegates that only support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
==Step by step example==&lt;br /&gt;
&lt;br /&gt;
In this example, we are going to update an existing plugin ([https://github.com/markn86/moodle-mod_certificate Certificate activity module]) that currently uses a Remote add-on.&lt;br /&gt;
This is a simple activity module that displays the certificate issued for the current user along with the list of the dates of previously issued certificates. It also stores in the course log that the user viewed a certificate. This module also works offline: when the user downloads the course or activity, the data is pre-fetched and can be viewed offline.&lt;br /&gt;
&lt;br /&gt;
The example code can be downloaded from here (https://github.com/markn86/moodle-mod_certificate/commit/003fbac0d80fd96baf428255500980bf95a7a0d6)&lt;br /&gt;
&lt;br /&gt;
TIP: Make sure to ([https://docs.moodle.org/35/en/Developer_tools#Purge_all_caches purge all cache]) after making an edit to one of the following files for your changes to be taken into account.&lt;br /&gt;
&lt;br /&gt;
===Step 1. Update the db/mobile.php file===&lt;br /&gt;
In this case, we are updating an existing file but for new plugins, you should create this new file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$addons = array(&lt;br /&gt;
    &amp;quot;mod_certificate&amp;quot; =&amp;gt; array( // Plugin identifier&lt;br /&gt;
    	&#039;handlers&#039; =&amp;gt; array( // Different places where the plugin will display content.&lt;br /&gt;
            &#039;coursecertificate&#039; =&amp;gt; array( // Handler unique name (alphanumeric).&lt;br /&gt;
            	&#039;displaydata&#039; =&amp;gt; array(&lt;br /&gt;
                	&#039;icon&#039; =&amp;gt; $CFG-&amp;gt;wwwroot . &#039;/mod/certificate/pix/icon.gif&#039;,&lt;br /&gt;
                	&#039;class&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
            	),&lt;br /&gt;
       &lt;br /&gt;
            	&#039;delegate&#039; =&amp;gt; &#039;CoreCourseModuleDelegate&#039;, // Delegate (where to display the link to the plugin)&lt;br /&gt;
            	&#039;method&#039; =&amp;gt; &#039;mobile_course_view&#039;, // Main function in \mod_certificate\output\mobile&lt;br /&gt;
            	&#039;offlinefunctions&#039; =&amp;gt; array(&lt;br /&gt;
                    &#039;mobile_course_view&#039; =&amp;gt; array(),&lt;br /&gt;
                    &#039;mobile_issues_view&#039; =&amp;gt; array()&lt;br /&gt;
                 )       // Function that needs to be downloaded for offline.&lt;br /&gt;
            )&lt;br /&gt;
    	),&lt;br /&gt;
	&#039;lang&#039; =&amp;gt; array(	// Language strings that are used in all the handlers.&lt;br /&gt;
                array(&#039;pluginname&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;summaryofattempts&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;getcertificate&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;requiredtimenotmet&#039;, &#039;certificate&#039;),&lt;br /&gt;
		 array(&#039;viewcertificateviews&#039;, &#039;certificate&#039;)&lt;br /&gt;
        ),&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Plugin identifier:&lt;br /&gt;
: A unique name for the plugin, it can be anything (there’s no need to match the module name).&lt;br /&gt;
 &lt;br /&gt;
;Handlers  (Different places where the plugin will display content):&lt;br /&gt;
: A plugin can be displayed in different views in the app. Each view should have a unique name inside the plugin scope (alphanumeric).&lt;br /&gt;
&lt;br /&gt;
; Display data:&lt;br /&gt;
: This is only needed for certain types of plugins. Also, depending on the type of delegate it may require additional (or less fields), in this case we are indicating the module icon.&lt;br /&gt;
	&lt;br /&gt;
; Delegate&lt;br /&gt;
: Where to display the link to the plugin, see the Delegates chapter in this documentation for all the possible options.&lt;br /&gt;
&lt;br /&gt;
; Method:&lt;br /&gt;
: This is the function in the Moodle component/lib.php file to be executed the first time the user clicks in the new option displayed in the app. The function should be a method of a Mobile class under the output/mobile namespace.	&lt;br /&gt;
&lt;br /&gt;
; Offlinefunctions&lt;br /&gt;
: These are the functions that need to be downloaded for offline usage. This is the list of functions that need to be called and stored when the user downloads a course for offline usage. Please note that you can add functions here that are not even listed in the mobile.php file. &lt;br /&gt;
: In our example, downloading for offline access will mean that we&#039;ll execute the functions for getting the certificate and issued certificates passing as parameters the current userid (and courseid when we are using the mod or course delegate). If we have the result of those functions stored in the app, we&#039;ll be able to display the certificate information even if the user is offline.&lt;br /&gt;
: Offline functions will be mostly used to display information for final users, any further interaction with the view won’t be supported offline (for example, trying to send information when the user is offline).&lt;br /&gt;
: You can indicate here other Web Services functions, indicating the parameters that they might need from a defined subset (currently userid and courseid)&lt;br /&gt;
: Prefetching the module will also download all the files returned by the methods in these offline functions (in the &#039;&#039;files&#039;&#039; array).&lt;br /&gt;
: Note: If your functions use additional custom parameters (for example, if you implement multiple pages within a module&#039;s view function by using a &#039;page&#039; parameter in addition to the usual cmid, courseid, userid) then the app will not know which additional parameters to supply. In this case, do not list the function in offlinefunctions; instead, you will need to manually implement a [[#Module_prefetch_handler|module prefetch handler]].&lt;br /&gt;
&lt;br /&gt;
;Lang:&lt;br /&gt;
: The language pack string ids used in the plugin by all the handlers. Please note that you should avoid adding all the plugin string ids (including those unused) because the Web Service that returns the plugin information will include the translation of each string id for every language installed in the platform.&lt;br /&gt;
&lt;br /&gt;
There are additional attributes supported by the mobile.php list, see “Mobile.php supported options” section below.&lt;br /&gt;
&lt;br /&gt;
===Step 2. Creating the main function===&lt;br /&gt;
&lt;br /&gt;
The main function displays the current issued certificate (or several warnings if it’s not possible to issue a certificate). It also displays a link to view the dates of previously issued certificates.&lt;br /&gt;
&lt;br /&gt;
All the functions must be created in the plugin or subsystem classes/output directory, the name of the class must be mobile.&lt;br /&gt;
&lt;br /&gt;
For this example (mod_certificate plugin) the namespace name will be mod_certificate\output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/classes/output/mobile.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace mod_certificate\output;&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
use context_module;&lt;br /&gt;
use mod_certificate_external;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Mobile output class for certificate&lt;br /&gt;
 *&lt;br /&gt;
 * @package	mod_certificate&lt;br /&gt;
 * @copyright  2018 Juan Leyva&lt;br /&gt;
 * @license	http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
class mobile {&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
 	* Returns the certificate course view for the mobile app.&lt;br /&gt;
 	* @param  array $args Arguments from tool_mobile_get_content WS&lt;br /&gt;
 	*&lt;br /&gt;
 	* @return array   	HTML, javascript and otherdata&lt;br /&gt;
 	*/&lt;br /&gt;
    public static function mobile_course_view($args) {&lt;br /&gt;
    	global $OUTPUT, $USER, $DB;&lt;br /&gt;
&lt;br /&gt;
    	$args = (object) $args;&lt;br /&gt;
    	$cm = get_coursemodule_from_id(&#039;certificate&#039;, $args-&amp;gt;cmid);&lt;br /&gt;
&lt;br /&gt;
    	// Capabilities check.&lt;br /&gt;
    	require_login($args-&amp;gt;courseid , false , $cm, true, true);&lt;br /&gt;
&lt;br /&gt;
    	$context = context_module::instance($cm-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
    	require_capability (&#039;mod/certificate:view&#039;, $context);&lt;br /&gt;
    	if ($args-&amp;gt;userid != $USER-&amp;gt;id) {&lt;br /&gt;
        	require_capability(&#039;mod/certificate:manage&#039;, $context);&lt;br /&gt;
    	}&lt;br /&gt;
    	$certificate = $DB-&amp;gt;get_record(&#039;certificate&#039;, array(&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance));&lt;br /&gt;
&lt;br /&gt;
    	// Get certificates from external (taking care of exceptions).&lt;br /&gt;
    	try {&lt;br /&gt;
        	$issued = mod_certificate_external::issue_certificate($cm-&amp;gt;instance);&lt;br /&gt;
        	$certificates = mod_certificate_external::get_issued_certificates($cm-&amp;gt;instance);&lt;br /&gt;
        	$issues = array_values($certificates[&#039;issues&#039;]); // Make it mustache compatible.&lt;br /&gt;
    	} catch (Exception $e) {&lt;br /&gt;
        	$issues = array();&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	// Set timemodified for each certificate.&lt;br /&gt;
    	foreach ($issues as $issue) {&lt;br /&gt;
        	if (empty($issue-&amp;gt;timemodified)) {&lt;br /&gt;
            		$issue-&amp;gt;timemodified = $issue-&amp;gt;timecreated;&lt;br /&gt;
        	}&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$showget = true;&lt;br /&gt;
    	if ($certificate-&amp;gt;requiredtime &amp;amp;&amp;amp; !has_capability(&#039;mod/certificate:manage&#039;, $context)) {&lt;br /&gt;
        	if (certificate_get_course_time($certificate-&amp;gt;course) &amp;lt; ($certificate-&amp;gt;requiredtime * 60)) {&lt;br /&gt;
            		$showget = false;&lt;br /&gt;
        	}&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$certificate-&amp;gt;name = format_string($certificate-&amp;gt;name);&lt;br /&gt;
    	list($certificate-&amp;gt;intro, $certificate-&amp;gt;introformat) =&lt;br /&gt;
                    	external_format_text($certificate-&amp;gt;intro, $certificate-&amp;gt;introformat, $context-&amp;gt;id,&#039;mod_certificate&#039;, &#039;intro&#039;);&lt;br /&gt;
    	$data = array(&lt;br /&gt;
        	&#039;certificate&#039; =&amp;gt; $certificate,&lt;br /&gt;
        	&#039;showget&#039; =&amp;gt; $showget &amp;amp;&amp;amp; count($issues) &amp;gt; 0,&lt;br /&gt;
        	&#039;issues&#039; =&amp;gt; $issues,&lt;br /&gt;
        	&#039;issue&#039; =&amp;gt; $issues[0],&lt;br /&gt;
&#039;numissues&#039; =&amp;gt; count($issues),&lt;br /&gt;
        	&#039;cmid&#039; =&amp;gt; $cm-&amp;gt;id,&lt;br /&gt;
        	&#039;courseid&#039; =&amp;gt; $args-&amp;gt;courseid&lt;br /&gt;
    	);&lt;br /&gt;
&lt;br /&gt;
    	return array(&lt;br /&gt;
        	&#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
            	array(&lt;br /&gt;
                	&#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                	&#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
            	),&lt;br /&gt;
        	),&lt;br /&gt;
        	&#039;javascript&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;otherdata&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;files&#039; =&amp;gt; $issues&lt;br /&gt;
    	);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let’s go through the function code to analyse the different parts.&lt;br /&gt;
&lt;br /&gt;
;Function declaration: &lt;br /&gt;
: The function name is the same as the one used in the mobile.php file (method field). There is only one argument “$args” which is an array containing all the information sent by the mobile app (the courseid, userid, appid, appversionname, appversioncode, applang, appcustomurlscheme…)&lt;br /&gt;
&lt;br /&gt;
; Function implementation:&lt;br /&gt;
: In the first part of the function, we check permissions and capabilities (like a view.php script would do normally). Then we retrieve the certificate information that’s necessary to display the template.&lt;br /&gt;
&lt;br /&gt;
Finally, we return:&lt;br /&gt;
* The rendered template (notice that we could return more than one template but we usually would only need one). By default the app will always render the first template received, the rest of the templates can be used if the plugin defines some Javascript code.&lt;br /&gt;
* JavaScript: Empty, because we don’t need any in this case&lt;br /&gt;
* Other data: Empty as well, because we don’t need any additional data to be used by directives or components in the template. This field will be published as an object supporting 2-way-data-bind to the template.&lt;br /&gt;
* Files: A list of files that the app should be able to download (for offline usage mostly)&lt;br /&gt;
&lt;br /&gt;
===Step 3. Creating the template for the main function===&lt;br /&gt;
&lt;br /&gt;
This is the most important part of your plugin because it contains the code that will be rendered on the mobile app.&lt;br /&gt;
&lt;br /&gt;
In this template we’ll be using Ionic and custom directives and components available in the Mobile app.&lt;br /&gt;
&lt;br /&gt;
All the HTML attributes starting with ion- are ionic components. Most of the time the component name is self-explanatory but you may refer to a detailed guide here: https://ionicframework.com/docs/components/ &lt;br /&gt;
&lt;br /&gt;
All the HTML attributes starting with &#039;&#039;core-&#039;&#039; are custom components of the Mobile app.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/templates/mobile_view_page.mustache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{=&amp;lt;% %&amp;gt;=}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
	&amp;lt;core-course-module-description description=&amp;quot;&amp;lt;% certificate.intro %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-course-module-description&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ion-list&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-list-header&amp;gt;&lt;br /&gt;
        	&amp;lt;p class=&amp;quot;item-heading&amp;quot;&amp;gt;{{ &#039;plugin.mod_certificate.summaryofattempts&#039; | translate }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-list-header&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%#issues%&amp;gt;&lt;br /&gt;
        	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
            	&amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-new-content title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
                	{{ &#039;plugin.mod_certificate.viewcertificateviews&#039; | translate: {$a: &amp;lt;% numissues %&amp;gt;} }}&lt;br /&gt;
            	&amp;lt;/button&amp;gt;&lt;br /&gt;
        	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/issues%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%#showget%&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
        	&amp;lt;button ion-button block core-course-download-module-main-file moduleId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot; courseId=&amp;quot;&amp;lt;% certificate.course %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; [files]=&amp;quot;[{fileurl: &#039;&amp;lt;% issue.fileurl %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.filename %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, mimetype: &#039;&amp;lt;% issue.mimetype %&amp;gt;&#039;}]&amp;quot;&amp;gt;&lt;br /&gt;
            	&amp;lt;ion-icon name=&amp;quot;cloud-download&amp;quot; item-start&amp;gt;&amp;lt;/ion-icon&amp;gt;&lt;br /&gt;
            	{{ &#039;plugin.mod_certificate.getcertificate&#039; | translate }}&lt;br /&gt;
        	&amp;lt;/button&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/showget%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%^showget%&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
        	&amp;lt;p&amp;gt;{{ &#039;plugin.mod_certificate.requiredtimenotmet&#039; | translate }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/showget%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;!-- Call log WS when the template is loaded. --&amp;gt;&lt;br /&gt;
    	&amp;lt;span core-site-plugins-call-ws-on-load name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
	&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the first line of the template we switch delimiters to avoid conflicting with Ionic delimiters (that are curly brackets like mustache). &lt;br /&gt;
&lt;br /&gt;
Then we display the module description using &amp;lt;code&amp;gt;&amp;lt;core-course-module-description&amp;lt;/code&amp;gt; that is a component used to include the course module description.&lt;br /&gt;
&lt;br /&gt;
For displaying the certificate information we create a list of elements, adding a header on top.&lt;br /&gt;
The following line &amp;lt;code&amp;gt;{{ &#039;plugin.mod_certificate.summaryofattempts&#039; | translate }}&amp;lt;/code&amp;gt; indicates that the Mobile app will translate the &#039;&#039;summaryofattempts&#039;&#039; string id (here we could’ve used mustache translation but it is usually better to delegate the strings translations to the app). The string id has this format: &lt;br /&gt;
&lt;br /&gt;
“plugin” + plugin identifier (from mobile.php) +  string id (the string must be indicated in the lang field in mobile.php). &lt;br /&gt;
&lt;br /&gt;
Then we display a button to transition to another page if there are certificates issued. The attribute (directive) &amp;lt;code&amp;gt;core-site-plugins-new-content&amp;lt;/code&amp;gt; indicates that if the user clicks the button, we need to call the function “mobile_issues_view” in the component “mod_certificate” passing as arguments the cmid and courseid. The content returned by this function will be displayed in a new page (see Step 4 for the code of this new page).&lt;br /&gt;
&lt;br /&gt;
Just after this button we display another one but this time for downloading an issued certificate. The &amp;lt;code&amp;gt;core-course-download-module-main-file&amp;lt;/code&amp;gt; directive indicates that clicking this button is for downloading the whole activity and opening the main file. This means that, when the user clicks this button, the whole certificate activity will be available in offline.&lt;br /&gt;
&lt;br /&gt;
Finally, just before the ion-list is closed, we use the &amp;lt;code&amp;gt;core-site-plugins-call-ws-on-load&amp;lt;/code&amp;gt; directive to indicate that once the page is loaded, we need to call to a Web Service function in the server, in this case we are calling the &#039;&#039;mod_certificate_view_certificate&#039;&#039; that will log that the user viewed this page.&lt;br /&gt;
&lt;br /&gt;
As you can see, no JavaScript was necessary at all. We used plain HTML elements and attributes that did all the complex dynamic logic (like calling a Web Service) behind the scenes.&lt;br /&gt;
&lt;br /&gt;
===Step 4. Adding an additional page===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Partial file contents: mod/certificate/classes/output/mobile.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
     * Returns the certificate issues view for the mobile app.&lt;br /&gt;
     * @param  array $args Arguments from tool_mobile_get_content WS&lt;br /&gt;
     *&lt;br /&gt;
     * @return array   	HTML, javascript and otherdata&lt;br /&gt;
     */&lt;br /&gt;
    public static function mobile_issues_view($args) {&lt;br /&gt;
    	global $OUTPUT, $USER, $DB;&lt;br /&gt;
&lt;br /&gt;
    	$args = (object) $args;&lt;br /&gt;
    	$cm = get_coursemodule_from_id(&#039;certificate&#039;, $args-&amp;gt;cmid);&lt;br /&gt;
&lt;br /&gt;
    	// Capabilities check.&lt;br /&gt;
    	require_login($args-&amp;gt;courseid , false , $cm, true, true);&lt;br /&gt;
&lt;br /&gt;
    	$context = context_module::instance($cm-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
    	require_capability (&#039;mod/certificate:view&#039;, $context);&lt;br /&gt;
    	if ($args-&amp;gt;userid != $USER-&amp;gt;id) {&lt;br /&gt;
        	require_capability(&#039;mod/certificate:manage&#039;, $context);&lt;br /&gt;
    	}&lt;br /&gt;
    	$certificate = $DB-&amp;gt;get_record(&#039;certificate&#039;, array(&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance));&lt;br /&gt;
&lt;br /&gt;
    	// Get certificates from external (taking care of exceptions).&lt;br /&gt;
    	try {&lt;br /&gt;
        	$issued = mod_certificate_external::issue_certificate($cm-&amp;gt;instance);&lt;br /&gt;
        	$certificates = mod_certificate_external::get_issued_certificates($cm-&amp;gt;instance);&lt;br /&gt;
        	$issues = array_values($certificates[&#039;issues&#039;]); // Make it mustache compatible.&lt;br /&gt;
    	} catch (Exception $e) {&lt;br /&gt;
        	$issues = array();&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$data = array(&lt;br /&gt;
        	&#039;issues&#039; =&amp;gt; $issues&lt;br /&gt;
    	);&lt;br /&gt;
&lt;br /&gt;
    	return array(&lt;br /&gt;
        	&#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
            	array(&lt;br /&gt;
                	&#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                	&#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_issues&#039;, $data),&lt;br /&gt;
            	),&lt;br /&gt;
        	),&lt;br /&gt;
        	&#039;javascript&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;otherdata&#039; =&amp;gt; &#039;&#039;&lt;br /&gt;
    	);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function for the new page was added just after the mobile_course_view function, the code is quite similar: Capabilities checks, retrieves the information required for the template and returns the template rendered.&lt;br /&gt;
&lt;br /&gt;
The code of the mustache template is also very simple:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/templates/mobile_view_issues.mustache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{=&amp;lt;% %&amp;gt;=}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
	&amp;lt;ion-list&amp;gt;&lt;br /&gt;
    	&amp;lt;%#issues%&amp;gt;&lt;br /&gt;
        	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
            	&amp;lt;p class=&amp;quot;item-heading&amp;quot;&amp;gt;{{ &amp;lt;%timecreated%&amp;gt; | coreToLocaleString }}&amp;lt;/p&amp;gt;&lt;br /&gt;
            	&amp;lt;p&amp;gt;&amp;lt;%grade%&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
        	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/issues%&amp;gt;&lt;br /&gt;
	&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As we did in the previous template, in the first line of the template we switch delimiters to avoid conflicting with Ionic delimiters (that are curly brackets like mustache). &lt;br /&gt;
&lt;br /&gt;
Here we are creating an ionic list that will display a new item in the list per each issued certificated.&lt;br /&gt;
&lt;br /&gt;
For the issued certificated we’ll display the time when it was created (using the app filter &#039;&#039;coreToLocaleString&#039;&#039;). We are also displaying the grade displayed in the certificate (if any). &lt;br /&gt;
&lt;br /&gt;
===Step 5. Plugin webservices, if included===&lt;br /&gt;
&lt;br /&gt;
If your plugin uses its own web services, they will also need to be enabled for mobile access in your db/services.php file.&lt;br /&gt;
&lt;br /&gt;
The following line &amp;lt;code&amp;gt;&#039;services&#039;      =&amp;gt; array(MOODLE_OFFICIAL_MOBILE_SERVICE, &#039;local_mobile&#039;),&amp;lt;/code&amp;gt; should be included in each webservice definition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/db/services.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$functions = array(&lt;br /&gt;
&lt;br /&gt;
    &#039;mod_certificate_get_certificates_by_courses&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;classname&#039;     =&amp;gt; &#039;mod_certificate_external&#039;,&lt;br /&gt;
        &#039;methodname&#039;    =&amp;gt; &#039;get_certificates_by_courses&#039;,&lt;br /&gt;
        &#039;description&#039;   =&amp;gt; &#039;Returns a list of certificate instances...&#039;,&lt;br /&gt;
        &#039;type&#039;          =&amp;gt; &#039;read&#039;,&lt;br /&gt;
        &#039;capabilities&#039;  =&amp;gt; &#039;mod/certificate:view&#039;,&lt;br /&gt;
        &#039;services&#039;      =&amp;gt; array(MOODLE_OFFICIAL_MOBILE_SERVICE, &#039;local_mobile&#039;),&lt;br /&gt;
    ),&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
This extra services definition is the reason why you will need to have the local_mobile plugin installed for Moodle versions 3.4 and lower, so that your Moodle site will have all the additional webservices included to deal with all these mobile access calls. This is explained further in the [https://docs.moodle.org/dev/Mobile_support_for_plugins#Moodle_version_requirements Moodle version requirements section] below.&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
The first and most important thing to know is that you don’t need a local mobile environment, you can just use the Chrome or Chromium browser to add mobile support to your plugins!&lt;br /&gt;
&lt;br /&gt;
Open this URL (with Chrome or Chromium browser): https://mobileapp.moodledemo.net/ and you will see a web version of the mobile app completely functional (except for some native features). This URL is updated with the latest integration version of the app.&lt;br /&gt;
&lt;br /&gt;
Please test that your site works correctly in the web version before starting any development.&lt;br /&gt;
&lt;br /&gt;
===Moodle version requirements===&lt;br /&gt;
&lt;br /&gt;
If your Moodle version is lower than 3.5 (to be released in May) you will need to install the [https://docs.moodle.org/en/Moodle_Mobile_additional_features Moodle Mobile additional features plugin]. &lt;br /&gt;
&lt;br /&gt;
Please use this development version for now: https://github.com/moodlehq/moodle-local_mobile/commits/MOODLE_31_STABLE (if your Moodle version is 3.2, 3.3 or 3.4) you will have to use the specific branch for your version but applying manually the [https://github.com/moodlehq/moodle-local_mobile/commits/MOODLE_31_STABLE last commit from the 3.1 branch] (the one with number MOBILE-2362).&lt;br /&gt;
&lt;br /&gt;
Also, when installing the Moodle Mobile Additional features plugin you must follow the installation instructions so the service is set up properly.&lt;br /&gt;
&lt;br /&gt;
Remember to update your plugin documentation to reflect that this plugin is mandatory for Mobile support. We don’t recommend to indicate in your plugin version.php a dependency to local_mobile though.&lt;br /&gt;
&lt;br /&gt;
===Development workflow===&lt;br /&gt;
&lt;br /&gt;
First of all, we recommend creating a simple &#039;&#039;mobile.php&#039;&#039; for displaying a new main menu option (even if your plugin won’t be in the main menu, just to verify that you are able to extend the app plugins). Then open the webapp (https://mobileapp.moodledemo.net/) or refresh the browser if it was already open. Check that you can correctly  see the new menu option you included.&lt;br /&gt;
&lt;br /&gt;
Then, develop the main function of the app returning a “Hello world” or basic code (without using templates) to see that everything works together. After adding the classes/output/mobile.php file it is very important to “Purge all caches” to avoid problems with the auto-loading cache.&lt;br /&gt;
&lt;br /&gt;
It is important to remember that:&lt;br /&gt;
* Any change in the mobile.php file will require you to refresh the web app page in the browser (remember to disable the cache in the Chrome developer options).&lt;br /&gt;
* Any change in an existing template or function won’t require to refresh the browser page. In most cases you should just do a PTR (Pull down To Refresh) in the page that displays the view returned by the function. Be aware that PTR will work only when using the “device” emulation in the browser (see following section).&lt;br /&gt;
&lt;br /&gt;
===Testing and debugging===&lt;br /&gt;
&lt;br /&gt;
To learn how to debug with the web version of the app, please read the following documents:&lt;br /&gt;
* [[Moodle Mobile debugging WS requests]] AND&lt;br /&gt;
* [[Moodle Mobile development using Chrome or Chromium]] (please, omit the installation section)&lt;br /&gt;
&lt;br /&gt;
For plugins using the Javascript API you may develop making use of the console.log function to add trace messages in your code that will be displayed in the browser console.&lt;br /&gt;
&lt;br /&gt;
==Mobile.php supported options==&lt;br /&gt;
&lt;br /&gt;
In the Step by Step section we learned about some of the existing options for handlers configuration. This is the full list of supported options:&lt;br /&gt;
&lt;br /&gt;
===Common options===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;delegate&#039;&#039;&#039; (mandatory): Name of the delegate to register the handler in.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (mandatory): The function to call to retrieve the main page content.&lt;br /&gt;
* &#039;&#039;&#039;lang&#039;&#039;&#039; (optional): List of language strings.&lt;br /&gt;
* &#039;&#039;&#039;init&#039;&#039;&#039; (optional): A function to call to retrieve the initialization JS and the &amp;quot;restrict&amp;quot; to apply to the whole handler. It can also return templates that can be used from the Javascript of the init method or the Javascript of the handler’s method.&lt;br /&gt;
* &#039;&#039;&#039;restricttocurrentuser&#039;&#039;&#039; (optional) Only used if the delegate has a isEnabledForUser function. If true, the handler will only be shown for current user. For more info about displaying the plugin only for certain users, please see [[Mobile_support_for_plugins#Display_the_plugin_only_if_certain_conditions_are_met|Display the plugin only if certain conditions are met]].&lt;br /&gt;
* &#039;&#039;&#039;restricttoenrolledcourses&#039;&#039;&#039; (optional): Only used if the delegate has a isEnabledForCourse function. If true or not defined, the handler will only be shown for courses the user is enrolled in. For more info about displaying the plugin only for certain courses, please see [[Mobile_support_for_plugins#Display_the_plugin_only_if_certain_conditions_are_met|Display the plugin only if certain conditions are met]].&lt;br /&gt;
* &#039;&#039;&#039;styles&#039;&#039;&#039; (optional): An array with two properties: &#039;&#039;url&#039;&#039; and &#039;&#039;version&#039;&#039;. The URL should point to a CSS file, either using an absolute URL or a relative URL. This file will be downloaded and applied by the app. It&#039;s recommended to include styles that will only affect your plugin templates. The version number is used to determine if the file needs to be downloaded again, you should change the version number everytime you change the CSS file.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseOptionsDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for CoreMainMenuDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. Main Menu plugins are always displayed in the &amp;quot;More&amp;quot; tab, they cannot be displayed as tabs in the bottom bar.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseModuleDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): icon, class.&lt;br /&gt;
* &#039;&#039;&#039;offlinefunctions&#039;&#039;&#039;: (optional) List of functions to call when prefetching the module. It can be a get_content method or a WS. You can filter the params received by the WS. By default, WS will receive these params: courseid, cmid, userid. Other valid values that will be added if they are present in the list of params: courseids (it will receive a list with the courses the user is enrolled in), component + &#039;id&#039; (e.g. certificateid).&lt;br /&gt;
* &#039;&#039;&#039;downloadbutton&#039;&#039;&#039;: (optional) Whether to display download button in the module. If not defined, the button will be shown if there is any offlinefunction.&lt;br /&gt;
* &#039;&#039;&#039;isresource&#039;&#039;&#039;: (optional) Whether the module is a resource or an activity. Only used if there is any offlinefunction. If your module relies on the &amp;quot;contents&amp;quot; field, then it should be true.&lt;br /&gt;
* &#039;&#039;&#039;updatesnames&#039;&#039;&#039;: (optional) Only used if there is any offlinefunction. A Regular Expression to check if there&#039;s any update in the module. It will be compared to the result of &#039;&#039;core_course_check_updates&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseFormatDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;canviewallsections&#039;&#039;&#039;: (optional) Whether the course format allows seeing all sections in a single page. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;displayenabledownload&#039;&#039;&#039;: (optional) Whether the option to enable section/module download should be displayed. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;displaysectionselector&#039;&#039;&#039;: (optional) Whether the default section selector should be displayed. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreUserDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: The type of the addon. Values accepted: &#039;newpage&#039; (default) or  &#039;communication&#039;. &lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for CoreSettingsDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for AddonMessageOutputDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
==Delegates==&lt;br /&gt;
&lt;br /&gt;
The delegates can be classified by type of plugin. For more info about type of plugins, please see the See [[Mobile_support_for_plugins#Types_of_plugins|Types of plugins]] section.&lt;br /&gt;
&lt;br /&gt;
===Templates generated and downloaded when the user opens the plugins===&lt;br /&gt;
&lt;br /&gt;
====CoreMainMenuDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add new items to the main menu (currently displayed at the bottom of the app). &lt;br /&gt;
&lt;br /&gt;
====CoreCourseOptionsDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add new options in a course (Participants or Grades are examples of this type of delegate).&lt;br /&gt;
&lt;br /&gt;
====CoreCourseModuleDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting activity modules or resources.&lt;br /&gt;
&lt;br /&gt;
====CoreUserDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add additional options in the user profile page in the app.&lt;br /&gt;
&lt;br /&gt;
====CoreCourseFormatDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting course formats.&lt;br /&gt;
&lt;br /&gt;
====CoreSettingsDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to add a new option in the settings page.&lt;br /&gt;
&lt;br /&gt;
====AddonMessageOutputDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a message output plugin.&lt;br /&gt;
&lt;br /&gt;
===Templates downloaded on login and rendered using JS data===&lt;br /&gt;
&lt;br /&gt;
====CoreQuestionDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting question types.&lt;br /&gt;
&lt;br /&gt;
====CoreQuestionBehaviourDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting question behaviours.&lt;br /&gt;
&lt;br /&gt;
====CoreUserProfileFieldDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting user profile fields.&lt;br /&gt;
&lt;br /&gt;
====AddonModQuizAccessRuleDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a quiz access rule.&lt;br /&gt;
&lt;br /&gt;
====AddonModAssignSubmissionDelegate and AddonModAssignFeedbackDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use these delegates to support assign submission or feedback plugins.&lt;br /&gt;
&lt;br /&gt;
====AddonWorkshopAssessmentStrategyDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a workshop assessment strategy plugin.&lt;br /&gt;
&lt;br /&gt;
===Pure Javascript plugins===&lt;br /&gt;
&lt;br /&gt;
These delegates require JavaScript to be supported. See [[Mobile_support_for_plugins#Initialization|Initialization]] for more information.&lt;br /&gt;
&lt;br /&gt;
* CoreContentLinksDelegate&lt;br /&gt;
* CoreCourseModulePrefetchDelegate&lt;br /&gt;
* CoreFileUploaderDelegate&lt;br /&gt;
* CorePluginFileDelegate&lt;br /&gt;
&lt;br /&gt;
==Available components and directives==&lt;br /&gt;
&lt;br /&gt;
===Difference between component and directives===&lt;br /&gt;
&lt;br /&gt;
A component (represented as an HTML tag) is used to add custom elements to the app.&lt;br /&gt;
Example of components are: ion-list, ion-item, core-search-box&lt;br /&gt;
&lt;br /&gt;
A directive (represented as an HTML attribute) allows you to extend a piece of HTML with additional information or functionality.&lt;br /&gt;
Example of directives are: core-auto-focus, *ngIf, ng-repeat&lt;br /&gt;
&lt;br /&gt;
The Mobile app uses Angular, Ionic and custom components and directives, for a full reference of:&lt;br /&gt;
* Angular directives, please check: https://angular.io/api?type=directive&lt;br /&gt;
* Ionic components, please check: https://ionicframework.com/docs/&lt;br /&gt;
&lt;br /&gt;
===Custom core components and directives===&lt;br /&gt;
&lt;br /&gt;
These are some useful custom components and directives (only available in the mobile app). Please notice that this isn’t the full list of components and directives of the app, it’s just an extract of the most common ones.&lt;br /&gt;
&lt;br /&gt;
====core-format-text====&lt;br /&gt;
&lt;br /&gt;
This directive formats the text and adds some directives needed for the app to work as it should. For example, it treats all links and all the embedded media so they work fine in the app. If some content in your template includes links or embedded media, please use this directive.&lt;br /&gt;
&lt;br /&gt;
This directive automatically applies core-external-content and core-link to all the links and embedded media.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039; (string): The text to format.&lt;br /&gt;
* &#039;&#039;&#039;siteId&#039;&#039;&#039; (string): Optional. Site ID to use. If not defined, current site.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to use when downloading embedded files.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
* &#039;&#039;&#039;adaptImg&#039;&#039;&#039; (boolean): Optional. Whether to adapt images to screen width. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;clean&#039;&#039;&#039; (boolean): Optional. Whether all the HTML tags should be removed. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;singleLine&#039;&#039;&#039; (boolean): Optional. Whether new lines should be removed (all text in single line). Only if clean=true. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;maxHeight&#039;&#039;&#039; (number): Optional. Max height in pixels to render the content box. It should be 50 at least to make sense. Using this parameter will force display: block to calculate height better. If you want to avoid this use class=&amp;quot;inline&amp;quot; at the same time to use display: inline-block.&lt;br /&gt;
* &#039;&#039;&#039;fullOnClick&#039;&#039;&#039; (boolean): Optional. Whether it should open a new page with the full contents on click. Only if maxHeight is set and the content has been collapsed. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;fullTitle&#039;&#039;&#039; (string): Optional. Title to use in full view. Defaults to &amp;quot;Description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-format-text text=&amp;quot;&amp;lt;% cm.description %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-format-text&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-link====&lt;br /&gt;
&lt;br /&gt;
Directive to handle a link. It performs several checks, like checking if the link needs to be opened in the app, and opens the link as it should (without overriding the app).&lt;br /&gt;
&lt;br /&gt;
This directive is automatically applied to all the links and media inside core-format-text.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;capture&#039;&#039;&#039; (boolean): Optional. Whether the link needs to be captured by the app (check if the link can be handled by the app instead of opening it in a browser).&lt;br /&gt;
* &#039;&#039;&#039;inApp&#039;&#039;&#039; (boolean): Optional. True to open in embedded browser, false to open in system browser.&lt;br /&gt;
* &#039;&#039;&#039;autoLogin&#039;&#039;&#039; (string): Optional. If the link should be open with auto-login. Accepts the following values:&lt;br /&gt;
** &amp;quot;yes&amp;quot; -&amp;gt; Always auto-login.&lt;br /&gt;
** &amp;quot;no&amp;quot; -&amp;gt; Never auto-login.&lt;br /&gt;
** &amp;quot;check&amp;quot; -&amp;gt; Auto-login only if it points to the current site. Default value.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;lt;% cm.url %&amp;gt;&amp;quot; core-link&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-external-content====&lt;br /&gt;
&lt;br /&gt;
Directive to handle links to files and embedded files. This directive should be used in any link to a file or any embedded file that you want to have available when the app is offline. &lt;br /&gt;
&lt;br /&gt;
If a file is downloaded, its URL will be replaced by the local file URL.&lt;br /&gt;
&lt;br /&gt;
This directive is automatically applied to all the links and media inside core-format-text.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;siteId&#039;&#039;&#039; (string): Optional. Site ID to use. If not defined, current site.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to use when downloading embedded files.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&amp;lt;% event.iconurl %&amp;gt;&amp;quot; core-external-content component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% event.id %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-user-link====&lt;br /&gt;
&lt;br /&gt;
Directive to go to user profile on click. When the user clicks the element where this directive is attached, the right user profile will be opened.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;userId&#039;&#039;&#039; (number): User id to open the profile.&lt;br /&gt;
* &#039;&#039;&#039;courseId&#039;&#039;&#039; (number): Optional. Course id to show the user info related to that course.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;a ion-item core-user-link userId=&amp;quot;&amp;lt;% userid %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-file====&lt;br /&gt;
&lt;br /&gt;
Component to handle a remote file. It shows the file name, icon (depending on mimetype) and a button to download/refresh it. The user can identify if the file is downloaded or not based on the button.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* file (object): The file. Must have a property &#039;filename&#039; and a &#039;fileurl&#039; or &#039;url&#039;&lt;br /&gt;
* component (string): Optional. Component the file belongs to.&lt;br /&gt;
* componentId (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
* canDelete (boolean): Optional. Whether file can be deleted.&lt;br /&gt;
* alwaysDownload (boolean): Optional. Whether it should always display the refresh button when the file is downloaded. Use it for files that you cannot determine if they&#039;re outdated or not.&lt;br /&gt;
* canDownload (boolean): Optional. Whether file can be downloaded. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-file [file]=&amp;quot;{fileurl: &#039;&amp;lt;% issue.url %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.name %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, filesize: &#039;&amp;lt;% issue.size %&amp;gt;&#039;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-file&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-download-file====&lt;br /&gt;
&lt;br /&gt;
Directive to allow downloading and open a file. When the item with this directive is clicked, the file will be downloaded (if needed) and opened.&lt;br /&gt;
&lt;br /&gt;
It is usually recommended to use the core-file component since it also displays the state of the file.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;core-download-file&#039;&#039;&#039; (object): The file to download.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to link the file to.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. Component ID to use in conjunction with the component.&lt;br /&gt;
&lt;br /&gt;
Example usage: a button to download a file.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button [core-download-file]=&amp;quot;{fileurl: &amp;lt;% issue.url %&amp;gt;, timemodified: &amp;lt;% issue.timemodified %&amp;gt;, filesize: &amp;lt;% issue.size %&amp;gt;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.download | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-course-download-module-main-file====&lt;br /&gt;
&lt;br /&gt;
Directive to allow downloading and opening the main file of a module.&lt;br /&gt;
&lt;br /&gt;
When the item with this directive is clicked, the whole module will be downloaded (if needed) and its main file opened. This is meant for modules like mod_resource.&lt;br /&gt;
&lt;br /&gt;
This directive must receive either a module or a moduleId. If no files are provided, it will use module.contents.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;module&#039;&#039;&#039; (object): Optional. The module object. Required if module is not supplied.&lt;br /&gt;
* &#039;&#039;&#039;moduleId&#039;&#039;&#039; (number): Optional. The module ID. Required if module is not supplied.&lt;br /&gt;
* &#039;&#039;&#039;courseId&#039;&#039;&#039; (number): The course ID the module belongs to.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to link the file to.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. Component ID to use in conjunction with the component. If not defined, moduleId.&lt;br /&gt;
* &#039;&#039;&#039;files&#039;&#039;&#039; (object[]): Optional. List of files of the module. If not provided, use module.contents.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block core-course-download-module-main-file moduleId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot; courseId=&amp;quot;&amp;lt;% certificate.course %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; [files]=&amp;quot;[{fileurl: &#039;&amp;lt;% issue.fileurl %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.filename %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, mimetype: &#039;&amp;lt;% issue.mimetype %&amp;gt;&#039;}]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getcertificate&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-navbar-buttons====&lt;br /&gt;
&lt;br /&gt;
Component to add buttons to the app&#039;s header without having to place them inside the header itself. Using this component in a site plugin will allow adding buttons to the header of the current page.&lt;br /&gt;
&lt;br /&gt;
If this component indicates a position (start/end), the buttons will only be added if the header has some buttons in that position. If no start/end is specified, then the buttons will be added to the first &amp;lt;ion-buttons&amp;gt; found in the header.&lt;br /&gt;
&lt;br /&gt;
You can use the [hidden] input to hide all the inner buttons if a certain condition is met.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-navbar-buttons end&amp;gt;&lt;br /&gt;
    &amp;lt;button ion-button icon-only (click)=&amp;quot;action()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ion-icon name=&amp;quot;funnel&amp;quot;&amp;gt;&amp;lt;/ion-icon&amp;gt;&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/core-navbar-buttons&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also use this to add options to the context menu. Example usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-navbar-buttons&amp;gt;&lt;br /&gt;
    &amp;lt;core-context-menu&amp;gt;&lt;br /&gt;
        &amp;lt;core-context-menu-item [priority]=&amp;quot;500&amp;quot; [content]=&amp;quot;&#039;Nice boat&#039;&amp;quot; (action)=&amp;quot;boatFunction()&amp;quot; [iconAction]=&amp;quot;&#039;boat&#039;&amp;quot;&amp;gt;&amp;lt;/core-context-menu-item&amp;gt;&lt;br /&gt;
    &amp;lt;/core-context-menu&amp;gt;&lt;br /&gt;
&amp;lt;/core-navbar-buttons&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it is not currently possible to remove or modify options from the context menu without using a nasty hack.&lt;br /&gt;
&lt;br /&gt;
===Specific component and directives for plugins===&lt;br /&gt;
&lt;br /&gt;
These are component and directives created specifically for supporting Moodle plugins.&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-new-content====&lt;br /&gt;
&lt;br /&gt;
Directive to display a new content when clicked. This new content can be displayed in a new page or in the current page (only if the current page is already displaying a site plugin content).&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): The component of the new content.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (string): The method to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;args&#039;&#039;&#039; (object): The params to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (string): The title to display with the new content. Only if samePage=false.&lt;br /&gt;
* &#039;&#039;&#039;samePage&#039;&#039;&#039; (boolean): Whether to display the content in same page or open a new one. Defaults to new page.&lt;br /&gt;
* &#039;&#039;&#039;useOtherData&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the args for the new &#039;&#039;get_content&#039;&#039; call. The format is the same as in &#039;&#039;useOtherDataForWS&#039;&#039;. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the new &#039;&#039;get_content&#039;&#039; WS call. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to go to a new content page:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-new-content title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.viewissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to load new content in current page using userid from otherdata:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-new-content component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot; samePage=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.viewissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS when the element is clicked. The action to do when the WS call is successful depends on the provided data: display a message, go back or refresh current view.&lt;br /&gt;
&lt;br /&gt;
If you want to load a new content when the WS call is done, please see core-site-plugins-call-ws-new-content.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* preSets (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
* &#039;&#039;&#039;confirmMessage&#039;&#039;&#039; (string): Message to confirm the action when the user clicks the element. If not supplied, no confirmation. If supplied but empty, default message (&amp;quot;Are you sure?&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;successMessage&#039;&#039;&#039; (string): Message to show on success. If not supplied, no message. If supplied but empty, default message (“Success”).&lt;br /&gt;
* &#039;&#039;&#039;goBackOnSuccess&#039;&#039;&#039; (boolean): Whether to go back if the WS call is successful.&lt;br /&gt;
* &#039;&#039;&#039;refreshOnSuccess&#039;&#039;&#039; (boolean): Whether to refresh the current view if the WS call is successful.&lt;br /&gt;
* &#039;&#039;&#039;onSuccess&#039;&#039;&#039; (Function): A function to call when the WS call is successful (HTTP call successful and no exception returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onError&#039;&#039;&#039; (Function): A function to call when the WS call fails (HTTP call fails or an exception is returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onDone&#039;&#039;&#039; (Function): A function to call when the WS call finishes (either success or fail). This field was added in v3.5.2.&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to send some data to the server without using cache, displaying default messages and refreshing on success:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot; confirmMessage successMessage refreshOnSuccess=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.senddata&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to send some data to the server using cache without confirming, going back on success and using userid from otherdata:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; goBackOnSuccess=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.senddata&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Same example as the previous one but implementing a custom JS code to run on success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot; (onSuccess)=&amp;quot;certificateViewed($event)&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.senddata&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.certificateViewed = function(result) {&lt;br /&gt;
    // Code to run when the WS call is successful.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws-new-content====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS when the element is clicked and load a new content passing the WS result as args. This new content can be displayed in a new page or in the same page (only if current page is already displaying a site plugin content).&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to load some new content when done, please see core-site-plugins-call-ws.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* &#039;&#039;&#039;preSets&#039;&#039;&#039; (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
* &#039;&#039;&#039;confirmMessage&#039;&#039;&#039; (string): Message to confirm the action when the user clicks the element. If not supplied, no confirmation. If supplied but empty, default message (&amp;quot;Are you sure?&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): The component of the new content.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (string): The method to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;args&#039;&#039;&#039; (object): The params to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (string): The title to display with the new content. Only if samePage=false.&lt;br /&gt;
* &#039;&#039;&#039;samePage&#039;&#039;&#039; (boolean): Whether to display the content in same page or open a new one. Defaults to new page.&lt;br /&gt;
* &#039;&#039;&#039;useOtherData&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the args for the new &#039;&#039;get_content&#039;&#039; call. The format is the same as in &#039;&#039;useOtherDataForWS&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;onSuccess&#039;&#039;&#039; (Function): A function to call when the WS call is successful (HTTP call successful and no exception returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onError&#039;&#039;&#039; (Function): A function to call when the WS call fails (HTTP call fails or an exception is returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onDone&#039;&#039;&#039; (Function): A function to call when the WS call finishes (either success or fail). This field was added in v3.5.2.&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to get some data from the server without using cache, showing default confirm and displaying a new page:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws-new-content name=&amp;quot;mod_certificate_get_issued_certificates&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot; confirmMessage title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to get some data from the server using cache, without confirm, displaying new content in same page and using &#039;&#039;userid&#039;&#039; from &#039;&#039;otherdata&#039;&#039;:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws-new-content name=&amp;quot;mod_certificate_get_issued_certificates&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot; samePage=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Same example as the previous one but implementing a custom JS code to run on success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws-new-content name=&amp;quot;mod_certificate_get_issued_certificates&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot; samePage=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot; (onSuccess)=&amp;quot;callDone($event)&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.callDone = function(result) {&lt;br /&gt;
    // Code to run when the WS call is successful.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws-on-load====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS as soon as the template is loaded. This directive is meant for actions to do in the background, like calling logging Web Services.&lt;br /&gt;
&lt;br /&gt;
If you want to call a WS when the user clicks on a certain element, please see core-site-plugins-call-ws.&lt;br /&gt;
&lt;br /&gt;
Note that this will cause an error to appear on each page load if the user is offline in v3.5.1 and older, the bug was fixed in v3.5.2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* &#039;&#039;&#039;preSets&#039;&#039;&#039; (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
* &#039;&#039;&#039;onSuccess&#039;&#039;&#039; (Function): A function to call when the WS call is successful (HTTP call successful and no exception returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onError&#039;&#039;&#039; (Function): A function to call when the WS call fails (HTTP call fails or an exception is returned). This field was added in v3.5.2.&lt;br /&gt;
* &#039;&#039;&#039;onDone&#039;&#039;&#039; (Function): A function to call when the WS call finishes (either success or fail). This field was added in v3.5.2.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;span core-site-plugins-call-ws-on-load name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot; (onSuccess)=&amp;quot;callDone($event)&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.callDone = function(result) {&lt;br /&gt;
    // Code to run when the WS call is successful.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Advanced features==&lt;br /&gt;
&lt;br /&gt;
===Display the plugin only if certain conditions are met===&lt;br /&gt;
&lt;br /&gt;
You might want to display your plugin in the mobile app only if certain dynamic conditions are met, so the plugin would be displayed only for some users. This can be achieved using the &amp;quot;init&amp;quot; method (for more info, please see the [[Mobile_support_for_plugins#Initialization|Initialization]] section ahead).&lt;br /&gt;
&lt;br /&gt;
All the init methods are called as soon as your plugin is retrieved. If you don&#039;t want your plugin to be displayed for the current user, then you should return an exception in this init method. It&#039;s recommended to include a message explaining why the plugin isn&#039;t available for the current user, this exception will be logged in the Javascript console.&lt;br /&gt;
&lt;br /&gt;
On the other hand, you might want to display a plugin only for certain courses (&#039;&#039;CoreCourseOptionsDelegate&#039;&#039;) or only if the user is viewing certain users&#039; profiles (&#039;&#039;CoreUserDelegate&#039;&#039;). This can be achieved with the init method too.&lt;br /&gt;
&lt;br /&gt;
In the init method you can return a &amp;quot;restrict&amp;quot; property with two fields in it: &#039;&#039;courses&#039;&#039; and &#039;&#039;users&#039;&#039;. If you return a list of courses IDs in this restrict property, then your plugin will only be displayed when the user views any of those courses. In the same way, if you return a list of user IDs then your plugin will only be displayed when the user views any of those users&#039; profiles.&lt;br /&gt;
&lt;br /&gt;
===Using “otherdata”===&lt;br /&gt;
&lt;br /&gt;
The values returned by the functions in otherdata are added to a variable so they can be used both in Javascript and in templates. The otherdata returned by a init call is added to a variable named INIT_OTHERDATA, while the otherdata returned by a &#039;&#039;get_content&#039;&#039; WS call is added to a variable named CONTENT_OTHERDATA.&lt;br /&gt;
&lt;br /&gt;
The otherdata returned by a init call will be passed to the JS and template of all the get_content calls in that handler. The otherdata returned by a get_content call will only be passed to the JS and template returned by that get_content call.&lt;br /&gt;
&lt;br /&gt;
This means that, in your Javascript, you can access and use these data like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
this.CONTENT_OTHERDATA.myVar&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
And in the template you could use it like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{ CONTENT_OTHERDATA.myVar }}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;myVar&#039;&#039; is the name we put to one of our variables, it can be the name you want. In the example above, this is the otherdata returned by the PHP method:&lt;br /&gt;
&lt;br /&gt;
array(&#039;myVar&#039; =&amp;gt; &#039;Initial value&#039;)&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
In our plugin we want to display an input text with a certain initial value. When the user clicks a button, we want the value in the input to be sent to a certain WebService. This can be done using otherdata.&lt;br /&gt;
&lt;br /&gt;
We will return the initial value of the input in the otherdata of our PHP method:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;myVar&#039; =&amp;gt; &#039;My initial value&#039;),&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Then in the template we will use it like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-item text-wrap&amp;gt;&lt;br /&gt;
    &amp;lt;ion-label stacked&amp;gt;{{ &#039;plugin.mod_certificate.textlabel | translate }}&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
    &amp;lt;ion-input type=&amp;quot;text&amp;quot; [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.myVar&amp;quot;&amp;gt;&amp;lt;/ion-input&amp;gt;&lt;br /&gt;
&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;ion-item&amp;gt;&lt;br /&gt;
    &amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-call-ws name=&amp;quot;mod_certificate_my_webservice&amp;quot; [useOtherDataForWS]=&amp;quot;[&#039;myVar&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
        {{ &#039;plugin.mod_certificate.send | translate }}&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above, we are creating an input text and we use &#039;&#039;[(ngModel)]&#039;&#039; to use the value in &#039;&#039;myVar&#039;&#039; as the initial value and to store the changes in the same &#039;&#039;myVar&#039;&#039; variable. This means that the initial value of the input will be “My initial value”, and if the user changes the value of the input these changes will be applied to the &#039;&#039;myVar&#039;&#039; variable. This is called 2-way data binding in Angular.&lt;br /&gt;
&lt;br /&gt;
Then we add a button to send this data to a WS, and for that we use the directive core-site-plugins-call-ws. We use the &#039;&#039;useOtherDataForWS&#039;&#039; attribute to specify which variable from &#039;&#039;otherdata&#039;&#039; we want to send to our WebService. So if the user enters “A new value” in the input and then clicks the button, it will call the WebService &#039;&#039;mod_certificate_my_webservice&#039;&#039; and will send as a param: myVar -&amp;gt; “A new value”.&lt;br /&gt;
&lt;br /&gt;
We can achieve the same result using the &#039;&#039;params&#039;&#039; attribute of the core-site-plugins-call-ws directive instead of using &#039;&#039;useOtherDataForWS&#039;&#039;:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-call-ws name=&amp;quot;mod_certificate_my_webservice&amp;quot; [params]=&amp;quot;{myVar: CONTENT_OTHERDATA.myVar}&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.send | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The WebService call will be exactly the same with both buttons.&lt;br /&gt;
&lt;br /&gt;
Please notice that this example could be done without using otherdata too, using the “&#039;&#039;form&#039;&#039;” input of the &#039;&#039;core-site-plugins-call-ws directive&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Running JS code after a content template has loaded===&lt;br /&gt;
&lt;br /&gt;
When you return JavaScript code from a handler function using the &#039;javascript&#039; array key, this code is executed immediately after the web service call returns, which may be before the returned template has been rendered into the DOM. &lt;br /&gt;
&lt;br /&gt;
If your code needs to run after the DOM has been updated, you can use setTimeout to call it. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
return [&lt;br /&gt;
    &#039;template&#039; =&amp;gt; [ ... ],&lt;br /&gt;
    &#039;javascript&#039; =&amp;gt; &#039;setTimeout(function() { console.log(&amp;quot;DOM is available now&amp;quot;); });&#039;,&lt;br /&gt;
    &#039;otherdata&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
    &#039;files&#039; =&amp;gt; []&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: If you wanted to write a lot of code here, you might be better off putting it in a function defined in the response from an init template, so that it does not get loaded again with each page of content.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===JS functions visible in the templates===&lt;br /&gt;
&lt;br /&gt;
The app provides some Javascript functions that can be used from the templates to update, refresh or view content. These are the functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;openContent(title: string, args: any, component?: string, method?: string)&#039;&#039;&#039;: Open a new page to display some new content. You need to specify the &#039;&#039;title&#039;&#039; of the new page and the &#039;&#039;args&#039;&#039; to send to the method. If &#039;&#039;component&#039;&#039; and &#039;&#039;method&#039;&#039; aren&#039;t provided, it will use the same as in the current page.&lt;br /&gt;
* &#039;&#039;&#039;refreshContent(showSpinner = true)&#039;&#039;&#039;: Refresh the current content. By default it will display a spinner while refreshing, if you don&#039;t want it to be displayed you should pass false as a parameter.&lt;br /&gt;
* &#039;&#039;&#039;updateContent(args: any, component?: string, method?: string)&#039;&#039;&#039;: Refresh the current content using different params. You need to specify the &#039;&#039;args&#039;&#039; to send to the method. If &#039;&#039;component&#039;&#039; and &#039;&#039;method&#039;&#039; aren&#039;t provided, it will use the same as in the current page.&lt;br /&gt;
&lt;br /&gt;
====Examples====&lt;br /&gt;
&lt;br /&gt;
=====Group selector=====&lt;br /&gt;
&lt;br /&gt;
Imagine we have an activity that uses groups and we want to let the user select which group he wants to see. A possible solution would be to return all the groups in the same template (hidden), and then show the group user selects. However, we can make it more dynamic and return only the group the user is requesting.&lt;br /&gt;
&lt;br /&gt;
To do so, we&#039;ll use a drop down to select the group. When the user selects a group using this drop down we&#039;ll update the page content to display the new group.&lt;br /&gt;
&lt;br /&gt;
The main difficulty in this is to tell the view which group needs to be selected when the view is loaded. There are 2 ways to do it: using plain HTML or using Angular&#039;s &#039;&#039;ngModel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
======Using plain HTML======&lt;br /&gt;
&lt;br /&gt;
We need to add a &amp;quot;&#039;&#039;selected&#039;&#039;&amp;quot; attribute to the option that needs to be selected. To do so, we need to pre-caclulate the selected option in the PHP code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        $groupid = empty($args-&amp;gt;group) ? 0 : $args-&amp;gt;group; // By default, group 0.&lt;br /&gt;
        $groups = groups_get_activity_allowed_groups($cm, $user-&amp;gt;id);&lt;br /&gt;
        // Detect which group is selected.&lt;br /&gt;
        foreach ($groups as $gid=&amp;gt;$group) {&lt;br /&gt;
            $group-&amp;gt;selected = $gid === $groupid;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $data = array(&lt;br /&gt;
            &#039;cmid&#039; =&amp;gt; $cm-&amp;gt;id,&lt;br /&gt;
            &#039;courseid&#039; =&amp;gt; $args-&amp;gt;courseid,&lt;br /&gt;
            &#039;groups&#039; =&amp;gt; $groups&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        return array(&lt;br /&gt;
            &#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
                array(&lt;br /&gt;
                    &#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                    &#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
                ),&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the code above, we&#039;re retrieving the groups the user can see and then we&#039;re adding a &amp;quot;selected&amp;quot; bool to each one to determine which one needs to be selected in the drop down. Finally, we pass the list of groups to the template.&lt;br /&gt;
&lt;br /&gt;
In the template, we display the drop down like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-select (ionChange)=&amp;quot;updateContent({cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;, group: $event})&amp;quot; interface=&amp;quot;popover&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;%#groups%&amp;gt;&lt;br /&gt;
        &amp;lt;ion-option value=&amp;quot;&amp;lt;% id %&amp;gt;&amp;quot; &amp;lt;%#selected%&amp;gt;selected&amp;lt;%/selected%&amp;gt; &amp;gt;&amp;lt;% name %&amp;gt;&amp;lt;/ion-option&amp;gt;&lt;br /&gt;
    &amp;lt;%/groups%&amp;gt;&lt;br /&gt;
&amp;lt;/ion-select&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ionChange&#039;&#039; function will be called everytime the user selects a different group with the drop down. We&#039;re using the function &#039;&#039;updateContent&#039;&#039; to update the current view using the new group. &#039;&#039;$event&#039;&#039; is an Angular variable that will have the selected value (in our case, the group ID that was just selected). This is enough to make the group selector work.&lt;br /&gt;
&lt;br /&gt;
======Using ngModel======&lt;br /&gt;
&lt;br /&gt;
ngModel is an Angular directive that allows storing the value of a certain input/select in a Javascript variable, and also the opposite way: tell the input/select which value to set. The main problem is that we cannot initialize a Javascript variable from the template (Angular doesn&#039;t have &#039;&#039;ng-init&#039;&#039; like in AngularJS), so we&#039;ll use &amp;quot;otherdata&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In the PHP function we&#039;ll return the group that needs to be selected in the &#039;&#039;otherdata&#039;&#039; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        $groupid = empty($args-&amp;gt;group) ? 0 : $args-&amp;gt;group; // By default, group 0.&lt;br /&gt;
        $groups = groups_get_activity_allowed_groups($cm, $user-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return array(&lt;br /&gt;
            &#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
                array(&lt;br /&gt;
                    &#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                    &#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
                ),&lt;br /&gt;
            ),&lt;br /&gt;
            &#039;otherdata&#039; =&amp;gt; array(&lt;br /&gt;
                &#039;group&#039; =&amp;gt; $groupid&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above we don&#039;t need to iterate over the groups array like in the plain HTML example. However, now we&#039;re returning the groupid in the &amp;quot;otherdata&amp;quot; array. As it&#039;s explained in the [[Mobile_support_for_plugins#Using_.E2.80.9Cotherdata.E2.80.9D|Using &amp;quot;otherdata&amp;quot;]] section, this &amp;quot;otherdata&amp;quot; is visible in the templates inside a variable named &#039;&#039;CONTENT_OTHERDATA&#039;&#039;. So in the template we&#039;ll use this variable like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-select [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.group&amp;quot; (ionChange)=&amp;quot;updateContent({cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;, group: CONTENT_OTHERDATA.group})&amp;quot; interface=&amp;quot;popover&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;%#groups%&amp;gt;&lt;br /&gt;
        &amp;lt;ion-option value=&amp;quot;&amp;lt;% id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;% name %&amp;gt;&amp;lt;/ion-option&amp;gt;&lt;br /&gt;
    &amp;lt;%/groups%&amp;gt;&lt;br /&gt;
&amp;lt;/ion-select&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Initialization===&lt;br /&gt;
&lt;br /&gt;
All handlers can specify a “&#039;&#039;init&#039;&#039;” method in the mobile.php file. This method is meant to return some JavaScript code that needs to be executed as soon as the plugin is retrieved.&lt;br /&gt;
&lt;br /&gt;
When the app retrieves all the handlers, the first thing it will do is call the &#039;&#039;tool_mobile_get_content&#039;&#039; WebService with the init method. This WS call will only receive the default args.&lt;br /&gt;
&lt;br /&gt;
The app will immediately execute the JavaScript code returned by this WS call. This JavaScript can be used to manually register your handlers in the delegates you want, without having to rely on the default handlers built based on the mobile.php data.&lt;br /&gt;
&lt;br /&gt;
The templates returned by this init method will be added to a INIT_TEMPLATES variable that will be passed to all the Javascript code of that handler. This means that the Javascript returned by the init method or the “main” method can access any of the templates HTML like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.INIT_TEMPLATES[‘main’];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
In this case, “main” is the ID of the template we want to use.&lt;br /&gt;
&lt;br /&gt;
The same happens with the &#039;&#039;otherdata&#039;&#039; returned by this init method, it is added to a INIT_OTHERDATA variable.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;restrict&#039;&#039; field returned by this init call will be used to determine if your handler is enabled or not. For example, if your handler is for the delegate &#039;&#039;CoreCourseOptionsDelegate&#039;&#039; and you return a list of courseids in restrict-&amp;gt;courses, then your handler will only be enabled in the courses you returned. This only applies to the “default” handlers, if you register your own handler using the Javascript code then you should check yourself if the handler is enabled.&lt;br /&gt;
&lt;br /&gt;
Finally, if you return an object in this init Javascript code, all the properties of that object will be passed to all the Javascript code of that handler so you can use them when the code is run. For example, if your init Javascript code does something like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var result = {&lt;br /&gt;
    MyAddonClass: new MyAddonClass()&lt;br /&gt;
};&lt;br /&gt;
result:&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Then, for the rest of Javascript code of your handler (e.g. for the “main” method) you can use this variable like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.MyAddonClass&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Examples====&lt;br /&gt;
&lt;br /&gt;
=====Module link handler=====&lt;br /&gt;
&lt;br /&gt;
A link handler allows you to decide what to do when a link with a certain URL is clicked. This is useful, for example, to open your module when a link to the module is clicked. In this example we’ll create a link handler to detect links to a certificate module using a init JavaScript:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
function AddonModCertificateModuleLinkHandler() {&lt;br /&gt;
    that.CoreContentLinksModuleIndexHandler.call(this, that.CoreCourseHelperProvider, &#039;mmaModCertificate&#039;, &#039;certificate&#039;);&lt;br /&gt;
&lt;br /&gt;
    this.name = &amp;quot;AddonModCertificateLinkHandler&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
AddonModCertificateModuleLinkHandler.prototype = Object.create(this.CoreContentLinksModuleIndexHandler.prototype);&lt;br /&gt;
AddonModCertificateModuleLinkHandler.prototype.constructor = AddonModCertificateModuleLinkHandler;&lt;br /&gt;
&lt;br /&gt;
this.CoreContentLinksDelegate.registerHandler(new AddonModCertificateModuleLinkHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Module prefetch handler=====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;CoreCourseModuleDelegate&#039;&#039; handler allows you to define a list of &#039;&#039;offlinefunctions&#039;&#039; to prefetch a module. However, you might want to create your own prefetch handler to determine what needs to be downloaded. For example, you might need to chain WS calls (pass the result of a WS call to the next one), and this cannot be done using &#039;&#039;offlinefunctions&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Here’s an example on how to create a prefetch handler using init JS:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
// Create a class that &amp;quot;inherits&amp;quot; from CoreCourseActivityPrefetchHandlerBase.&lt;br /&gt;
function AddonModCertificateModulePrefetchHandler() {&lt;br /&gt;
    that.CoreCourseActivityPrefetchHandlerBase.call(this, that.TranslateService, that.CoreAppProvider, that.CoreUtilsProvider,&lt;br /&gt;
            that.CoreCourseProvider, that.CoreFilepoolProvider, that.CoreSitesProvider, that.CoreDomUtilsProvider);&lt;br /&gt;
&lt;br /&gt;
    this.name = &amp;quot;AddonModCertificateModulePrefetchHandler&amp;quot;;&lt;br /&gt;
    this.modName = &amp;quot;certificate&amp;quot;;&lt;br /&gt;
    this.component = &amp;quot;mmaModCertificate&amp;quot;;&lt;br /&gt;
    this.updatesNames = /^configuration$|^.*files$/;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype = Object.create(this.CoreCourseActivityPrefetchHandlerBase.prototype);&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype.constructor = AddonModCertificateModulePrefetchHandler;&lt;br /&gt;
&lt;br /&gt;
// Override the prefetch call.&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype.prefetch = function(module, courseId, single, dirPath) {&lt;br /&gt;
    return this.prefetchPackage(module, courseId, single, prefetchCertificate);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function prefetchCertificate(module, courseId, single, siteId) {&lt;br /&gt;
    // Perform all the WS calls.&lt;br /&gt;
    // You can access most of the app providers using that.ClassName. E.g. that.CoreWSProvider.call().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
this.CoreCourseModulePrefetchDelegate.registerHandler(new AddonModCertificateModulePrefetchHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One relatively simple full example is where you have a function that needs to work offline, but it has an additional argument other than the standard ones. You can imagine for this an activity like the book module, where it has multiple pages for the same cmid. The app will not automatically work with this situation - it will call the offline function with the standard arguments only, so you won&#039;t be able to prefetch all the possible parameters. &lt;br /&gt;
&lt;br /&gt;
To deal with this, you need to implement a web service in your Moodle component that returns the list of possible extra arguments, and then you can call this web service and loop around doing the same thing the app does when it prefetches the offline functions. Here is an example from a third-party module (showing only the actual prefetch function - the rest of the code is as above) where there are multiple values of a custom &#039;section&#039; parameter for the mobile function &#039;mobile_document_view&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
function prefetchOucontent(module, courseId, single, siteId) {&lt;br /&gt;
    var component = &#039;mod_oucontent&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Get the site, first.&lt;br /&gt;
    return that.CoreSitesProvider.getSite(siteId).then(function(site) {&lt;br /&gt;
        // Read the list of pages in this document using a web service.&lt;br /&gt;
        return site.read(&#039;mod_oucontent_get_page_list&#039;, {&#039;cmid&#039;: module.id}).then(function(response) {&lt;br /&gt;
            var promises = [];&lt;br /&gt;
&lt;br /&gt;
            // For each page, read and process the page - this is a copy of logic in the app at&lt;br /&gt;
            // siteplugins.ts (prefetchFunctions), but modified to add the custom argument.&lt;br /&gt;
            for(var i = 0; i &amp;lt; response.length; i++) {&lt;br /&gt;
                var args = {&lt;br /&gt;
                    courseid: courseId,&lt;br /&gt;
                    cmid: module.id,&lt;br /&gt;
                    userid: site.getUserId()&lt;br /&gt;
                };&lt;br /&gt;
                if (response[i] !== &#039;&#039;) {&lt;br /&gt;
                    args.section = response[i];&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                promises.push(that.CoreSitePluginsProvider.getContent(&lt;br /&gt;
                        component, &#039;mobile_document_view&#039;, args).then(&lt;br /&gt;
                        function(result) {&lt;br /&gt;
                            var subPromises = [];&lt;br /&gt;
                            if (result.files &amp;amp;&amp;amp; result.files.length) {&lt;br /&gt;
                                subPromises.push(that.CoreFilepoolProvider.downloadOrPrefetchFiles(&lt;br /&gt;
                                        site.id, result.files, true, false, component, module.id));&lt;br /&gt;
                            }&lt;br /&gt;
                            return Promise.all(subPromises);&lt;br /&gt;
                        }));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return Promise.all(promises);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Single activity course format=====&lt;br /&gt;
&lt;br /&gt;
In the following example, the value of INIT_TEMPLATES[&amp;quot;main&amp;quot;] is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;core-dynamic-component [component]=&amp;quot;componentClass&amp;quot; [data]=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/core-dynamic-component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This template is returned by the init method. And this is the JavaScript code returned by the init method:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
function getAddonSingleActivityFormatComponent() {&lt;br /&gt;
    function AddonSingleActivityFormatComponent() {&lt;br /&gt;
        this.data = {};&lt;br /&gt;
    };&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.constructor = AddonSingleActivityFormatComponent;&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.ngOnChanges = function(changes) {&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        if (this.course &amp;amp;&amp;amp; this.sections &amp;amp;&amp;amp; this.sections.length) {&lt;br /&gt;
            var module = this.sections[0] &amp;amp;&amp;amp; this.sections[0].modules &amp;amp;&amp;amp; this.sections[0].modules[0];&lt;br /&gt;
            if (module &amp;amp;&amp;amp; !this.componentClass) {&lt;br /&gt;
                that.CoreCourseModuleDelegate.getMainComponent(that.Injector, this.course, module).then((component) =&amp;gt; {&lt;br /&gt;
                    self.componentClass = component || that.CoreCourseUnsupportedModuleComponent;&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            this.data.courseId = this.course.id;&lt;br /&gt;
            this.data.module = module;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.doRefresh = function(refresher, done) {&lt;br /&gt;
        return Promise.resolve(this.dynamicComponent.callComponentFunction(&amp;quot;doRefresh&amp;quot;, [refresher, done]));&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
return AddonSingleActivityFormatComponent;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function AddonSingleActivityFormatHandler() {&lt;br /&gt;
    this.name = &amp;quot;singleactivity&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.constructor = AddonSingleActivityFormatHandler;&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.isEnabled = function() {&lt;br /&gt;
    return true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.canViewAllSections = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.getCourseTitle = function(course, sections) {&lt;br /&gt;
    if (sections &amp;amp;&amp;amp; sections[0] &amp;amp;&amp;amp; sections[0].modules &amp;amp;&amp;amp; sections[0].modules[0]) {&lt;br /&gt;
        return sections[0].modules[0].name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return course.fullname || &amp;quot;&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.displayEnableDownload = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.displaySectionSelector = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.getCourseFormatComponent = function(injector, course) {&lt;br /&gt;
    that.Injector = injector || that.Injector;&lt;br /&gt;
&lt;br /&gt;
    return that.CoreCompileProvider.instantiateDynamicComponent(that.INIT_TEMPLATES[&amp;quot;main&amp;quot;], getAddonSingleActivityFormatComponent(), injector);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
this.CoreCourseFormatDelegate.registerHandler(new AddonSingleActivityFormatHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using the JavaScript API===&lt;br /&gt;
&lt;br /&gt;
The Javascript API is partly supported right now, only the &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; supports it now. This API allows you to override any of the functions of the default handler. &lt;br /&gt;
&lt;br /&gt;
The “method” specified in a handler registered in the &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; will be called immediately after the init method, and the Javascript returned by this method will be run. If this Javascript code returns an object with certain functions, these function will override the ones in the default handler.&lt;br /&gt;
&lt;br /&gt;
For example, if the Javascript returned by the method returns something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var result = {&lt;br /&gt;
    getData: function(field, signup, registerAuth, formValues) {&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
result;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The the &#039;&#039;getData&#039;&#039; function of the default handler will be overridden by the returned getData function.&lt;br /&gt;
&lt;br /&gt;
The default handler for &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; only has 2 functions: &#039;&#039;getComponent&#039;&#039; and &#039;&#039;getData&#039;&#039;. In addition, the JavaScript code can return an extra function named &#039;&#039;componentInit&#039;&#039; that will be executed when the component returned by &#039;&#039;getComponent&#039;&#039; is initialized.&lt;br /&gt;
&lt;br /&gt;
Here’s an example on how to support the text user profile field using this API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
var result = {&lt;br /&gt;
    componentInit: function() {&lt;br /&gt;
        if (this.field &amp;amp;&amp;amp; this.edit &amp;amp;&amp;amp; this.form) {&lt;br /&gt;
            this.field.modelName = &amp;quot;profile_field_&amp;quot; + this.field.shortname;&lt;br /&gt;
&lt;br /&gt;
            if (this.field.param2) {&lt;br /&gt;
                this.field.maxlength = parseInt(this.field.param2, 10) || &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            this.field.inputType = that.CoreUtilsProvider.isTrueOrOne(this.field.param3) ? &amp;quot;password&amp;quot; : &amp;quot;text&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            var formData = {&lt;br /&gt;
                value: this.field.defaultdata,&lt;br /&gt;
                disabled: this.disabled&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            this.form.addControl(this.field.modelName, that.FormBuilder.control(formData, this.field.required &amp;amp;&amp;amp; !this.field.locked ? that.Validators.required : null));&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    getData: function(field, signup, registerAuth, formValues) {&lt;br /&gt;
        var name = &amp;quot;profile_field_&amp;quot; + field.shortname;&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            type: &amp;quot;text&amp;quot;,&lt;br /&gt;
            name: name,&lt;br /&gt;
            value: that.CoreTextUtilsProvider.cleanTags(formValues[name])&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
result;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
=== Invalid response received ===&lt;br /&gt;
&lt;br /&gt;
You might receive this error when using the &amp;quot;core-site-plugins-call-ws&amp;quot; directive or similar. By default, the app expects all WebService calls to return an object, if your WebService returns another type (string, bool, ...) then you need to specify it using the preSets attribute of the directive. For example, if your WS returns a boolean value, then you should specify it like this:&lt;br /&gt;
&lt;br /&gt;
[preSets]=&amp;quot;{typeExpected: &#039;boolean&#039;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In a similar way, if your WebService returns null you need to tell the app not to expect any result using the preSets:&lt;br /&gt;
&lt;br /&gt;
[preSets]=&amp;quot;{responseExpected: false}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS ===&lt;br /&gt;
&lt;br /&gt;
Some directives allow you to specify a form id or name to send the data from the form to a certain WS. These directives look for HTML inputs to retrieve the data to send. However, ion-radio, ion-checkbox and ion-select don&#039;t use HTML inputs, they simulate them, so the directive isn&#039;t going to find their data and so it won&#039;t be sent to the WebService.&lt;br /&gt;
&lt;br /&gt;
There are 2 workarounds to fix this problem. It seems that the next major release of Ionic framework does use HTML inputs, so these are temporary solutions.&lt;br /&gt;
&lt;br /&gt;
==== Sending the data manually ====&lt;br /&gt;
&lt;br /&gt;
The first solution is to send the missing params manually using the &amp;quot;&#039;&#039;params&#039;&#039;&amp;quot; property. We will use &#039;&#039;ngModel&#039;&#039; to store the input value in a variable, and this variable will be passed to the params. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a template like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;ion-list radio-group name=&amp;quot;responses&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;myws&amp;quot; [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;}&amp;quot; form=&amp;quot;myform&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mycomponent.save&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you should modify it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;ion-list radio-group [(ngModel)]=&amp;quot;responses&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;myws&amp;quot; [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;, responses: responses}&amp;quot; form=&amp;quot;myform&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mycomponent.save&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Basically, you need to add &#039;&#039;ngModel&#039;&#039; to the affected element (in this case, the &#039;&#039;radio-group&#039;&#039;). You can put whatever name you want as the value, we used &amp;quot;responses&amp;quot;. With this, everytime the user selects a radio button the value will be stored in a variable named &amp;quot;responses&amp;quot;. Then, in the button we are passing this variable to the params of the WebService.&lt;br /&gt;
&lt;br /&gt;
Please notice that the &amp;quot;form&amp;quot; attribute has priority over &amp;quot;params&amp;quot;, so if you have an input with name=&amp;quot;responses&amp;quot; it will override what you&#039;re manually passing to params.&lt;br /&gt;
&lt;br /&gt;
==== Using a hidden input ====&lt;br /&gt;
&lt;br /&gt;
Since the directive is looking for HTML inputs, you need to add one with the value to send to the server. You can use &#039;&#039;ngModel&#039;&#039; to synchronize your ion-radio/ion-checkbox/ion-select with the new hidden input. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a radio button like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;div radio-group name=&amp;quot;responses&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you should modify it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;div radio-group name=&amp;quot;responses&amp;quot; [(ngModel)]=&amp;quot;responses&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ion-input type=&amp;quot;hidden&amp;quot; [ngModel]=&amp;quot;responses&amp;quot; name=&amp;quot;responses&amp;quot;&amp;gt;&amp;lt;/ion-input&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above, we&#039;re using a variable named &amp;quot;responses&amp;quot; to synchronize the data between the &#039;&#039;radio-group&#039;&#039; and the hidden input. You can use whatever name you want.&lt;br /&gt;
&lt;br /&gt;
=== I can&#039;t return an object or array in otherdata ===&lt;br /&gt;
&lt;br /&gt;
If you try to return an object or an array in any field inside &#039;&#039;otherdata&#039;&#039;, the WebService call will fail with the following error:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scalar type expected, array or object received&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Each field in &#039;&#039;otherdata&#039;&#039; must be a string, number or boolean, it cannot be an object or array. To make it work, you need to encode your object or array into a JSON string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; json_encode($data))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The app will automatically parse this JSON and convert it back into an array or object.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===Accepting dynamic names in a WebService===&lt;br /&gt;
&lt;br /&gt;
We want to display a form where the names of the fields are dynamic, like it happens in quiz. This data will be sent to a new WebService that we have created.&lt;br /&gt;
&lt;br /&gt;
The first issue we find is that the WebService needs to define the names of the parameters received, but in this case they&#039;re dynamic. The solution is to accept an array of objects with name and value. So in the &#039;&#039;_parameters()&#039;&#039; function of our new WebService, we will add this parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;data&#039; =&amp;gt; new external_multiple_structure(&lt;br /&gt;
     new external_single_structure(&lt;br /&gt;
        array(&lt;br /&gt;
            &#039;name&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;data name&#039;),&lt;br /&gt;
            &#039;value&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;data value&#039;),&lt;br /&gt;
        )&lt;br /&gt;
    ),&lt;br /&gt;
    &#039;The data to be saved&#039;, VALUE_DEFAULT, array()&lt;br /&gt;
)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to adapt our form to send the data as the WebService requires it. In our template, we have a button with the directive &#039;&#039;core-site-plugins-call-ws&#039;&#039; that will send the form data to our WebService. To make this work we will have to pass the parameters manually, without using the &amp;quot;&#039;&#039;form&#039;&#039;&amp;quot; attribute, because we need to format the data before it is sent.&lt;br /&gt;
&lt;br /&gt;
Since we will send the params manually and we want it all to be sent in the same array, we will use &#039;&#039;ngModel&#039;&#039; to store the input data into a variable that we&#039;ll call &amp;quot;data&amp;quot;, but you can use the name you want. This &amp;quot;data&amp;quot; will be an object that will hold the input data with the format &amp;quot;name-&amp;gt;value&amp;quot;. For example, if I have an input with name &amp;quot;a1&amp;quot; and value &amp;quot;My answer&amp;quot;, the data object will be:&lt;br /&gt;
&lt;br /&gt;
{a1: &amp;quot;My answer&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
So we need to add &#039;&#039;ngModel&#039;&#039; to all the inputs whose values need to be sent to the &amp;quot;data&amp;quot; WS param. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&amp;lt;ion-input name=&amp;quot;&amp;lt;% name %&amp;gt;&amp;quot; [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.data[&#039;&amp;lt;% name %&amp;gt;&#039;]&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, we&#039;re using &#039;&#039;CONTENT_OTHERDATA&#039;&#039; to store the data. We do it like this because we&#039;ll use &#039;&#039;otherdata&#039;&#039; to initialize the form, setting the values the user has already stored. If you don&#039;t need to initialize the form, then you can use the variable &amp;quot;dataObject&amp;quot;, an empty object that the Mobile app creates for you: [(ngModel)]=&amp;quot;dataObject[&#039;&amp;lt;% name %&amp;gt;&#039;]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Mobile app has a function that allows you to convert this data object into an array like the one the WS expects: &#039;&#039;objectToArrayOfObjects&#039;&#039;. So in our button we&#039;ll use this function to format the data before it&#039;s sent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;my_ws_name&amp;quot;&lt;br /&gt;
    [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;, data: CoreUtilsProvider.objectToArrayOfObjects(CONTENT_OTHERDATA.data, &#039;name&#039;, &#039;value&#039;)}&amp;quot;&lt;br /&gt;
    successMessage&lt;br /&gt;
    refreshOnSuccess=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see in the example above, we&#039;re specifying that the keys of the &amp;quot;data&amp;quot; object need to be stored in a property named &amp;quot;name&amp;quot;, and the values need to be stored in a property named &amp;quot;value&amp;quot;. If your WebService expects different names you need to change the parameters of the function &#039;&#039;objectToArrayOfObjects&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If you open your plugin now in the Mobile app it will display an error in the Javascript console. The reason is that the variable &amp;quot;data&amp;quot; doesn&#039;t exist inside &#039;&#039;CONTENT_OTHERDATA&#039;&#039;. As it is explained in previous sections, &#039;&#039;CONTENT_OTHERDATA&#039;&#039; holds the data that you return in &#039;&#039;otherdata&#039;&#039; for your method. We&#039;ll use &#039;&#039;otherdata&#039;&#039; to initialize the values to be displayed in the form.&lt;br /&gt;
&lt;br /&gt;
If the user hasn&#039;t answered the form yet, we can initialize the &amp;quot;data&amp;quot; object as an empty object. Please remember that we cannot return arrays or objects in &#039;&#039;otherdata&#039;&#039;, so we&#039;ll return a JSON string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; &#039;{}&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the code above, the form will always be empty when the user opens it. But now we want to check if the user has already answered the form and fill the form with the previous values. We will do it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$userdata = get_user_responses(); // It will held the data in a format name-&amp;gt;value. Example: array(&#039;a1&#039; =&amp;gt; &#039;My value&#039;).&lt;br /&gt;
...&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; json_encode($userdata))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the user will be able to see previous values when the form is opened, and clicking the button will send the data to our WebService in array format.&lt;br /&gt;
&lt;br /&gt;
==Moodle plugins with mobile support==&lt;br /&gt;
&lt;br /&gt;
* Group choice: [https://moodle.org/plugins/mod_choicegroup Moodle plugins directory entry] and [https://github.com/ndunand/moodle-mod_choicegroup code in github].&lt;br /&gt;
* Custom certificate: [https://moodle.org/plugins/mod_customcert Moodle plugins directory entry] and [https://github.com/markn86/moodle-mod_customcert code in github].&lt;br /&gt;
* Gapfill question type: [https://moodle.org/plugins/qtype_gapfill Moodle plugins directory entry] and [https://github.com/marcusgreen/moodle-qtype_gapfill in github].&lt;br /&gt;
* Certificate: [https://moodle.org/plugins/mod_certificate Moodle plugins directory entry] and [https://github.com/markn86/moodle-mod_certificate in github].&lt;br /&gt;
* Attendance [https://moodle.org/plugins/mod_attendance Moodle plugins directory entry] and [https://github.com/danmarsden/moodle-mod_attendance in github].&lt;br /&gt;
&lt;br /&gt;
See the complete list in the plugins database [https://moodle.org/plugins/browse.php?list=award&amp;amp;id=6 here] (it may contain some outdated plugins)&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Plugins_Development_Guide&amp;diff=54727</id>
		<title>Moodle App Plugins Development Guide</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Plugins_Development_Guide&amp;diff=54727"/>
		<updated>2018-09-07T00:42:57Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Sending the data manually */ fix example to be valid mustache - radio-group should be in ion-list - not div.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}&lt;br /&gt;
&lt;br /&gt;
==Context==&lt;br /&gt;
Since Moodle 3.1 it is possible to support different types of Moodle plugins in the Mobile app via the [[Moodle Mobile Remote add-ons|Remote add-ons]] functionality.&lt;br /&gt;
&lt;br /&gt;
Remote add-ons allow a developer to add complete support to their plugins in the Mobile app, but they have some disadvantages:&lt;br /&gt;
* Remote add-ons are not easy to develop and test since they are required to be developed as an Angular JS/Ionic module.&lt;br /&gt;
* A zip file containing the plugin must be downloaded from the server to be lazy-loaded.&lt;br /&gt;
* It is not easy to maintain or upgrade them.&lt;br /&gt;
* Developers had to set up a local Mobile development environment&lt;br /&gt;
&lt;br /&gt;
In order to allow plugin developers to make their plugins compatible with the app, the Mobile team has been thinking in a new way to extend the mobile app features following these premises:&lt;br /&gt;
* It has to be easy to develop&lt;br /&gt;
* It should work without developing Angular/Ionic code&lt;br /&gt;
* It has to be easy to maintain&lt;br /&gt;
* It has to be supported since Moodle 3.1 at least&lt;br /&gt;
* Should support all the different types of Moodle plugins supported by the app&lt;br /&gt;
* Should work in any type of device&lt;br /&gt;
* Should not require JavaScript at all, although in some cases it will be needed. In the latter case, we’ll try to simplify the required JavaScript&lt;br /&gt;
&lt;br /&gt;
==New approach==&lt;br /&gt;
&lt;br /&gt;
We published an initial draft specification, and last month we started its implementation. During the implementation process we decided to make the following changes to the initial plans in order to make developers life easier:&lt;br /&gt;
&lt;br /&gt;
* There will be just one way to support plugins in the app.&lt;br /&gt;
* This new way will allow developers to support plugins using PHP code, templates and Ionic markup (html components).&lt;br /&gt;
* The use of JavaScript will be optional (but some type of advanced plugins may require it)&lt;br /&gt;
* Developers won’t need to set up a Mobile development environment, they will be able to test using the latest version of the official app (although setting up a local Mobile environment is recommended for complex plugins).&lt;br /&gt;
&lt;br /&gt;
This means that remote add-ons won’t be necessary anymore, and developers won’t have to learn Ionic 3 / Angular and set up a new mobile development environment to migrate them.&lt;br /&gt;
&lt;br /&gt;
Important notes:&lt;br /&gt;
* Moodle Mobile 3.5 (to be released June 2018) will be the first version of the Mobile app supporting this new type of plugins.&lt;br /&gt;
* Remote add-ons will have to be migrated to the new simpler way (following this documentation)&lt;br /&gt;
* These features are natively supported in Moodle 3.5, but for previous versions you will need to install the Moodle Mobile Additional Features plugin.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
The overall idea is to allow Moodle plugins to extend different areas in the app with &#039;&#039;just PHP server side&#039;&#039; code and Ionic 3 markup (custom html elements that are called components) using a set of custom Ionic directives and components.&lt;br /&gt;
&lt;br /&gt;
Developers will have to:&lt;br /&gt;
# Create a db/mobile.php file in their plugins. In this file developers will be able to indicate which areas of the app they want to extend, for example, adding a new option in the main menu, implementing an activity module not supported, including a new option in the course menu, including a new option in the user profile, etc. All the areas supported are described further in this document.&lt;br /&gt;
# Create new functions in a reserved namespace that will return the content of the new options. The content should be returned rendered (html). The template should use [https://ionicframework.com/docs/components/ Ionic components] so that it looks native (custom html elements) but it can be generated using mustache templates. &lt;br /&gt;
&lt;br /&gt;
Let’s clarify some points:&lt;br /&gt;
&lt;br /&gt;
* You don’t need to create new Web Service functions (although you will be able to use them for advanced features). You just need plain php functions that will be placed in a reserved namespace.&lt;br /&gt;
* Those functions will be exported via the Web Service function tool_mobile_get_content&lt;br /&gt;
* As arguments of your functions you will always receive the userid, some relevant details of the app (app version, current language in the app, etc…) and some specific data depending on the type of plugin (courseid, cmid, …).&lt;br /&gt;
* We provide a list of custom Ionic components and directives (html tags) that will provide dynamic behaviour, like indicating that you are linking a file that can be downloaded, or to allow a transition to new pages into the app calling a specific function in the server, submit form data to the server  etc..&lt;br /&gt;
&lt;br /&gt;
==Types of plugins==&lt;br /&gt;
&lt;br /&gt;
We could classify all the plugins in 3 different types:&lt;br /&gt;
&lt;br /&gt;
===Templates generated and downloaded when the user opens the plugins===&lt;br /&gt;
&lt;br /&gt;
[[File:Templates_downloaded_when_requested.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
With this type of plugin, the template of your plugin will be generated and downloaded when the user opens your plugin in the app. This means that your function will receive some context params. For example, if you&#039;re developing a course module plugin you will receive the courseid and the cmid (course module ID). You can see the list of delegates that support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
===Templates downloaded on login and rendered using JS data===&lt;br /&gt;
&lt;br /&gt;
[[File:Templates_downloaded_on_login.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
With this type of plugin, the template for your plugin will be downloaded when the user logins in the app and will be stored in the device. This means that your function will not receive any context params, and you need to return a generic template that will be built with JS data like the ones in the Mobile app. When the user opens a page that includes your plugin, your template will receive the required JS data and your template will be rendered. You can see the list of delegates that support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
===Pure Javascript plugins===&lt;br /&gt;
&lt;br /&gt;
You can always implement your whole plugin yourself using Javascript instead of using our API. In fact, this is required if you want to implement some features like capturing links in the Mobile app. You can see the list of delegates that only support this type of plugin in the [[Mobile_support_for_plugins#Delegates|Delegates]] section.&lt;br /&gt;
&lt;br /&gt;
==Step by step example==&lt;br /&gt;
&lt;br /&gt;
In this example, we are going to update an existing plugin ([https://github.com/markn86/moodle-mod_certificate Certificate activity module]) that currently uses a Remote add-on.&lt;br /&gt;
This is a simple activity module that displays the certificate issued for the current user along with the list of the dates of previously issued certificates. It also stores in the course log that the user viewed a certificate. This module also works offline: when the user downloads the course or activity, the data is pre-fetched and can be viewed offline.&lt;br /&gt;
&lt;br /&gt;
The example code can be downloaded from here (see last commit) https://github.com/jleyva/moodle-mod_certificate/commits/MOBILE-2363&lt;br /&gt;
&lt;br /&gt;
TIP: Make sure to ([https://docs.moodle.org/35/en/Developer_tools#Purge_all_caches purge all cache]) after making an edit to one of the following files for your changes to be taken into account.&lt;br /&gt;
&lt;br /&gt;
===Step 1. Update the db/mobile.php file===&lt;br /&gt;
In this case, we are updating an existing file but for new plugins, you should create this new file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$addons = array(&lt;br /&gt;
    &amp;quot;mod_certificate&amp;quot; =&amp;gt; array( // Plugin identifier&lt;br /&gt;
    	&#039;handlers&#039; =&amp;gt; array( // Different places where the plugin will display content.&lt;br /&gt;
            &#039;coursecertificate&#039; =&amp;gt; array( // Handler unique name (alphanumeric).&lt;br /&gt;
            	&#039;displaydata&#039; =&amp;gt; array(&lt;br /&gt;
                	&#039;icon&#039; =&amp;gt; $CFG-&amp;gt;wwwroot . &#039;/mod/certificate/pix/icon.gif&#039;,&lt;br /&gt;
                	&#039;class&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
            	),&lt;br /&gt;
       &lt;br /&gt;
            	&#039;delegate&#039; =&amp;gt; &#039;CoreCourseModuleDelegate&#039;, // Delegate (where to display the link to the plugin)&lt;br /&gt;
            	&#039;method&#039; =&amp;gt; &#039;mobile_course_view&#039;, // Main function in \mod_certificate\output\mobile&lt;br /&gt;
            	&#039;offlinefunctions&#039; =&amp;gt; array(&lt;br /&gt;
                    &#039;mobile_course_view&#039; =&amp;gt; array(),&lt;br /&gt;
                    &#039;mobile_issues_view&#039; =&amp;gt; array()&lt;br /&gt;
                 )       // Function that needs to be downloaded for offline.&lt;br /&gt;
            )&lt;br /&gt;
    	),&lt;br /&gt;
	&#039;lang&#039; =&amp;gt; array(	// Language strings that are used in all the handlers.&lt;br /&gt;
                array(&#039;pluginname&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;summaryofattempts&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;getcertificate&#039;, &#039;certificate&#039;),&lt;br /&gt;
                array(&#039;requiredtimenotmet&#039;, &#039;certificate&#039;),&lt;br /&gt;
		 array(&#039;viewcertificateviews&#039;, &#039;certificate&#039;)&lt;br /&gt;
        ),&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Plugin identifier:&lt;br /&gt;
: A unique name for the plugin, it can be anything (there’s no need to match the module name).&lt;br /&gt;
 &lt;br /&gt;
;Handlers  (Different places where the plugin will display content):&lt;br /&gt;
: A plugin can be displayed in different views in the app. Each view should have a unique name inside the plugin scope (alphanumeric).&lt;br /&gt;
&lt;br /&gt;
; Display data:&lt;br /&gt;
: This is only needed for certain types of plugins. Also, depending on the type of delegate it may require additional (or less fields), in this case we are indicating the module icon.&lt;br /&gt;
	&lt;br /&gt;
; Delegate&lt;br /&gt;
: Where to display the link to the plugin, see the Delegates chapter in this documentation for all the possible options.&lt;br /&gt;
&lt;br /&gt;
; Method:&lt;br /&gt;
: This is the function in the Moodle component/lib.php file to be executed the first time the user clicks in the new option displayed in the app. The function should be a method of a Mobile class under the output/mobile namespace.	&lt;br /&gt;
&lt;br /&gt;
; Offlinefunctions&lt;br /&gt;
: These are the functions that need to be downloaded for offline usage. This is the list of functions that need to be called and stored when the user downloads a course for offline usage. Please note that you can add functions here that are not even listed in the mobile.php file. &lt;br /&gt;
: In our example, downloading for offline access will mean that we&#039;ll execute the functions for getting the certificate and issued certificates passing as parameters the current userid (and courseid when we are using the mod or course delegate). If we have the result of those functions stored in the app, we&#039;ll be able to display the certificate information even if the user is offline.&lt;br /&gt;
: Offline functions will be mostly used to display information for final users, any further interaction with the view won’t be supported offline (for example, trying to send information when the user is offline).&lt;br /&gt;
: You can indicate here other Web Services functions, indicating the parameters that they might need from a defined subset (currently userid and courseid)&lt;br /&gt;
: Prefetching the module will also download all the files returned by the methods in these offline functions (in the &#039;&#039;files&#039;&#039; array).&lt;br /&gt;
: Note: If your functions use additional custom parameters (for example, if you implement multiple pages within a module&#039;s view function by using a &#039;page&#039; parameter in addition to the usual cmid, courseid, userid) then the app will not know which additional parameters to supply. In this case, do not list the function in offlinefunctions; instead, you will need to manually implement a [[#Module_prefetch_handler|module prefetch handler]].&lt;br /&gt;
&lt;br /&gt;
;Lang:&lt;br /&gt;
: The language pack string ids used in the plugin by all the handlers. Please note that you should avoid adding all the plugin string ids (including those unused) because the Web Service that returns the plugin information will include the translation of each string id for every language installed in the platform.&lt;br /&gt;
&lt;br /&gt;
There are additional attributes supported by the mobile.php list, see “Mobile.php supported options” section below.&lt;br /&gt;
&lt;br /&gt;
===Step 2. Creating the main function===&lt;br /&gt;
&lt;br /&gt;
The main function displays the current issued certificate (or several warnings if it’s not possible to issue a certificate). It also displays a link to view the dates of previously issued certificates.&lt;br /&gt;
&lt;br /&gt;
All the functions must be created in the plugin or subsystem classes/output directory, the name of the class must be mobile.&lt;br /&gt;
&lt;br /&gt;
For this example (mod_certificate plugin) the namespace name will be mod_certificate\output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/classes/output/mobile.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace mod_certificate\output;&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
use context_module;&lt;br /&gt;
use mod_certificate_external;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Mobile output class for certificate&lt;br /&gt;
 *&lt;br /&gt;
 * @package	mod_certificate&lt;br /&gt;
 * @copyright  2018 Juan Leyva&lt;br /&gt;
 * @license	http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
class mobile {&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
 	* Returns the certificate course view for the mobile app.&lt;br /&gt;
 	* @param  array $args Arguments from tool_mobile_get_content WS&lt;br /&gt;
 	*&lt;br /&gt;
 	* @return array   	HTML, javascript and otherdata&lt;br /&gt;
 	*/&lt;br /&gt;
    public static function mobile_course_view($args) {&lt;br /&gt;
    	global $OUTPUT, $USER, $DB;&lt;br /&gt;
&lt;br /&gt;
    	$args = (object) $args;&lt;br /&gt;
    	$cm = get_coursemodule_from_id(&#039;certificate&#039;, $args-&amp;gt;cmid);&lt;br /&gt;
&lt;br /&gt;
    	// Capabilities check.&lt;br /&gt;
    	require_login($args-&amp;gt;courseid , false , $cm, true, true);&lt;br /&gt;
&lt;br /&gt;
    	$context = context_module::instance($cm-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
    	require_capability (&#039;mod/certificate:view&#039;, $context);&lt;br /&gt;
    	if ($args-&amp;gt;userid != $USER-&amp;gt;id) {&lt;br /&gt;
        	require_capability(&#039;mod/certificate:manage&#039;, $context);&lt;br /&gt;
    	}&lt;br /&gt;
    	$certificate = $DB-&amp;gt;get_record(&#039;certificate&#039;, array(&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance));&lt;br /&gt;
&lt;br /&gt;
    	// Get certificates from external (taking care of exceptions).&lt;br /&gt;
    	try {&lt;br /&gt;
        	$issued = mod_certificate_external::issue_certificate($cm-&amp;gt;instance);&lt;br /&gt;
        	$certificates = mod_certificate_external::get_issued_certificates($cm-&amp;gt;instance);&lt;br /&gt;
        	$issues = array_values($certificates[&#039;issues&#039;]); // Make it mustache compatible.&lt;br /&gt;
    	} catch (Exception $e) {&lt;br /&gt;
        	$issues = array();&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	// Set timemodified for each certificate.&lt;br /&gt;
    	foreach ($issues as $issue) {&lt;br /&gt;
        	if (empty($issue-&amp;gt;timemodified)) {&lt;br /&gt;
            		$issue-&amp;gt;timemodified = $issue-&amp;gt;timecreated;&lt;br /&gt;
        	}&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$showget = true;&lt;br /&gt;
    	if ($certificate-&amp;gt;requiredtime &amp;amp;&amp;amp; !has_capability(&#039;mod/certificate:manage&#039;, $context)) {&lt;br /&gt;
        	if (certificate_get_course_time($certificate-&amp;gt;course) &amp;lt; ($certificate-&amp;gt;requiredtime * 60)) {&lt;br /&gt;
            		$showget = false;&lt;br /&gt;
        	}&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$certificate-&amp;gt;name = format_string($certificate-&amp;gt;name);&lt;br /&gt;
    	list($certificate-&amp;gt;intro, $certificate-&amp;gt;introformat) =&lt;br /&gt;
                    	external_format_text($certificate-&amp;gt;intro, $certificate-&amp;gt;introformat, $context-&amp;gt;id,&#039;mod_certificate&#039;, &#039;intro&#039;);&lt;br /&gt;
    	$data = array(&lt;br /&gt;
        	&#039;certificate&#039; =&amp;gt; $certificate,&lt;br /&gt;
        	&#039;showget&#039; =&amp;gt; $showget &amp;amp;&amp;amp; count($issues) &amp;gt; 0,&lt;br /&gt;
        	&#039;issues&#039; =&amp;gt; $issues,&lt;br /&gt;
        	&#039;issue&#039; =&amp;gt; $issues[0],&lt;br /&gt;
&#039;numissues&#039; =&amp;gt; count($issues),&lt;br /&gt;
        	&#039;cmid&#039; =&amp;gt; $cm-&amp;gt;id,&lt;br /&gt;
        	&#039;courseid&#039; =&amp;gt; $args-&amp;gt;courseid&lt;br /&gt;
    	);&lt;br /&gt;
&lt;br /&gt;
    	return array(&lt;br /&gt;
        	&#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
            	array(&lt;br /&gt;
                	&#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                	&#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
            	),&lt;br /&gt;
        	),&lt;br /&gt;
        	&#039;javascript&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;otherdata&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;files&#039; =&amp;gt; $issues&lt;br /&gt;
    	);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let’s go through the function code to analyse the different parts.&lt;br /&gt;
&lt;br /&gt;
;Function declaration: &lt;br /&gt;
: The function name is the same as the one used in the mobile.php file (method field). There is only one argument “$args” which is an array containing all the information sent by the mobile app (the courseid, userid, appid, appversionname, appversioncode, applang, appcustomurlscheme…)&lt;br /&gt;
&lt;br /&gt;
; Function implementation:&lt;br /&gt;
: In the first part of the function, we check permissions and capabilities (like a view.php script would do normally). Then we retrieve the certificate information that’s necessary to display the template.&lt;br /&gt;
&lt;br /&gt;
Finally, we return:&lt;br /&gt;
* The rendered template (notice that we could return more than one template but we usually would only need one). By default the app will always render the first template received, the rest of the templates can be used if the plugin defines some Javascript code.&lt;br /&gt;
* JavaScript: Empty, because we don’t need any in this case&lt;br /&gt;
* Other data: Empty as well, because we don’t need any additional data to be used by directives or components in the template. This field will be published as an object supporting 2-way-data-bind to the template.&lt;br /&gt;
* Files: A list of files that the app should be able to download (for offline usage mostly)&lt;br /&gt;
&lt;br /&gt;
===Step 3. Creating the template for the main function===&lt;br /&gt;
&lt;br /&gt;
This is the most important part of your plugin because it contains the code that will be rendered on the mobile app.&lt;br /&gt;
&lt;br /&gt;
In this template we’ll be using Ionic and custom directives and components available in the Mobile app.&lt;br /&gt;
&lt;br /&gt;
All the HTML attributes starting with ion- are ionic components. Most of the time the component name is self-explanatory but you may refer to a detailed guide here: https://ionicframework.com/docs/components/ &lt;br /&gt;
&lt;br /&gt;
All the HTML attributes starting with &#039;&#039;core-&#039;&#039; are custom components of the Mobile app.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/templates/mobile_view_page.mustache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{=&amp;lt;% %&amp;gt;=}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
	&amp;lt;core-course-module-description description=&amp;quot;&amp;lt;% certificate.intro %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-course-module-description&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;ion-list&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-list-header&amp;gt;&lt;br /&gt;
        	&amp;lt;p class=&amp;quot;item-heading&amp;quot;&amp;gt;{{ &#039;plugin.mod_certificate.summaryofattempts&#039; | translate }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-list-header&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%#issues%&amp;gt;&lt;br /&gt;
        	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
            	&amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-new-content title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
                	{{ &#039;plugin.mod_certificate.viewcertificateviews&#039; | translate: {$a: &amp;lt;% numissues %&amp;gt;} }}&lt;br /&gt;
            	&amp;lt;/button&amp;gt;&lt;br /&gt;
        	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/issues%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%#showget%&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
        	&amp;lt;button ion-button block core-course-download-module-main-file moduleId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot; courseId=&amp;quot;&amp;lt;% certificate.course %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; [files]=&amp;quot;[{fileurl: &#039;&amp;lt;% issue.fileurl %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.filename %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, mimetype: &#039;&amp;lt;% issue.mimetype %&amp;gt;&#039;}]&amp;quot;&amp;gt;&lt;br /&gt;
            	&amp;lt;ion-icon name=&amp;quot;cloud-download&amp;quot; item-start&amp;gt;&amp;lt;/ion-icon&amp;gt;&lt;br /&gt;
            	{{ &#039;plugin.mod_certificate.getcertificate&#039; | translate }}&lt;br /&gt;
        	&amp;lt;/button&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/showget%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;%^showget%&amp;gt;&lt;br /&gt;
    	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
        	&amp;lt;p&amp;gt;{{ &#039;plugin.mod_certificate.requiredtimenotmet&#039; | translate }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/showget%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    	&amp;lt;!-- Call log WS when the template is loaded. --&amp;gt;&lt;br /&gt;
    	&amp;lt;span core-site-plugins-call-ws-on-load name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
	&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the first line of the template we switch delimiters to avoid conflicting with Ionic delimiters (that are curly brackets like mustache). &lt;br /&gt;
&lt;br /&gt;
Then we display the module description using &amp;lt;code&amp;gt;&amp;lt;core-course-module-description&amp;lt;/code&amp;gt; that is a component used to include the course module description.&lt;br /&gt;
&lt;br /&gt;
For displaying the certificate information we create a list of elements, adding a header on top.&lt;br /&gt;
The following line &amp;lt;code&amp;gt;{{ &#039;plugin.mod_certificate.summaryofattempts&#039; | translate }}&amp;lt;/code&amp;gt; indicates that the Mobile app will translate the &#039;&#039;summaryofattempts&#039;&#039; string id (here we could’ve used mustache translation but it is usually better to delegate the strings translations to the app). The string id has this format: &lt;br /&gt;
&lt;br /&gt;
“plugin” + plugin identifier (from mobile.php) +  string id (the string must be indicated in the lang field in mobile.php). &lt;br /&gt;
&lt;br /&gt;
Then we display a button to transition to another page if there are certificates issued. The attribute (directive) &amp;lt;code&amp;gt;core-site-plugins-new-content&amp;lt;/code&amp;gt; indicates that if the user clicks the button, we need to call the function “mobile_issues_view” in the component “mod_certificate” passing as arguments the cmid and courseid. The content returned by this function will be displayed in a new page (see Step 4 for the code of this new page).&lt;br /&gt;
&lt;br /&gt;
Just after this button we display another one but this time for downloading an issued certificate. The &amp;lt;code&amp;gt;core-course-download-module-main-file&amp;lt;/code&amp;gt; directive indicates that clicking this button is for downloading the whole activity and opening the main file. This means that, when the user clicks this button, the whole certificate activity will be available in offline.&lt;br /&gt;
&lt;br /&gt;
Finally, just before the ion-list is closed, we use the &amp;lt;code&amp;gt;core-site-plugins-call-ws-on-load&amp;lt;/code&amp;gt; directive to indicate that once the page is loaded, we need to call to a Web Service function in the server, in this case we are calling the &#039;&#039;mod_certificate_view_certificate&#039;&#039; that will log that the user viewed this page.&lt;br /&gt;
&lt;br /&gt;
As you can see, no JavaScript was necessary at all. We used plain HTML elements and attributes that did all the complex dynamic logic (like calling a Web Service) behind the scenes.&lt;br /&gt;
&lt;br /&gt;
===Step 4. Adding an additional page===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Partial file contents: mod/certificate/classes/output/mobile.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
     * Returns the certificate issues view for the mobile app.&lt;br /&gt;
     * @param  array $args Arguments from tool_mobile_get_content WS&lt;br /&gt;
     *&lt;br /&gt;
     * @return array   	HTML, javascript and otherdata&lt;br /&gt;
     */&lt;br /&gt;
    public static function mobile_issues_view($args) {&lt;br /&gt;
    	global $OUTPUT, $USER, $DB;&lt;br /&gt;
&lt;br /&gt;
    	$args = (object) $args;&lt;br /&gt;
    	$cm = get_coursemodule_from_id(&#039;certificate&#039;, $args-&amp;gt;cmid);&lt;br /&gt;
&lt;br /&gt;
    	// Capabilities check.&lt;br /&gt;
    	require_login($args-&amp;gt;courseid , false , $cm, true, true);&lt;br /&gt;
&lt;br /&gt;
    	$context = context_module::instance($cm-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
    	require_capability (&#039;mod/certificate:view&#039;, $context);&lt;br /&gt;
    	if ($args-&amp;gt;userid != $USER-&amp;gt;id) {&lt;br /&gt;
        	require_capability(&#039;mod/certificate:manage&#039;, $context);&lt;br /&gt;
    	}&lt;br /&gt;
    	$certificate = $DB-&amp;gt;get_record(&#039;certificate&#039;, array(&#039;id&#039; =&amp;gt; $cm-&amp;gt;instance));&lt;br /&gt;
&lt;br /&gt;
    	// Get certificates from external (taking care of exceptions).&lt;br /&gt;
    	try {&lt;br /&gt;
        	$issued = mod_certificate_external::issue_certificate($cm-&amp;gt;instance);&lt;br /&gt;
        	$certificates = mod_certificate_external::get_issued_certificates($cm-&amp;gt;instance);&lt;br /&gt;
        	$issues = array_values($certificates[&#039;issues&#039;]); // Make it mustache compatible.&lt;br /&gt;
    	} catch (Exception $e) {&lt;br /&gt;
        	$issues = array();&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
    	$data = array(&lt;br /&gt;
        	&#039;issues&#039; =&amp;gt; $issues&lt;br /&gt;
    	);&lt;br /&gt;
&lt;br /&gt;
    	return array(&lt;br /&gt;
        	&#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
            	array(&lt;br /&gt;
                	&#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                	&#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_issues&#039;, $data),&lt;br /&gt;
            	),&lt;br /&gt;
        	),&lt;br /&gt;
        	&#039;javascript&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        	&#039;otherdata&#039; =&amp;gt; &#039;&#039;&lt;br /&gt;
    	);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function for the new page was added just after the mobile_course_view function, the code is quite similar: Capabilities checks, retrieves the information required for the template and returns the template rendered.&lt;br /&gt;
&lt;br /&gt;
The code of the mustache template is also very simple:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/templates/mobile_view_issues.mustache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{=&amp;lt;% %&amp;gt;=}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
	&amp;lt;ion-list&amp;gt;&lt;br /&gt;
    	&amp;lt;%#issues%&amp;gt;&lt;br /&gt;
        	&amp;lt;ion-item&amp;gt;&lt;br /&gt;
            	&amp;lt;p class=&amp;quot;item-heading&amp;quot;&amp;gt;{{ &amp;lt;%timecreated%&amp;gt; | coreToLocaleString }}&amp;lt;/p&amp;gt;&lt;br /&gt;
            	&amp;lt;p&amp;gt;&amp;lt;%grade%&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
        	&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
    	&amp;lt;%/issues%&amp;gt;&lt;br /&gt;
	&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As we did in the previous template, in the first line of the template we switch delimiters to avoid conflicting with Ionic delimiters (that are curly brackets like mustache). &lt;br /&gt;
&lt;br /&gt;
Here we are creating an ionic list that will display a new item in the list per each issued certificated.&lt;br /&gt;
&lt;br /&gt;
For the issued certificated we’ll display the time when it was created (using the app filter &#039;&#039;coreToLocaleString&#039;&#039;). We are also displaying the grade displayed in the certificate (if any). &lt;br /&gt;
&lt;br /&gt;
===Step 5. Plugin webservices, if included===&lt;br /&gt;
&lt;br /&gt;
If your plugin uses its own web services, they will also need to be enabled for mobile access in your db/services.php file.&lt;br /&gt;
&lt;br /&gt;
The following line &amp;lt;code&amp;gt;&#039;services&#039;      =&amp;gt; array(MOODLE_OFFICIAL_MOBILE_SERVICE, &#039;local_mobile&#039;),&amp;lt;/code&amp;gt; should be included in each webservice definition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File contents: mod/certificate/db/services.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$functions = array(&lt;br /&gt;
&lt;br /&gt;
    &#039;mod_certificate_get_certificates_by_courses&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;classname&#039;     =&amp;gt; &#039;mod_certificate_external&#039;,&lt;br /&gt;
        &#039;methodname&#039;    =&amp;gt; &#039;get_certificates_by_courses&#039;,&lt;br /&gt;
        &#039;description&#039;   =&amp;gt; &#039;Returns a list of certificate instances...&#039;,&lt;br /&gt;
        &#039;type&#039;          =&amp;gt; &#039;read&#039;,&lt;br /&gt;
        &#039;capabilities&#039;  =&amp;gt; &#039;mod/certificate:view&#039;,&lt;br /&gt;
        &#039;services&#039;      =&amp;gt; array(MOODLE_OFFICIAL_MOBILE_SERVICE, &#039;local_mobile&#039;),&lt;br /&gt;
    ),&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
This extra services definition is the reason why you will need to have the local_mobile plugin installed for Moodle versions 3.4 and lower, so that your Moodle site will have all the additional webservices included to deal with all these mobile access calls. This is explained further in the [https://docs.moodle.org/dev/Mobile_support_for_plugins#Moodle_version_requirements Moodle version requirements section] below.&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
The first and most important thing to know is that you don’t need a local mobile environment, you can just use the Chrome or Chromium browser to add mobile support to your plugins!&lt;br /&gt;
&lt;br /&gt;
Open this URL (with Chrome or Chromium browser): https://mobileapp.moodledemo.net/ and you will see a web version of the mobile app completely functional (except for some native features). This URL is updated with the latest integration version of the app.&lt;br /&gt;
&lt;br /&gt;
Please test that your site works correctly in the web version before starting any development.&lt;br /&gt;
&lt;br /&gt;
===Moodle version requirements===&lt;br /&gt;
&lt;br /&gt;
If your Moodle version is lower than 3.5 (to be released in May) you will need to install the [https://docs.moodle.org/en/Moodle_Mobile_additional_features Moodle Mobile additional features plugin]. &lt;br /&gt;
&lt;br /&gt;
Please use this development version for now: https://github.com/moodlehq/moodle-local_mobile/commits/MOODLE_31_STABLE (if your Moodle version is 3.2, 3.3 or 3.4) you will have to use the specific branch for your version but applying manually the [https://github.com/moodlehq/moodle-local_mobile/commits/MOODLE_31_STABLE last commit from the 3.1 branch] (the one with number MOBILE-2362).&lt;br /&gt;
&lt;br /&gt;
Also, when installing the Moodle Mobile Additional features plugin you must follow the installation instructions so the service is set up properly.&lt;br /&gt;
&lt;br /&gt;
Remember to update your plugin documentation to reflect that this plugin is mandatory for Mobile support. We don’t recommend to indicate in your plugin version.php a dependency to local_mobile though.&lt;br /&gt;
&lt;br /&gt;
===Development workflow===&lt;br /&gt;
&lt;br /&gt;
First of all, we recommend creating a simple &#039;&#039;mobile.php&#039;&#039; for displaying a new main menu option (even if your plugin won’t be in the main menu, just to verify that you are able to extend the app plugins). Then open the webapp (https://mobileapp.moodledemo.net/) or refresh the browser if it was already open. Check that you can correctly  see the new menu option you included.&lt;br /&gt;
&lt;br /&gt;
Then, develop the main function of the app returning a “Hello world” or basic code (without using templates) to see that everything works together. After adding the classes/output/mobile.php file it is very important to “Purge all caches” to avoid problems with the auto-loading cache.&lt;br /&gt;
&lt;br /&gt;
It is important to remember that:&lt;br /&gt;
* Any change in the mobile.php file will require you to refresh the web app page in the browser (remember to disable the cache in the Chrome developer options).&lt;br /&gt;
* Any change in an existing template or function won’t require to refresh the browser page. In most cases you should just do a PTR (Pull down To Refresh) in the page that displays the view returned by the function. Be aware that PTR will work only when using the “device” emulation in the browser (see following section).&lt;br /&gt;
&lt;br /&gt;
===Testing and debugging===&lt;br /&gt;
&lt;br /&gt;
To learn how to debug with the web version of the app, please read the following documents:&lt;br /&gt;
* [[Moodle Mobile debugging WS requests]] AND&lt;br /&gt;
* [[Moodle Mobile development using Chrome or Chromium]] (please, omit the installation section)&lt;br /&gt;
&lt;br /&gt;
For plugins using the Javascript API you may develop making use of the console.log function to add trace messages in your code that will be displayed in the browser console.&lt;br /&gt;
&lt;br /&gt;
==Mobile.php supported options==&lt;br /&gt;
&lt;br /&gt;
In the Step by Step section we learned about some of the existing options for handlers configuration. This is the full list of supported options:&lt;br /&gt;
&lt;br /&gt;
===Common options===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;delegate&#039;&#039;&#039; (mandatory): Name of the delegate to register the handler in.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (mandatory): The function to call to retrieve the main page content.&lt;br /&gt;
* &#039;&#039;&#039;lang&#039;&#039;&#039; (optional): List of language strings.&lt;br /&gt;
* &#039;&#039;&#039;init&#039;&#039;&#039; (optional): A function to call to retrieve the initialization JS and the &amp;quot;restrict&amp;quot; to apply to the whole handler. It can also return templates that can be used from the Javascript of the init method or the Javascript of the handler’s method.&lt;br /&gt;
* &#039;&#039;&#039;restricttocurrentuser&#039;&#039;&#039; (optional) Only used if the delegate has a isEnabledForUser function. If true, the handler will only be shown for current user. For more info about displaying the plugin only for certain users, please see [[Mobile_support_for_plugins#Display_the_plugin_only_if_certain_conditions_are_met|Display the plugin only if certain conditions are met]].&lt;br /&gt;
* &#039;&#039;&#039;restricttoenrolledcourses&#039;&#039;&#039; (optional): Only used if the delegate has a isEnabledForCourse function. If true or not defined, the handler will only be shown for courses the user is enrolled in. For more info about displaying the plugin only for certain courses, please see [[Mobile_support_for_plugins#Display_the_plugin_only_if_certain_conditions_are_met|Display the plugin only if certain conditions are met]].&lt;br /&gt;
* &#039;&#039;&#039;styles&#039;&#039;&#039; (optional): An array with two properties: &#039;&#039;url&#039;&#039; and &#039;&#039;version&#039;&#039;. The URL should point to a CSS file, either using an absolute URL or a relative URL. This file will be downloaded and applied by the app. It&#039;s recommended to include styles that will only affect your plugin templates. The version number is used to determine if the file needs to be downloaded again, you should change the version number everytime you change the CSS file.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseOptionsDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for CoreMainMenuDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. Main Menu plugins are always displayed in the &amp;quot;More&amp;quot; tab, they cannot be displayed as tabs in the bottom bar.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseModuleDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): icon, class.&lt;br /&gt;
* &#039;&#039;&#039;offlinefunctions&#039;&#039;&#039;: (optional) List of functions to call when prefetching the module. It can be a get_content method or a WS. You can filter the params received by the WS. By default, WS will receive these params: courseid, cmid, userid. Other valid values that will be added if they are present in the list of params: courseids (it will receive a list with the courses the user is enrolled in), component + &#039;id&#039; (e.g. certificateid).&lt;br /&gt;
* &#039;&#039;&#039;downloadbutton&#039;&#039;&#039;: (optional) Whether to display download button in the module. If not defined, the button will be shown if there is any offlinefunction.&lt;br /&gt;
* &#039;&#039;&#039;isresource&#039;&#039;&#039;: (optional) Whether the module is a resource or an activity. Only used if there is any offlinefunction. If your module relies on the &amp;quot;contents&amp;quot; field, then it should be true.&lt;br /&gt;
* &#039;&#039;&#039;updatesnames&#039;&#039;&#039;: (optional) Only used if there is any offlinefunction. A Regular Expression to check if there&#039;s any update in the module. It will be compared to the result of &#039;&#039;core_course_check_updates&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreCourseFormatDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;canviewallsections&#039;&#039;&#039;: (optional) Whether the course format allows seeing all sections in a single page. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;displayenabledownload&#039;&#039;&#039;: (optional) Whether the option to enable section/module download should be displayed. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;displaysectionselector&#039;&#039;&#039;: (optional) Whether the default section selector should be displayed. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
===Options only for CoreUserDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: The type of the addon. Values accepted: &#039;newpage&#039; (default) or  &#039;communication&#039;. &lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for CoreSettingsDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon, class.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
===Options only for AddonMessageOutputDelegate===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;displaydata&#039;&#039;&#039; (mandatory): title, icon.&lt;br /&gt;
* &#039;&#039;&#039;priority&#039;&#039;&#039; (optional): Priority of the handler. Higher priority is displayed first. &lt;br /&gt;
&lt;br /&gt;
==Delegates==&lt;br /&gt;
&lt;br /&gt;
The delegates can be classified by type of plugin. For more info about type of plugins, please see the See [[Mobile_support_for_plugins#Types_of_plugins|Types of plugins]] section.&lt;br /&gt;
&lt;br /&gt;
===Templates generated and downloaded when the user opens the plugins===&lt;br /&gt;
&lt;br /&gt;
====CoreMainMenuDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add new items to the main menu (currently displayed at the bottom of the app). &lt;br /&gt;
&lt;br /&gt;
====CoreCourseOptionsDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add new options in a course (Participants or Grades are examples of this type of delegate).&lt;br /&gt;
&lt;br /&gt;
====CoreCourseModuleDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting activity modules or resources.&lt;br /&gt;
&lt;br /&gt;
====CoreUserDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate when you want to add additional options in the user profile page in the app.&lt;br /&gt;
&lt;br /&gt;
====CoreCourseFormatDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting course formats.&lt;br /&gt;
&lt;br /&gt;
====CoreSettingsDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to add a new option in the settings page.&lt;br /&gt;
&lt;br /&gt;
====AddonMessageOutputDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a message output plugin.&lt;br /&gt;
&lt;br /&gt;
===Templates downloaded on login and rendered using JS data===&lt;br /&gt;
&lt;br /&gt;
====CoreQuestionDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting question types.&lt;br /&gt;
&lt;br /&gt;
====CoreQuestionBehaviourDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting question behaviours.&lt;br /&gt;
&lt;br /&gt;
====CoreUserProfileFieldDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate for supporting user profile fields.&lt;br /&gt;
&lt;br /&gt;
====AddonModQuizAccessRuleDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a quiz access rule.&lt;br /&gt;
&lt;br /&gt;
====AddonModAssignSubmissionDelegate and AddonModAssignFeedbackDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use these delegates to support assign submission or feedback plugins.&lt;br /&gt;
&lt;br /&gt;
====AddonWorkshopAssessmentStrategyDelegate====&lt;br /&gt;
&lt;br /&gt;
You must use this delegate to support a workshop assessment strategy plugin.&lt;br /&gt;
&lt;br /&gt;
===Pure Javascript plugins===&lt;br /&gt;
&lt;br /&gt;
These delegates require JavaScript to be supported. See [[Mobile_support_for_plugins#Initialization|Initialization]] for more information.&lt;br /&gt;
&lt;br /&gt;
* CoreContentLinksDelegate&lt;br /&gt;
* CoreCourseModulePrefetchDelegate&lt;br /&gt;
* CoreFileUploaderDelegate&lt;br /&gt;
* CorePluginFileDelegate&lt;br /&gt;
&lt;br /&gt;
==Available components and directives==&lt;br /&gt;
&lt;br /&gt;
===Difference between component and directives===&lt;br /&gt;
&lt;br /&gt;
A component (represented as an HTML tag) is used to add custom elements to the app.&lt;br /&gt;
Example of components are: ion-list, ion-item, core-search-box&lt;br /&gt;
&lt;br /&gt;
A directive (represented as an HTML attribute) allows you to extend a piece of HTML with additional information or functionality.&lt;br /&gt;
Example of directives are: core-auto-focus, *ngIf, ng-repeat&lt;br /&gt;
&lt;br /&gt;
The Mobile app uses Angular, Ionic and custom components and directives, for a full reference of:&lt;br /&gt;
* Angular directives, please check: https://angular.io/api?type=directive&lt;br /&gt;
* Ionic components, please check: https://ionicframework.com/docs/&lt;br /&gt;
&lt;br /&gt;
===Custom core components and directives===&lt;br /&gt;
&lt;br /&gt;
These are some useful custom components and directives (only available in the mobile app). Please notice that this isn’t the full list of components and directives of the app, it’s just an extract of the most common ones.&lt;br /&gt;
&lt;br /&gt;
====core-format-text====&lt;br /&gt;
&lt;br /&gt;
This directive formats the text and adds some directives needed for the app to work as it should. For example, it treats all links and all the embedded media so they work fine in the app. If some content in your template includes links or embedded media, please use this directive.&lt;br /&gt;
&lt;br /&gt;
This directive automatically applies core-external-content and core-link to all the links and embedded media.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039; (string): The text to format.&lt;br /&gt;
* &#039;&#039;&#039;siteId&#039;&#039;&#039; (string): Optional. Site ID to use. If not defined, current site.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to use when downloading embedded files.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
* &#039;&#039;&#039;adaptImg&#039;&#039;&#039; (boolean): Optional. Whether to adapt images to screen width. Defaults to true.&lt;br /&gt;
* &#039;&#039;&#039;clean&#039;&#039;&#039; (boolean): Optional. Whether all the HTML tags should be removed. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;singleLine&#039;&#039;&#039; (boolean): Optional. Whether new lines should be removed (all text in single line). Only if clean=true. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;maxHeight&#039;&#039;&#039; (number): Optional. Max height in pixels to render the content box. It should be 50 at least to make sense. Using this parameter will force display: block to calculate height better. If you want to avoid this use class=&amp;quot;inline&amp;quot; at the same time to use display: inline-block.&lt;br /&gt;
* &#039;&#039;&#039;fullOnClick&#039;&#039;&#039; (boolean): Optional. Whether it should open a new page with the full contents on click. Only if maxHeight is set and the content has been collapsed. Defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;fullTitle&#039;&#039;&#039; (string): Optional. Title to use in full view. Defaults to &amp;quot;Description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-format-text text=&amp;quot;&amp;lt;% cm.description %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-format-text&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-link====&lt;br /&gt;
&lt;br /&gt;
Directive to handle a link. It performs several checks, like checking if the link needs to be opened in the app, and opens the link as it should (without overriding the app).&lt;br /&gt;
&lt;br /&gt;
This directive is automatically applied to all the links and media inside core-format-text.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;capture&#039;&#039;&#039; (boolean): Optional. Whether the link needs to be captured by the app (check if the link can be handled by the app instead of opening it in a browser).&lt;br /&gt;
* &#039;&#039;&#039;inApp&#039;&#039;&#039; (boolean): Optional. True to open in embedded browser, false to open in system browser.&lt;br /&gt;
* &#039;&#039;&#039;autoLogin&#039;&#039;&#039; (string): Optional. If the link should be open with auto-login. Accepts the following values:&lt;br /&gt;
** &amp;quot;yes&amp;quot; -&amp;gt; Always auto-login.&lt;br /&gt;
** &amp;quot;no&amp;quot; -&amp;gt; Never auto-login.&lt;br /&gt;
** &amp;quot;check&amp;quot; -&amp;gt; Auto-login only if it points to the current site. Default value.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;lt;% cm.url %&amp;gt;&amp;quot; core-link&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-external-content====&lt;br /&gt;
&lt;br /&gt;
Directive to handle links to files and embedded files. This directive should be used in any link to a file or any embedded file that you want to have available when the app is offline. &lt;br /&gt;
&lt;br /&gt;
If a file is downloaded, its URL will be replaced by the local file URL.&lt;br /&gt;
&lt;br /&gt;
This directive is automatically applied to all the links and media inside core-format-text.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;siteId&#039;&#039;&#039; (string): Optional. Site ID to use. If not defined, current site.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to use when downloading embedded files.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&amp;lt;% event.iconurl %&amp;gt;&amp;quot; core-external-content component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% event.id %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-user-link====&lt;br /&gt;
&lt;br /&gt;
Directive to go to user profile on click. When the user clicks the element where this directive is attached, the right user profile will be opened.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;userId&#039;&#039;&#039; (number): User id to open the profile.&lt;br /&gt;
* &#039;&#039;&#039;courseId&#039;&#039;&#039; (number): Optional. Course id to show the user info related to that course.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;a ion-item core-user-link userId=&amp;quot;&amp;lt;% userid %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-file====&lt;br /&gt;
&lt;br /&gt;
Component to handle a remote file. It shows the file name, icon (depending on mimetype) and a button to download/refresh it. The user can identify if the file is downloaded or not based on the button.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* file (object): The file. Must have a property &#039;filename&#039; and a &#039;fileurl&#039; or &#039;url&#039;&lt;br /&gt;
* component (string): Optional. Component the file belongs to.&lt;br /&gt;
* componentId (string|number): Optional. ID to use in conjunction with the component.&lt;br /&gt;
* canDelete (boolean): Optional. Whether file can be deleted.&lt;br /&gt;
* alwaysDownload (boolean): Optional. Whether it should always display the refresh button when the file is downloaded. Use it for files that you cannot determine if they&#039;re outdated or not.&lt;br /&gt;
* canDownload (boolean): Optional. Whether file can be downloaded. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-file [file]=&amp;quot;{fileurl: &#039;&amp;lt;% issue.url %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.name %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, filesize: &#039;&amp;lt;% issue.size %&amp;gt;&#039;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;/core-file&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-download-file====&lt;br /&gt;
&lt;br /&gt;
Directive to allow downloading and open a file. When the item with this directive is clicked, the file will be downloaded (if needed) and opened.&lt;br /&gt;
&lt;br /&gt;
It is usually recommended to use the core-file component since it also displays the state of the file.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;core-download-file&#039;&#039;&#039; (object): The file to download.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to link the file to.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. Component ID to use in conjunction with the component.&lt;br /&gt;
&lt;br /&gt;
Example usage: a button to download a file.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button [core-download-file]=&amp;quot;{fileurl: &amp;lt;% issue.url %&amp;gt;, timemodified: &amp;lt;% issue.timemodified %&amp;gt;, filesize: &amp;lt;% issue.size %&amp;gt;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; componentId=&amp;quot;&amp;lt;% cm.id %&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.download | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-course-download-module-main-file====&lt;br /&gt;
&lt;br /&gt;
Directive to allow downloading and opening the main file of a module.&lt;br /&gt;
&lt;br /&gt;
When the item with this directive is clicked, the whole module will be downloaded (if needed) and its main file opened. This is meant for modules like mod_resource.&lt;br /&gt;
&lt;br /&gt;
This directive must receive either a module or a moduleId. If no files are provided, it will use module.contents.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;module&#039;&#039;&#039; (object): Optional. The module object. Required if module is not supplied.&lt;br /&gt;
* &#039;&#039;&#039;moduleId&#039;&#039;&#039; (number): Optional. The module ID. Required if module is not supplied.&lt;br /&gt;
* &#039;&#039;&#039;courseId&#039;&#039;&#039; (number): The course ID the module belongs to.&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): Optional. Component to link the file to.&lt;br /&gt;
* &#039;&#039;&#039;componentId&#039;&#039;&#039; (string|number): Optional. Component ID to use in conjunction with the component. If not defined, moduleId.&lt;br /&gt;
* &#039;&#039;&#039;files&#039;&#039;&#039; (object[]): Optional. List of files of the module. If not provided, use module.contents.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block core-course-download-module-main-file moduleId=&amp;quot;&amp;lt;% cmid %&amp;gt;&amp;quot; courseId=&amp;quot;&amp;lt;% certificate.course %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; [files]=&amp;quot;[{fileurl: &#039;&amp;lt;% issue.fileurl %&amp;gt;&#039;, filename: &#039;&amp;lt;% issue.filename %&amp;gt;&#039;, timemodified: &#039;&amp;lt;% issue.timemodified %&amp;gt;&#039;, mimetype: &#039;&amp;lt;% issue.mimetype %&amp;gt;&#039;}]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getcertificate&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-navbar-buttons====&lt;br /&gt;
&lt;br /&gt;
Component to add buttons to the app&#039;s header without having to place them inside the header itself. Using this component in a site plugin will allow adding buttons to the header of the current page.&lt;br /&gt;
&lt;br /&gt;
If this component indicates a position (start/end), the buttons will only be added if the header has some buttons in that position. If no start/end is specified, then the buttons will be added to the first &amp;lt;ion-buttons&amp;gt; found in the header.&lt;br /&gt;
&lt;br /&gt;
You can use the [hidden] input to hide all the inner buttons if a certain condition is met.&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;core-navbar-buttons end&amp;gt;&lt;br /&gt;
    &amp;lt;button ion-button icon-only (click)=&amp;quot;action()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ion-icon name=&amp;quot;funnel&amp;quot;&amp;gt;&amp;lt;/ion-icon&amp;gt;&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/core-navbar-buttons&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Specific component and directives for plugins===&lt;br /&gt;
&lt;br /&gt;
These are component and directives created specifically for supporting Moodle plugins.&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-new-content====&lt;br /&gt;
&lt;br /&gt;
Directive to display a new content when clicked. This new content can be displayed in a new page or in the current page (only if the current page is already displaying a site plugin content).&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): The component of the new content.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (string): The method to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;args&#039;&#039;&#039; (object): The params to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (string): The title to display with the new content. Only if samePage=false.&lt;br /&gt;
* &#039;&#039;&#039;samePage&#039;&#039;&#039; (boolean): Whether to display the content in same page or open a new one. Defaults to new page.&lt;br /&gt;
* &#039;&#039;&#039;useOtherData&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the args for the new &#039;&#039;get_content&#039;&#039; call. The format is the same as in &#039;&#039;useOtherDataForWS&#039;&#039;. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the new &#039;&#039;get_content&#039;&#039; WS call. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to go to a new content page:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-new-content title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.viewissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to load new content in current page using userid from otherdata:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-new-content component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot; samePage=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.viewissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS when the element is clicked. The action to do when the WS call is successful depends on the provided data: display a message, go back or refresh current view.&lt;br /&gt;
&lt;br /&gt;
If you want to load a new content when the WS call is done, please see core-site-plugins-call-ws-new-content.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* preSets (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
* &#039;&#039;&#039;confirmMessage&#039;&#039;&#039; (string): Message to confirm the action when the user clicks the element. If not supplied, no confirmation. If supplied but empty, default message (&amp;quot;Are you sure?&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;successMessage&#039;&#039;&#039; (string): Message to show on success. If not supplied, no message. If supplied but empty, default message (“Success”).&lt;br /&gt;
* &#039;&#039;&#039;goBackOnSuccess&#039;&#039;&#039; (boolean): Whether to go back if the WS call is successful.&lt;br /&gt;
* &#039;&#039;&#039;refreshOnSuccess&#039;&#039;&#039; (boolean): Whether to refresh the current view if the WS call is successful.&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to send some data to the server without using cache, displaying default messages and refreshing on success:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot; confirmMessage successMessage refreshOnSuccess=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.senddata&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to send some data to the server using cache without confirming, going back on success and using userid from otherdata:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; goBackOnSuccess=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
     {{ &#039;plugin.mod_certificate.senddata&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws-new-content====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS when the element is clicked and load a new content passing the WS result as args. This new content can be displayed in a new page or in the same page (only if current page is already displaying a site plugin content).&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t need to load some new content when done, please see core-site-plugins-call-ws.&lt;br /&gt;
&lt;br /&gt;
Data that can be passed to the directive:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* &#039;&#039;&#039;preSets&#039;&#039;&#039; (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
* &#039;&#039;&#039;confirmMessage&#039;&#039;&#039; (string): Message to confirm the action when the user clicks the element. If not supplied, no confirmation. If supplied but empty, default message (&amp;quot;Are you sure?&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;component&#039;&#039;&#039; (string): The component of the new content.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039; (string): The method to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;args&#039;&#039;&#039; (object): The params to get the new content.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (string): The title to display with the new content. Only if samePage=false.&lt;br /&gt;
* &#039;&#039;&#039;samePage&#039;&#039;&#039; (boolean): Whether to display the content in same page or open a new one. Defaults to new page.&lt;br /&gt;
* &#039;&#039;&#039;useOtherData&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the args for the new &#039;&#039;get_content&#039;&#039; call. The format is the same as in &#039;&#039;useOtherDataForWS&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example usages:&lt;br /&gt;
&lt;br /&gt;
A button to get some data from the server without using cache, showing default confirm and displaying a new page:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws-new-content name=&amp;quot;mod_certificate_get_issued_certificates&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot; confirmMessage title=&amp;quot;&amp;lt;% certificate.name %&amp;gt;&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A button to get some data from the server using cache, without confirm, displaying new content in same page and using &#039;&#039;userid&#039;&#039; from &#039;&#039;otherdata&#039;&#039;:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button core-site-plugins-call-ws-new-content name=&amp;quot;mod_certificate_get_issued_certificates&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; component=&amp;quot;mod_certificate&amp;quot; method=&amp;quot;mobile_issues_view&amp;quot; [args]=&amp;quot;{cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;}&amp;quot; samePage=&amp;quot;true&amp;quot; [useOtherData]=&amp;quot;[&#039;userid&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.getissued&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====core-site-plugins-call-ws-on-load====&lt;br /&gt;
&lt;br /&gt;
Directive to call a WS as soon as the template is loaded. This directive is meant for actions to do in the background, like calling logging Web Services.&lt;br /&gt;
&lt;br /&gt;
If you want to call a WS when the user clicks on a certain element, please see core-site-plugins-call-ws.&lt;br /&gt;
&lt;br /&gt;
Note that this will cause an error to appear on each page load if the user is offline. This is a bug in the app that will be fixed in v3.5.2, this directive shouldn&#039;t display any error message.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; (string): The name of the WS to call.&lt;br /&gt;
* &#039;&#039;&#039;params&#039;&#039;&#039; (object): The params for the WS call.&lt;br /&gt;
* &#039;&#039;&#039;preSets&#039;&#039;&#039; (object): Extra options for the WS call: whether to use cache or not, etc.&lt;br /&gt;
* &#039;&#039;&#039;useOtherDataForWS&#039;&#039;&#039; (any): Whether to include &#039;&#039;otherdata&#039;&#039; (from the &#039;&#039;get_content&#039;&#039; WS call) in the params for the WS call. If not supplied, no other data will be added. If supplied but empty (null, false or empty string) all the &#039;&#039;otherdata&#039;&#039; will be added. If it’s an array, it will only copy the properties whose names are in the array.&lt;br /&gt;
* &#039;&#039;&#039;form&#039;&#039;&#039; (string): ID or name to identify a form in the template. The form will be obtained from &#039;&#039;document.forms&#039;&#039;. If supplied and form is found, the form data will be retrieved and sent to the WS. If your form contains an ion-radio, ion-checkbox or ion-select, please see [[Mobile_support_for_plugins#Values_of_ion-radio.2C_ion-checkbox_or_ion-select_aren.27t_sent_to_my_WS|Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS]].&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;span core-site-plugins-call-ws-on-load name=&amp;quot;mod_certificate_view_certificate&amp;quot; [params]=&amp;quot;{certificateid: &amp;lt;% certificate.id %&amp;gt;}&amp;quot; [preSets]=&amp;quot;{getFromCache: 0, saveToCache: 0}&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Advanced features==&lt;br /&gt;
&lt;br /&gt;
===Display the plugin only if certain conditions are met===&lt;br /&gt;
&lt;br /&gt;
You might want to display your plugin in the mobile app only if certain dynamic conditions are met, so the plugin would be displayed only for some users. This can be achieved using the &amp;quot;init&amp;quot; method (for more info, please see the [[Mobile_support_for_plugins#Initialization|Initialization]] section ahead).&lt;br /&gt;
&lt;br /&gt;
All the init methods are called as soon as your plugin is retrieved. If you don&#039;t want your plugin to be displayed for the current user, then you should return an exception in this init method. It&#039;s recommended to include a message explaining why the plugin isn&#039;t available for the current user, this exception will be logged in the Javascript console.&lt;br /&gt;
&lt;br /&gt;
On the other hand, you might want to display a plugin only for certain courses (&#039;&#039;CoreCourseOptionsDelegate&#039;&#039;) or only if the user is viewing certain users&#039; profiles (&#039;&#039;CoreUserDelegate&#039;&#039;). This can be achieved with the init method too.&lt;br /&gt;
&lt;br /&gt;
In the init method you can return a &amp;quot;restrict&amp;quot; property with two fields in it: &#039;&#039;courses&#039;&#039; and &#039;&#039;users&#039;&#039;. If you return a list of courses IDs in this restrict property, then your plugin will only be displayed when the user views any of those courses. In the same way, if you return a list of user IDs then your plugin will only be displayed when the user views any of those users&#039; profiles.&lt;br /&gt;
&lt;br /&gt;
===Using “otherdata”===&lt;br /&gt;
&lt;br /&gt;
The values returned by the functions in otherdata are added to a variable so they can be used both in Javascript and in templates. The otherdata returned by a init call is added to a variable named INIT_OTHERDATA, while the otherdata returned by a &#039;&#039;get_content&#039;&#039; WS call is added to a variable named CONTENT_OTHERDATA.&lt;br /&gt;
&lt;br /&gt;
The otherdata returned by a init call will be passed to the JS and template of all the get_content calls in that handler. The otherdata returned by a get_content call will only be passed to the JS and template returned by that get_content call.&lt;br /&gt;
&lt;br /&gt;
This means that, in your Javascript, you can access and use these data like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
this.CONTENT_OTHERDATA.myVar&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
And in the template you could use it like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
{{ CONTENT_OTHERDATA.myVar }}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;myVar&#039;&#039; is the name we put to one of our variables, it can be the name you want. In the example above, this is the otherdata returned by the PHP method:&lt;br /&gt;
&lt;br /&gt;
array(&#039;myVar&#039; =&amp;gt; &#039;Initial value&#039;)&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
&lt;br /&gt;
In our plugin we want to display an input text with a certain initial value. When the user clicks a button, we want the value in the input to be sent to a certain WebService. This can be done using otherdata.&lt;br /&gt;
&lt;br /&gt;
We will return the initial value of the input in the otherdata of our PHP method:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;myVar&#039; =&amp;gt; &#039;My initial value&#039;),&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Then in the template we will use it like this:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-item text-wrap&amp;gt;&lt;br /&gt;
    &amp;lt;ion-label stacked&amp;gt;{{ &#039;plugin.mod_certificate.textlabel | translate }}&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
    &amp;lt;ion-input type=&amp;quot;text&amp;quot; [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.myVar&amp;quot;&amp;gt;&amp;lt;/ion-input&amp;gt;&lt;br /&gt;
&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;ion-item&amp;gt;&lt;br /&gt;
    &amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-call-ws name=&amp;quot;mod_certificate_my_webservice&amp;quot; [useOtherDataForWS]=&amp;quot;[&#039;myVar&#039;]&amp;quot;&amp;gt;&lt;br /&gt;
        {{ &#039;plugin.mod_certificate.send | translate }}&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above, we are creating an input text and we use &#039;&#039;[(ngModel)]&#039;&#039; to use the value in &#039;&#039;myVar&#039;&#039; as the initial value and to store the changes in the same &#039;&#039;myVar&#039;&#039; variable. This means that the initial value of the input will be “My initial value”, and if the user changes the value of the input these changes will be applied to the &#039;&#039;myVar&#039;&#039; variable. This is called 2-way data binding in Angular.&lt;br /&gt;
&lt;br /&gt;
Then we add a button to send this data to a WS, and for that we use the directive core-site-plugins-call-ws. We use the &#039;&#039;useOtherDataForWS&#039;&#039; attribute to specify which variable from &#039;&#039;otherdata&#039;&#039; we want to send to our WebService. So if the user enters “A new value” in the input and then clicks the button, it will call the WebService &#039;&#039;mod_certificate_my_webservice&#039;&#039; and will send as a param: myVar -&amp;gt; “A new value”.&lt;br /&gt;
&lt;br /&gt;
We can achieve the same result using the &#039;&#039;params&#039;&#039; attribute of the core-site-plugins-call-ws directive instead of using &#039;&#039;useOtherDataForWS&#039;&#039;:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block color=&amp;quot;light&amp;quot; core-site-plugins-call-ws name=&amp;quot;mod_certificate_my_webservice&amp;quot; [params]=&amp;quot;{myVar: CONTENT_OTHERDATA.myVar}&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mod_certificate.send | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The WebService call will be exactly the same with both buttons.&lt;br /&gt;
&lt;br /&gt;
Please notice that this example could be done without using otherdata too, using the “&#039;&#039;form&#039;&#039;” input of the &#039;&#039;core-site-plugins-call-ws directive&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===JS functions visible in the templates===&lt;br /&gt;
&lt;br /&gt;
The app provides some Javascript functions that can be used from the templates to update, refresh or view content. These are the functions:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;openContent(title: string, args: any, component?: string, method?: string)&#039;&#039;&#039;: Open a new page to display some new content. You need to specify the &#039;&#039;title&#039;&#039; of the new page and the &#039;&#039;args&#039;&#039; to send to the method. If &#039;&#039;component&#039;&#039; and &#039;&#039;method&#039;&#039; aren&#039;t provided, it will use the same as in the current page.&lt;br /&gt;
* &#039;&#039;&#039;refreshContent(showSpinner = true)&#039;&#039;&#039;: Refresh the current content. By default it will display a spinner while refreshing, if you don&#039;t want it to be displayed you should pass false as a parameter.&lt;br /&gt;
* &#039;&#039;&#039;updateContent(args: any, component?: string, method?: string)&#039;&#039;&#039;: Refresh the current content using different params. You need to specify the &#039;&#039;args&#039;&#039; to send to the method. If &#039;&#039;component&#039;&#039; and &#039;&#039;method&#039;&#039; aren&#039;t provided, it will use the same as in the current page.&lt;br /&gt;
&lt;br /&gt;
====Examples====&lt;br /&gt;
&lt;br /&gt;
=====Group selector=====&lt;br /&gt;
&lt;br /&gt;
Imagine we have an activity that uses groups and we want to let the user select which group he wants to see. A possible solution would be to return all the groups in the same template (hidden), and then show the group user selects. However, we can make it more dynamic and return only the group the user is requesting.&lt;br /&gt;
&lt;br /&gt;
To do so, we&#039;ll use a drop down to select the group. When the user selects a group using this drop down we&#039;ll update the page content to display the new group.&lt;br /&gt;
&lt;br /&gt;
The main difficulty in this is to tell the view which group needs to be selected when the view is loaded. There are 2 ways to do it: using plain HTML or using Angular&#039;s &#039;&#039;ngModel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
======Using plain HTML======&lt;br /&gt;
&lt;br /&gt;
We need to add a &amp;quot;&#039;&#039;selected&#039;&#039;&amp;quot; attribute to the option that needs to be selected. To do so, we need to pre-caclulate the selected option in the PHP code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        $groupid = empty($args-&amp;gt;group) ? 0 : $args-&amp;gt;group; // By default, group 0.&lt;br /&gt;
        $groups = groups_get_activity_allowed_groups($cm, $user-&amp;gt;id);&lt;br /&gt;
        // Detect which group is selected.&lt;br /&gt;
        foreach ($groups as $gid=&amp;gt;$group) {&lt;br /&gt;
            $group-&amp;gt;selected = $gid === $groupid;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $data = array(&lt;br /&gt;
            &#039;cmid&#039; =&amp;gt; $cm-&amp;gt;id,&lt;br /&gt;
            &#039;courseid&#039; =&amp;gt; $args-&amp;gt;courseid,&lt;br /&gt;
            &#039;groups&#039; =&amp;gt; $groups&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        return array(&lt;br /&gt;
            &#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
                array(&lt;br /&gt;
                    &#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                    &#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
                ),&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the code above, we&#039;re retrieving the groups the user can see and then we&#039;re adding a &amp;quot;selected&amp;quot; bool to each one to determine which one needs to be selected in the drop down. Finally, we pass the list of groups to the template.&lt;br /&gt;
&lt;br /&gt;
In the template, we display the drop down like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-select (ionChange)=&amp;quot;updateContent({cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;, group: $event})&amp;quot; interface=&amp;quot;popover&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;%#groups%&amp;gt;&lt;br /&gt;
        &amp;lt;ion-option value=&amp;quot;&amp;lt;% id %&amp;gt;&amp;quot; &amp;lt;%#selected%&amp;gt;selected&amp;lt;%/selected%&amp;gt; &amp;gt;&amp;lt;% name %&amp;gt;&amp;lt;/ion-option&amp;gt;&lt;br /&gt;
    &amp;lt;%/groups%&amp;gt;&lt;br /&gt;
&amp;lt;/ion-select&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ionChange&#039;&#039; function will be called everytime the user selects a different group with the drop down. We&#039;re using the function &#039;&#039;updateContent&#039;&#039; to update the current view using the new group. &#039;&#039;$event&#039;&#039; is an Angular variable that will have the selected value (in our case, the group ID that was just selected). This is enough to make the group selector work.&lt;br /&gt;
&lt;br /&gt;
======Using ngModel======&lt;br /&gt;
&lt;br /&gt;
ngModel is an Angular directive that allows storing the value of a certain input/select in a Javascript variable, and also the opposite way: tell the input/select which value to set. The main problem is that we cannot initialize a Javascript variable from the template (Angular doesn&#039;t have &#039;&#039;ng-init&#039;&#039; like in AngularJS), so we&#039;ll use &amp;quot;otherdata&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In the PHP function we&#039;ll return the group that needs to be selected in the &#039;&#039;otherdata&#039;&#039; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        $groupid = empty($args-&amp;gt;group) ? 0 : $args-&amp;gt;group; // By default, group 0.&lt;br /&gt;
        $groups = groups_get_activity_allowed_groups($cm, $user-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
         ...&lt;br /&gt;
&lt;br /&gt;
         return array(&lt;br /&gt;
            &#039;templates&#039; =&amp;gt; array(&lt;br /&gt;
                array(&lt;br /&gt;
                    &#039;id&#039; =&amp;gt; &#039;main&#039;,&lt;br /&gt;
                    &#039;html&#039; =&amp;gt; $OUTPUT-&amp;gt;render_from_template(&#039;mod_certificate/mobile_view_page&#039;, $data),&lt;br /&gt;
                ),&lt;br /&gt;
            ),&lt;br /&gt;
            &#039;otherdata&#039; =&amp;gt; array(&lt;br /&gt;
                &#039;group&#039; =&amp;gt; $groupid&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above we don&#039;t need to iterate over the groups array like in the plain HTML example. However, now we&#039;re returning the groupid in the &amp;quot;otherdata&amp;quot; array. As it&#039;s explained in the [[Mobile_support_for_plugins#Using_.E2.80.9Cotherdata.E2.80.9D|Using &amp;quot;otherdata&amp;quot;]] section, this &amp;quot;otherdata&amp;quot; is visible in the templates inside a variable named &#039;&#039;CONTENT_OTHERDATA&#039;&#039;. So in the template we&#039;ll use this variable like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;ion-select [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.group&amp;quot; (ionChange)=&amp;quot;updateContent({cmid: &amp;lt;% cmid %&amp;gt;, courseid: &amp;lt;% courseid %&amp;gt;, group: CONTENT_OTHERDATA.group})&amp;quot; interface=&amp;quot;popover&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;%#groups%&amp;gt;&lt;br /&gt;
        &amp;lt;ion-option value=&amp;quot;&amp;lt;% id %&amp;gt;&amp;quot;&amp;gt;&amp;lt;% name %&amp;gt;&amp;lt;/ion-option&amp;gt;&lt;br /&gt;
    &amp;lt;%/groups%&amp;gt;&lt;br /&gt;
&amp;lt;/ion-select&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Initialization===&lt;br /&gt;
&lt;br /&gt;
All handlers can specify a “&#039;&#039;init&#039;&#039;” method in the mobile.php file. This method is meant to return some JavaScript code that needs to be executed as soon as the plugin is retrieved.&lt;br /&gt;
&lt;br /&gt;
When the app retrieves all the handlers, the first thing it will do is call the &#039;&#039;tool_mobile_get_content&#039;&#039; WebService with the init method. This WS call will only receive the default args.&lt;br /&gt;
&lt;br /&gt;
The app will immediately execute the JavaScript code returned by this WS call. This JavaScript can be used to manually register your handlers in the delegates you want, without having to rely on the default handlers built based on the mobile.php data.&lt;br /&gt;
&lt;br /&gt;
The templates returned by this init method will be added to a INIT_TEMPLATES variable that will be passed to all the Javascript code of that handler. This means that the Javascript returned by the init method or the “main” method can access any of the templates HTML like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.INIT_TEMPLATES[‘main’];&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
In this case, “main” is the ID of the template we want to use.&lt;br /&gt;
&lt;br /&gt;
The same happens with the &#039;&#039;otherdata&#039;&#039; returned by this init method, it is added to a INIT_OTHERDATA variable.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;restrict&#039;&#039; field returned by this init call will be used to determine if your handler is enabled or not. For example, if your handler is for the delegate &#039;&#039;CoreCourseOptionsDelegate&#039;&#039; and you return a list of courseids in restrict-&amp;gt;courses, then your handler will only be enabled in the courses you returned. This only applies to the “default” handlers, if you register your own handler using the Javascript code then you should check yourself if the handler is enabled.&lt;br /&gt;
&lt;br /&gt;
Finally, if you return an object in this init Javascript code, all the properties of that object will be passed to all the Javascript code of that handler so you can use them when the code is run. For example, if your init Javascript code does something like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var result = {&lt;br /&gt;
    MyAddonClass: new MyAddonClass()&lt;br /&gt;
};&lt;br /&gt;
result:&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Then, for the rest of Javascript code of your handler (e.g. for the “main” method) you can use this variable like this:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
this.MyAddonClass&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Examples====&lt;br /&gt;
&lt;br /&gt;
=====Module link handler=====&lt;br /&gt;
&lt;br /&gt;
A link handler allows you to decide what to do when a link with a certain URL is clicked. This is useful, for example, to open your module when a link to the module is clicked. In this example we’ll create a link handler to detect links to a certificate module using a init JavaScript:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
function AddonModCertificateModuleLinkHandler() {&lt;br /&gt;
    that.CoreContentLinksModuleIndexHandler.call(this, that.CoreCourseHelperProvider, &#039;mmaModCertificate&#039;, &#039;certificate&#039;);&lt;br /&gt;
&lt;br /&gt;
    this.name = &amp;quot;AddonModCertificateLinkHandler&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
AddonModCertificateModuleLinkHandler.prototype = Object.create(this.CoreContentLinksModuleIndexHandler.prototype);&lt;br /&gt;
AddonModCertificateModuleLinkHandler.prototype.constructor = AddonModCertificateModuleLinkHandler;&lt;br /&gt;
&lt;br /&gt;
this.CoreContentLinksDelegate.registerHandler(new AddonModCertificateModuleLinkHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Module prefetch handler=====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;CoreCourseModuleDelegate&#039;&#039; handler allows you to define a list of &#039;&#039;offlinefunctions&#039;&#039; to prefetch a module. However, you might want to create your own prefetch handler to determine what needs to be downloaded. For example, you might need to chain WS calls (pass the result of a WS call to the next one), and this cannot be done using &#039;&#039;offlinefunctions&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Here’s an example on how to create a prefetch handler using init JS:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
// Create a class that &amp;quot;inherits&amp;quot; from CoreCourseActivityPrefetchHandlerBase.&lt;br /&gt;
function AddonModCertificateModulePrefetchHandler() {&lt;br /&gt;
    that.CoreCourseActivityPrefetchHandlerBase.call(this, that.TranslateService, that.CoreAppProvider, that.CoreUtilsProvider,&lt;br /&gt;
            that.CoreCourseProvider, that.CoreFilepoolProvider, that.CoreSitesProvider, that.CoreDomUtilsProvider);&lt;br /&gt;
&lt;br /&gt;
    this.name = &amp;quot;AddonModCertificateModulePrefetchHandler&amp;quot;;&lt;br /&gt;
    this.modName = &amp;quot;certificate&amp;quot;;&lt;br /&gt;
    this.component = &amp;quot;mmaModCertificate&amp;quot;;&lt;br /&gt;
    this.updatesNames = /^configuration$|^.*files$/;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype = Object.create(this.CoreCourseActivityPrefetchHandlerBase.prototype);&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype.constructor = AddonModCertificateModulePrefetchHandler;&lt;br /&gt;
&lt;br /&gt;
// Override the prefetch call.&lt;br /&gt;
AddonModCertificateModulePrefetchHandler.prototype.prefetch = function(module, courseId, single, dirPath) {&lt;br /&gt;
    return this.prefetchPackage(module, courseId, single, prefetchCertificate);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function prefetchCertificate(module, courseId, single, siteId) {&lt;br /&gt;
    // Perform all the WS calls.&lt;br /&gt;
    // You can access most of the app providers using that.ClassName. E.g. that.CoreWSProvider.call().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
this.CoreCourseModulePrefetchDelegate.registerHandler(new AddonModCertificateModulePrefetchHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One relatively simple full example is where you have a function that needs to work offline, but it has an additional argument other than the standard ones. You can imagine for this an activity like the book module, where it has multiple pages for the same cmid. The app will not automatically work with this situation - it will call the offline function with the standard arguments only, so you won&#039;t be able to prefetch all the possible parameters. &lt;br /&gt;
&lt;br /&gt;
To deal with this, you need to implement a web service in your Moodle component that returns the list of possible extra arguments, and then you can call this web service and loop around doing the same thing the app does when it prefetches the offline functions. Here is an example from a third-party module (showing only the actual prefetch function - the rest of the code is as above) where there are multiple values of a custom &#039;section&#039; parameter for the mobile function &#039;mobile_document_view&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
function prefetchOucontent(module, courseId, single, siteId) {&lt;br /&gt;
    var component = &#039;mod_oucontent&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Get the site, first.&lt;br /&gt;
    return that.CoreSitesProvider.getSite(siteId).then(function(site) {&lt;br /&gt;
        // Read the list of pages in this document using a web service.&lt;br /&gt;
        return site.read(&#039;mod_oucontent_get_page_list&#039;, {&#039;cmid&#039;: module.id}).then(function(response) {&lt;br /&gt;
            var promises = [];&lt;br /&gt;
&lt;br /&gt;
            // For each page, read and process the page - this is a copy of logic in the app at&lt;br /&gt;
            // siteplugins.ts (prefetchFunctions), but modified to add the custom argument.&lt;br /&gt;
            for(var i = 0; i &amp;lt; response.length; i++) {&lt;br /&gt;
                var args = {&lt;br /&gt;
                    courseid: courseId,&lt;br /&gt;
                    cmid: module.id,&lt;br /&gt;
                    userid: site.getUserId()&lt;br /&gt;
                };&lt;br /&gt;
                if (response[i] !== &#039;&#039;) {&lt;br /&gt;
                    args.section = response[i];&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                promises.push(that.CoreSitePluginsProvider.getContent(&lt;br /&gt;
                        component, &#039;mobile_document_view&#039;, args).then(&lt;br /&gt;
                        function(result) {&lt;br /&gt;
                            var subPromises = [];&lt;br /&gt;
                            if (result.files &amp;amp;&amp;amp; result.files.length) {&lt;br /&gt;
                                subPromises.push(that.CoreFilepoolProvider.downloadOrPrefetchFiles(&lt;br /&gt;
                                        site.id, result.files, true, false, component, module.id));&lt;br /&gt;
                            }&lt;br /&gt;
                            return Promise.all(subPromises);&lt;br /&gt;
                        }));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            return Promise.all(promises);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Single activity course format=====&lt;br /&gt;
&lt;br /&gt;
In the following example, the value of INIT_TEMPLATES[&amp;quot;main&amp;quot;] is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;core-dynamic-component [component]=&amp;quot;componentClass&amp;quot; [data]=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/core-dynamic-component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This template is returned by the init method. And this is the JavaScript code returned by the init method:&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
function getAddonSingleActivityFormatComponent() {&lt;br /&gt;
    function AddonSingleActivityFormatComponent() {&lt;br /&gt;
        this.data = {};&lt;br /&gt;
    };&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.constructor = AddonSingleActivityFormatComponent;&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.ngOnChanges = function(changes) {&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        if (this.course &amp;amp;&amp;amp; this.sections &amp;amp;&amp;amp; this.sections.length) {&lt;br /&gt;
            var module = this.sections[0] &amp;amp;&amp;amp; this.sections[0].modules &amp;amp;&amp;amp; this.sections[0].modules[0];&lt;br /&gt;
            if (module &amp;amp;&amp;amp; !this.componentClass) {&lt;br /&gt;
                that.CoreCourseModuleDelegate.getMainComponent(that.Injector, this.course, module).then((component) =&amp;gt; {&lt;br /&gt;
                    self.componentClass = component || that.CoreCourseUnsupportedModuleComponent;&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            this.data.courseId = this.course.id;&lt;br /&gt;
            this.data.module = module;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    AddonSingleActivityFormatComponent.prototype.doRefresh = function(refresher, done) {&lt;br /&gt;
        return Promise.resolve(this.dynamicComponent.callComponentFunction(&amp;quot;doRefresh&amp;quot;, [refresher, done]));&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
return AddonSingleActivityFormatComponent;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function AddonSingleActivityFormatHandler() {&lt;br /&gt;
    this.name = &amp;quot;singleactivity&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.constructor = AddonSingleActivityFormatHandler;&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.isEnabled = function() {&lt;br /&gt;
    return true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.canViewAllSections = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.getCourseTitle = function(course, sections) {&lt;br /&gt;
    if (sections &amp;amp;&amp;amp; sections[0] &amp;amp;&amp;amp; sections[0].modules &amp;amp;&amp;amp; sections[0].modules[0]) {&lt;br /&gt;
        return sections[0].modules[0].name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return course.fullname || &amp;quot;&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.displayEnableDownload = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.displaySectionSelector = function(course) {&lt;br /&gt;
    return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
AddonSingleActivityFormatHandler.prototype.getCourseFormatComponent = function(injector, course) {&lt;br /&gt;
    that.Injector = injector || that.Injector;&lt;br /&gt;
&lt;br /&gt;
    return that.CoreCompileProvider.instantiateDynamicComponent(that.INIT_TEMPLATES[&amp;quot;main&amp;quot;], getAddonSingleActivityFormatComponent(), injector);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
this.CoreCourseFormatDelegate.registerHandler(new AddonSingleActivityFormatHandler());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using the JavaScript API===&lt;br /&gt;
&lt;br /&gt;
The Javascript API is partly supported right now, only the &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; supports it now. This API allows you to override any of the functions of the default handler. &lt;br /&gt;
&lt;br /&gt;
The “method” specified in a handler registered in the &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; will be called immediately after the init method, and the Javascript returned by this method will be run. If this Javascript code returns an object with certain functions, these function will override the ones in the default handler.&lt;br /&gt;
&lt;br /&gt;
For example, if the Javascript returned by the method returns something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var result = {&lt;br /&gt;
    getData: function(field, signup, registerAuth, formValues) {&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
result;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The the &#039;&#039;getData&#039;&#039; function of the default handler will be overridden by the returned getData function.&lt;br /&gt;
&lt;br /&gt;
The default handler for &#039;&#039;CoreUserProfileFieldDelegate&#039;&#039; only has 2 functions: &#039;&#039;getComponent&#039;&#039; and &#039;&#039;getData&#039;&#039;. In addition, the JavaScript code can return an extra function named &#039;&#039;componentInit&#039;&#039; that will be executed when the component returned by &#039;&#039;getComponent&#039;&#039; is initialized.&lt;br /&gt;
&lt;br /&gt;
Here’s an example on how to support the text user profile field using this API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
var that = this;&lt;br /&gt;
&lt;br /&gt;
var result = {&lt;br /&gt;
    componentInit: function() {&lt;br /&gt;
        if (this.field &amp;amp;&amp;amp; this.edit &amp;amp;&amp;amp; this.form) {&lt;br /&gt;
            this.field.modelName = &amp;quot;profile_field_&amp;quot; + this.field.shortname;&lt;br /&gt;
&lt;br /&gt;
            if (this.field.param2) {&lt;br /&gt;
                this.field.maxlength = parseInt(this.field.param2, 10) || &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            this.field.inputType = that.CoreUtilsProvider.isTrueOrOne(this.field.param3) ? &amp;quot;password&amp;quot; : &amp;quot;text&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            var formData = {&lt;br /&gt;
                value: this.field.defaultdata,&lt;br /&gt;
                disabled: this.disabled&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            this.form.addControl(this.field.modelName, that.FormBuilder.control(formData, this.field.required &amp;amp;&amp;amp; !this.field.locked ? that.Validators.required : null));&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    getData: function(field, signup, registerAuth, formValues) {&lt;br /&gt;
        var name = &amp;quot;profile_field_&amp;quot; + field.shortname;&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            type: &amp;quot;text&amp;quot;,&lt;br /&gt;
            name: name,&lt;br /&gt;
            value: that.CoreTextUtilsProvider.cleanTags(formValues[name])&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
result;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
=== Invalid response received ===&lt;br /&gt;
&lt;br /&gt;
You might receive this error when using the &amp;quot;core-site-plugins-call-ws&amp;quot; directive or similar. By default, the app expects all WebService calls to return an object, if your WebService returns another type (string, bool, ...) then you need to specify it using the preSets attribute of the directive. For example, if your WS returns a boolean value, then you should specify it like this:&lt;br /&gt;
&lt;br /&gt;
[preSets]=&amp;quot;{typeExpected: &#039;boolean&#039;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In a similar way, if your WebService returns null you need to tell the app not to expect any result using the preSets:&lt;br /&gt;
&lt;br /&gt;
[preSets]=&amp;quot;{responseExpected: false}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Values of ion-radio, ion-checkbox or ion-select aren&#039;t sent to my WS ===&lt;br /&gt;
&lt;br /&gt;
Some directives allow you to specify a form id or name to send the data from the form to a certain WS. These directives look for HTML inputs to retrieve the data to send. However, ion-radio, ion-checkbox and ion-select don&#039;t use HTML inputs, they simulate them, so the directive isn&#039;t going to find their data and so it won&#039;t be sent to the WebService.&lt;br /&gt;
&lt;br /&gt;
There are 2 workarounds to fix this problem. It seems that the next major release of Ionic framework does use HTML inputs, so these are temporary solutions.&lt;br /&gt;
&lt;br /&gt;
==== Sending the data manually ====&lt;br /&gt;
&lt;br /&gt;
The first solution is to send the missing params manually using the &amp;quot;&#039;&#039;params&#039;&#039;&amp;quot; property. We will use &#039;&#039;ngModel&#039;&#039; to store the input value in a variable, and this variable will be passed to the params. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a template like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;ion-list radio-group name=&amp;quot;responses&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;myws&amp;quot; [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;}&amp;quot; form=&amp;quot;myform&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mycomponent.save&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you should modify it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;ion-list radio-group [(ngModel)]=&amp;quot;responses&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/ion-list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;myws&amp;quot; [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;, responses: responses}&amp;quot; form=&amp;quot;myform&amp;quot;&amp;gt;&lt;br /&gt;
    {{ &#039;plugin.mycomponent.save&#039; | translate }}&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Basically, you need to add &#039;&#039;ngModel&#039;&#039; to the affected element (in this case, the &#039;&#039;radio-group&#039;&#039;). You can put whatever name you want as the value, we used &amp;quot;responses&amp;quot;. With this, everytime the user selects a radio button the value will be stored in a variable named &amp;quot;responses&amp;quot;. Then, in the button we are passing this variable to the params of the WebService.&lt;br /&gt;
&lt;br /&gt;
Please notice that the &amp;quot;form&amp;quot; attribute has priority over &amp;quot;params&amp;quot;, so if you have an input with name=&amp;quot;responses&amp;quot; it will override what you&#039;re manually passing to params.&lt;br /&gt;
&lt;br /&gt;
==== Using a hidden input ====&lt;br /&gt;
&lt;br /&gt;
Since the directive is looking for HTML inputs, you need to add one with the value to send to the server. You can use &#039;&#039;ngModel&#039;&#039; to synchronize your ion-radio/ion-checkbox/ion-select with the new hidden input. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a radio button like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;div radio-group name=&amp;quot;responses&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you should modify it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;div radio-group name=&amp;quot;responses&amp;quot; [(ngModel)]=&amp;quot;responses&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;ion-item&amp;gt;&lt;br /&gt;
        &amp;lt;ion-label&amp;gt;First value&amp;lt;/ion-label&amp;gt;&lt;br /&gt;
        &amp;lt;ion-radio value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/ion-radio&amp;gt;&lt;br /&gt;
    &amp;lt;/ion-item&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ion-input type=&amp;quot;hidden&amp;quot; [ngModel]=&amp;quot;responses&amp;quot; name=&amp;quot;responses&amp;quot;&amp;gt;&amp;lt;/ion-input&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example above, we&#039;re using a variable named &amp;quot;responses&amp;quot; to synchronize the data between the &#039;&#039;radio-group&#039;&#039; and the hidden input. You can use whatever name you want.&lt;br /&gt;
&lt;br /&gt;
=== I can&#039;t return an object or array in otherdata ===&lt;br /&gt;
&lt;br /&gt;
If you try to return an object or an array in any field inside &#039;&#039;otherdata&#039;&#039;, the WebService call will fail with the following error:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scalar type expected, array or object received&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Each field in &#039;&#039;otherdata&#039;&#039; must be a string, number or boolean, it cannot be an object or array. To make it work, you need to encode your object or array into a JSON string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; json_encode($data))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The app will automatically parse this JSON and convert it back into an array or object.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===Accepting dynamic names in a WebService===&lt;br /&gt;
&lt;br /&gt;
We want to display a form where the names of the fields are dynamic, like it happens in quiz. This data will be sent to a new WebService that we have created.&lt;br /&gt;
&lt;br /&gt;
The first issue we find is that the WebService needs to define the names of the parameters received, but in this case they&#039;re dynamic. The solution is to accept an array of objects with name and value. So in the &#039;&#039;_parameters()&#039;&#039; function of our new WebService, we will add this parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;data&#039; =&amp;gt; new external_multiple_structure(&lt;br /&gt;
     new external_single_structure(&lt;br /&gt;
        array(&lt;br /&gt;
            &#039;name&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;data name&#039;),&lt;br /&gt;
            &#039;value&#039; =&amp;gt; new external_value(PARAM_RAW, &#039;data value&#039;),&lt;br /&gt;
        )&lt;br /&gt;
    ),&lt;br /&gt;
    &#039;The data to be saved&#039;, VALUE_DEFAULT, array()&lt;br /&gt;
)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to adapt our form to send the data as the WebService requires it. In our template, we have a button with the directive &#039;&#039;core-site-plugins-call-ws&#039;&#039; that will send the form data to our WebService. To make this work we will have to pass the parameters manually, without using the &amp;quot;&#039;&#039;form&#039;&#039;&amp;quot; attribute, because we need to format the data before it is sent.&lt;br /&gt;
&lt;br /&gt;
Since we will send the params manually and we want it all to be sent in the same array, we will use &#039;&#039;ngModel&#039;&#039; to store the input data into a variable that we&#039;ll call &amp;quot;data&amp;quot;, but you can use the name you want. This &amp;quot;data&amp;quot; will be an object that will hold the input data with the format &amp;quot;name-&amp;gt;value&amp;quot;. For example, if I have an input with name &amp;quot;a1&amp;quot; and value &amp;quot;My answer&amp;quot;, the data object will be:&lt;br /&gt;
&lt;br /&gt;
{a1: &amp;quot;My answer&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
So we need to add &#039;&#039;ngModel&#039;&#039; to all the inputs whose values need to be sent to the &amp;quot;data&amp;quot; WS param. Please notice that &#039;&#039;ngModel&#039;&#039; &#039;&#039;&#039;requires&#039;&#039;&#039; the element to have a name, so if you add &#039;&#039;ngModel&#039;&#039; to a certain element you need to add a name too. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&amp;lt;ion-input name=&amp;quot;&amp;lt;% name %&amp;gt;&amp;quot; [(ngModel)]=&amp;quot;CONTENT_OTHERDATA.data[&#039;&amp;lt;% name %&amp;gt;&#039;]&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, we&#039;re using &#039;&#039;CONTENT_OTHERDATA&#039;&#039; to store the data. We do it like this because we&#039;ll use &#039;&#039;otherdata&#039;&#039; to initialize the form, setting the values the user has already stored. If you don&#039;t need to initialize the form, then you can use the variable &amp;quot;dataObject&amp;quot;, an empty object that the Mobile app creates for you: [(ngModel)]=&amp;quot;dataObject[&#039;&amp;lt;% name %&amp;gt;&#039;]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Mobile app has a function that allows you to convert this data object into an array like the one the WS expects: &#039;&#039;objectToArrayOfObjects&#039;&#039;. So in our button we&#039;ll use this function to format the data before it&#039;s sent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
&amp;lt;button ion-button block type=&amp;quot;submit&amp;quot; core-site-plugins-call-ws name=&amp;quot;my_ws_name&amp;quot;&lt;br /&gt;
    [params]=&amp;quot;{id: &amp;lt;% id %&amp;gt;, data: CoreUtilsProvider.objectToArrayOfObjects(CONTENT_OTHERDATA.data, &#039;name&#039;, &#039;value&#039;)}&amp;quot;&lt;br /&gt;
    successMessage&lt;br /&gt;
    refreshOnSuccess=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see in the example above, we&#039;re specifying that the keys of the &amp;quot;data&amp;quot; object need to be stored in a property named &amp;quot;name&amp;quot;, and the values need to be stored in a property named &amp;quot;value&amp;quot;. If your WebService expects different names you need to change the parameters of the function &#039;&#039;objectToArrayOfObjects&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If you open your plugin now in the Mobile app it will display an error in the Javascript console. The reason is that the variable &amp;quot;data&amp;quot; doesn&#039;t exist inside &#039;&#039;CONTENT_OTHERDATA&#039;&#039;. As it is explained in previous sections, &#039;&#039;CONTENT_OTHERDATA&#039;&#039; holds the data that you return in &#039;&#039;otherdata&#039;&#039; for your method. We&#039;ll use &#039;&#039;otherdata&#039;&#039; to initialize the values to be displayed in the form.&lt;br /&gt;
&lt;br /&gt;
If the user hasn&#039;t answered the form yet, we can initialize the &amp;quot;data&amp;quot; object as an empty object. Please remember that we cannot return arrays or objects in &#039;&#039;otherdata&#039;&#039;, so we&#039;ll return a JSON string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; &#039;{}&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the code above, the form will always be empty when the user opens it. But now we want to check if the user has already answered the form and fill the form with the previous values. We will do it like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$userdata = get_user_responses(); // It will held the data in a format name-&amp;gt;value. Example: array(&#039;a1&#039; =&amp;gt; &#039;My value&#039;).&lt;br /&gt;
...&lt;br /&gt;
&#039;otherdata&#039; =&amp;gt; array(&#039;data&#039; =&amp;gt; json_encode($userdata))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the user will be able to see previous values when the form is opened, and clicking the button will send the data to our WebService in array format.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53894</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53894"/>
		<updated>2018-03-23T19:42:11Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve SCORM plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
* Choose where to send users after completing SCORM (MDL-61677)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Migrate end-to-end testing support in the Mobile app to Ionic 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 167 e2e tests in the Mobile app (see detailed information [https://magician03.github.io/2017/08/21/gsoc-moodle-final-phase/ here]). &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the existing end-to-end testing support in the Mobile app to Ionic 3 (the original tests were implemented for Ionic 1/AngularJS). &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Update all the tests so they can run in the new version of the framework (Ionic 3)&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Moodle Mobile End To End Testing]], student must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (Angular and Ionic 3)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students: &lt;br /&gt;
* We require prospective students to  set-up a local development environment of the Mobile app (and run it locally) following this documentation: [[Setting_up_your_development_environment_for_Moodle_Mobile_2]], students must provide a video or detailed screenshots including a detailed explanation of what they did to run the app locally.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53893</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53893"/>
		<updated>2018-03-23T19:40:52Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve SCORM plugin */ remove some of the suggested bugs that are already sorted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Migrate end-to-end testing support in the Mobile app to Ionic 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 167 e2e tests in the Mobile app (see detailed information [https://magician03.github.io/2017/08/21/gsoc-moodle-final-phase/ here]). &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the existing end-to-end testing support in the Mobile app to Ionic 3 (the original tests were implemented for Ionic 1/AngularJS). &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Update all the tests so they can run in the new version of the framework (Ionic 3)&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Moodle Mobile End To End Testing]], student must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (Angular and Ionic 3)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students: &lt;br /&gt;
* We require prospective students to  set-up a local development environment of the Mobile app (and run it locally) following this documentation: [[Setting_up_your_development_environment_for_Moodle_Mobile_2]], students must provide a video or detailed screenshots including a detailed explanation of what they did to run the app locally.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53892</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53892"/>
		<updated>2018-03-23T19:38:02Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve SCORM plugin */ remove some of the suggested bugs that are already sorted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Migrate end-to-end testing support in the Mobile app to Ionic 3 ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 167 e2e tests in the Mobile app (see detailed information [https://magician03.github.io/2017/08/21/gsoc-moodle-final-phase/ here]). &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the existing end-to-end testing support in the Mobile app to Ionic 3 (the original tests were implemented for Ionic 1/AngularJS). &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Update all the tests so they can run in the new version of the framework (Ionic 3)&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
&lt;br /&gt;
* We require prospective students to set-up and run in a local environment the existing tests following this documentation: [[Moodle Mobile End To End Testing]], student must record a video of the tests running on a local machine.&lt;br /&gt;
* We also require students to create an additional test (detailed instructions for writing tests are available in the previous link)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (Angular and Ionic 3)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students: &lt;br /&gt;
* We require prospective students to  set-up a local development environment of the Mobile app (and run it locally) following this documentation: [[Setting_up_your_development_environment_for_Moodle_Mobile_2]], students must provide a video or detailed screenshots including a detailed explanation of what they did to run the app locally.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53694</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53694"/>
		<updated>2018-02-12T20:40:06Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: remove advanced grading project as possible GSOC project - unless someone else wants to mentor a project on it.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53658</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53658"/>
		<updated>2018-01-30T21:41:25Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Potential projects */  add text suggested by Helen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions and lists projects together with experienced core developers willing to mentor new developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Add monitoring metrics to Moodle via a plugin ===&lt;br /&gt;
Expose metrics for monitoring for systems like [http://prometheus.io Prometheus] to allow for long term monitoring of things like student count or active users.&lt;br /&gt;
Work would need to be done speccing out this project as well as the actual implementation.&lt;br /&gt;
&lt;br /&gt;
Requirements for prospective students:&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=2101503 Paul Greidanus]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53657</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53657"/>
		<updated>2018-01-30T21:38:39Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: remove old project with no confirmed mentor.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Add monitoring metrics to Moodle via a plugin ===&lt;br /&gt;
Expose metrics for monitoring for systems like [http://prometheus.io Prometheus] to allow for long term monitoring of things like student count or active users.&lt;br /&gt;
Work would need to be done speccing out this project as well as the actual implementation.&lt;br /&gt;
&lt;br /&gt;
Requirements for prospective students:&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=2101503 Paul Greidanus]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53652</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53652"/>
		<updated>2018-01-28T22:23:10Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add mobile app support for attendance project.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Pusher integration for HTML5 push notifications ===&lt;br /&gt;
Moodle supports message output plugins. By adding a plugin for pusher.com and a Javascript service worker to listen for push notifications, we can have realtime HTML5 notifications on all platforms.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (JQuery, AMD), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Add Mobile app support to Attendance plugin ===&lt;br /&gt;
A new version of the Moodle Mobile app will be finished in May 2018 - This will provide a simpler way for plugins to add support for the Mobile app. &lt;br /&gt;
Draft spec is available here https://moodle.org/mod/forum/discuss.php?d=361230&lt;br /&gt;
&lt;br /&gt;
Minimum requirements for this would involve the ability for teachers and students to take attendance, and for students to view their reports.&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53651</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53651"/>
		<updated>2018-01-28T22:05:17Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Pusher integration for HTML5 push notifications */ removing Damyon as possible mentor as he won&amp;#039;t be participating in gsoc for 2018&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Pusher integration for HTML5 push notifications ===&lt;br /&gt;
Moodle supports message output plugins. By adding a plugin for pusher.com and a Javascript service worker to listen for push notifications, we can have realtime HTML5 notifications on all platforms.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (JQuery, AMD), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53650</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=53650"/>
		<updated>2018-01-28T22:02:03Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve SCORM plugin */ adjust scorm project possible issues.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Pusher integration for HTML5 push notifications ===&lt;br /&gt;
Moodle supports message output plugins. By adding a plugin for pusher.com and a Javascript service worker to listen for push notifications, we can have realtime HTML5 notifications on all platforms.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (JQuery, AMD), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1337843 Damyon Wiese]&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=52062</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=52062"/>
		<updated>2017-03-21T20:16:04Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Advanced Grading in Forums */ add task to update code.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Pusher integration for HTML5 push notifications ===&lt;br /&gt;
Moodle supports message output plugins. By adding a plugin for pusher.com and a Javascript service worker to listen for push notifications, we can have realtime HTML5 notifications on all platforms.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (JQuery, AMD), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1337843 Damyon Wiese]&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Migrate scorm_cron into new tasks API (MDL-53343)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Update existing patch to work on latest master branch (existing patch based on an early release of 2.9)&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=51870</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=51870"/>
		<updated>2017-02-09T20:02:02Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve Behat tests in SCORM plugin */ -&amp;gt; now general SCORM improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Pusher integration for HTML5 push notifications ===&lt;br /&gt;
Moodle supports message output plugins. By adding a plugin for pusher.com and a Javascript service worker to listen for push notifications, we can have realtime HTML5 notifications on all platforms.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (JQuery, AMD), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1337843 Damyon Wiese]&lt;br /&gt;
&lt;br /&gt;
=== Improve SCORM plugin ===&lt;br /&gt;
There are a number of areas of SCORM that could be improved as part of a GSOC project, some of these are bigger projects and others could be combined to form a single project.&lt;br /&gt;
&lt;br /&gt;
These are just some examples, take a look at the open SCORM issues in the Moodle tracker for a list of other issues.&lt;br /&gt;
* Improve Grading (MDL-51086, MDL-52871, MDL-55004, MDL-37421)&lt;br /&gt;
* Add Support for Safe Exam Browser (MDL-41054)&lt;br /&gt;
* Add new option to force new attempts (MDL-32585)&lt;br /&gt;
* Improve validation of SCORM packages (MDL-38060, MDL-24057)&lt;br /&gt;
* Migrate scorm_cron into new tasks API (MDL-53343)&lt;br /&gt;
* Convert YUI Treeview to use Jquery (Moodle is moving away from YUI and the existing Treeview has a few issues)&lt;br /&gt;
&lt;br /&gt;
Requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Improve end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
There are almost 40 e2e tests in the Mobile app, right now tests only works in old versions of Node and Protractor. &lt;br /&gt;
&lt;br /&gt;
The aim of this project is to upgrade the Node, Protractor, Selenium and the rest of dependencies to be able to run tests in both a browser and in real devices via external systems like Saucelabs. &lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Upgrade the Node, Protractor and dependencies versions to be able to run tests in modern environments.&lt;br /&gt;
* Configure the app to be able to be launched in Saucelabs via Travis (if possible).&lt;br /&gt;
* Fix existing tests that are failing&lt;br /&gt;
* Update Moodle Mobile documentation with new instructions for setting up both environments.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Migrate Moodle Mobile publishing scripts to Gulp tasks ===&lt;br /&gt;
&lt;br /&gt;
Right now the Mobile app uses several scripts ([see here https://github.com/moodlehq/moodlemobile-scripts]) for common tasks related to publishing.&lt;br /&gt;
&lt;br /&gt;
Those scripts should be migrated to Gulp tasks so they are available among the other tasks already implemented.&lt;br /&gt;
&lt;br /&gt;
Tasks:&lt;br /&gt;
* Migrate the prepare-release-version.sh script to gulp task&lt;br /&gt;
* Migrate the prepare-release-integration.sh script to gulp task&lt;br /&gt;
* Improve previous scripts to compile the resulting app via Phonegap Build API&lt;br /&gt;
* Migrate the rest of scripts that synchronizes language translations&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; Javascript &lt;br /&gt;
:&#039;&#039;&#039;Difficulty level:&#039;&#039;&#039; Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor:&#039;&#039;&#039; [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49560</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49560"/>
		<updated>2016-03-01T21:06:18Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Advanced Grading in Forums */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ability to crop/resize/rotate an image in atto ===&lt;br /&gt;
&lt;br /&gt;
Moodle comes with it&#039;s own HTML editor known as &#039;atto&#039; (see https://docs.moodle.org/dev/Atto). The editor functions similarly to other editors out there, like TinyMCE, but is tailored to Moodle. It comes with multiple plugins that allow users to perform tasks, such as changing the font size, the alignment, adding links etc. One of these plugins allows the user to add an image to the text editor with the ability to specify the size and alignment of the image via text input. The idea of this project is to extend and improve this current plugin so the user can crop/resize/rotate the image via JS - making the whole experience easier and more aesthetically pleasing.&lt;br /&gt;
&lt;br /&gt;
This project details/discussion can be located at MDL-52982.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/view.php?id=1057750 Mark Nelson]&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Add support to end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
The basements for this project are done, see MOBILE-1179, the only remaining work is to add more tests to the app and document the set-up process in the Moodle developers wiki.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required: Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Create a desktop version of Moodle Mobile using Electron ===&lt;br /&gt;
&lt;br /&gt;
[http://electron.atom.io/ Electron] is a tool for creating cross platform desktop applications using web technologies.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/moodlehq/moodlemobile/ Moodle Mobile 1] (the previous version of Moodle Mobile) had an experimental desktop application using a similar tool ([http://nwjs.io/ Node-Webkit, now NW.js]), for Moodle Mobile 2 we’d like to see the application packaged for desktop using Electron.&lt;br /&gt;
&lt;br /&gt;
In this project you will implement some of the Cordova APIs to use the Node.js API provided by electron:&lt;br /&gt;
* FileSystem API - For browsing the local file system&lt;br /&gt;
* FileTransfer API - For downloads and uploads&lt;br /&gt;
* Camera and capture API - For taking photos, videos and audios using the webcam&lt;br /&gt;
&lt;br /&gt;
Notice that these APIs are already implemented in the previous version of Moodle Mobile 1, this project is about migrating this old APIs from Node-Webkit to the new version of the application using Electron.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required: Javascript (Node.js)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Generator of Moodle plugins scaffold code ===&lt;br /&gt;
&lt;br /&gt;
There are many [[Plugin types|plugin types]] in Moodle. There are [[Plugin files|files]] and code patterns that all plugins have in common. Also there are specific interfaces that individual plugin types are expected to implement. When developing a new plugin, Moodle contributors use some available templates for various plugin types as well as existing plugins as a reference.&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to develop a tool that helps Moodle contributors to generate a scaffold code for a new Moodle plugin. Given parameters such as plugin type, plugin name, list of enabled/disabled features and other meta-data (such as author name etc), the tool should generate a scaffold code for that plugin that the developer can build on.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Research and analysis of existing tools and approaches used in other software projects.&lt;br /&gt;
* Specification of the format/syntax of templates that will be used to generate the plugin code.&lt;br /&gt;
* Templates for all Moodle plugin types and specification of their storage, organisation and maintenance (so that it is possible to keep them up to date in further Moodle versions).&lt;br /&gt;
* Software tool that makes use of these templates and actually generates the plugin scaffold code.&lt;br /&gt;
&lt;br /&gt;
Requirements:&lt;br /&gt;
* The generated code should pass 100% of the Moodle codechecking tools to ensure it meets with Moodle Guidelines.&lt;br /&gt;
* The generator itself should be written in PHP and provide both CLI and GUI.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP, experience with Moodle plugins development is a big plus.&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
=== Add search to more moodle components ===&lt;br /&gt;
&lt;br /&gt;
MDL-31989 is introducing global search to Moodle to index moodle data in an external source and to retrieve data back from that external source. There are some module components, like glossary or databases that can use the search engine to index their data on it, so moodle users with permissions can access them quickly. This project would be about implementing the search API in some moodle components, the number of components can vary depending on the time available, but ideally this should land into core.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=122326 David Monllao]&lt;br /&gt;
&lt;br /&gt;
=== Elastic search ===&lt;br /&gt;
&lt;br /&gt;
MDL-31989 is introducing global search to Moodle to index moodle data in an external source and to retrieve data back from that external source. The only search engine that will be initially supported will be solr, as elasticsearch has a good use base would be nice to write a search_elastic plugin implementing moodle&#039;s search engine API. This does not necessarily need to go into core.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=122326 David Monllao]&lt;br /&gt;
&lt;br /&gt;
===Clef | Two-Factor Authentication===&lt;br /&gt;
Create [https://getclef.com Clef two factor authentication] plugin, so user can login using there mobile to reduce login time. This will improve security and reduce login time for users.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP, Javascript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1328988 Rajesh Taneja]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49559</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49559"/>
		<updated>2016-03-01T21:06:07Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Improve Behat tests in SCORM plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ability to crop/resize/rotate an image in atto ===&lt;br /&gt;
&lt;br /&gt;
Moodle comes with it&#039;s own HTML editor known as &#039;atto&#039; (see https://docs.moodle.org/dev/Atto). The editor functions similarly to other editors out there, like TinyMCE, but is tailored to Moodle. It comes with multiple plugins that allow users to perform tasks, such as changing the font size, the alignment, adding links etc. One of these plugins allows the user to add an image to the text editor with the ability to specify the size and alignment of the image via text input. The idea of this project is to extend and improve this current plugin so the user can crop/resize/rotate the image via JS - making the whole experience easier and more aesthetically pleasing.&lt;br /&gt;
&lt;br /&gt;
This project details/discussion can be located at MDL-52982.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/view.php?id=1057750 Mark Nelson]&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* We require prospective students to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Add support to end-to-end testing in the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
[https://angular.github.io/protractor/#/ Protractor] is an end-to-end test framework for AngularJS applications. Protractor runs tests against your application running in a real browser, interacting with it as a user would.&lt;br /&gt;
&lt;br /&gt;
The basements for this project are done, see MOBILE-1179, the only remaining work is to add more tests to the app and document the set-up process in the Moodle developers wiki.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required: Javascript (AngularJS)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Create a desktop version of Moodle Mobile using Electron ===&lt;br /&gt;
&lt;br /&gt;
[http://electron.atom.io/ Electron] is a tool for creating cross platform desktop applications using web technologies.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/moodlehq/moodlemobile/ Moodle Mobile 1] (the previous version of Moodle Mobile) had an experimental desktop application using a similar tool ([http://nwjs.io/ Node-Webkit, now NW.js]), for Moodle Mobile 2 we’d like to see the application packaged for desktop using Electron.&lt;br /&gt;
&lt;br /&gt;
In this project you will implement some of the Cordova APIs to use the Node.js API provided by electron:&lt;br /&gt;
* FileSystem API - For browsing the local file system&lt;br /&gt;
* FileTransfer API - For downloads and uploads&lt;br /&gt;
* Camera and capture API - For taking photos, videos and audios using the webcam&lt;br /&gt;
&lt;br /&gt;
Notice that these APIs are already implemented in the previous version of Moodle Mobile 1, this project is about migrating this old APIs from Node-Webkit to the new version of the application using Electron.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required: Javascript (Node.js)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Generator of Moodle plugins scaffold code ===&lt;br /&gt;
&lt;br /&gt;
There are many [[Plugin types|plugin types]] in Moodle. There are [[Plugin files|files]] and code patterns that all plugins have in common. Also there are specific interfaces that individual plugin types are expected to implement. When developing a new plugin, Moodle contributors use some available templates for various plugin types as well as existing plugins as a reference.&lt;br /&gt;
&lt;br /&gt;
The goal of this project is to develop a tool that helps Moodle contributors to generate a scaffold code for a new Moodle plugin. Given parameters such as plugin type, plugin name, list of enabled/disabled features and other meta-data (such as author name etc), the tool should generate a scaffold code for that plugin that the developer can build on.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Research and analysis of existing tools and approaches used in other software projects.&lt;br /&gt;
* Specification of the format/syntax of templates that will be used to generate the plugin code.&lt;br /&gt;
* Templates for all Moodle plugin types and specification of their storage, organisation and maintenance (so that it is possible to keep them up to date in further Moodle versions).&lt;br /&gt;
* Software tool that makes use of these templates and actually generates the plugin scaffold code.&lt;br /&gt;
&lt;br /&gt;
Requirements:&lt;br /&gt;
* The generated code should pass 100% of the Moodle codechecking tools to ensure it meets with Moodle Guidelines.&lt;br /&gt;
* The generator itself should be written in PHP and provide both CLI and GUI.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP, experience with Moodle plugins development is a big plus.&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=1601&amp;amp;course=5 David Mudrák]&lt;br /&gt;
&lt;br /&gt;
=== Add search to more moodle components ===&lt;br /&gt;
&lt;br /&gt;
MDL-31989 is introducing global search to Moodle to index moodle data in an external source and to retrieve data back from that external source. There are some module components, like glossary or databases that can use the search engine to index their data on it, so moodle users with permissions can access them quickly. This project would be about implementing the search API in some moodle components, the number of components can vary depending on the time available, but ideally this should land into core.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=122326 David Monllao]&lt;br /&gt;
&lt;br /&gt;
=== Elastic search ===&lt;br /&gt;
&lt;br /&gt;
MDL-31989 is introducing global search to Moodle to index moodle data in an external source and to retrieve data back from that external source. The only search engine that will be initially supported will be solr, as elasticsearch has a good use base would be nice to write a search_elastic plugin implementing moodle&#039;s search engine API. This does not necessarily need to go into core.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=122326 David Monllao]&lt;br /&gt;
&lt;br /&gt;
===Clef | Two-Factor Authentication===&lt;br /&gt;
Create [https://getclef.com Clef two factor authentication] plugin, so user can login using there mobile to reduce login time. This will improve security and reduce login time for users.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required:&#039;&#039;&#039; PHP, Javascript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1328988 Rajesh Taneja]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49279</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49279"/>
		<updated>2016-01-24T01:30:58Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students:&lt;br /&gt;
* Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49278</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49278"/>
		<updated>2016-01-24T01:29:37Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at MDL-31860&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49277</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49277"/>
		<updated>2016-01-24T01:27:52Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
=== Advanced Grading in Forums ===&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at [https://tracker.moodle.org/browse/MDL-31860 MDL-31860]&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49276</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49276"/>
		<updated>2016-01-24T01:27:26Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
== Advanced Grading in Forums ==&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at [https://tracker.moodle.org/browse/MDL-31860 MDL-31860]&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49275</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49275"/>
		<updated>2016-01-24T01:26:45Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add new project for advanced grading.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
== Advanced Grading in Forums ==&lt;br /&gt;
Finish the work required to add the advanced grading feature to the Moodle forum activity. This builds on some existing work available at [https://tracker.moodle.org/browse/MDL-31860 MDL-31860]&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Modify the forum grading so that it pushes 2 grade areas (or 3 including ratings) into the gradebook instead of a single grade.&lt;br /&gt;
* Improve interface that allows overall forum participation grading.&lt;br /&gt;
* Behat tests for all new functionality.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application will not be considered.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49274</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49274"/>
		<updated>2016-01-24T01:21:18Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add scorm behat project&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Improve Behat tests in SCORM plugin ===&lt;br /&gt;
The Moodle SCORM plugin does not contain very many behat tests and most tests are manual. The Claude Ostyn diagnostic SCO should be used to implement a range of new Behat tests to cover the functionality that the SCORM module provides.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* Behat tests for all existing SCORM QA tests (where possible)&lt;br /&gt;
* Behat tests for all SCORM settings (eg standards mode, mastery score settings etc) &lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
&lt;br /&gt;
Extra requirement for prospective students.&lt;br /&gt;
Moodle requires all GSOC applicants to make an attempt at fixing at least 1 issue in the Moodle tracker before their proposal can be considered - on top of this you must also attempt to convert one existing QA test into a Behat test. This MUST be completed before your application can be considered valid. If you do not have time to do this before the submission deadline your application cannot be considered.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49273</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=49273"/>
		<updated>2016-01-24T01:04:12Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: delete old project (moorsp) as this was completed in 2015&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how the Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [https://tracker.moodle.org/issues/?jql=type%20in%20%28%22New%20Feature%22%2C%20Improvement%29%20AND%20resolution%20%3D%20unresolved%20and%20labels%20in%20%28addon_candidate%29%20ORDER%20BY%20votes%20DESC Popular new feature and improvement requests in Tracker that can be implemented as plugins]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
* [https://docs.moodle.org/dev/Moodle_Wishlist a Wishlist] by some Moodle users. Some of the good ideas here may be adopted.&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49267</id>
		<title>Plagiarism plugins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49267"/>
		<updated>2016-01-22T05:03:35Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The Plagiarism API is a core set of functions that all Moodle code can use to send user submitted content to Plagiarism Prevention systems&lt;br /&gt;
&lt;br /&gt;
A typical user story:&lt;br /&gt;
# When Plagiarism tools are enabled (in site administration/advanced features and also check site administration/plugins/plagiarism/manage plagiarism plugins), every module that allows it will have a group of settings added to allow management of sending the user content to a plagiarism service.&lt;br /&gt;
# A user enters some content/submits a file inside a module that a teacher/Admin has configured the tool to be used.&lt;br /&gt;
# An Event is triggered which contains details about the user, module and submission they have made&lt;br /&gt;
# Event handlers in the Plagiarism plugin are triggered and process anything required.&lt;br /&gt;
# Hooks for displaying information returned from the Plagiarism tools to both the user and teacher (controlled by the plugin)&lt;br /&gt;
===Supported Modules ===&lt;br /&gt;
The following modules are the only ones who have currently implemented support for the plagiarism api&lt;br /&gt;
* Assignment 2.2 -&lt;br /&gt;
** Single Upload Assignment&lt;br /&gt;
** Advanced Assignment&lt;br /&gt;
** Online Text Assignment&lt;br /&gt;
* Assignment&lt;br /&gt;
* Forum&lt;br /&gt;
* Workshop&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
* Urkund https://github.com/danmarsden/moodle-plagiarism_urkund&lt;br /&gt;
* Turnitin https://github.com/turnitin/moodle-plagiarism_turnitin&lt;br /&gt;
* PlagScan https://api.plagscan.com/plagscan_2015071501.zip&lt;br /&gt;
&lt;br /&gt;
==Template==&lt;br /&gt;
Use this git branch as a base for your new plugin: https://github.com/danmarsden/moodle-plagiarism_new&lt;br /&gt;
(replace all instances of &amp;quot;new&amp;quot; with the folder name of your new plugin)&lt;br /&gt;
==Naming conventions==&lt;br /&gt;
Following Naming conventions should be kept in mind while writing a plagiarism plugin:-&lt;br /&gt;
&lt;br /&gt;
*Folder name should be same as pluginname&lt;br /&gt;
*Name of the extended class should be plagiarism_plugin_pluginname&lt;br /&gt;
*Each plugin must define the string &amp;quot;pluginname&amp;quot; in the language files.&lt;br /&gt;
&lt;br /&gt;
== Interfacing to APIs  ==&lt;br /&gt;
&lt;br /&gt;
======cron======&lt;br /&gt;
This function was deprecated in 3.1, Moodle 2.7 added the new [[Task_API]] which should now be used instead. in versions prior to 3.1 this function must exist within your local class but can be empty if you have migrated to using the newer [[Task_API]]&lt;br /&gt;
&lt;br /&gt;
======get_form_elements======&lt;br /&gt;
This function allows the addition of any Plagiarism specific settings to an mform inside a module settings page.&lt;br /&gt;
&lt;br /&gt;
======save_form_elements======&lt;br /&gt;
This function is triggered when a teacher saves the settings on a module page to allows storing of any Plagiarism specific settings.&lt;br /&gt;
&lt;br /&gt;
======get_links======&lt;br /&gt;
This function provides a hook to allow information to be displayed beside a users submission - for example the grading page for teachers to display an originality score/link to more information or to allow a student to see the same information.&lt;br /&gt;
&lt;br /&gt;
======print_disclosure======&lt;br /&gt;
This function allows the plugin to display a message to users inside the submission page to let them know that the submission will be passed to a plagiarism prevention system.&lt;br /&gt;
&lt;br /&gt;
======update_status======&lt;br /&gt;
This function is called on pages that display a full list of users eg grading pages to allow the status of any submissions to be checked. This function is called every time the report page is loaded so it should perform appropriate caching.&lt;br /&gt;
&lt;br /&gt;
===Event Triggers===&lt;br /&gt;
Modules that support the Plagiarism API should have appropriate event triggers when a user has updated text that requires processing by the Plagiarism API&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How_to_add_support_for_a_Plagiarism_Plugin_to_my_activity_module]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49266</id>
		<title>Plagiarism plugins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49266"/>
		<updated>2016-01-22T05:02:32Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* cron */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The Plagiarism API is a core set of functions that all Moodle code can use to send user submitted content to Plagiarism Prevention systems&lt;br /&gt;
&lt;br /&gt;
A typical user story:&lt;br /&gt;
# When Plagiarism tools are enabled (in site administration/advanced features and also check site administration/plugins/plagiarism/manage plagiarism plugins), every module that allows it will have a group of settings added to allow management of sending the user content to a plagiarism service.&lt;br /&gt;
# A user enters some content/submits a file inside a module that a teacher/Admin has configured the tool to be used.&lt;br /&gt;
# An Event is triggered which contains details about the user, module and submission they have made&lt;br /&gt;
# Event handlers in the Plagiarism plugin are triggered and process anything required.&lt;br /&gt;
# Hooks for displaying information returned from the Plagiarism tools to both the user and teacher (controlled by the plugin)&lt;br /&gt;
===Supported Modules ===&lt;br /&gt;
The following modules are the only ones who have currently implemented support for the plagiarism api&lt;br /&gt;
* Assignment 2.2 -&lt;br /&gt;
** Single Upload Assignment&lt;br /&gt;
** Advanced Assignment&lt;br /&gt;
** Online Text Assignment&lt;br /&gt;
* Assignment&lt;br /&gt;
* Forum&lt;br /&gt;
* Workshop&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
* PlagScan https://api.plagscan.com/plagscan_2015071501.zip&lt;br /&gt;
* Urkund https://github.com/danmarsden/moodle-plagiarism_urkund&lt;br /&gt;
* Turnitin https://github.com/danmarsden/moodle-plagiarism_turnitin&lt;br /&gt;
==Template==&lt;br /&gt;
Use this git branch as a base for your new plugin: https://github.com/danmarsden/moodle-plagiarism_new&lt;br /&gt;
(replace all instances of &amp;quot;new&amp;quot; with the folder name of your new plugin)&lt;br /&gt;
==Naming conventions==&lt;br /&gt;
Following Naming conventions should be kept in mind while writing a plagiarism plugin:-&lt;br /&gt;
&lt;br /&gt;
*Folder name should be same as pluginname&lt;br /&gt;
*Name of the extended class should be plagiarism_plugin_pluginname&lt;br /&gt;
*Each plugin must define the string &amp;quot;pluginname&amp;quot; in the language files.&lt;br /&gt;
&lt;br /&gt;
== Interfacing to APIs  ==&lt;br /&gt;
&lt;br /&gt;
======cron======&lt;br /&gt;
This function was deprecated in 3.1, Moodle 2.7 added the new [[Task_API]] which should now be used instead. in versions prior to 3.1 this function must exist within your local class but can be empty if you have migrated to using the newer [[Task_API]]&lt;br /&gt;
&lt;br /&gt;
======get_form_elements======&lt;br /&gt;
This function allows the addition of any Plagiarism specific settings to an mform inside a module settings page.&lt;br /&gt;
&lt;br /&gt;
======save_form_elements======&lt;br /&gt;
This function is triggered when a teacher saves the settings on a module page to allows storing of any Plagiarism specific settings.&lt;br /&gt;
&lt;br /&gt;
======get_links======&lt;br /&gt;
This function provides a hook to allow information to be displayed beside a users submission - for example the grading page for teachers to display an originality score/link to more information or to allow a student to see the same information.&lt;br /&gt;
&lt;br /&gt;
======print_disclosure======&lt;br /&gt;
This function allows the plugin to display a message to users inside the submission page to let them know that the submission will be passed to a plagiarism prevention system.&lt;br /&gt;
&lt;br /&gt;
======update_status======&lt;br /&gt;
This function is called on pages that display a full list of users eg grading pages to allow the status of any submissions to be checked. This function is called every time the report page is loaded so it should perform appropriate caching.&lt;br /&gt;
&lt;br /&gt;
===Event Triggers===&lt;br /&gt;
Modules that support the Plagiarism API should have appropriate event triggers when a user has updated text that requires processing by the Plagiarism API&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How_to_add_support_for_a_Plagiarism_Plugin_to_my_activity_module]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49265</id>
		<title>Plagiarism plugins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Plagiarism_plugins&amp;diff=49265"/>
		<updated>2016-01-22T05:02:18Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* cron */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The Plagiarism API is a core set of functions that all Moodle code can use to send user submitted content to Plagiarism Prevention systems&lt;br /&gt;
&lt;br /&gt;
A typical user story:&lt;br /&gt;
# When Plagiarism tools are enabled (in site administration/advanced features and also check site administration/plugins/plagiarism/manage plagiarism plugins), every module that allows it will have a group of settings added to allow management of sending the user content to a plagiarism service.&lt;br /&gt;
# A user enters some content/submits a file inside a module that a teacher/Admin has configured the tool to be used.&lt;br /&gt;
# An Event is triggered which contains details about the user, module and submission they have made&lt;br /&gt;
# Event handlers in the Plagiarism plugin are triggered and process anything required.&lt;br /&gt;
# Hooks for displaying information returned from the Plagiarism tools to both the user and teacher (controlled by the plugin)&lt;br /&gt;
===Supported Modules ===&lt;br /&gt;
The following modules are the only ones who have currently implemented support for the plagiarism api&lt;br /&gt;
* Assignment 2.2 -&lt;br /&gt;
** Single Upload Assignment&lt;br /&gt;
** Advanced Assignment&lt;br /&gt;
** Online Text Assignment&lt;br /&gt;
* Assignment&lt;br /&gt;
* Forum&lt;br /&gt;
* Workshop&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
* PlagScan https://api.plagscan.com/plagscan_2015071501.zip&lt;br /&gt;
* Urkund https://github.com/danmarsden/moodle-plagiarism_urkund&lt;br /&gt;
* Turnitin https://github.com/danmarsden/moodle-plagiarism_turnitin&lt;br /&gt;
==Template==&lt;br /&gt;
Use this git branch as a base for your new plugin: https://github.com/danmarsden/moodle-plagiarism_new&lt;br /&gt;
(replace all instances of &amp;quot;new&amp;quot; with the folder name of your new plugin)&lt;br /&gt;
==Naming conventions==&lt;br /&gt;
Following Naming conventions should be kept in mind while writing a plagiarism plugin:-&lt;br /&gt;
&lt;br /&gt;
*Folder name should be same as pluginname&lt;br /&gt;
*Name of the extended class should be plagiarism_plugin_pluginname&lt;br /&gt;
*Each plugin must define the string &amp;quot;pluginname&amp;quot; in the language files.&lt;br /&gt;
&lt;br /&gt;
== Interfacing to APIs  ==&lt;br /&gt;
&lt;br /&gt;
======cron======&lt;br /&gt;
This function was deprecated in 3.1, Moodle 2.7 added the new [[Task_API] which should now be used instead. in versions prior to 3.1 this function must exist within your local class but can be empty if you have migrated to using the newer [[Task_API]]&lt;br /&gt;
&lt;br /&gt;
======get_form_elements======&lt;br /&gt;
This function allows the addition of any Plagiarism specific settings to an mform inside a module settings page.&lt;br /&gt;
&lt;br /&gt;
======save_form_elements======&lt;br /&gt;
This function is triggered when a teacher saves the settings on a module page to allows storing of any Plagiarism specific settings.&lt;br /&gt;
&lt;br /&gt;
======get_links======&lt;br /&gt;
This function provides a hook to allow information to be displayed beside a users submission - for example the grading page for teachers to display an originality score/link to more information or to allow a student to see the same information.&lt;br /&gt;
&lt;br /&gt;
======print_disclosure======&lt;br /&gt;
This function allows the plugin to display a message to users inside the submission page to let them know that the submission will be passed to a plagiarism prevention system.&lt;br /&gt;
&lt;br /&gt;
======update_status======&lt;br /&gt;
This function is called on pages that display a full list of users eg grading pages to allow the status of any submissions to be checked. This function is called every time the report page is loaded so it should perform appropriate caching.&lt;br /&gt;
&lt;br /&gt;
===Event Triggers===&lt;br /&gt;
Modules that support the Plagiarism API should have appropriate event triggers when a user has updated text that requires processing by the Plagiarism API&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How_to_add_support_for_a_Plagiarism_Plugin_to_my_activity_module]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=GSOC/2015&amp;diff=48442</id>
		<title>GSOC/2015</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=GSOC/2015&amp;diff=48442"/>
		<updated>2015-08-13T02:03:13Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add moorsp details.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An overview of the Google Summer of Code 2015 projects for Moodle.&lt;br /&gt;
&lt;br /&gt;
== Meta enrolment plugin with multiple courses selection ==&lt;br /&gt;
&lt;br /&gt;
* Student: [https://moodle.org/user/profile.php?id=1925183 Mihir Thakkar]&lt;br /&gt;
* Mentor: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
* Summary:&lt;br /&gt;
* Spec: [[Meta enrolment plugin with multiple courses selection]]&lt;br /&gt;
* Outputs:&lt;br /&gt;
&lt;br /&gt;
== Moorsp Plagiarism API test plugin ==&lt;br /&gt;
The Moorsp plugin provides automated Behat and Unit tests for the core Moodle [Plagiarism_API]. Ramindu completed functions to leverage the plagiarism API and implemented behat and unit tests to cover these functions. The plugin uses the new [Event_2 Events API] instead of the older legacy log like the existing plagiarism plugins currently provide.&lt;br /&gt;
&lt;br /&gt;
* Student: [https://moodle.org/user/profile.php?id=1924331&amp;amp;course=5  Ramindu Deshapriya]&lt;br /&gt;
* Mentor: [https://moodle.org/user/profile.php?id=21591 Dan Marsden]&lt;br /&gt;
* Github repository: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
== SCORM 1.2 player in the Mobile app ==&lt;br /&gt;
&lt;br /&gt;
* Student:&lt;br /&gt;
* Mentor:&lt;br /&gt;
* Summary:&lt;br /&gt;
* Spec: [[SCORM 1.2 player in the Mobile app]]&lt;br /&gt;
* Outputs:&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Security:Brute-forcing_login&amp;diff=48418</id>
		<title>Security:Brute-forcing login</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Security:Brute-forcing_login&amp;diff=48418"/>
		<updated>2015-08-04T06:14:02Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* How Moodle avoids this problem */ add information about account lockout threshold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page forms part of the [[Security|Moodle security guidelines]].&lt;br /&gt;
&lt;br /&gt;
==What is the danger?==&lt;br /&gt;
&lt;br /&gt;
Evil Hacker wants to break into your Moodle site by stealing the account of a registered user.&lt;br /&gt;
&lt;br /&gt;
They write a script that automatically tries logging in with a range of common passwords, for example, admin/admin, admin/apple, admin/1234, .... It only takes one user with we weak password that Evil Hacker can guess, and your site is compromised.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How Moodle avoids this problem==&lt;br /&gt;
A lockout system is present in 2.5 onwards, you just need to turn it on at Administration &amp;gt; Site administration &amp;gt; Security &amp;gt; Site policies ... Account lockout threshold&lt;br /&gt;
&lt;br /&gt;
Moodle also counts failed login attempts, and can alert the administrator by email when there are too many.&lt;br /&gt;
&lt;br /&gt;
There are admin settings to enforce a minimum level of complexity for passwords, for example, by insisting on a minimum number of characters.&lt;br /&gt;
&lt;br /&gt;
==What you need to do in your code==&lt;br /&gt;
&lt;br /&gt;
* If you are writing an authentication plugin, ensure that all failed logins are logged correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What you need to do as an administrator==&lt;br /&gt;
&lt;br /&gt;
* Consider turning on the options for reporting login failures.&lt;br /&gt;
* Consider turning on the settings that ensure password complexity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Security]]&lt;br /&gt;
* [[Coding]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Applying_to_work_with_Moodle_for_GSOC&amp;diff=47524</id>
		<title>Applying to work with Moodle for GSOC</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Applying_to_work_with_Moodle_for_GSOC&amp;diff=47524"/>
		<updated>2015-03-22T23:03:52Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Before submitting your application */ seems to be some confusion around the word &amp;quot;enrol&amp;quot; from students new to Moodle.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
Thanks for your interest in Moodle and for considering applying to work with us :-)&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please enrol the actual [https://moodle.org/auth/mnet/jump.php?hostwwwroot=http://dev.moodle.org&amp;amp;wantsurl=/course/index.php?categoryid=6 GSOC course] and post in the GSOC application forum.&lt;br /&gt;
&lt;br /&gt;
==Before submitting your application==&lt;br /&gt;
&lt;br /&gt;
* [http://moodle.org/login/signup.php Create an account on moodle.org] and browse the [http://moodle.org/course/view.php?id=5 Moodle in English] course. &lt;br /&gt;
* Enter the [https://moodle.org/auth/mnet/jump.php?hostwwwroot=http://dev.moodle.org&amp;amp;wantsurl=/course/index.php?categoryid=6 GSOC course] on our [http://dev.moodle.org Moodle Developer Courses site] and introduce yourself in the introductions forum.&lt;br /&gt;
* [http://download.moodle.org/ Download Moodle] and install it on your local machine. Initially, you may like to try one of our all-in-one packages. Later you will want to create a clone of the Moodle [[Git for developers|using Git]].&lt;br /&gt;
* Take a look at our [[Projects for new developers]]. Discuss your ideas in the GSOC application forum.&lt;br /&gt;
* [http://tracker.moodle.org/secure/Signup!default.jspa Sign up for a Moodle tracker account].&lt;br /&gt;
* Browse our list of [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+MDL+AND+type+in+%28bug%29+AND+status+%3D+open+AND+Difficulty+%3D+Easy+AND+labels+not+in+%28patch%29+ORDER+BY+created+DESC&amp;amp;runQuery=true&amp;amp;clear=true relatively easy Moodle bugs] and suggest a fix for at least one of them. (Note that we don&#039;t always bother to classify bugs as easy/medium/hard, so you may also want to look at unclassified bugs.) It is not essential that your fix is integrated into Moodle.&lt;br /&gt;
** Read [http://dev.moodle.org/mod/forum/discuss.php?d=1802#p3456 Some advice for applicants] from Tim Hunt, attempting to fix a bug is &#039;&#039;&#039;required&#039;&#039;&#039; before we will consider your application - no exceptions.&lt;br /&gt;
** Read [http://dev.moodle.org/mod/forum/discuss.php?d=1826 Tips for when you are trying to fix a bug] &lt;br /&gt;
** Also see the steps on [[Git for developers]]&lt;br /&gt;
** Alternatively, see [[How to create a patch]]. Attach your patch to the tracker issue and link to the tracker issue in your application.&lt;br /&gt;
&lt;br /&gt;
==Your application==&lt;br /&gt;
&lt;br /&gt;
Applications are made through the GSOC site.&lt;br /&gt;
&lt;br /&gt;
Feel free to use the following template, though it&#039;s not compulsory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personal Details&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*  Name&lt;br /&gt;
*  Email&lt;br /&gt;
*  Other contact methods&lt;br /&gt;
*  Timezone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What do you plan to do?&lt;br /&gt;
 &lt;br /&gt;
Also describe any work or research on this project you have already done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schedule of Deliverables&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There is a calendar published on the GSoC site that defines periods applicable to GSoC projects. Your schedule should follow that format.&lt;br /&gt;
&lt;br /&gt;
What are the milestones and deliverables for your project? You will be assessed against these. Tell us why you think this schedule is realistic.&lt;br /&gt;
&lt;br /&gt;
Do you have any other commitments during this time? Provide dates, such as holidays, when you will not be available.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: We expect your project to be your primary focus during the project period. Please do not apply if you have other employment.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Open Source Development Experience&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Do you have any experience of Open Source software development?&lt;br /&gt;
&lt;br /&gt;
Moodle Tracker issue number(s) of bug(s) you have fixed with patches attached.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: We require you to suggest a fix for at least one Moodle bug before considering your project proposal.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Work/Internship Experience&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Anything relevant to the project, or related to web design or software development.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Academic Experience&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What you&#039;re studying at university/college.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Why Moodle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tell us why you chose to apply to us.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* GSOC [http://dev.moodle.org/mod/forum/discuss.php?d=383 Greetings from Tim] forum post which describes what mentors look for in applications&lt;br /&gt;
&lt;br /&gt;
[[Category:GSOC|Application template]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47523</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47523"/>
		<updated>2015-03-22T21:18:34Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Plagiarism plugin (Moorsp) */ add link to forum post&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Existing Plagiarism plugins (turnitin, urkund, compilatio etc) make use of the legacy log feature of the events api - the new plugin should use the new api and not rely on legacy logs.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
&lt;br /&gt;
This project was proposed in previous GSOC years and some useful information is available in the older discussion [http://dev.moodle.org/mod/forum/discuss.php?d=1822 here]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Message from the mentor&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=2280 Tips for applying to the moorsp project]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic SCORM 1.2 player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
Currently there are several Javascript SCORM players with basic support for SCORM 1.2:&lt;br /&gt;
&lt;br /&gt;
* http://www.scormpool.com/&lt;br /&gt;
* https://github.com/skfriese/simple-scorm-api&lt;br /&gt;
* https://bitbucket.org/jugger0/tsp&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to fix and package inside an Angular module one of those players to be included in the official Moodle Mobile app.&lt;br /&gt;
&lt;br /&gt;
This will allow the app to play SCORM files in online and offline mode.&lt;br /&gt;
&lt;br /&gt;
The player should be able to:&lt;br /&gt;
* Parse the imsmanifest.xml file in order to display the available Organizations and structures inside the package.&lt;br /&gt;
* Display a basic SCORM player with a basic menu tree.&lt;br /&gt;
* Implement a basic runtime support in order to be able to retrieve the SCOs tracking from the Moodle site.&lt;br /&gt;
* Store in the app local storage the user interactions (API runtime) to be synchronized when the user is online again.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium-High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic IMS CP player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
This is a minor project related to the previous one, it can be described as an initial step for implementing the SCORM player.&lt;br /&gt;
&lt;br /&gt;
Detailed information about the IMS CP format can be found here: [http://edutechwiki.unige.ch/en/IMS_Content_Packaging]&lt;br /&gt;
&lt;br /&gt;
The Mobile app should be able to download the package, extract it and open the contents in a basic player similar to the Moodle one. The manifest XML file should be parsed in order to obtain a navigation TOC:&lt;br /&gt;
&lt;br /&gt;
[[File:IMSCP Sample.png]]&lt;br /&gt;
&lt;br /&gt;
Contents will be opened in an iframe, the TOC links will target the iframe.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Low&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Improved enrol_meta plugin ===&lt;br /&gt;
&lt;br /&gt;
Current enrol_meta plugin provides functionality to automatically synchronise enrolments between two courses. See [https://docs.moodle.org/en/Course_meta_link Course meta link]. Teacher creates an instance of enroment method in the meta course and links it to one child course. Later cron job ensures that any enrolment change in the child course is pushed to the parent. &lt;br /&gt;
&lt;br /&gt;
Unfortunately user interface is very inconvenient. The main problem is inability to bulk select courses and/or order courses on the Enrolment methods page. Plus it lacks important functionality to synchronise suspended/expired enrolments. See the number of highly voted issues MDL-27628, MDL-17929, MDL-32161, MDL-31451&lt;br /&gt;
&lt;br /&gt;
The proposal is to re-write this enrolment plugin completely. One instance of the plugin should allow to link multiple child courses and additionally synchronise each of them with a group in the meta course.  Ideally it should also allow to synchronise all courses in the category. &lt;br /&gt;
&lt;br /&gt;
This project requires development of both user interface (JS) and backend (PHP).&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP, Javascript (YUI)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47470</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47470"/>
		<updated>2015-03-08T22:54:01Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Plagiarism plugin (Moorsp) */ move link to old discussion into text.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Existing Plagiarism plugins (turnitin, urkund, compilatio etc) make use of the legacy log feature of the events api - the new plugin should use the new api and not rely on legacy logs.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
&lt;br /&gt;
This project was proposed in previous GSOC years and some useful information is available in the older discussion [http://dev.moodle.org/mod/forum/discuss.php?d=1822 here]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic SCORM 1.2 player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
Currently there are several Javascript SCORM players with basic support for SCORM 1.2:&lt;br /&gt;
&lt;br /&gt;
* http://www.scormpool.com/&lt;br /&gt;
* https://github.com/skfriese/simple-scorm-api&lt;br /&gt;
* https://bitbucket.org/jugger0/tsp&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to fix and package inside an Angular module one of those players to be included in the official Moodle Mobile app.&lt;br /&gt;
&lt;br /&gt;
This will allow the app to play SCORM files in online and offline mode.&lt;br /&gt;
&lt;br /&gt;
The player should be able to:&lt;br /&gt;
* Parse the imsmanifest.xml file in order to display the available Organizations and structures inside the package.&lt;br /&gt;
* Display a basic SCORM player with a basic menu tree.&lt;br /&gt;
* Implement a basic runtime support in order to be able to retrieve the SCOs tracking from the Moodle site.&lt;br /&gt;
* Store in the app local storage the user interactions (API runtime) to be synchronized when the user is online again.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium-High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic IMS CP player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
This is a minor project related to the previous one, it can be described as an initial step for implementing the SCORM player.&lt;br /&gt;
&lt;br /&gt;
Detailed information about the IMS CP format can be found here: [http://edutechwiki.unige.ch/en/IMS_Content_Packaging]&lt;br /&gt;
&lt;br /&gt;
The Mobile app should be able to download the package, extract it and open the contents in a basic player similar to the Moodle one. The manifest XML file should be parsed in order to obtain a navigation TOC:&lt;br /&gt;
&lt;br /&gt;
[[File:IMSCP Sample.png]]&lt;br /&gt;
&lt;br /&gt;
Contents will be opened in an iframe, the TOC links will target the iframe.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Low&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Improved enrol_meta plugin ===&lt;br /&gt;
&lt;br /&gt;
Current enrol_meta plugin provides functionality to automatically synchronise enrolments between two courses. See [https://docs.moodle.org/en/Course_meta_link Course meta link]. Teacher creates an instance of enroment method in the meta course and links it to one child course. Later cron job ensures that any enrolment change in the child course is pushed to the parent. &lt;br /&gt;
&lt;br /&gt;
Unfortunately user interface is very inconvenient. The main problem is inability to bulk select courses and/or order courses on the Enrolment methods page. Plus it lacks important functionality to synchronise suspended/expired enrolments. See the number of highly voted issues MDL-27628, MDL-17929, MDL-32161, MDL-31451&lt;br /&gt;
&lt;br /&gt;
The proposal is to re-write this enrolment plugin completely. One instance of the plugin should allow to link multiple child courses and additionally synchronise each of them with a group in the meta course.  Ideally it should also allow to synchronise all courses in the category. &lt;br /&gt;
&lt;br /&gt;
This project requires development of both user interface (JS) and backend (PHP).&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP, Javascript (YUI)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47469</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47469"/>
		<updated>2015-03-08T22:47:59Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Plagiarism plugin (Moorsp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GSOC}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Existing Plagiarism plugins (turnitin, urkund, compilatio etc) make use of the legacy log feature of the events api - the new plugin should use the new api and not rely on legacy logs.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Discussion&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=1822]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic SCORM 1.2 player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
Currently there are several Javascript SCORM players with basic support for SCORM 1.2:&lt;br /&gt;
&lt;br /&gt;
* http://www.scormpool.com/&lt;br /&gt;
* https://github.com/skfriese/simple-scorm-api&lt;br /&gt;
* https://bitbucket.org/jugger0/tsp&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to fix and package inside an Angular module one of those players to be included in the official Moodle Mobile app.&lt;br /&gt;
&lt;br /&gt;
This will allow the app to play SCORM files in online and offline mode.&lt;br /&gt;
&lt;br /&gt;
The player should be able to:&lt;br /&gt;
* Parse the imsmanifest.xml file in order to display the available Organizations and structures inside the package.&lt;br /&gt;
* Display a basic SCORM player with a basic menu tree.&lt;br /&gt;
* Implement a basic runtime support in order to be able to retrieve the SCOs tracking from the Moodle site.&lt;br /&gt;
* Store in the app local storage the user interactions (API runtime) to be synchronized when the user is online again.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium-High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic IMS CP player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
This is a minor project related to the previous one, it can be described as an initial step for implementing the SCORM player.&lt;br /&gt;
&lt;br /&gt;
Detailed information about the IMS CP format can be found here: [http://edutechwiki.unige.ch/en/IMS_Content_Packaging]&lt;br /&gt;
&lt;br /&gt;
The Mobile app should be able to download the package, extract it and open the contents in a basic player similar to the Moodle one. The manifest XML file should be parsed in order to obtain a navigation TOC:&lt;br /&gt;
&lt;br /&gt;
[[File:IMSCP Sample.png]]&lt;br /&gt;
&lt;br /&gt;
Contents will be opened in an iframe, the TOC links will target the iframe.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Low&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Improved enrol_meta plugin ===&lt;br /&gt;
&lt;br /&gt;
Current enrol_meta plugin provides functionality to automatically synchronise enrolments between two courses. See [https://docs.moodle.org/en/Course_meta_link Course meta link]. Teacher creates an instance of enroment method in the meta course and links it to one child course. Later cron job ensures that any enrolment change in the child course is pushed to the parent. &lt;br /&gt;
&lt;br /&gt;
Unfortunately user interface is very inconvenient. The main problem is inability to bulk select courses and/or order courses on the Enrolment methods page. Plus it lacks important functionality to synchronise suspended/expired enrolments. See the number of highly voted issues MDL-27628, MDL-17929, MDL-32161, MDL-31451&lt;br /&gt;
&lt;br /&gt;
The proposal is to re-write this enrolment plugin completely. One instance of the plugin should allow to link multiple child courses and additionally synchronise each of them with a group in the meta course.  Ideally it should also allow to synchronise all courses in the category. &lt;br /&gt;
&lt;br /&gt;
This project requires development of both user interface (JS) and backend (PHP).&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP, Javascript (YUI)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47422</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=47422"/>
		<updated>2015-02-25T22:19:26Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Plagiarism plugin (Moorsp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
[[File:GSoC2012 logo.png|right]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Latest news:&#039;&#039;&#039; &#039;&#039;Moodle will be taking part in the [http://socghop.appspot.com/ Google Summer of Code] for our sixth year in 2012!&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re thinking of applying to work with Moodle for GSOC 2012, please check the information on [[Applying to work with Moodle for GSOC]] and join our gsoc2012@conference.moodle.org jabber chat!&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript, SQL and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please consider adopting a [https://moodle.org/plugins/browse.php?list=set&amp;amp;id=61 plugin seeking a new maintainer]&#039;&#039;. See the [https://moodle.org/mod/forum/discuss.php?d=260354 Plugins adoption programme].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Existing Plagiarism plugins (turnitin, urkund, compilatio etc) make use of the legacy log feature of the events api - the new plugin should use the new api and not rely on legacy logs.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should be perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Discussion&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=1822]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic SCORM 1.2 player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
Currently there are several Javascript SCORM players with basic support for SCORM 1.2:&lt;br /&gt;
&lt;br /&gt;
* http://www.scormpool.com/&lt;br /&gt;
* https://github.com/skfriese/simple-scorm-api&lt;br /&gt;
* https://bitbucket.org/jugger0/tsp&lt;br /&gt;
&lt;br /&gt;
The aim of this project is to fix and package inside an Angular module one of those players to be included in the official Moodle Mobile app.&lt;br /&gt;
&lt;br /&gt;
This will allow the app to play SCORM files in online and offline mode.&lt;br /&gt;
&lt;br /&gt;
The player should be able to:&lt;br /&gt;
* Parse the imsmanifest.xml file in order to display the available Organizations and structures inside the package.&lt;br /&gt;
* Display a basic SCORM player with a basic menu tree.&lt;br /&gt;
* Implement a basic runtime support in order to be able to retrieve the SCOs tracking from the Moodle site.&lt;br /&gt;
* Store in the app local storage the user interactions (API runtime) to be synchronized when the user is online again.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium-High&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Javascript basic IMS CP player for the Mobile app ===&lt;br /&gt;
&lt;br /&gt;
This is a minor project related to the previous one, it can be described as an initial step for implementing the SCORM player.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: HTML5, Javascript, AngularJS&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Low&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=49568 Juan Leyva]&lt;br /&gt;
&lt;br /&gt;
=== Improved enrol_meta plugin ===&lt;br /&gt;
&lt;br /&gt;
Current enrol_meta plugin provides functionality to automatically synchronise enrolments between two courses. See [https://docs.moodle.org/en/Course_meta_link Course meta link]. Teacher creates an instance of enroment method in the meta course and links it to one child course. Later cron job ensures that any enrolment change in the child course is pushed to the parent. &lt;br /&gt;
&lt;br /&gt;
Unfortunately user interface is very inconvenient. The main problem is inability to bulk select courses and/or order courses on the Enrolment methods page. Plus it lacks important functionality to synchronise suspended/expired enrolments. See the number of highly voted issues MDL-27628, MDL-17929, MDL-32161, MDL-31451&lt;br /&gt;
&lt;br /&gt;
The proposal is to re-write this enrolment plugin completely. One instance of the plugin should allow to link multiple child courses and additionally synchronise each of them with a group in the meta course.  Ideally it should also allow to synchronise all courses in the category. &lt;br /&gt;
&lt;br /&gt;
This project requires development of both user interface (JS) and backend (PHP).&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP, Javascript (YUI)&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
=== Allow to crop/resize/rotate images when inserting them ===&lt;br /&gt;
&lt;br /&gt;
This project is inspired by MDL-32183. There are two options on how to implement this functionality - as a repository plugin or as an atto plugin. &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: Javascript (YUI), PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1334243 Marina Glancy]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
* [[Projects for new developers/Archive|Archive]] of outdated and/or inactive calls for projects&lt;br /&gt;
&lt;br /&gt;
[[Category:GSOC]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=46497</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=46497"/>
		<updated>2014-10-18T02:09:34Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: Undo revision 46495 by Lutherdummy (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
[[File:GSoC2012 logo.png|right]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Latest news:&#039;&#039;&#039; &#039;&#039;Moodle will be taking part in the [http://socghop.appspot.com/ Google Summer of Code] for our sixth year in 2012!&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re thinking of applying to work with Moodle for GSOC 2012, please check the information on [[Applying to work with Moodle for GSOC]] and join our gsoc2012@conference.moodle.org jabber chat!&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===HTML maths editor===&lt;br /&gt;
&lt;br /&gt;
Traditional written mathematical notation takes advantage of a rich set of special symbols, together with their relative size and&lt;br /&gt;
position on a two dimensional page.   Underlying mathematical expressions is a well-defined semantic tree structure.  When typing a mathematical expression into a computer keyboard the ability to take advantage of the features of traditional mathematical notation is severely limited. Essentially one has only a one-dimensional string of symbols taken from the limited alphabet found on computer keyboards and a strict syntax. Syntax is often problematic for users.  For example, they differ between applications and they do not correspond to traditional notation. &lt;br /&gt;
&lt;br /&gt;
DragMath (http://www.dragmath.bham.ac.uk) is a nice &amp;quot;drag and drop&amp;quot; equation editor that has been integrated with the Moodle editor for some time. However, it is implemented in Java, and that is becoming increasingly problematic, with increasing security warnings on the desktop, and limited support on mobile devices. We would like a new editor, keeping all the good parts of DragMath, but written in JavaScript. This could then be integrated with Moodle and other web applications.&lt;br /&gt;
&lt;br /&gt;
Goal: to create a useful and usable &amp;quot;mathematics entry system&amp;quot; for Moodle, using a combination of JavaScript and HTML5.&lt;br /&gt;
&lt;br /&gt;
This should&lt;br /&gt;
* parse typed expressions into an internal tree representation&lt;br /&gt;
* provide useful feedback to users, e.g. &amp;quot;missing bracket&amp;quot;, on ill-formed expressions.&lt;br /&gt;
* have flexible options for providing a &amp;quot;context&amp;quot; to mediate between the requirements of a strict syntax, and users&#039; expectations based on traditional written mathematics.  E.g. is &amp;quot;x(t+1)&amp;quot; a multiplication of x and (t+1) or application of the function &amp;quot;x&amp;quot; to the argument &amp;quot;(t+1)&amp;quot;?&lt;br /&gt;
* have &amp;quot;drag and drop&amp;quot; components (in HTML5)&lt;br /&gt;
* have a modular and flexible output mechanism, this includes&lt;br /&gt;
** on-screen display &amp;quot;as you type/edit&amp;quot; &lt;br /&gt;
** output in a variety of formats, LaTeX, Maxima syntax, MathML etc. which can be embedded into web applications, specifically Moodle.  It is not a goal to provide multiple outputs, but it is a goal to develop a framework in which other users can contribute such formats.&lt;br /&gt;
** show users the internal tree representation on request&lt;br /&gt;
* potentially enable manipulation (computer algebra) of internal expressions by pre-defined rules.&lt;br /&gt;
* have a well documented and simple API.&lt;br /&gt;
&lt;br /&gt;
Much of the basic design has been done in for example&lt;br /&gt;
* DragMath   http://www.dragmath.bham.ac.uk/&lt;br /&gt;
* Numbas     http://www.ncl.ac.uk/maths/numbas/&lt;br /&gt;
* CanvasMath https://code.google.com/p/canvasmath/&lt;br /&gt;
We will draw from this previous design experience to guide the development.&lt;br /&gt;
&lt;br /&gt;
See this forum thread: https://moodle.org/mod/forum/discuss.php?d=251627 for more.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: JavaScript, HTML 5&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Chris Sangwin&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
&lt;br /&gt;
This is not really a specific project idea, but I would like to point one an important general area:&lt;br /&gt;
&lt;br /&gt;
With HTML5 the range of what can be done in a web browser keeps expanding. Can we use these possibilities to make new, much more interactive, question types for Moodle? &lt;br /&gt;
&lt;br /&gt;
There are some ideas in this forum thread: https://moodle.org/mod/forum/discuss.php?d=222439&lt;br /&gt;
* a question type where students have to join things up correctly by adding lines to a diagram (for example to complete an electric circuit).&lt;br /&gt;
* a question type where students can change the colour of certain parts of a diagram, and they have to get it correct.&lt;br /&gt;
* ... I am sure there are more possible ideas. Use your imagination!&lt;br /&gt;
&lt;br /&gt;
There are also some ideas which don&#039;t require complex HTML5 things:&lt;br /&gt;
* A &#039;Give 3 examples of ...&#039; Question type. For example &amp;quot;Give three ways to speed up a chemical reaction:&amp;quot;. Answer &#039;heat&#039;, &#039;increase concentration&#039;, &#039;catalyst&#039; (in any order). However, &#039;warm it&#039; might be an acceptable alternative, but &#039;heat&#039;, &#039;catalyst&#039;, &#039;warm it&#039; should only score 2/3.&lt;br /&gt;
* An ordering question type. Probably based on the OU&#039;s qtype_ddwtos. The think that cannot do is give good credit for partially correct answer. For example &#039;F&#039;, &#039;A&#039;, &#039;B&#039;, &#039;C&#039;, &#039;D&#039;, &#039;E&#039; might be considered close to the right order, but if you do that with ddwtos it will score 0.&lt;br /&gt;
* A question type where students must highlight certain words in some text. E.g. &amp;quot;Find all the verbs in this paragraph.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
There is also scope to make significant enhancements to existing question types. For example&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_ddmarker Drag and drop markers] allow teachers to define the drop zones by dragging with the mouse, rather than typing co-ordinates.&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_pmatch the pattern-match question type] a tool like STACK question tests to help teachers verify that their answer matching works correctly (upload example responses, indicate what grade they should receive, show what grade they actually receive, and highlight the differences.&lt;br /&gt;
&lt;br /&gt;
Before proposing anything, please make sure you are familiar with the [https://docs.moodle.org/22/en/Questions standard question types] already available in Moodle, and the [http://moodle.org/plugins/browse.php?list=category&amp;amp;id=29 contributed question types] that other people have already created.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Tim Hunt&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should be perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Discussion&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=1822]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Event subscription plugin ===&lt;br /&gt;
	 &lt;br /&gt;
This project includes the following:-&lt;br /&gt;
* creating a Moodle plugin that provides users with an interface to subscribe to various events in Moodle.&lt;br /&gt;
* Users should be able to subscribe to generic events (ex:- all delete events) or extremelly specfic events (ex:- users added to a specific group)&lt;br /&gt;
* Performance is an important aspect, any solution designed should not be too harsh on performance.&lt;br /&gt;
* This project requires deep understanding of Moodle events framework - [https://docs.moodle.org/dev/Event_2 Event Specs]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP and Javascript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1310725, Ankit Agarwal]&lt;br /&gt;
&lt;br /&gt;
=== Pronunciation evaluation question type ===&lt;br /&gt;
&lt;br /&gt;
This project would expand on some [http://cmusphinx.sourceforge.net/wiki/pronunciation_evaluation work done as part of the CMUSphinx project funded by GSoC 2012]. The project developed an algorithm/library that was could take some recorded audio of someone saying a particular phrase, and determine whether it was pronounced well or badly.&lt;br /&gt;
&lt;br /&gt;
The goal of this project would be to take that system, and package it up as a Moodle question type, so that teachers can create a Moodle quiz that determines how good their students&#039; pronunciation is. (Think foreign-language teaching.) Here is the documentation about [[Question_types|creating question types]].&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: [http://talknicer.com/about/ James Salsman] &amp;amp; [http://moodle.org/user/view.php?id=93821&amp;amp;course=5 Tim Hunt]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
&lt;br /&gt;
[[Category:GSOC]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=GSOC/2014&amp;diff=46218</id>
		<title>GSOC/2014</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=GSOC/2014&amp;diff=46218"/>
		<updated>2014-09-05T01:09:13Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* SCORM player and navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[GSOC|GSoC]] &amp;gt; GSoC 2014&lt;br /&gt;
&lt;br /&gt;
An overview of the [http://www.google-melange.com/gsoc/program/home/google/gsoc2014 Google Summer of Code 2014] projects for Moodle.&lt;br /&gt;
&lt;br /&gt;
==New question types==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Student&#039;&#039;&#039;: [https://moodle.org/user/view.php?id=1580475&amp;amp;course=5 Jayesh Anandani]&lt;br /&gt;
:&#039;&#039;&#039;Mentors&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=8026&amp;amp;course=5 Jean-Michel Vedrine] &amp;amp; [https://moodle.org/user/view.php?id=93821&amp;amp;course=5 Tim Hunt]&lt;br /&gt;
:&#039;&#039;&#039;Specification&#039;&#039;&#039;: [[gsoc2014_proposal_jayesh]]&lt;br /&gt;
&lt;br /&gt;
==SCORM improvements==&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Student&#039;&#039;&#039;: Vignesh Panneerselvam&lt;br /&gt;
:&#039;&#039;&#039;Mentor&#039;&#039;&#039;: [https://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Summary&#039;&#039;&#039;: Vignesh worked on a number of areas in SCORM including improving performance and compliance with coding guidelines.&lt;br /&gt;
:&#039;&#039;&#039;Key Bugs resolved&#039;&#039;&#039;: MDL-35870 MDL-41216 MDL-41665 MDL-45887 MDL-46236 and many others contributed to.&lt;br /&gt;
:&#039;&#039;&#039;Blog post from Mentor&#039;&#039;&#039;: [http://danmarsden.com/blog/2014/08/26/gsoc-2014-update/]&lt;br /&gt;
[[Category:GSOC]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=45294</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=45294"/>
		<updated>2014-06-11T22:52:14Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: remove scorm project (successful student working on it already - will add details about their project elsewhere.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
[[File:GSoC2012 logo.png|right]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Latest news:&#039;&#039;&#039; &#039;&#039;Moodle will be taking part in the [http://socghop.appspot.com/ Google Summer of Code] for our sixth year in 2012!&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re thinking of applying to work with Moodle for GSOC 2012, please check the information on [[Applying to work with Moodle for GSOC]] and join our gsoc2012@conference.moodle.org jabber chat!&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===HTML maths editor===&lt;br /&gt;
&lt;br /&gt;
Traditional written mathematical notation takes advantage of a rich set of special symbols, together with their relative size and&lt;br /&gt;
position on a two dimensional page.   Underlying mathematical expressions is a well-defined semantic tree structure.  When typing a mathematical expression into a computer keyboard the ability to take advantage of the features of traditional mathematical notation is severely limited. Essentially one has only a one-dimensional string of symbols taken from the limited alphabet found on computer keyboards and a strict syntax. Syntax is often problematic for users.  For example, they differ between applications and they do not correspond to traditional notation. &lt;br /&gt;
&lt;br /&gt;
DragMath (http://www.dragmath.bham.ac.uk) is a nice &amp;quot;drag and drop&amp;quot; equation editor that has been integrated with the Moodle editor for some time. However, it is implemented in Java, and that is becoming increasingly problematic, with increasing security warnings on the desktop, and limited support on mobile devices. We would like a new editor, keeping all the good parts of DragMath, but written in JavaScript. This could then be integrated with Moodle and other web applications.&lt;br /&gt;
&lt;br /&gt;
Goal: to create a useful and usable &amp;quot;mathematics entry system&amp;quot; for Moodle, using a combination of JavaScript and HTML5.&lt;br /&gt;
&lt;br /&gt;
This should&lt;br /&gt;
* parse typed expressions into an internal tree representation&lt;br /&gt;
* provide useful feedback to users, e.g. &amp;quot;missing bracket&amp;quot;, on ill-formed expressions.&lt;br /&gt;
* have flexible options for providing a &amp;quot;context&amp;quot; to mediate between the requirements of a strict syntax, and users&#039; expectations based on traditional written mathematics.  E.g. is &amp;quot;x(t+1)&amp;quot; a multiplication of x and (t+1) or application of the function &amp;quot;x&amp;quot; to the argument &amp;quot;(t+1)&amp;quot;?&lt;br /&gt;
* have &amp;quot;drag and drop&amp;quot; components (in HTML5)&lt;br /&gt;
* have a modular and flexible output mechanism, this includes&lt;br /&gt;
** on-screen display &amp;quot;as you type/edit&amp;quot; &lt;br /&gt;
** output in a variety of formats, LaTeX, Maxima syntax, MathML etc. which can be embedded into web applications, specifically Moodle.  It is not a goal to provide multiple outputs, but it is a goal to develop a framework in which other users can contribute such formats.&lt;br /&gt;
** show users the internal tree representation on request&lt;br /&gt;
* potentially enable manipulation (computer algebra) of internal expressions by pre-defined rules.&lt;br /&gt;
* have a well documented and simple API.&lt;br /&gt;
&lt;br /&gt;
Much of the basic design has been done in for example&lt;br /&gt;
* DragMath   http://www.dragmath.bham.ac.uk/&lt;br /&gt;
* Numbas     http://www.ncl.ac.uk/maths/numbas/&lt;br /&gt;
* CanvasMath https://code.google.com/p/canvasmath/&lt;br /&gt;
We will draw from this previous design experience to guide the development.&lt;br /&gt;
&lt;br /&gt;
See this forum thread: https://moodle.org/mod/forum/discuss.php?d=251627 for more.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: JavaScript, HTML 5&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Chris Sangwin&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
&lt;br /&gt;
This is not really a specific project idea, but I would like to point one an important general area:&lt;br /&gt;
&lt;br /&gt;
With HTML5 the range of what can be done in a web browser keeps expanding. Can we use these possibilities to make new, much more interactive, question types for Moodle? &lt;br /&gt;
&lt;br /&gt;
There are some ideas in this forum thread: https://moodle.org/mod/forum/discuss.php?d=222439&lt;br /&gt;
* a question type where students have to join things up correctly by adding lines to a diagram (for example to complete an electric circuit).&lt;br /&gt;
* a question type where students can change the colour of certain parts of a diagram, and they have to get it correct.&lt;br /&gt;
* ... I am sure there are more possible ideas. Use your imagination!&lt;br /&gt;
&lt;br /&gt;
There are also some ideas which don&#039;t require complex HTML5 things:&lt;br /&gt;
* A &#039;Give 3 examples of ...&#039; Question type. For example &amp;quot;Give three ways to speed up a chemical reaction:&amp;quot;. Answer &#039;heat&#039;, &#039;increase concentration&#039;, &#039;catalyst&#039; (in any order). However, &#039;warm it&#039; might be an acceptable alternative, but &#039;heat&#039;, &#039;catalyst&#039;, &#039;warm it&#039; should only score 2/3.&lt;br /&gt;
* An ordering question type. Probably based on the OU&#039;s qtype_ddwtos. The think that cannot do is give good credit for partially correct answer. For example &#039;F&#039;, &#039;A&#039;, &#039;B&#039;, &#039;C&#039;, &#039;D&#039;, &#039;E&#039; might be considered close to the right order, but if you do that with ddwtos it will score 0.&lt;br /&gt;
* A question type where students must highlight certain words in some text. E.g. &amp;quot;Find all the verbs in this paragraph.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
There is also scope to make significant enhancements to existing question types. For example&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_ddmarker Drag and drop markers] allow teachers to define the drop zones by dragging with the mouse, rather than typing co-ordinates.&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_pmatch the pattern-match question type] a tool like STACK question tests to help teachers verify that their answer matching works correctly (upload example responses, indicate what grade they should receive, show what grade they actually receive, and highlight the differences.&lt;br /&gt;
&lt;br /&gt;
Before proposing anything, please make sure you are familiar with the [https://docs.moodle.org/22/en/Questions standard question types] already available in Moodle, and the [http://moodle.org/plugins/browse.php?list=category&amp;amp;id=29 contributed question types] that other people have already created.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Tim Hunt&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should be perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Discussion&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=1822]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Event subscription plugin ===&lt;br /&gt;
	 &lt;br /&gt;
This project includes the following:-&lt;br /&gt;
* creating a Moodle plugin that provides users with an interface to subscribe to various events in Moodle.&lt;br /&gt;
* Users should be able to subscribe to generic events (ex:- all delete events) or extremelly specfic events (ex:- users added to a specific group)&lt;br /&gt;
* Performance is an important aspect, any solution designed should not be too harsh on performance.&lt;br /&gt;
* This project requires deep understanding of Moodle events framework - [https://docs.moodle.org/dev/Event_2 Event Specs]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP and Javascript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1310725, Ankit Agarwal]&lt;br /&gt;
&lt;br /&gt;
=== Pronunciation evaluation question type ===&lt;br /&gt;
&lt;br /&gt;
This project would expand on some [http://cmusphinx.sourceforge.net/wiki/pronunciation_evaluation work done as part of the CMUSphinx project funded by GSoC 2012]. The project developed an algorithm/library that was could take some recorded audio of someone saying a particular phrase, and determine whether it was pronounced well or badly.&lt;br /&gt;
&lt;br /&gt;
The goal of this project would be to take that system, and package it up as a Moodle question type, so that teachers can create a Moodle quiz that determines how good their students&#039; pronunciation is. (Think foreign-language teaching.) Here is the documentation about [[Question_types|creating question types]].&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: [http://talknicer.com/about/ James Salsman] &amp;amp; [http://moodle.org/user/view.php?id=93821&amp;amp;course=5 Tim Hunt]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
&lt;br /&gt;
[[Category:GSOC]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=45293</id>
		<title>Projects for new developers</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Projects_for_new_developers&amp;diff=45293"/>
		<updated>2014-06-11T22:50:39Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: /* Plagiarism plugin */ update spec a bit for future reference.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
[[File:GSoC2012 logo.png|right]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Latest news:&#039;&#039;&#039; &#039;&#039;Moodle will be taking part in the [http://socghop.appspot.com/ Google Summer of Code] for our sixth year in 2012!&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re thinking of applying to work with Moodle for GSOC 2012, please check the information on [[Applying to work with Moodle for GSOC]] and join our gsoc2012@conference.moodle.org jabber chat!&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
&lt;br /&gt;
Moodle uses PHP, JavaScript and a number of other Web languages, so learning those is a good place to start.&lt;br /&gt;
&lt;br /&gt;
When you have some basic PHP programming skills, you may wish to start learning about how to Moodle code is organised. It is recommended that you complete the [http://dev.moodle.org/course/view.php?id=2 Introduction to Moodle Programming] course on [http://dev.moodle.org/ dev.moodle.org]. To access this you will need to have an account on moodle.org first.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking for projects suggested in the tracker, look for issues with the [https://tracker.moodle.org/issues/?jql=labels%20in%20%28addon_candidate%29 &#039;addon_candidate&#039; label].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are looking to make a quick contribution, look for tracker issues with marked as [https://tracker.moodle.org/issues/?jql=Difficulty%20%3D%20Easy easy].&lt;br /&gt;
&lt;br /&gt;
As you become more involved in Moodle development, you might like to learn more about the [[Coding|coding conventions]] used and how changes to Moodle core code are [[Process|processed]].&lt;br /&gt;
&lt;br /&gt;
==Potential projects==&lt;br /&gt;
&lt;br /&gt;
This evolving page lists possible Moodle projects for new developers derived from community suggestions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you have any ideas for new features in Moodle which might be suitable as projects for new developers, please see [[New feature ideas]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== SCORM ===&lt;br /&gt;
&lt;br /&gt;
There are various SCORM related projects I&#039;d be interested in mentoring for GSOC in 2014. &lt;br /&gt;
* Fix/Improve built in SCORM navigation (MDL-25642 MDL-29193 MDL-39551)&lt;br /&gt;
* Improve SCORM performance, PHPDocs, compliance with coding guidelines. - There are a number of known areas of SCORM code that need a clean-up/re-structure - It would be good to audit all the scorm code and make it comply with Moodle&#039;s coding guidelines and improve the performance of the code - it would be good to implement MUC in areas that can make use of it - Ideally we would also rewrite the datamodels/scorm_*_.js.php files to separate the php from the js and make the JavaScript cache-able - (work started on this in MDL-35870) Other related bugs: MDL-41216 MDL-41665 MDL-42314 MDL-44586&lt;br /&gt;
* SCORM reports - there are currently 3 SCORM reports - ideas on new report plugins would be considered as possible projects.&lt;br /&gt;
&lt;br /&gt;
If you want to apply to work on a SCORM related project I have posted a list of bugs that you could look at as part of your GSOC application here:&lt;br /&gt;
[http://dev.moodle.org/mod/forum/discuss.php?d=2011 http://dev.moodle.org/mod/forum/discuss.php?d=2011]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP, JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium -&amp;gt; Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
&lt;br /&gt;
===HTML maths editor===&lt;br /&gt;
&lt;br /&gt;
Traditional written mathematical notation takes advantage of a rich set of special symbols, together with their relative size and&lt;br /&gt;
position on a two dimensional page.   Underlying mathematical expressions is a well-defined semantic tree structure.  When typing a mathematical expression into a computer keyboard the ability to take advantage of the features of traditional mathematical notation is severely limited. Essentially one has only a one-dimensional string of symbols taken from the limited alphabet found on computer keyboards and a strict syntax. Syntax is often problematic for users.  For example, they differ between applications and they do not correspond to traditional notation. &lt;br /&gt;
&lt;br /&gt;
DragMath (http://www.dragmath.bham.ac.uk) is a nice &amp;quot;drag and drop&amp;quot; equation editor that has been integrated with the Moodle editor for some time. However, it is implemented in Java, and that is becoming increasingly problematic, with increasing security warnings on the desktop, and limited support on mobile devices. We would like a new editor, keeping all the good parts of DragMath, but written in JavaScript. This could then be integrated with Moodle and other web applications.&lt;br /&gt;
&lt;br /&gt;
Goal: to create a useful and usable &amp;quot;mathematics entry system&amp;quot; for Moodle, using a combination of JavaScript and HTML5.&lt;br /&gt;
&lt;br /&gt;
This should&lt;br /&gt;
* parse typed expressions into an internal tree representation&lt;br /&gt;
* provide useful feedback to users, e.g. &amp;quot;missing bracket&amp;quot;, on ill-formed expressions.&lt;br /&gt;
* have flexible options for providing a &amp;quot;context&amp;quot; to mediate between the requirements of a strict syntax, and users&#039; expectations based on traditional written mathematics.  E.g. is &amp;quot;x(t+1)&amp;quot; a multiplication of x and (t+1) or application of the function &amp;quot;x&amp;quot; to the argument &amp;quot;(t+1)&amp;quot;?&lt;br /&gt;
* have &amp;quot;drag and drop&amp;quot; components (in HTML5)&lt;br /&gt;
* have a modular and flexible output mechanism, this includes&lt;br /&gt;
** on-screen display &amp;quot;as you type/edit&amp;quot; &lt;br /&gt;
** output in a variety of formats, LaTeX, Maxima syntax, MathML etc. which can be embedded into web applications, specifically Moodle.  It is not a goal to provide multiple outputs, but it is a goal to develop a framework in which other users can contribute such formats.&lt;br /&gt;
** show users the internal tree representation on request&lt;br /&gt;
* potentially enable manipulation (computer algebra) of internal expressions by pre-defined rules.&lt;br /&gt;
* have a well documented and simple API.&lt;br /&gt;
&lt;br /&gt;
Much of the basic design has been done in for example&lt;br /&gt;
* DragMath   http://www.dragmath.bham.ac.uk/&lt;br /&gt;
* Numbas     http://www.ncl.ac.uk/maths/numbas/&lt;br /&gt;
* CanvasMath https://code.google.com/p/canvasmath/&lt;br /&gt;
We will draw from this previous design experience to guide the development.&lt;br /&gt;
&lt;br /&gt;
See this forum thread: https://moodle.org/mod/forum/discuss.php?d=251627 for more.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: JavaScript, HTML 5&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Chris Sangwin&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
&lt;br /&gt;
This is not really a specific project idea, but I would like to point one an important general area:&lt;br /&gt;
&lt;br /&gt;
With HTML5 the range of what can be done in a web browser keeps expanding. Can we use these possibilities to make new, much more interactive, question types for Moodle? &lt;br /&gt;
&lt;br /&gt;
There are some ideas in this forum thread: https://moodle.org/mod/forum/discuss.php?d=222439&lt;br /&gt;
* a question type where students have to join things up correctly by adding lines to a diagram (for example to complete an electric circuit).&lt;br /&gt;
* a question type where students can change the colour of certain parts of a diagram, and they have to get it correct.&lt;br /&gt;
* ... I am sure there are more possible ideas. Use your imagination!&lt;br /&gt;
&lt;br /&gt;
There are also some ideas which don&#039;t require complex HTML5 things:&lt;br /&gt;
* A &#039;Give 3 examples of ...&#039; Question type. For example &amp;quot;Give three ways to speed up a chemical reaction:&amp;quot;. Answer &#039;heat&#039;, &#039;increase concentration&#039;, &#039;catalyst&#039; (in any order). However, &#039;warm it&#039; might be an acceptable alternative, but &#039;heat&#039;, &#039;catalyst&#039;, &#039;warm it&#039; should only score 2/3.&lt;br /&gt;
* An ordering question type. Probably based on the OU&#039;s qtype_ddwtos. The think that cannot do is give good credit for partially correct answer. For example &#039;F&#039;, &#039;A&#039;, &#039;B&#039;, &#039;C&#039;, &#039;D&#039;, &#039;E&#039; might be considered close to the right order, but if you do that with ddwtos it will score 0.&lt;br /&gt;
* A question type where students must highlight certain words in some text. E.g. &amp;quot;Find all the verbs in this paragraph.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
There is also scope to make significant enhancements to existing question types. For example&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_ddmarker Drag and drop markers] allow teachers to define the drop zones by dragging with the mouse, rather than typing co-ordinates.&lt;br /&gt;
* in [https://moodle.org/plugins/view.php?plugin=qtype_pmatch the pattern-match question type] a tool like STACK question tests to help teachers verify that their answer matching works correctly (upload example responses, indicate what grade they should receive, show what grade they actually receive, and highlight the differences.&lt;br /&gt;
&lt;br /&gt;
Before proposing anything, please make sure you are familiar with the [https://docs.moodle.org/22/en/Questions standard question types] already available in Moodle, and the [http://moodle.org/plugins/browse.php?list=category&amp;amp;id=29 contributed question types] that other people have already created.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: Tim Hunt&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism plugin (Moorsp) ===&lt;br /&gt;
&lt;br /&gt;
There are various commercial plugins available that use the Plagiarism API in Moodle, but because these plagiarism systems can require paid subscriptions, testing them can be difficult. I&#039;d like to see a basic plugin developed (called Moorsp) that could be used for testing the Plagiarism API and provides a structure that can be built on in future to add further functionality.&lt;br /&gt;
&lt;br /&gt;
The initial aim of this project is not to develop a new Plagiarism checking tool but to develop a tool that provides complete Behat and unit tests for the Moodle Plagiarism API. &lt;br /&gt;
&lt;br /&gt;
All files uploaded to Moodle are stored on disk using the contenthash of the file as the filename - this means that if a user uploads the exact file multiple times in different locations only one file is stored on disk. The plugin should implement a check to see if the exact file has been submitted to any other courses/activities and display related information if another match has been found.&lt;br /&gt;
&lt;br /&gt;
Deliverables:&lt;br /&gt;
* All Plagiarism API functions should be implemented.&lt;br /&gt;
* Support for Assign, forum and Workshop modules should be implemented.&lt;br /&gt;
* Full Unit test coverage of all plugin functions.&lt;br /&gt;
* Full Behat tests for Assign, forum and workshop modules should be implemented to ensure that all Plagiarism API functions are working as expected.&lt;br /&gt;
* The code should pass 100% of the Moodle codechecking tools to ensure the code meets with Moodle Guidelines.&lt;br /&gt;
* The code should be perform well with appropriate use of the Moodle caching tools.&lt;br /&gt;
&lt;br /&gt;
Future Improvements (outside scope of initial project)&lt;br /&gt;
* Add Plagiarism API to the Moodle Glossary plugin.&lt;br /&gt;
* Implement functions that allow the plugin to post content to an external source - a future open source moorsp server that will receive content and generate a similarity report - we may be able to re-purpose some of the code from the old plagiarism_crot plugin to do this.&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [http://moodle.org/user/view.php?id=21591&amp;amp;course=5 Dan Marsden]&lt;br /&gt;
:&#039;&#039;&#039;Discussion&#039;&#039;&#039;: [http://dev.moodle.org/mod/forum/discuss.php?d=1822]&lt;br /&gt;
:&#039;&#039;&#039;Initial code structure&#039;&#039;&#039;: [https://github.com/danmarsden/moodle-plagiarism_moorsp]&lt;br /&gt;
&lt;br /&gt;
=== Event subscription plugin ===&lt;br /&gt;
	 &lt;br /&gt;
This project includes the following:-&lt;br /&gt;
* creating a Moodle plugin that provides users with an interface to subscribe to various events in Moodle.&lt;br /&gt;
* Users should be able to subscribe to generic events (ex:- all delete events) or extremelly specfic events (ex:- users added to a specific group)&lt;br /&gt;
* Performance is an important aspect, any solution designed should not be too harsh on performance.&lt;br /&gt;
* This project requires deep understanding of Moodle events framework - [https://docs.moodle.org/dev/Event_2 Event Specs]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP and Javascript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium&lt;br /&gt;
:&#039;&#039;&#039;Possible mentor&#039;&#039;&#039;: [https://moodle.org/user/profile.php?id=1310725, Ankit Agarwal]&lt;br /&gt;
&lt;br /&gt;
=== Pronunciation evaluation question type ===&lt;br /&gt;
&lt;br /&gt;
This project would expand on some [http://cmusphinx.sourceforge.net/wiki/pronunciation_evaluation work done as part of the CMUSphinx project funded by GSoC 2012]. The project developed an algorithm/library that was could take some recorded audio of someone saying a particular phrase, and determine whether it was pronounced well or badly.&lt;br /&gt;
&lt;br /&gt;
The goal of this project would be to take that system, and package it up as a Moodle question type, so that teachers can create a Moodle quiz that determines how good their students&#039; pronunciation is. (Think foreign-language teaching.) Here is the documentation about [[Question_types|creating question types]].&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Skills required&#039;&#039;&#039;: PHP &amp;amp; JavaScript&lt;br /&gt;
:&#039;&#039;&#039;Difficulty level&#039;&#039;&#039;: Medium - Hard&lt;br /&gt;
:&#039;&#039;&#039;Possible mentors&#039;&#039;&#039;: [http://talknicer.com/about/ James Salsman] &amp;amp; [http://moodle.org/user/view.php?id=93821&amp;amp;course=5 Tim Hunt]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[GSOC]] - describing Moodle&#039;s involvement with Google in their Summer of Code program&lt;br /&gt;
* [http://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=type+in+%28%22New+Feature%22%2C+Improvement%29+AND+resolution+%3D+unresolved+ORDER+BY+votes+DESC&amp;amp;runQuery=true&amp;amp;clear=true Popular new feature and improvement requests in Tracker]&lt;br /&gt;
&lt;br /&gt;
[[Category:GSOC]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_2.7_release_notes&amp;diff=45089</id>
		<title>Moodle 2.7 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_2.7_release_notes&amp;diff=45089"/>
		<updated>2014-06-03T00:17:28Z</updated>

		<summary type="html">&lt;p&gt;Danmarsden: add details about SCORM new window changes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 12th May 2014&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%222.7%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the complete list of fixed issues in 2.7]. See [https://docs.moodle.org/27/en/New_features New features] for a user-friendly highlights tour with screenshots.&lt;br /&gt;
 &lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
These just the minimum supported versions. We recommend keeping all of your software up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 2.2 or later (if upgrading from earlier versions, you must upgrade to 2.2.11 as a first step)&lt;br /&gt;
* Minimum PHP version: PHP 5.4.4 (always use latest PHP 5.4.x or 5.5.x on Windows - http://windows.php.net/download/)&lt;br /&gt;
* Ghostscript should be installed for pdf annotation.&lt;br /&gt;
&lt;br /&gt;
=== Database requirements ===&lt;br /&gt;
&lt;br /&gt;
Moodle supports the following database servers. Again, version numbers are just the minimum supported version. We recommend running the latest stable version of any software.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Database&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
| 9.1&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microsoft.com/en-us/server-cloud/products/sql-server/ Microsoft SQL Server]&lt;br /&gt;
| 2008&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oracle.com/us/products/database/overview/index.html Oracle Database]&lt;br /&gt;
| 10.2&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
=== Browser support ===&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [http://https://www.google.com/intl/en_au/chrome/browser/ Google Chrome]&lt;br /&gt;
| 30.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mozilla.org/en-US/ Mozilla Firefox]&lt;br /&gt;
| 25.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.apple.com/safari/ Apple Safari]&lt;br /&gt;
| 6&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://windows.microsoft.com/en-AU/internet-explorer/download-ie Microsoft Internet Explorer]&lt;br /&gt;
| 9&lt;br /&gt;
| Latest&lt;br /&gt;
| Version 10 is required for drag-and-drop upload of content from outside the browser into Moodle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Screen reader support ===&lt;br /&gt;
We now support and test on two screen reader configurations (MDL-44002).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser&lt;br /&gt;
! Screen reader&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended version&lt;br /&gt;
|-&lt;br /&gt;
| [http://windows.microsoft.com/en-AU/internet-explorer/download-ie Microsoft Internet Explorer]&lt;br /&gt;
| [http://www.freedomscientific.com/products/fs/jaws-product-page.asp Jaws]&lt;br /&gt;
| 15&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mozilla.org/en-US/ Mozilla Firefox]&lt;br /&gt;
| [http://www.nvaccess.org/ NVDA]&lt;br /&gt;
| 2014.1&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Before you upgrade==&lt;br /&gt;
&lt;br /&gt;
===Questions engine upgrade===&lt;br /&gt;
&lt;br /&gt;
When upgrading to Moodle 2.1 or 2.2 it was possible to [https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1#Planning_the_question_engine_upgrade delay part of the Question engine upgrade]. You must complete this upgrade before upgrading to Moodle 2.7. You can check if this was completed at the bottom of the [[:en:Environment|Environment page]].&lt;br /&gt;
&lt;br /&gt;
For further information, see the upgrading notes to [https://docs.moodle.org/27/en/Upgrading#Questions_engine_upgrade complete the Question engine upgrade before Moodle 2.7].&lt;br /&gt;
&lt;br /&gt;
===Themes===&lt;br /&gt;
 &lt;br /&gt;
All standard themes present in earlier versions, except &#039;&#039;&#039;Clean&#039;&#039;&#039;, have been removed from Moodle 2.7.  If you wish to continue using one of these themes then you will need to reinstall it explicitly before running the upgrade.&lt;br /&gt;
&lt;br /&gt;
See the upgrading notes for [https://docs.moodle.org/27/en/Upgrading#Themes theme upgrades in Moodle 2.7] for further information.&lt;br /&gt;
&lt;br /&gt;
==Headline features==&lt;br /&gt;
&lt;br /&gt;
===Interface===&lt;br /&gt;
* MDL-42964 - [https://docs.moodle.org/27/en/Standard_themes Themes clean-up] - Moodle is focussed on Bootstrap and improved responsive design.  Clean is now the default theme and most other old themes have been removed from core (still available from Plugins directory).  Many small improvements have been made all through the interface.&lt;br /&gt;
* MDL-43786 - More theme - A completely new theme called More that provides easy configuration though the UI, while retaining the efficiency of LESS and the responsiveness of Bootstrap.&lt;br /&gt;
* MDL-43841 - New [https://docs.moodle.org/27/en/Text_editor text editor], Atto - Tightly integrated in Moodle and focussing on usability and accessibility (TinyMCE still available as an option).&lt;br /&gt;
* MDL-44070 - Improved [https://docs.moodle.org/27/en/Conditional_activities_settings conditional activities] - Complex boolean combinations are now supported, with a conditions plugin API and a better interface...and it&#039;s faster!&lt;br /&gt;
* MDL-43855 - New mathematical equation editor for Atto, producing TeX using a GUI without needing Java.  Works everywhere, even tablets and phones.&lt;br /&gt;
* MDL-43856 - New [https://docs.moodle.org/27/en/MathJax_filter MathJax filter] for displaying mathematical equations without needing binaries on the server.&lt;br /&gt;
* MDL-44637 - New report listing all events possible on a site.&lt;br /&gt;
&lt;br /&gt;
===Platform===&lt;br /&gt;
* MDL-37658 - Logging - a new logging subsystem with plugins allowing Moodle logs to be very detailed and external. Log reports have been updated too.  [https://docs.moodle.org/27/en/Events_list Many new events] have been added which developers can take advantage of. These advancements will support better analytics in future as well as reporting standards like TinCan.&lt;br /&gt;
* MDL-25499 - Scheduled Tasks - an improved [https://docs.moodle.org/27/en/Scheduled_tasks scheduling system] (like Unix cron) that allows precise scheduling of tasks even on complex clustered servers.&lt;br /&gt;
* Performance - With improvements to logging and scheduled tasks, as well as many other small improvements, overall performance will be improved, particularly on large sites.&lt;br /&gt;
&lt;br /&gt;
===Long-term support (LTS) until May 2017===&lt;br /&gt;
&lt;br /&gt;
This release will have an extra-long period of support from Moodle HQ for &#039;&#039;&#039;3 years&#039;&#039;&#039; (instead of the usual 1.5 years).&lt;br /&gt;
&lt;br /&gt;
If you have been stuck on an old version like Moodle 1.9 then this might be the perfect time to join us in the future!&lt;br /&gt;
&lt;br /&gt;
==Much much more==&lt;br /&gt;
&lt;br /&gt;
===Administration===&lt;br /&gt;
* MDL-26680 - My home [https://docs.moodle.org/27/en/My_home reset to default] button&lt;br /&gt;
* MDL-42932 - [https://docs.moodle.org/27/en/Calendar_settings Calendar type choice] at system level&lt;br /&gt;
* MDL-43526 - Option to [https://docs.moodle.org/27/en/Course_restore restore a course from the course management pages]&lt;br /&gt;
* MDL-43497 - New capability [https://docs.moodle.org/27/en/Capabilities/moodle/site:forcelanguage moodle/site:forcelanguage] to allow the course language to be overridden&lt;br /&gt;
* MDL-18633 - New capability [https://docs.moodle.org/27/en/Capabilities/moodle/user:viewlastip moodle/user:viewlastip] for viewing a last IP field on user profile pages&lt;br /&gt;
* MDL-36141 - New capability [https://docs.moodle.org/27/en/Capabilities/moodle/course:reviewotherusers moodle/course:reviewotherusers] for restricting access to the other users page&lt;br /&gt;
* MDL-44505 - Subject line of [https://docs.moodle.org/27/en/Forum_settings#Changing_the_subject_line_of_forum_notifications forum notifications] is configurable.&lt;br /&gt;
* MDL-43682, MDL-43681 Log reports - User interfaces for the [https://docs.moodle.org/27/en/Logs Live logs and Log reports] have been improved, with more information and filtering support.&lt;br /&gt;
* MDL-35597 - Plugin types are now ordered in Plugins menu.&lt;br /&gt;
* MDL-43117 - A release column has been added to the Plugins Overview page.&lt;br /&gt;
* MDL-40939 - Mimetex binary path is configurable.&lt;br /&gt;
&lt;br /&gt;
===Quiz &amp;amp; Question bank===&lt;br /&gt;
&lt;br /&gt;
* MDL-41727 - Quiz reports improved.&lt;br /&gt;
** Responses from all tries are available for analysis when using or &amp;quot;Adaptive&amp;quot;, &amp;quot;Interactive with multiple tries&amp;quot; or similar behaviours.&lt;br /&gt;
** Break-down by question variant, for question types like Calculated, STACK and Variable-numeric, which one question can have different random variants.&lt;br /&gt;
** Progress bar during long calculations to prevent time-outs.&lt;br /&gt;
** Low-level calculation code moved into the question component, where it could potentially be reused by other activities.&lt;br /&gt;
** Much more automated testing of this complex area of code.&lt;br /&gt;
* Some minor improvements to the usability of the question bank - Some of MDL-40987&lt;br /&gt;
** MDL-33653 - To duplicate a question, you now start by clicking the x2 icon, like for activities.&lt;br /&gt;
** MDL-33839 - The various different ways to move questions in the question bank have been rationalised. &lt;br /&gt;
** MDL-33653 - There is now a &#039;Save changes and continue editing&#039; button when editing questions. Useful when you are working on a complex question with the preview open in another window.&lt;br /&gt;
** MDL-32729 - The interface of the question type selector has been updated&lt;br /&gt;
* MDL-40313 &amp;amp; MDL-40457 - New plugin point, so that plugins can add columns to the question bank, or new search conditions.&lt;br /&gt;
* MDL-39756 - Essay questions can now require an attachment, with the text optional, rather than the other way around.&lt;br /&gt;
* MDL-27414 - [https://docs.moodle.org/27/en/Random_Short-Answer_Matching_question_type Random short-answer matching question type] brought back from the dead. (This was in stable branches, but worth mentioning again.)&lt;br /&gt;
* MDL-43478 - Option to show all tries in responses report.&lt;br /&gt;
&lt;br /&gt;
===Assignment===&lt;br /&gt;
&lt;br /&gt;
* MDL-33952 - The old Assignment (2.2) module has been removed from core. It has been replaced by a stub to support transparently remapping urls and restoring course backups from the old module to the new one. If you are still using the old assignment module - all instances of the old assignment module will be hidden after upgrading to Moodle 2.7. Once the upgrade tool is run on those assignments they will become visible again. It is recommended to upgrade, and then convert any remaining assignments because logic has been added to the assignment upgrade code for Moodle 2.7 to transparently map urls from the old assignment module to the new one. If you really, really need to keep using the old module, you should update the code to Moodle 2.7, and then replace the &amp;quot;mod/assignment&amp;quot; folder with the one from https://github.com/moodlehq/moodle-mod_assignment/releases before completing the upgrade.&lt;br /&gt;
* MDL-28448 - A new capability [https://docs.moodle.org/27/en/Capabilities/mod/assign:editothersubmission mod/assign:editothersubmission] can be given to teachers to allow them to edit or delete student submissions.&lt;br /&gt;
* MDL-33600 - [https://docs.moodle.org/27/en/Using_Assignment#Controlling_when_to_notify_students_of_graded_work &#039;Notify students&#039;] is available to control when to send feedback during the grading process.&lt;br /&gt;
* MDL-34432 - Teachers can comment directly on students&#039; work on online text assignments&lt;br /&gt;
* MDL-42585 - New capability [https://docs.moodle.org/27/en/Capabilities/mod/assign:viewgrades mod/assign:viewgrades] to allow grades to be viewed but not changed&lt;br /&gt;
* MDL-44268 - Assignment grading table [https://docs.moodle.org/27/en/Using_Assignment#Filtering_submissions filters]&lt;br /&gt;
* MDL-35373 - [https://docs.moodle.org/27/en/Assignment_settings#Online_text Word limit] feature added to online assignments.&lt;br /&gt;
* MDL-44629 - Assignment plugins can display an introduction.&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
* MDL-42842 - Availability can be set with [https://docs.moodle.org/27/en/Database_activity_settings a time as well as a date.]&lt;br /&gt;
&lt;br /&gt;
===Forum===&lt;br /&gt;
* MDL-44505 - Subject line of forum notifications can now be configured through language string customisation&lt;br /&gt;
&lt;br /&gt;
===SCORM===&lt;br /&gt;
* MDL-43011 - SCORM new window now opens without headers/footers as expected.&lt;br /&gt;
===Cron===&lt;br /&gt;
&lt;br /&gt;
* MDL-25499 - Cron has received a major update and now has support for both scheduled and adhoc tasks.&lt;br /&gt;
The benefits of these changes are:&lt;br /&gt;
* The schedule for every task can be configured by the admin&lt;br /&gt;
* Tasks can run in parallel&lt;br /&gt;
* Cron processes use locking to prevent the same task running at the same time by different processes&lt;br /&gt;
&lt;br /&gt;
A result of this is that cron can be run much more often, which means (for example) forum posts can be sent out sooner. It is now strongly recommended that administrators increase the frequency that cron is run to at least &#039;&#039;once per minute&#039;&#039;, however it can be kept at it&#039;s previous schedule if desired if you do not wish to benefit from these changes.&lt;br /&gt;
&lt;br /&gt;
===Badges===&lt;br /&gt;
&lt;br /&gt;
* MDL-40551 - Badges can be [https://docs.moodle.org/27/en/Managing_badges#Deleting_badges deleted]&lt;br /&gt;
* MDL-44264 - Badges are displayed on [https://docs.moodle.org/27/en/Badges_settings#Viewing_the_badges_of_other_users course profile] pages&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
&lt;br /&gt;
* MDL-42816 - [https://docs.moodle.org/27/en/Manual_accounts Manual account authentication] can now have password expiry enabled.&lt;br /&gt;
* MDL-41115 - Users can [https://docs.moodle.org/27/en/Managing_authentication log in] with either their username or their email address.&lt;br /&gt;
* MDL-33925 - Support for self-signed certificate without SSL in auth IMAP&lt;br /&gt;
&lt;br /&gt;
===Gradebook===&lt;br /&gt;
&lt;br /&gt;
* MDL-32888 - Gradebook search allows for [https://docs.moodle.org/27/en/Gradebook filtering by student name.]&lt;br /&gt;
* MDL-31679 - The top of the grader report now also has a [https://docs.moodle.org/27/en/Gradebook horizontal scrollbar].&lt;br /&gt;
* MDL-22999 - [https://docs.moodle.org/27/en/Grade_points Maximum marks] in standard activities can now exceed 100.&lt;br /&gt;
&lt;br /&gt;
===Course and pages===&lt;br /&gt;
&lt;br /&gt;
* MDL-38923 - Blocks can be docked while using the Clean theme.&lt;br /&gt;
* MDL-44269 - Breadcrumbs moved below the logo image in Clean.&lt;br /&gt;
&lt;br /&gt;
===Mobile===&lt;br /&gt;
&lt;br /&gt;
* MDL-44342 - Airnotifier allows notifications to be sent to MoodleMobile app.&lt;br /&gt;
* MDL-30085, MDL-30106 Web services added for grades and forums.&lt;br /&gt;
&lt;br /&gt;
==Security issues==&lt;br /&gt;
 &lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260361 MSA-14-0014] Cross-site request forgery possible in Assignment&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260362 MSA-14-0015] Web service token expiry issue for MoodleMobile&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260363 MSA-14-0016] Anonymous student identity revealed in Assignment&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260364 MSA-14-0017] File access issue in HTML block&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260365 MSA-14-0018] Information leak in courses&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=260366 MSA-14-0019] Reflected XSS in URL downloader repository&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developer Notes ==&lt;br /&gt;
&lt;br /&gt;
* Logging and events: All plugins should convert their logging and triggering of events to the new API. See [[Migrating logging calls in plugins]].&lt;br /&gt;
* Reports: Reports that use log table should be updated to use the new logging framework. Old reports will continue to work as before as long as legacy logging is enabled in the site. See [[Migrating log access in reports]] for details.&lt;br /&gt;
* Developers can now use the [[Lock_API]] to lock critical tasks (even across cluster nodes).&lt;br /&gt;
* Plugins can now use the [[Task_API]] to schedule background tasks and developers are encouraged to convert to this API from legacy cron.&lt;br /&gt;
* New plugin type for conditional availability. See [[Availability_conditions]].&lt;br /&gt;
* New plugin type for Atto editor. See [[Atto]]&lt;br /&gt;
* New plugin type for Logging store.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== API changes ===&lt;br /&gt;
* MDL-39952 - Core events: All core events have been converted to the new [[Event 2|Events API]]. The list of all events is available for admin in report &amp;quot;Events list&amp;quot;. Writing observers to the new events is easier but old-style observers will continue to work. Moodle plans to add missing validation to core events before release of 2.7.1 (it will not affect plugins unless they directly trigger core events).&lt;br /&gt;
* MDL-43040 - Activity modules should use $plugin instead of $module in mod/*/version.php.&lt;br /&gt;
* MDL-45250 - add_to_log() has been deprecated and now generates debugging warnings\&lt;br /&gt;
* MDL-44510 - PHPUnit 4.x is now supported.&lt;br /&gt;
* New API for raising php time limit core_php_time_limit::raise()&lt;br /&gt;
* MDL-39337 - New html_writer::image() api&lt;br /&gt;
&lt;br /&gt;
=== Upgrade notes for developers ===&lt;br /&gt;
&lt;br /&gt;
;Authentication plugins : http://git.moodle.org/gw?p=moodle.git;a=blob;f=auth/upgrade.txt;hb=master&lt;br /&gt;
;Badges: http://git.moodle.org/gw?p=moodle.git;a=blob;f=badges/upgrade.txt;hb=master&lt;br /&gt;
;Blog: http://git.moodle.org/gw?p=moodle.git;a=blob;f=blog/upgrade.txt;hb=master&lt;br /&gt;
;Cache: http://git.moodle.org/gw?p=moodle.git;a=blob;f=cache/upgrade.txt;hb=master&lt;br /&gt;
;Core: http://git.moodle.org/gw?p=moodle.git;a=blob;f=lib/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;
;Modules: http://git.moodle.org/gw?p=moodle.git;a=blob;f=mod/upgrade.txt;hb=master&lt;br /&gt;
;Question system: http://git.moodle.org/gw?p=moodle.git;a=blob;f=question/upgrade.txt;hb=master&lt;br /&gt;
;Reports: http://git.moodle.org/gw?p=moodle.git;a=blob;f=report/upgrade.txt;hb=master&lt;br /&gt;
;Tags: http://git.moodle.org/gw?p=moodle.git;a=blob;f=tag/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;
;Webservices: http://git.moodle.org/gw?p=moodle.git;a=blob;f=webservice/upgrade.txt;hb=master&lt;br /&gt;
&lt;br /&gt;
==Development numbers==&lt;br /&gt;
&lt;br /&gt;
[[file:27devstats.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [https://docs.moodle.org/27/en/Category:New_features User documentation of new features in Moodle 2.7]&lt;br /&gt;
* [https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to Moodle 2.7] - information for admins who are upgrading from earlier versions&lt;br /&gt;
&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 2.7]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 2.7]]&lt;br /&gt;
[[es:Notas de Moodle 2.7]]&lt;/div&gt;</summary>
		<author><name>Danmarsden</name></author>
	</entry>
</feed>