<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rjharishabh</id>
	<title>Joomla! Documentation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rjharishabh"/>
	<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/Special:Contributions/Rjharishabh"/>
	<updated>2026-10-01T22:27:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=GSoC_2022_Project_Ideas&amp;diff=899214</id>
		<title>GSoC 2022 Project Ideas</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=GSoC_2022_Project_Ideas&amp;diff=899214"/>
		<updated>2022-04-02T14:39:59Z</updated>

		<summary type="html">&lt;p&gt;Rjharishabh: /* Project Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Top portal heading|color=white-bkgd|text-color=#333|title=&lt;br /&gt;
Welcome to Joomla GSoC 2022 Projects Page }}&lt;br /&gt;
[[Image:Gsoc2016.png|150px|center|link=GSoC 2020]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welcome to the [[GSoC_2022|Joomla Google Summer of Code (GSoC) 2022]] projects page. &lt;br /&gt;
&lt;br /&gt;
If you are interested in participating as a student please review the materials on applying that are available at [https://developers.google.com/open-source/gsoc/faq Google]. We strongly encourage you to ask questions about process and projects on our [https://groups.google.com/forum/#!forum/jgsoc joomla-gsoc mailing list] and join our &lt;br /&gt;
[https://glip.com/joomla public Glip / Ringcentral chat tool].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Note: The GSoC 2022 projects are displayed in no particular order&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project I: Workflow/scheduler ==&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
With Joomla! 4.0 and 4.1 two new features were implemented into Joomla!: the workflow and the task scheduler. In this project both features should be combined. Workflow transitions which are then executed by the scheduler when they are scheduled.Therefore the user interface of the articles extension has to be extended + different task/workflow plugins need to be created.&lt;br /&gt;
As a student, here is the list of things expected from you as deliverable for the project:&lt;br /&gt;
*Deliver an user interface suggestion for com_content how the user interface can look like for pre-defining transition chains.&lt;br /&gt;
*Implement the user interface in com_content&lt;br /&gt;
*Deliver a task plugin to execute the transitions via the scheduler extension&lt;br /&gt;
&lt;br /&gt;
===Knowledge Prerequisite===&lt;br /&gt;
*Language Requisitions: PHP, HTML, CSS and JavaScript&lt;br /&gt;
*Nice to have: Understanding of the Joomla! Scheduler and workflow extension&lt;br /&gt;
&lt;br /&gt;
===Difficulty===&lt;br /&gt;
*Medium&lt;br /&gt;
&lt;br /&gt;
===Project Type===&lt;br /&gt;
*Large [350 Hrs]&lt;br /&gt;
&lt;br /&gt;
===Mentors===&lt;br /&gt;
*Yatharth Vyas&lt;br /&gt;
*Tushar&lt;br /&gt;
*Benjamin&lt;br /&gt;
*Christiane&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|30px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project II: Guided Tour==&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
&lt;br /&gt;
In Joomla! are certain workflows needed to do certain tasks. Currently, users have to read the documentation if they’re new and want to know how they can achieve different things. This project should implement the functionality of guided tours in Joomla!. A tour is a click-through path which the user can follow to fulfill certain tasks like creating an article. So on the one hand Joomla! core should deliver basic tours for users to use core functionality without the need to read the documentation. On the other hand, it should be possible to create their own tours (e.g. as administrators for system operators), copy and change existing tours or allow 3rd party developers to ship their own tours when their extension will be installed.&lt;br /&gt;
&lt;br /&gt;
The project has a history: https://docs.joomla.org/Guided_Tour&lt;br /&gt;
&lt;br /&gt;
Now we want to make the project ready for the next Joomla Version.&lt;br /&gt;
&lt;br /&gt;
===Knowledge Prerequisite===&lt;br /&gt;
*Language Requisitions: PHP, HTML, CSS and JavaScript&lt;br /&gt;
&lt;br /&gt;
===Difficulty===&lt;br /&gt;
*Easy&lt;br /&gt;
&lt;br /&gt;
===Project Type===&lt;br /&gt;
*Medium [175 Hrs]&lt;br /&gt;
&lt;br /&gt;
===Mentors===&lt;br /&gt;
*Patrick Jackson&lt;br /&gt;
*Eyvaz Ahmadzada&lt;br /&gt;
*Jatin Salve&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|30px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project III: SEO ==&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
Joomla! 4.0 is built around a lot of SEO improvements. In this project you should implement additional basic SEO features.&lt;br /&gt;
As a student, here is the list of things expected from you as deliverable for the project:&lt;br /&gt;
*Review the current Joomla! 4 version and find out existing SEO features&lt;br /&gt;
*Define and propose new useful features which we can ship in future Joomla! Versions&lt;br /&gt;
*Implement features agreed with your mentor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Knowledge Prerequisite===&lt;br /&gt;
*Language Requisitions: PHP, HTML, CSS and JavaScript&lt;br /&gt;
*Nice to have: SEO experience&lt;br /&gt;
&lt;br /&gt;
===Difficulty===&lt;br /&gt;
&lt;br /&gt;
*Medium&lt;br /&gt;
&lt;br /&gt;
===Project Type===&lt;br /&gt;
*Medium [175 Hrs]&lt;br /&gt;
&lt;br /&gt;
===Mentors===&lt;br /&gt;
*Christopher Wagner&lt;br /&gt;
*Philip Walton&lt;br /&gt;
*Shivam Rajput&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|30px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project IV: Accessibility Plugin ==&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
Joomla uses an accessibility Plugin. This Plugin should be foked and re-written completely.&lt;br /&gt;
&lt;br /&gt;
===Knowledge Prerequisite===&lt;br /&gt;
*Language Requisitions: PHP, HTML, CSS and JavaScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Difficulty===&lt;br /&gt;
&lt;br /&gt;
*Medium&lt;br /&gt;
&lt;br /&gt;
===Project Type===&lt;br /&gt;
*Medium [175 Hrs]&lt;br /&gt;
&lt;br /&gt;
===Mentors===&lt;br /&gt;
*Achilleas Papageorgiou&lt;br /&gt;
*Viviana Menzel&lt;br /&gt;
*Kumar Shivam&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|30px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Project V: Schema.org==&lt;br /&gt;
&lt;br /&gt;
===Project Description===&lt;br /&gt;
Currently Joomla! uses inline microdata for adding rich snippets. The drawback of this implementation is that it’s hard coded (can’t be changed from the backend, only by overrides) and it is very generic. With this project, Joomla! should switch to a schema.org JSON+LD implementation which is configurable via the backend (e.g in article, category view).&lt;br /&gt;
As a student, here is the list of things expected from you as deliverable for the project:&lt;br /&gt;
*Suggest and implement a JSON+LD library&lt;br /&gt;
*Implement article/menu/category/… parameter interface to add rich snippets to articles.&lt;br /&gt;
*Output the rich snippets dynamically in the frontend&lt;br /&gt;
&lt;br /&gt;
===Knowledge Prerequisite===&lt;br /&gt;
*Language Requisitions: PHP, HTML, CSS and JavaScript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Difficulty===&lt;br /&gt;
&lt;br /&gt;
*Hard&lt;br /&gt;
&lt;br /&gt;
===Project Type===&lt;br /&gt;
*Large [350 Hrs]&lt;br /&gt;
&lt;br /&gt;
===Mentors===&lt;br /&gt;
*Niels &lt;br /&gt;
*Richard Faith&lt;br /&gt;
*Anurag Kumar&lt;br /&gt;
*Rishabh Ranjan Jha&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|30px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Gsoc2016.png|50px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Google Summer of Code 2022]]&lt;br /&gt;
[[Category:Google Summer of Code]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rjharishabh</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J4.x:Creating_a_Simple_Module&amp;diff=789440</id>
		<title>J4.x:Creating a Simple Module</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J4.x:Creating_a_Simple_Module&amp;diff=789440"/>
		<updated>2021-05-22T18:07:21Z</updated>

		<summary type="html">&lt;p&gt;Rjharishabh: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{Joomla version|version=4.x|comment=&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; Tutorial&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
{{-}}&lt;br /&gt;
{{Top portal heading|color=white-bkgd|icon=file-code-o|icon-color=#5091cd|size=5x|text-color=#333|title=&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt; Creating a Simple Module for Joomla 4.x&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:3--&amp;gt; This is a tutorial on how to Create a simple module for Joomla Version 4x.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Introduction == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; Joomlaǃ 4 provides five types of extensionsː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[S:MyLanguage/Component|&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt; Components&amp;lt;/translate&amp;gt;]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt; A component is the main part of the site. A component handles data manipulation as well as input and storage into the database. A component on most sites is the primary focus of the page.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[S:MyLanguage/Module|&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; Modules&amp;lt;/translate&amp;gt;]]&#039;&#039;&#039; &amp;lt;br /&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt; A module is an add-on to the site that extends the functionality. A module usually occupies a secondary portion of the web page and is not considered the primary focus of a page. It can be displayed on different positions and you can choose on which active menu items it should be displayed. Modules are lightweight and flexible extensions. They are used for small bits of the page that are generally less complex and are able to be seen across different components.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[S:MyLanguage/Plugin|&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt; Plugins&amp;lt;/translate&amp;gt;]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt; A Plugin manipulates output that is already generated by the system. It typically does not run as separate part of the site. It takes data from other sources (i.e. the content) and manipulates this data before displaying. A plugin typically work behind the scenes.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[S:MyLanguage/Languages|&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; Languages&amp;lt;/translate&amp;gt;]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:203--&amp;gt; Probably the most basic extensions are languages. In essence the language package files consist of key/value pairs, which provide the translation of static text strings, assigned within the Joomla! source code.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[S:MyLanguage/Templates|&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; Templates&amp;lt;/translate&amp;gt;]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; A template is basically the design of your Joomla! powered website.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; Joomla! 4 is constructed using five different applications:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
* Installation (used for installing Joomla and have to delete after installation);&lt;br /&gt;
* Administrator (backend - used for managing content);&lt;br /&gt;
* Public or site (frontend - used for displaying content);&lt;br /&gt;
* CLI (used for accessing Joomla on the command line and for cron jobs);&lt;br /&gt;
* API (web services - used for creating APIs for machine accessible content);&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
The installation application is used once. The administrator and public are used through the concept of &#039;&#039;components&#039;&#039; with &#039;&#039;modules&#039;&#039;. Each module has a single entry point located in the &#039;&#039;modules&#039;&#039; and accordingly &#039;&#039;administrator/modules&#039;&#039;  directory. This entry point is called &amp;lt;tt&amp;gt;&#039;&#039;mod_modulename/mod_modulename.php&#039;&#039;&amp;lt;/tt&amp;gt; (the &#039;&#039;mod_&#039;&#039; prefix is a historical trace). The entry point for the login module is for example &#039;&#039;/mod_login/mod_login.php&#039;&#039;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Requirements === &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt; You need Joomla! 4.x installation available to use for this tutorial ([https://github.com/joomla/joomla-cms/releases Download latest release here])&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt; You can download Joomla! 4 at [https://github.com/joomla/joomla-cms/releases GitHub], on the [https://developer.joomla.org/nightly-builds.html Developer website] or you can create a free website at https://launch.joomla.org.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating a simple module/Developing a Basic Module - Part 1 == &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt; You can see many examples of modules in the standard Joomla! install. For example:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
* Menus &lt;br /&gt;
* Latest News&lt;br /&gt;
* Login form&lt;br /&gt;
* and many more.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:24--&amp;gt; This tutorial will explain how to create a simple module. Through this tutorial you will learn the basic file structure of a Joomlaǃ 4 module. This basic structure can then be expanded to produce more elaborate modules.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== File Structure === &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:26--&amp;gt; There are a few basic files that are used in the standard pattern of module development:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt; * &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; - This file is the main entry point for the module. It will perform any necessary initialization routines, call helper routines to collect any necessary data, and include the template which will display the module output.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt; * &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; - This file contains information about the module. It defines the files that need to be installed by the Joomla! installer and specifies configuration parameters for the module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt; * &amp;lt;tt&amp;gt;tmpl/default.php&amp;lt;/tt&amp;gt; - This is the module template. This file will take the data collected by mod_foo.php and generate the HTML to be displayed on the page.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt; * &amp;lt;tt&amp;gt;language/en-GB/mod_foo.ini&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;language/en-GB/mod_foo.sys.ini&amp;lt;/tt&amp;gt;- This are the files that provide the text in United Kingdom English.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creating mod_foo.php === &amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt; The &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; file will perform following tasks:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:33--&amp;gt; * Import the class &amp;lt;tt&amp;gt;ModuleHelper&amp;lt;/tt&amp;gt; to the current scope. We need it later for displaying the output.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt; * Include the template to display the output.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:35--&amp;gt; The helper class is imported to our current scope at the begin of the file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;use Joomla\CMS\Helper\ModuleHelper;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt; Last we include the template to display the output via&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require ModuleHelper::getLayoutPath(&#039;mod_foo&#039;, $params-&amp;gt;get(&#039;layout&#039;, &#039;default&#039;));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.php file ==== &amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
use Joomla\CMS\Helper\ModuleHelper;&lt;br /&gt;
&lt;br /&gt;
require ModuleHelper::getLayoutPath(&#039;mod_foo&#039;, $params-&amp;gt;get(&#039;layout&#039;, &#039;default&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt; &#039;&#039;Side note&#039;&#039;ː In Joomla 3x you usually used a line like &amp;lt;tt&amp;gt;$moduleclass_sfx = htmlspecialchars($params-&amp;gt;get(&#039;moduleclass_sfx&#039;));&amp;lt;/tt&amp;gt;. You don&#039;t need this anymore. See this PRː https://github.com/joomla/joomla-cms/pull/17447.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt; The one line that we haven’t explained so far is the first line &amp;lt;tt&amp;gt;defined(&#039;_JEXEC&#039;) or die;&amp;lt;/tt&amp;gt;. This line checks to make sure that this file is being included from the Joomla application. This is necessary to prevent variable injection and other potential security concerns.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating tmpl/default.php === &amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:42--&amp;gt; The &amp;lt;tt&amp;gt;default.php&amp;lt;/tt&amp;gt; file is the template which displays the module output.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed tmpl/default.php file ==== &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt; The code for the tmpl/default.php file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
echo &#039;[PROJECT_NAME]&#039;; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt; An important point to note is that the template file has the same scope as the &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; file. It means that a variable can be defined in the &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; file and then used in the template file without any extra declarations or function calls.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating mod_foo.xml === &amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:47--&amp;gt; The &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; file is the installation file. Most entries are self-explanatory.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.xml file ==== &amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:49--&amp;gt; The code for the &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt;  file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension type=&amp;quot;module&amp;quot; version=&amp;quot;4.0&amp;quot; client=&amp;quot;site&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;MOD_FOO&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;creationDate&amp;gt;[DATE]&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
    &amp;lt;author&amp;gt;[AUTHOR]&amp;lt;/author&amp;gt;&lt;br /&gt;
    &amp;lt;authorEmail&amp;gt;[AUTHOR_EMAIL]&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
    &amp;lt;authorUrl&amp;gt;[AUTHOR_URL]&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
    &amp;lt;copyright&amp;gt;[COPYRIGHT]&amp;lt;/copyright&amp;gt;&lt;br /&gt;
    &amp;lt;license&amp;gt;GNU General Public License version 2 or later; see LICENSE.txt&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;MOD_FOO_XML_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;files&amp;gt;&lt;br /&gt;
        &amp;lt;filename module=&amp;quot;mod_foo&amp;quot;&amp;gt;mod_foo.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;filename&amp;gt;mod_foo.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;/files&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating the language files === &amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt; The files &amp;lt;tt&amp;gt;language/en-GB/mod_foo.ini&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;language/en-GB/mod_foo.sys.ini&amp;lt;/tt&amp;gt; are used to translate text in the frontend and in the backend. Note that the language file structure has been updated in Joomla 4, and language prefixes on the individual files in a language folder are no longer required.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt; The code for &amp;lt;tt&amp;gt;language/en-GB/mod_foo.sys.ini&amp;lt;/tt&amp;gt; is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MOD_FOO=&amp;quot;[PROJECT_NAME]&amp;quot;&lt;br /&gt;
MOD_FOO_XML_DESCRIPTION=&amp;quot;Foo Module&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:204--&amp;gt; The code for &amp;lt;tt&amp;gt;language/en-GB/mod_foo.ini&amp;lt;/tt&amp;gt; is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MOD_FOO=&amp;quot;[PROJECT_NAME]&amp;quot;&lt;br /&gt;
MOD_FOO_XML_DESCRIPTION=&amp;quot;Foo Module&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt; The &amp;lt;tt&amp;gt;.sys.ini&amp;lt;/tt&amp;gt; file is used to translate the description of the extension upon installation, where as the &amp;lt;tt&amp;gt;.ini&amp;lt;/tt&amp;gt; file is used to translate the remaining strings and the description when viewing your extension.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt; More information about language files can be found [[S:MyLanguage/Specification_of_language_files|here]].&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test your module == &amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:56--&amp;gt; Now you can zip all files and install them via the Joomla Extension Manager.&amp;lt;br /&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt; After that you can choose your module in the module manager, when you create a new site module.&amp;lt;/translate&amp;gt; &lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial1-&amp;lt;translate&amp;gt;&amp;lt;!--T:58--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial2-&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:60--&amp;gt; In the frontend, you will see your module like displayed in the next image.&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial3-&amp;lt;translate&amp;gt;&amp;lt;!--T:61--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Conclusion == &amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt; Module development for Joomla is a fairly simple, straightforward process. Using the techniques described in this tutorial, an endless variety of modules can be developed with little hassle.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt; You can find boilerplates hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla-extensions/boilerplate/tree/master/module&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:65--&amp;gt; The sample files for this Tutorial can be found hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/astridx/boilerplate/tree/tutorial/tutorial/modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add a helper class using namespaces - Part 2== &amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Requirements === &amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:68--&amp;gt; You need Joomla! 4.x for this tutorial (as of writing currently Joomla! 4.0.0-alpha6-dev)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Namespaces == &amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:70--&amp;gt; With PHP 5.3, the namespaces came into their own. In other programming languages for a long time in use, these small structures now also help us with the clarity of our code.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt; Namespaces are separate areas in which certain logical things (in our case, classes, interfaces, functions, and constants) can live. These areas provide encapsulation of the code and prevent name conflicts.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:72--&amp;gt; Let&#039;s take a look how to use them in Joomla 4. We use the helper file for this.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== File Structure === &amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:74--&amp;gt; We will create/change the following files:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Helper/FooHelper.php&amp;lt;/code&amp;gt; - This is the file we use here as an example. We have to create it.&lt;br /&gt;
* &amp;lt;code&amp;gt;mod_foo.php&amp;lt;/code&amp;gt; - In this file, we will mainly load the namespace.&lt;br /&gt;
* &amp;lt;code&amp;gt;tmpl/default.php&amp;lt;/code&amp;gt; - In this file, we will demonstrate how the data of a helper can be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;mod_foo.xml&amp;lt;/code&amp;gt; - We create a new directory with a new file. This must be installed during the installation. For this we have to specify them in this file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating Helper/FooHelper.php === &amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt; Our new helper class should belong to a namespace. We achieve this with the following code. It is important, that this line is at the beginning of the file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;namespace Joomla\Module\Foo\Site\Helper;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:78--&amp;gt; Then we create a simple class with a simple method. Of course you can do a lot more here. Take a look at the Joomla core methods. Here are many examples. They show you first-hand what options you have.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed Helper/FooHelper.php ==== &amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:80--&amp;gt; The complete &amp;lt;tt&amp;gt;FooHelper.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package     Joomla.Site&lt;br /&gt;
 * @subpackage  mod_foo&lt;br /&gt;
 *&lt;br /&gt;
 * @copyright   Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.&lt;br /&gt;
 * @license     GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
namespace Joomla\Module\Foo\Site\Helper;&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Helper for mod_foo&lt;br /&gt;
 *&lt;br /&gt;
 * @since  4.0&lt;br /&gt;
 */&lt;br /&gt;
class FooHelper&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Retrieve foo test&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   Registry        $params  The module parameters&lt;br /&gt;
	 * @param   CMSApplication  $app     The application&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  array&lt;br /&gt;
	 */&lt;br /&gt;
	public static function getText()&lt;br /&gt;
	{&lt;br /&gt;
		return &#039;FooHelpertest&#039;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Editing mod_foo.php === &amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:82--&amp;gt; Our new helper class is imported to our current scope at the beginning of the file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;use Joomla\Module\Foo\Site\Helper\FooHelper;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:83--&amp;gt; Last use the helper file for testing if it is loaded correctlyː&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$test  = FooHelper::getText($params, $app);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.php file ==== &amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
use Joomla\CMS\Helper\ModuleHelper;&lt;br /&gt;
use Joomla\Module\Foo\Site\Helper\FooHelper;&lt;br /&gt;
&lt;br /&gt;
$test  = FooHelper::getText();&lt;br /&gt;
&lt;br /&gt;
require ModuleHelper::getLayoutPath(&#039;mod_foo&#039;, $params-&amp;gt;get(&#039;layout&#039;, &#039;default&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing tmpl/default.php === &amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt; In this file you make only a small change to demonstrate in the frontend that your helper file is working properly. You only add the value of the variable at the end of the current output.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;echo &#039;[PROJECT_NAME]&#039; . $test;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed tmpl/default.php ==== &amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt; The complete &amp;lt;tt&amp;gt;tmpl/default.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
echo &#039;[PROJECT_NAME]&#039; . $test; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing mod_foo.xml === &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt; First you have to add a line, so that the namespace is set automatically in Joomla. After this change, you have to re-install your module. A simple change in an already installed module is not enough. If you are doing local development you can also delete the files libraries/autoload_psr4.php and it will automatically be re-created. After inserting and installing, the namespace is known by the loader &amp;lt;tt&amp;gt;JPATH_LIBRARIES . &#039;/autoload_psr4.php&#039;&amp;lt;/tt&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;namespace&amp;gt;Joomla\Module\Foo&amp;lt;/namespace&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:92--&amp;gt; Joomla! should copy your helper file when installing the module. So Joomla! needs to know your helper file. For this, you need to add the following line to your XML file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;folder&amp;gt;Helper&amp;lt;/folder&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.xml ==== &amp;lt;!--T:93--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:94--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension type=&amp;quot;module&amp;quot; version=&amp;quot;4.0&amp;quot; client=&amp;quot;site&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;MOD_FOO&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;creationDate&amp;gt;[DATE]&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
    &amp;lt;author&amp;gt;[AUTHOR]&amp;lt;/author&amp;gt;&lt;br /&gt;
    &amp;lt;authorEmail&amp;gt;[AUTHOR_EMAIL]&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
    &amp;lt;authorUrl&amp;gt;[AUTHOR_URL]&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
    &amp;lt;copyright&amp;gt;[COPYRIGHT]&amp;lt;/copyright&amp;gt;&lt;br /&gt;
    &amp;lt;license&amp;gt;GNU General Public License version 2 or later; see LICENSE.txt&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;MOD_FOO_XML_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;namespace&amp;gt;Joomla\Module\Foo&amp;lt;/namespace&amp;gt;&lt;br /&gt;
    &amp;lt;files&amp;gt;&lt;br /&gt;
        &amp;lt;filename module=&amp;quot;mod_foo&amp;quot;&amp;gt;mod_foo.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;Helper&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;filename&amp;gt;mod_foo.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;/files&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Test your module == &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:96--&amp;gt; Now you can zip all files and install them via the Joomla Extension Manager.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt; After that you can choose your module in the module manager, when you create a new site module.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:98--&amp;gt; In the frontend you will see your module like displayed in the next image. The text from your helper file is displayed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial23-&amp;lt;translate&amp;gt;&amp;lt;!--T:99--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Conclusion == &amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:101--&amp;gt; As you can see, once you get a bit into the namespaces, they are not that complicated anymore. In big projects they can bring a lot of benefits. However, we should plan namespaces, as otherwise it will soon be more time-consuming.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:102--&amp;gt; You can find boilerplates hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla-extensions/boilerplate/tree/master/module&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:103--&amp;gt; The sample files for this Tutorial can be found hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/astridx/boilerplate/tree/tutorial/tutorial/modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Customizationː Add parameters via form fields - Part 3 == &amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Requirements === &amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt; You need Joomla! 4.x for this tutorial (as of writing currently Joomla! 4.0.0-alpha6-dev)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Customization with form fields and parameters == &amp;lt;!--T:107--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt; Form fields give a great deal of customization in Joomla and for modules are the sole way of allowing the user to tweak the module to the needs of their site.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt; In this case we are going to extend our previous example using a url field for inserting a domain that we can use as link in the front end. To allow this to happen we will use the [[S:MyLanguage/URL_form_field_type|URL Form Field]] type.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt; After that, we insert parameters that allow to use standard functionality of Joomla.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:111--&amp;gt; Let&#039;s take a look on how to use them in Joomla 4.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== File Structure === &amp;lt;!--T:112--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt; We will change the following files:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; - This is the file where we add the fields.&lt;br /&gt;
* &amp;lt;tt&amp;gt;tmpl/default.php&amp;lt;/tt&amp;gt; - In this file demonstrate how the data of a field can be used.&lt;br /&gt;
* &amp;lt;tt&amp;gt;language/en-GB/en-GB.mod_foo.ini&amp;lt;/tt&amp;gt; - Here we use a language string so that the field can be labeled correctly in different languages.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing mod_foo.xml === &amp;lt;!--T:115--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt; First we set a custom parameter.&amp;lt;/translate&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;domain&amp;quot;&lt;br /&gt;
    type=&amp;quot;url&amp;quot;&lt;br /&gt;
    label=&amp;quot;MOD_FOO_FIELD_URL_LABEL&amp;quot;&lt;br /&gt;
    filter=&amp;quot;url&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt; Then we insert Joomla default fields, so that we can use cache, moduleclass-suffix and layouts.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;layout&amp;quot;&lt;br /&gt;
    type=&amp;quot;modulelayout&amp;quot;&lt;br /&gt;
    label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;&lt;br /&gt;
    class=&amp;quot;custom-select&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;moduleclass_sfx&amp;quot;&lt;br /&gt;
    type=&amp;quot;textarea&amp;quot;&lt;br /&gt;
    label=&amp;quot;COM_MODULES_FIELD_MODULECLASS_SFX_LABEL&amp;quot;&lt;br /&gt;
    rows=&amp;quot;3&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;cache&amp;quot;&lt;br /&gt;
    type=&amp;quot;list&amp;quot;&lt;br /&gt;
    label=&amp;quot;COM_MODULES_FIELD_CACHING_LABEL&amp;quot;&lt;br /&gt;
    default=&amp;quot;0&amp;quot;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
    &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;COM_MODULES_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;cache_time&amp;quot;&lt;br /&gt;
    type=&amp;quot;number&amp;quot;&lt;br /&gt;
    label=&amp;quot;COM_MODULES_FIELD_CACHE_TIME_LABEL&amp;quot;&lt;br /&gt;
    default=&amp;quot;0&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field&lt;br /&gt;
    name=&amp;quot;cachemode&amp;quot;&lt;br /&gt;
    type=&amp;quot;hidden&amp;quot;&lt;br /&gt;
    default=&amp;quot;itemid&amp;quot;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
    &amp;lt;option value=&amp;quot;itemid&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.xml ==== &amp;lt;!--T:118--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension type=&amp;quot;module&amp;quot; version=&amp;quot;4.0&amp;quot; client=&amp;quot;site&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;MOD_FOO&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;creationDate&amp;gt;[DATE]&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
    &amp;lt;author&amp;gt;[AUTHOR]&amp;lt;/author&amp;gt;&lt;br /&gt;
    &amp;lt;authorEmail&amp;gt;[AUTHOR_EMAIL]&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
    &amp;lt;authorUrl&amp;gt;[AUTHOR_URL]&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
    &amp;lt;copyright&amp;gt;[COPYRIGHT]&amp;lt;/copyright&amp;gt;&lt;br /&gt;
    &amp;lt;license&amp;gt;GNU General Public License version 2 or later; see LICENSE.txt&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;MOD_FOO_XML_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;namespace&amp;gt;Joomla\Module\Foo&amp;lt;/namespace&amp;gt;&lt;br /&gt;
    &amp;lt;files&amp;gt;&lt;br /&gt;
        &amp;lt;filename module=&amp;quot;mod_foo&amp;quot;&amp;gt;mod_foo.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;Helper&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;filename&amp;gt;mod_foo.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;/files&amp;gt;&lt;br /&gt;
    &amp;lt;config&amp;gt;&lt;br /&gt;
        &amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;domain&amp;quot;&lt;br /&gt;
                    type=&amp;quot;url&amp;quot;&lt;br /&gt;
                    label=&amp;quot;MOD_FOO_FIELD_URL_LABEL&amp;quot;&lt;br /&gt;
                    filter=&amp;quot;url&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;advanced&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;layout&amp;quot;&lt;br /&gt;
                    type=&amp;quot;modulelayout&amp;quot;&lt;br /&gt;
                    label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;&lt;br /&gt;
                    class=&amp;quot;custom-select&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;moduleclass_sfx&amp;quot;&lt;br /&gt;
                    type=&amp;quot;textarea&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_MODULECLASS_SFX_LABEL&amp;quot;&lt;br /&gt;
                    rows=&amp;quot;3&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache&amp;quot;&lt;br /&gt;
                    type=&amp;quot;list&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHING_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;COM_MODULES_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache_time&amp;quot;&lt;br /&gt;
                    type=&amp;quot;number&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHE_TIME_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cachemode&amp;quot;&lt;br /&gt;
                    type=&amp;quot;hidden&amp;quot;&lt;br /&gt;
                    default=&amp;quot;itemid&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;itemid&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
        &amp;lt;/fields&amp;gt;&lt;br /&gt;
    &amp;lt;/config&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing tmpl/default.php === &amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:121--&amp;gt; We can use the value of the parameter for creating a hyperlink in the frontend. We can access the value via the variable $params.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$domain = $params-&amp;gt;get(&#039;domain&#039;, &#039;https://www.joomla.org&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt; Later we set use this value for creating the hyperlink.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $domain; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo &#039;[PROJECT_NAME]&#039; . $test; ?&amp;gt;&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed tmpl/default.php file ==== &amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:124--&amp;gt; The complete &amp;lt;tt&amp;gt;tmpl/default.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
$domain = $params-&amp;gt;get(&#039;domain&#039;, &#039;https://www.joomla.org&#039;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $domain; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo &#039;[PROJECT_NAME]&#039; . $test; ?&amp;gt;&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing language/en-GB/en-GB.mod_foo.ini === &amp;lt;!--T:125--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt; Here we can specify the text for the English version of the field label.&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;MOD_FOO_FIELD_URL_LABEL=&amp;quot;Url&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed language/en-GB/en-GB.mod_foo.ini ==== &amp;lt;!--T:127--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:128--&amp;gt; The complete &amp;lt;tt&amp;gt;language/en-GB/en-GB.mod_foo.ini&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MOD_FOO=&amp;quot;[PROJECT_NAME]&amp;quot;&lt;br /&gt;
MOD_FOO_XML_DESCRIPTION=&amp;quot;Foo Module&amp;quot;&lt;br /&gt;
MOD_FOO_FIELD_URL_LABEL=&amp;quot;Url&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Test your module == &amp;lt;!--T:129--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:130--&amp;gt; Now you can zip all files and install them via the Joomla Extension Manager.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:131--&amp;gt; After that you can choose your module in the module manager, when you create a new site module.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt; In the backend, you will see your module like displayed in the next image.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt; In the basic tab, you will see the custom field where you can insert a domain. The text for the label is fetched from the language file.&amp;lt;/translate&amp;gt; &lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial31-&amp;lt;translate&amp;gt;&amp;lt;!--T:134--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:135--&amp;gt; In the advanced tab, you will see all default options except the cache mode because of this is a hidden field.&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial32-&amp;lt;translate&amp;gt;&amp;lt;!--T:136--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:137--&amp;gt; In the frontend, you will see your module like displayed in the next image. The text form your helper file is displayed and you should see a hyperlink.&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial33-&amp;lt;translate&amp;gt;&amp;lt;!--T:138--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Conclusion == &amp;lt;!--T:139--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:140--&amp;gt; Form fields give the user an easy way to customize the module to their sites settings. This allows the modules scope to be increased.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:141--&amp;gt; You can find boilerplates hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla-extensions/boilerplate/tree/master/module&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:142--&amp;gt; The sample files for this Tutorial can be found hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/astridx/boilerplate/tree/tutorial/tutorial/modules&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:143--&amp;gt; See this issue for possible future changes:&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla/joomla-cms/pull/23553&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Install, Update and Uninstall script - Part 4 == &amp;lt;!--T:144--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Requirements === &amp;lt;!--T:145--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:146--&amp;gt; You need Joomla! 4.x for this tutorial (as of writing currently Joomla! 4.0.0-alpha6-dev)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Scripts === &amp;lt;!--T:147--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:148--&amp;gt; Installing, updating and uninstalling a module may require additional operations that cannot be achieved by the basic operations described in the main XML file. Joomla offers a new approach to solve this problem. It consists in using a PHP script file containing a class using five methods:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:149--&amp;gt;&lt;br /&gt;
* preflight which is executed before install and update&lt;br /&gt;
* install&lt;br /&gt;
* update&lt;br /&gt;
* uninstall&lt;br /&gt;
* postflight which is executed after install and update&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:150--&amp;gt; Let&#039;s take a look how to use them in Joomla 4. We use the helper file for this.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== File Structure === &amp;lt;!--T:151--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:152--&amp;gt; We will create/change the following files:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:153--&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;script.php&amp;lt;/tt&amp;gt; - This is the file we use here as an example. We have to create it.&lt;br /&gt;
* &amp;lt;tt&amp;gt;language/en-GB/en-GB.mod_foo.sys.ini&amp;lt;/tt&amp;gt; - In this file we will add text.&lt;br /&gt;
* &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; - We create a new file. This must be installed during the installation. For this we have to specify it in this file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating script.php === &amp;lt;!--T:154--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:155--&amp;gt; Writing an extension script consists in declaring a class whose name is &amp;lt;tt&amp;gt;mod_ModuleNameInstallerScript&amp;lt;/tt&amp;gt; with these 5 methods. See the comments in the file for more information. In this comments I explain when a method is called.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:156--&amp;gt; In this example, I only use text to show when which method will be executed. In addition, I show you how to check the minimum requirements. Of course you can do much more. For example, you can delete files that are no longer needed in a new version of your module. This can be seen in the file. Another idea for this file is to create sample content, to show a success message with the current installed version number or you can redirect after a successful installation to the page with the module settings.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed script.php ==== &amp;lt;!--T:157--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:158--&amp;gt; The complete &amp;lt;tt&amp;gt;script.php&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @package    [PACKAGE_NAME]&lt;br /&gt;
 *&lt;br /&gt;
 * @author     [AUTHOR] &amp;lt;[AUTHOR_EMAIL]&amp;gt;&lt;br /&gt;
 * @copyright  [COPYRIGHT]&lt;br /&gt;
 * @license    GNU General Public License version 2 or later; see LICENSE.txt&lt;br /&gt;
 * @link       [AUTHOR_URL]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
use Joomla\CMS\Language\Text;&lt;br /&gt;
use Joomla\CMS\Log\Log;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Script file of Foo module&lt;br /&gt;
 */&lt;br /&gt;
class mod_fooInstallerScript {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Extension script constructor.&lt;br /&gt;
     *&lt;br /&gt;
     * @return  void&lt;br /&gt;
     */&lt;br /&gt;
    public function __construct() {&lt;br /&gt;
        $this-&amp;gt;minimumJoomla = &#039;4.0&#039;;&lt;br /&gt;
        $this-&amp;gt;minimumPhp = JOOMLA_MINIMUM_PHP;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Method to install the extension&lt;br /&gt;
     *&lt;br /&gt;
     * @param   InstallerAdapter  $parent  The class calling this method&lt;br /&gt;
     *&lt;br /&gt;
     * @return  boolean  True on success&lt;br /&gt;
     */&lt;br /&gt;
    function install($parent) {&lt;br /&gt;
        echo Text::_(&#039;MOD_FOO_INSTALLERSCRIPT_INSTALL&#039;);&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Method to uninstall the extension&lt;br /&gt;
     *&lt;br /&gt;
     * @param   InstallerAdapter  $parent  The class calling this method&lt;br /&gt;
     *&lt;br /&gt;
     * @return  boolean  True on success&lt;br /&gt;
     */&lt;br /&gt;
    function uninstall($parent) {&lt;br /&gt;
        echo Text::_(&#039;MOD_FOO_INSTALLERSCRIPT_UNINSTALL&#039;);&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Method to update the extension&lt;br /&gt;
     *&lt;br /&gt;
     * @param   InstallerAdapter  $parent  The class calling this method&lt;br /&gt;
     *&lt;br /&gt;
     * @return  boolean  True on success&lt;br /&gt;
     */&lt;br /&gt;
    function update($parent) {&lt;br /&gt;
        echo Text::_(&#039;MOD_FOO_INSTALLERSCRIPT_UPDATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Function called before extension installation/update/removal procedure commences&lt;br /&gt;
     *&lt;br /&gt;
     * @param   string            $type    The type of change (install, update or discover_install, not uninstall)&lt;br /&gt;
     * @param   InstallerAdapter  $parent  The class calling this method&lt;br /&gt;
     *&lt;br /&gt;
     * @return  boolean  True on success&lt;br /&gt;
     */&lt;br /&gt;
    function preflight($type, $parent) {&lt;br /&gt;
        // Check for the minimum PHP version before continuing&lt;br /&gt;
        if (!empty($this-&amp;gt;minimumPhp) &amp;amp;&amp;amp; version_compare(PHP_VERSION, $this-&amp;gt;minimumPhp, &#039;&amp;lt;&#039;)) {&lt;br /&gt;
            Log::add(Text::sprintf(&#039;JLIB_INSTALLER_MINIMUM_PHP&#039;, $this-&amp;gt;minimumPhp), Log::WARNING, &#039;jerror&#039;);&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Check for the minimum Joomla version before continuing&lt;br /&gt;
        if (!empty($this-&amp;gt;minimumJoomla) &amp;amp;&amp;amp; version_compare(JVERSION, $this-&amp;gt;minimumJoomla, &#039;&amp;lt;&#039;)) {&lt;br /&gt;
            Log::add(Text::sprintf(&#039;JLIB_INSTALLER_MINIMUM_JOOMLA&#039;, $this-&amp;gt;minimumJoomla), Log::WARNING, &#039;jerror&#039;);&lt;br /&gt;
&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        echo Text::_(&#039;MOD_FOO_INSTALLERSCRIPT_PREFLIGHT&#039;);&lt;br /&gt;
        echo $this-&amp;gt;minimumJoomla . &#039; &#039; . $this-&amp;gt;minimumPhp;&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Function called after extension installation/update/removal procedure commences&lt;br /&gt;
     *&lt;br /&gt;
     * @param   string            $type    The type of change (install, update or discover_install, not uninstall)&lt;br /&gt;
     * @param   InstallerAdapter  $parent  The class calling this method&lt;br /&gt;
     *&lt;br /&gt;
     * @return  boolean  True on success&lt;br /&gt;
     */&lt;br /&gt;
    function postflight($type, $parent) {&lt;br /&gt;
        echo Text::_(&#039;MOD_FOO_INSTALLERSCRIPT_POSTFLIGHT&#039;);&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing language/en-GB/en-GB.mod_foo.sys.ini === &amp;lt;!--T:159--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:160--&amp;gt; There is not much to explain here. Write the text for the translation into this file.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed language/en-GB/en-GB.mod_foo.sys.ini file ==== &amp;lt;!--T:161--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:162--&amp;gt; The complete &amp;lt;tt&amp;gt;language/en-GB/en-GB.mod_foo.sys.ini&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MOD_FOO=&amp;quot;[PROJECT_NAME]&amp;quot;&lt;br /&gt;
MOD_FOO_XML_DESCRIPTION=&amp;quot;Foo Module&amp;quot;&lt;br /&gt;
MOD_FOO_INSTALLERSCRIPT_PREFLIGHT=&amp;quot;&amp;lt;p&amp;gt;Anything here happens before the installation/update/uninstallation of the module&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
MOD_FOO_INSTALLERSCRIPT_UPDATE=&amp;quot;&amp;lt;p&amp;gt;The module has been updated&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
MOD_FOO_INSTALLERSCRIPT_UNINSTALL=&amp;quot;&amp;lt;p&amp;gt;The module has been uninstalled&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
MOD_FOO_INSTALLERSCRIPT_INSTALL=&amp;quot;&amp;lt;p&amp;gt;The module has been installed&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
MOD_FOO_INSTALLERSCRIPT_POSTFLIGHT=&amp;quot;&amp;lt;p&amp;gt;Anything here happens after the installation/update/uninstallation of the module&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Editing mod_foo.xml === &amp;lt;!--T:163--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:164--&amp;gt; You have to add a line, so that the script is called automatically in Joomla.&amp;lt;/translate&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;scriptfile&amp;gt;script.php&amp;lt;/scriptfile&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.xml ==== &amp;lt;!--T:165--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:166--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension type=&amp;quot;module&amp;quot; version=&amp;quot;4.0&amp;quot; client=&amp;quot;site&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;MOD_FOO&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;creationDate&amp;gt;[DATE]&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
    &amp;lt;author&amp;gt;[AUTHOR]&amp;lt;/author&amp;gt;&lt;br /&gt;
    &amp;lt;authorEmail&amp;gt;[AUTHOR_EMAIL]&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
    &amp;lt;authorUrl&amp;gt;[AUTHOR_URL]&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
    &amp;lt;copyright&amp;gt;[COPYRIGHT]&amp;lt;/copyright&amp;gt;&lt;br /&gt;
    &amp;lt;license&amp;gt;GNU General Public License version 2 or later; see LICENSE.txt&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;MOD_FOO_XML_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;namespace&amp;gt;Joomla\Module\Foo&amp;lt;/namespace&amp;gt;&lt;br /&gt;
    &amp;lt;scriptfile&amp;gt;script.php&amp;lt;/scriptfile&amp;gt;&lt;br /&gt;
    &amp;lt;files&amp;gt;&lt;br /&gt;
        &amp;lt;filename module=&amp;quot;mod_foo&amp;quot;&amp;gt;mod_foo.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;Helper&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;filename&amp;gt;mod_foo.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;/files&amp;gt;&lt;br /&gt;
    &amp;lt;config&amp;gt;&lt;br /&gt;
        &amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;domain&amp;quot;&lt;br /&gt;
                    type=&amp;quot;url&amp;quot;&lt;br /&gt;
                    label=&amp;quot;MOD_FOO_FIELD_URL_LABEL&amp;quot;&lt;br /&gt;
                    filter=&amp;quot;url&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;advanced&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;layout&amp;quot;&lt;br /&gt;
                    type=&amp;quot;modulelayout&amp;quot;&lt;br /&gt;
                    label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;&lt;br /&gt;
                    class=&amp;quot;custom-select&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;moduleclass_sfx&amp;quot;&lt;br /&gt;
                    type=&amp;quot;textarea&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_MODULECLASS_SFX_LABEL&amp;quot;&lt;br /&gt;
                    rows=&amp;quot;3&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache&amp;quot;&lt;br /&gt;
                    type=&amp;quot;list&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHING_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;COM_MODULES_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache_time&amp;quot;&lt;br /&gt;
                    type=&amp;quot;number&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHE_TIME_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cachemode&amp;quot;&lt;br /&gt;
                    type=&amp;quot;hidden&amp;quot;&lt;br /&gt;
                    default=&amp;quot;itemid&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;itemid&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
        &amp;lt;/fields&amp;gt;&lt;br /&gt;
    &amp;lt;/config&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Test your module == &amp;lt;!--T:167--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:168--&amp;gt; Now you can zip all files and install them via the Joomla Extension Manager.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:169--&amp;gt; Immediately after the installation, you will see the following information. This you had entered in the script so.&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:moduletutorial14-&amp;lt;translate&amp;gt;&amp;lt;!--T:170--&amp;gt; en&amp;lt;/translate&amp;gt;.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Conclusion == &amp;lt;!--T:171--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:172--&amp;gt; As you can see, Joomla offers you a lot to make your extension easy to use - right from the start.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:173--&amp;gt; You can find boilerplates hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla-extensions/boilerplate/tree/master/module&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:174--&amp;gt; The sample files for this Tutorial can be found hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/astridx/boilerplate/tree/tutorial/tutorial/modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Joomla Updaterː Adding Auto Update - Part 5 == &amp;lt;!--T:175--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Requirements === &amp;lt;!--T:176--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:177--&amp;gt; You need Joomla! 4.x for this tutorial (as of writing currently Joomla! 4.0.0-alpha6-dev)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Joomla Updater === &amp;lt;!--T:178--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:179--&amp;gt; The first thing to do is to read the [[S:MyLanguage/J2.5:Managing_Component_Updates|Managing Component Upgrades with Joomla 2.5 - Part 1]] tutorial to give an idea of how the upgrade process works in Joomlaǃ. Whilst written for 2.5 the process hasn&#039;t changed. Also read [[S:MyLanguage/Deploying_an_Update_Server|Deploying an update server]] - this is what we&#039;ll be implementing in this tutorial.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== File Structure === &amp;lt;!--T:180--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:181--&amp;gt; We will create/change the following files:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:182--&amp;gt; * &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; - The only way to update our existing module is to add in a update server - for example &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/foo_update.xml&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; - into the xml file.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:183--&amp;gt; * &amp;lt;tt&amp;gt;foo_update.xml&amp;lt;/tt&amp;gt; - Then we have to create the XML file for the update server at &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/foo_update.xml&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; to let Joomla know an update is available.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Editing mod_foo.xml ==== &amp;lt;!--T:184--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:185--&amp;gt; To add our update server, we need to insert the following lines in your XML-Fileː&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;updateservers&amp;gt;&lt;br /&gt;
    &amp;lt;server type=&amp;quot;extension&amp;quot; priority=&amp;quot;1&amp;quot; name=&amp;quot;[PROJECT_NAME]&amp;quot;&amp;gt;https://www.example.com/mod_foo.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
&amp;lt;/updateservers&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed mod_foo.xml ==== &amp;lt;!--T:186--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:187--&amp;gt; The complete &amp;lt;tt&amp;gt;mod_foo.xml&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension type=&amp;quot;module&amp;quot; version=&amp;quot;4.0&amp;quot; client=&amp;quot;site&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;MOD_FOO&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;creationDate&amp;gt;[DATE]&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
    &amp;lt;author&amp;gt;[AUTHOR]&amp;lt;/author&amp;gt;&lt;br /&gt;
    &amp;lt;authorEmail&amp;gt;[AUTHOR_EMAIL]&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
    &amp;lt;authorUrl&amp;gt;[AUTHOR_URL]&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
    &amp;lt;copyright&amp;gt;[COPYRIGHT]&amp;lt;/copyright&amp;gt;&lt;br /&gt;
    &amp;lt;license&amp;gt;GNU General Public License version 2 or later; see LICENSE.txt&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;MOD_FOO_XML_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;namespace&amp;gt;Joomla\Module\Foo&amp;lt;/namespace&amp;gt;&lt;br /&gt;
    &amp;lt;files&amp;gt;&lt;br /&gt;
        &amp;lt;filename module=&amp;quot;mod_foo&amp;quot;&amp;gt;mod_foo.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;Helper&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
        &amp;lt;filename&amp;gt;mod_foo.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;/files&amp;gt;&lt;br /&gt;
    &amp;lt;updateservers&amp;gt;&lt;br /&gt;
        &amp;lt;server type=&amp;quot;extension&amp;quot; priority=&amp;quot;1&amp;quot; name=&amp;quot;[PROJECT_NAME]&amp;quot;&amp;gt;https://www.example.com/mod_foo.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;/updateservers&amp;gt;&lt;br /&gt;
    &amp;lt;config&amp;gt;&lt;br /&gt;
        &amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;domain&amp;quot;&lt;br /&gt;
                    type=&amp;quot;url&amp;quot;&lt;br /&gt;
                    label=&amp;quot;MOD_FOO_FIELD_URL_LABEL&amp;quot;&lt;br /&gt;
                    filter=&amp;quot;url&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;fieldset name=&amp;quot;advanced&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;layout&amp;quot;&lt;br /&gt;
                    type=&amp;quot;modulelayout&amp;quot;&lt;br /&gt;
                    label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;&lt;br /&gt;
                    class=&amp;quot;custom-select&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;moduleclass_sfx&amp;quot;&lt;br /&gt;
                    type=&amp;quot;textarea&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_MODULECLASS_SFX_LABEL&amp;quot;&lt;br /&gt;
                    rows=&amp;quot;3&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache&amp;quot;&lt;br /&gt;
                    type=&amp;quot;list&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHING_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;COM_MODULES_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cache_time&amp;quot;&lt;br /&gt;
                    type=&amp;quot;number&amp;quot;&lt;br /&gt;
                    label=&amp;quot;COM_MODULES_FIELD_CACHE_TIME_LABEL&amp;quot;&lt;br /&gt;
                    default=&amp;quot;0&amp;quot;&lt;br /&gt;
                /&amp;gt;&lt;br /&gt;
                &amp;lt;field&lt;br /&gt;
                    name=&amp;quot;cachemode&amp;quot;&lt;br /&gt;
                    type=&amp;quot;hidden&amp;quot;&lt;br /&gt;
                    default=&amp;quot;itemid&amp;quot;&lt;br /&gt;
                &amp;gt;&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;itemid&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
                &amp;lt;/field&amp;gt;&lt;br /&gt;
            &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
        &amp;lt;/fields&amp;gt;&lt;br /&gt;
    &amp;lt;/config&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:188--&amp;gt; So now that Joomlaǃ is searching for updates to our extension - let&#039;s create one to test out our process. But first we need to create the file &amp;lt;tt&amp;gt;foo_update.xml&amp;lt;/tt&amp;gt;. So far we have only described the update server. We do not know yet if there is an update. In the file &amp;lt;tt&amp;gt;foo_update.xml&amp;lt;/tt&amp;gt; we indicate when a new version is published and where it can be downloaded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Creating foo_update.xml === &amp;lt;!--T:189--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:190--&amp;gt; Now we have to create the XML file at &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/foo_update.xml&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; to let Joomla know an update is available.&amp;lt;/translate&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Completed foo_update.xml ==== &amp;lt;!--T:191--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:192--&amp;gt; The complete &amp;lt;tt&amp;gt;foo_update.xml&amp;lt;/tt&amp;gt; file is as follows:&amp;lt;/translate&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;updates&amp;gt;&lt;br /&gt;
    &amp;lt;update&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;Foo&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;description&amp;gt;This is mod_foo 1.0.1&amp;lt;/description&amp;gt;&lt;br /&gt;
        &amp;lt;element&amp;gt;mod_foo&amp;lt;/element&amp;gt;&lt;br /&gt;
        &amp;lt;type&amp;gt;module&amp;lt;/type&amp;gt;&lt;br /&gt;
        &amp;lt;version&amp;gt;1.0.1&amp;lt;/version&amp;gt;&lt;br /&gt;
        &amp;lt;downloads&amp;gt;&lt;br /&gt;
            &amp;lt;downloadurl type=&amp;quot;full&amp;quot; format=&amp;quot;zip&amp;quot;&amp;gt;http://www.example.com/mod_foo_101.zip&amp;lt;/downloadurl&amp;gt;&lt;br /&gt;
        &amp;lt;/downloads&amp;gt;&lt;br /&gt;
        &amp;lt;maintainer&amp;gt;Joomla&amp;lt;/maintainer&amp;gt;&lt;br /&gt;
        &amp;lt;maintainerurl&amp;gt;http://www.example.com&amp;lt;/maintainerurl&amp;gt;&lt;br /&gt;
        &amp;lt;targetplatform name=&amp;quot;joomla&amp;quot; version=&amp;quot;4.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;client&amp;gt;site&amp;lt;/client&amp;gt;&lt;br /&gt;
    &amp;lt;/update&amp;gt;&lt;br /&gt;
&amp;lt;/updates&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:193--&amp;gt; After uploading this file to the address &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/mod_foo.xml&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; the update will be displayed in the Joomla backend.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Test your module update === &amp;lt;!--T:194--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:195--&amp;gt; Create a copy of the module as it is now. Then let&#039;s update the version number to 1.0.1. Now you can zip all files. After that you should load your zip to the URL &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/mod_foo_101.zip&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. Now you can update your module via the Joomla Updater.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Commercial Modules === &amp;lt;!--T:196--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:197--&amp;gt; Note that in our files we have linked to the extensions updates xml file. And from that xml file we have a location for the zip of the module. This means that if someone was to track this backwards they could find the physical source of your modules zip file. If you don&#039;t do like this, you can find a solution in this PRː https://github.com/joomla/joomla-cms/pull/15185 .&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Conclusion === &amp;lt;!--T:198--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:199--&amp;gt; With the Joomlaǃ updater, you can easily reach all users and tell them that there is a new version. Even the update itself is easy.&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:200--&amp;gt; Each extension should use an update server. Especially for security reasons.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:201--&amp;gt; You can find boilerplates hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/joomla-extensions/boilerplate/tree/master/module&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:202--&amp;gt; The sample files for this Tutorial can be found hereː&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://github.com/astridx/boilerplate/tree/tutorial/tutorial/modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Beginner Development{{#translation:}}]]&lt;br /&gt;
[[Category:Tutorials{{#translation:}}]]&lt;br /&gt;
[[Category:Tutorials in a Series{{#translation:}}]]&lt;br /&gt;
[[Category:Development{{#translation:}}]]&lt;br /&gt;
[[Category:Module Development{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.x{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.0{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rjharishabh</name></author>
	</entry>
</feed>