<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://docs.joomla.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://docs.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mvangeest</id>
		<title>Joomla! Documentation - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://docs.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mvangeest"/>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Special:Contributions/Mvangeest"/>
		<updated>2013-05-19T03:44:23Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.3</generator>

	<entry>
		<id>http://docs.joomla.org/Enav/Beginners</id>
		<title>Enav/Beginners</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Enav/Beginners"/>
				<updated>2013-03-17T21:00:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Mvangeest moved page Enav/Beginners to User:Enav/Beginners: Moved page to the User namespace after user request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Enav/Beginners]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:Enav/Beginners</id>
		<title>User:Enav/Beginners</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:Enav/Beginners"/>
				<updated>2013-03-17T21:00:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Mvangeest moved page Enav/Beginners to User:Enav/Beginners: Moved page to the User namespace after user request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to Joomla!, a leading open source Content Management System (CMS) platform. Joomla! is a well-tested, extensible and effective tool supported by a very active and friendly community of developers and users.&lt;br /&gt;
&lt;br /&gt;
This page contain several articles to quickly help you understand the basics of Joomla, and be able to create basic Joomla sites in a short time.&lt;br /&gt;
&lt;br /&gt;
== What is Joomla? ==&lt;br /&gt;
&lt;br /&gt;
If you are a boy from the old school (1990 ish) you may think that web sites still work with a bunch of linked HTML files, Not anymore buddy!, Welcome to century XXI! modern websites runs over Content Management Systems (CMS), this systems runs using dynamic languages like PHP and  databases like MySQL databases, this way a CMS can store and manage huge amount of data like thousand of news articles articles.&lt;br /&gt;
&lt;br /&gt;
So in short Joomla is a very flexible CMS that runs on PHP that uses MySQL databases to store the data and let you create websites with dynamic content that will change and adjust to the context or the configuration parameters you provide.&lt;br /&gt;
&lt;br /&gt;
== Play with it ==&lt;br /&gt;
&lt;br /&gt;
Do you want to get started with Joomla!, but you have no idea where to begin? If so, you have come to the right place. The fastest way to learn about Joomla is to start paying with it right now. Visit the demo page and take few minutes to see the demo content and play with the configurations.&lt;br /&gt;
&lt;br /&gt;
Yes right here---&amp;gt; [http://demo.joomla.org/ Joomla demo page]&lt;br /&gt;
&lt;br /&gt;
The first 2 term you need to learn are &amp;quot;Frontend&amp;quot; and &amp;quot;Backend&amp;quot;, the Frontent is the part that shows your site content and all the funny stuff and the Backend is the part that contains the configuration views and it is also the place where you normally manage (create, edit, update) your content. To access to your Joomla site Backend you just need to add the &amp;quot;/administrators&amp;quot; to your Joomla site path in the browser address bar i.e.: &lt;br /&gt;
&lt;br /&gt;
 www.example.com/adminisrator&lt;br /&gt;
&lt;br /&gt;
Now that you know how Joomla looks and feel in the frontend and backend is time to you to learn what kind of magic you can do with this new tool of yours.&lt;br /&gt;
&lt;br /&gt;
Note: On the demo page you can chose to use a free trial hosting account, when the trial period expired if you chose to contract a paid hosting  account with them, the Joomla! Project will receive a royalty for the transaction, consider this option if you would like to support the project.&lt;br /&gt;
&lt;br /&gt;
== What can i do with it? ==&lt;br /&gt;
&lt;br /&gt;
Joomla is a CMS, a system to manage content, To make a small analogy you can compare Joomla with a computer operative system, for example, on your computer the operative system manages the resources of your computer, also you can install applications to do more things on your computer, in this order of ideas Joomla is the one who is in charge to manage the data and you can install &amp;quot;extensions&amp;quot; to extend and enhance the functions of Joomla. &lt;br /&gt;
&lt;br /&gt;
Joomla comes by default with a bunch of extensions pre-installed and pre-configured to make Joomla works as a News website, but you can manually configure your Joomla site to easily make it works as a:&lt;br /&gt;
&lt;br /&gt;
* Blog site&lt;br /&gt;
* Company or Government site&lt;br /&gt;
* Contact directory&lt;br /&gt;
* Simple product Catalog&lt;br /&gt;
&lt;br /&gt;
Now if your interest is to create more complex sites like:&lt;br /&gt;
&lt;br /&gt;
* eCommerce sites with shopping cart&lt;br /&gt;
* Support sites with forums and ticket systems&lt;br /&gt;
* News sites with paid subscription system and comment systems&lt;br /&gt;
* e-learning sites with paid subscription systems&lt;br /&gt;
&lt;br /&gt;
Then you need to install more Joomla extensions to make your vanilla Joomla site work the way you need. Lots and lots of extensions are for free with no cost at all, and others are extensions commercial, this means that you need to pay a fee to have the right to use them but the normally commercial extensions comes with a tech support deals that will help you save precious time and money, and everybody knows time is gold.&lt;br /&gt;
 &lt;br /&gt;
Here at [http://extensions.joomla.org/ The Joomla Extension Directory] you have thousands of extensions to chose from, take some time to visit the directory and do few searches for the sake to get familiarized with it, you may need to use some more extensions in the future if you decide to [http://www.youtube.com/watch?v=HYtbEmO_JC4 pimp up] your Joomla site.&lt;br /&gt;
&lt;br /&gt;
Maybe a client or your boss is asking you for a web solution with a very specific set of requirements and the information so far does not help you to determine if Joomla is suitable for the job, in order to help you to save some time feel free to visit the Joomla community people and make your questions to humans at:&lt;br /&gt;
&lt;br /&gt;
* The official [http://forum.joomla.org/ Joomla Forums]&lt;br /&gt;
* The official [http://webchat.freenode.net/?channels=joomla ##Joomla] IRC channel (aka chat room)&lt;br /&gt;
* The official [http://www.facebook.com/groups/joomlanospam/ Facebook group]&lt;br /&gt;
&lt;br /&gt;
== Installing Joomla! ==&lt;br /&gt;
&lt;br /&gt;
Now that you had enough fun playing with the Joomla demo site you may want to go the next level and start messing around with extensions and templates to see how they do in your very own local test server or your rented web server.&lt;br /&gt;
&lt;br /&gt;
Follow one of this tutorials that suits you better.&lt;br /&gt;
&lt;br /&gt;
* [[Installing Joomla on a rented web server]]&lt;br /&gt;
* [[Installing Joomla on a local web server]]&lt;br /&gt;
&lt;br /&gt;
Note: This tutorials are targeted for non-expert audience, if you need more detailed and advanced information go to the [[developers | Developers page]].&lt;br /&gt;
&lt;br /&gt;
== Understanding How Joomla Works ==&lt;br /&gt;
&lt;br /&gt;
To keep this introductory article as short and friendly as possible we can say that Joomla have tow main parts, the Frontend and the Backend, as explained before the Frontend shows the site content that any visitor can see and the Backend is the administrative part that is normally restricted for users with privileges such as administrators.&lt;br /&gt;
&lt;br /&gt;
Taking a quick look at the average website we can conclude that most of them have this basic layout:&lt;br /&gt;
&lt;br /&gt;
* Header&lt;br /&gt;
* Main menu&lt;br /&gt;
* Main content&lt;br /&gt;
* Side content (left or right of main content)&lt;br /&gt;
* Footer&lt;br /&gt;
&lt;br /&gt;
In Joomla a template is the one in charge to determine the layout and disposition of those chunks of data described in the previous list, also a template is the one used to determine the font types, colors, styles and the presentation in general.&lt;br /&gt;
&lt;br /&gt;
Now you may wonder what is used to render each of those chunks of data, and the answer is modules and components. Joomla depends on extensions (components, modules, plugins) to render chunks of information that have certain characteristics, for example, for small and compact chunks of data like header, main menu, side content and footer Joomla uses Modules who are meant to be use for that kind of data, but for the main content of the page that tend to be a very large and dynamic chunk of data, the element in use is the component.&lt;br /&gt;
&lt;br /&gt;
There are several kinds of plugins and they are categorized depending on the job they do, For example, A content plugin can be used to manipulate data before it is rendered on the page, an authentication plugin is a plugin that can give you the ability to login in a Joomla site using Google accounts or Facebook accounts.&lt;br /&gt;
&lt;br /&gt;
In resume:&lt;br /&gt;
&lt;br /&gt;
* Templates: Defines the site layout and visual styles.&lt;br /&gt;
* Component: Used to render large chucks of dynamic data.&lt;br /&gt;
* Modules: Used to render compact and normally static chunks of data.&lt;br /&gt;
* Plugins: They are used to extend the Joomla functions and manipulate data.&lt;br /&gt;
&lt;br /&gt;
Both the frontend and the backend uses templates and extensions. Is a normal thing that many Joomla sites uses different templates on the frontend and leave the backend with the default template but you can always install a custom 3rd party template for the backend to have a different look and feel.&lt;br /&gt;
&lt;br /&gt;
Note: Since most developers creates extensions based on how the default administrative template looks and work you may experience bugs and visual glitches with 3rd party administrative templates, so we recommend the use of the default Joomla template, most tutorials and documentation screenshots in general are based on the default Joomla administrative template.&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Manifest_files</id>
		<title>Manifest files</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Manifest_files"/>
				<updated>2013-01-22T23:00:42Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: /* Root element */ Corrected and (partly) updated information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{incomplete}}&lt;br /&gt;
{{RightTOC}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
Within Joomla there are manifest files for all of the extensions. These files include the general installation information as well as parameters for the configuration of the [[extension]] itself. Since Joomla! 1.6 {{JVer|1.6}}, there are very few differences between the manifest file formats for the different [[Extension types (technical definitions)|types of extensions]], allowing each type to access the full power of the Joomla! installer.&lt;br /&gt;
&lt;br /&gt;
==Naming conventions==&lt;br /&gt;
The file must be named &amp;lt;tt&amp;gt;manifest.xml&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;lt;extension_name&amp;gt;.xml&amp;lt;/tt&amp;gt; and located in the root directory of the installation package.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&lt;br /&gt;
=== Root element ===&lt;br /&gt;
The primary tag of the installation file is: &lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&amp;lt;extension&amp;gt;&amp;lt;/extension&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This starting and closing tags are now valid for all extensions. The new tag &amp;lt;code&amp;gt;&amp;lt;extension&amp;gt;&amp;lt;/code&amp;gt; replaces the old &amp;lt;code&amp;gt;&amp;lt;install&amp;gt;&amp;lt;/install&amp;gt;&amp;lt;/code&amp;gt; from Joomla {{JVer|1.5}}. The following attributes are allowed within the tag:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 150px&amp;quot; | Attribute || style=&amp;quot;width: 150px&amp;quot; | Values || Applicable&amp;amp;nbsp;to || Description&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;lt;code&amp;gt;component&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;library&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;plugin&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; || All extensions&lt;br /&gt;
| This attribute describes the type of the extension for the installer. Based on this type further requirements to sub-tags apply.&lt;br /&gt;
|-&lt;br /&gt;
| version&lt;br /&gt;
| &amp;lt;code&amp;gt;2.5&amp;lt;/code&amp;gt; || All extensions&lt;br /&gt;
| String that identifies the version of Joomla for which this extension is developed.&lt;br /&gt;
|-&lt;br /&gt;
| method&lt;br /&gt;
| &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;upgrade&amp;lt;/code&amp;gt; || All extensions&lt;br /&gt;
| The default value &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; will be also used if the method attribute is not used. The &amp;lt;code&amp;gt;install&amp;lt;/code&amp;gt; value means the installer will gracefully stop if it finds any existing file/folder of the new extension.&lt;br /&gt;
|-&lt;br /&gt;
| client&lt;br /&gt;
| &amp;lt;code&amp;gt;site&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;administrator&amp;lt;/code&amp;gt; || Modules&lt;br /&gt;
| The client attribute allows you to specify for which application client the new module is available.&lt;br /&gt;
|-&lt;br /&gt;
| group&lt;br /&gt;
| ''string'' || Plugins&lt;br /&gt;
| The group name specifies for which group of plugins the new plugin is available. The existing groups are the folder names within the directory &amp;lt;tt&amp;gt;/plugins&amp;lt;/tt&amp;gt;. The installer will create new folder names for group names that do not exist yet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The following elements can be used to insert metadata. None of these elements are required; if they are present, they must be a child of the root element.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; raw component name (e.g. &amp;lt;code&amp;gt;com_banners&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;author&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; author's name (e.g. &amp;lt;code&amp;gt;Joomla! Project&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;creationDate&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; date of creation or release (e.g. &amp;lt;code&amp;gt;April 2006&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;copyright&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; a copyright statement (e.g. &amp;lt;code&amp;gt;(C) 2005 - 2011 Open Source Matters. All rights reserved.&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;license&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; a license statement (e.g. &amp;lt;code&amp;gt;NU General Public License version 2 or later; see LICENSE.txt&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;authorEmail&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; author's email address (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;admin@joomla.org&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;authorUrl&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; URL to the author's website (e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;www.joomla.org&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; the version number of the extension (e.g. &amp;lt;code&amp;gt;1.6.0&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;description&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;ndash; the description of the component. This is a translatable field. (e.g. &amp;lt;code&amp;gt;COM_BANNERS_XML_DESCRIPTION&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Front-end files ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;files folder=&amp;quot;from-folder&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;example.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;examples&amp;lt;/folder&amp;gt;&lt;br /&gt;
	&amp;lt;/files&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Files to copy to the front-end directory should be placed in the &amp;lt;code&amp;gt;&amp;lt;files&amp;gt;&amp;lt;/code&amp;gt; element. You can use the optional &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; attribute to specify a directory '''in the ZIP package''' to copy '''from'''. Each file to copy must be represented by a &amp;lt;code&amp;gt;&amp;lt;filename&amp;gt;&amp;lt;/code&amp;gt; element. If you want to copy an entire folder at once, you can define it as a &amp;lt;code&amp;gt;&amp;lt;folder&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Media files ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;gt;&lt;br /&gt;
	&amp;lt;media folder=&amp;quot;media&amp;quot; destination=&amp;quot;com_example&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;com_example_logo.png&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;css&amp;lt;/folder&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;js&amp;lt;/folder&amp;gt;&lt;br /&gt;
	&amp;lt;/media&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example will copy the file(s) (&amp;lt;tt&amp;gt;/media/com_example_logo.png&amp;lt;/tt&amp;gt;) and folders ( &amp;lt;tt&amp;gt;/media/css/&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/media/js/&amp;lt;/tt&amp;gt; ) listed to &amp;lt;tt&amp;gt;/media/com_example/&amp;lt;/tt&amp;gt;, creating the &amp;lt;tt&amp;gt;com_example&amp;lt;/tt&amp;gt; folder if required. You can use the optional &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; attribute to specify a directory '''in the ZIP package''' to copy '''from''' (in this case, &amp;lt;tt&amp;gt;media&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Extensions should be storing assets they need to be web accessible (JS, CSS, images etc) in &amp;lt;code&amp;gt;media&amp;lt;/code&amp;gt;. Amongst other things this feature was added as step in the progression to multi-site support and the eventual move of code files (PHP) out of the web accessible areas of the server.&lt;br /&gt;
&lt;br /&gt;
Ref:&lt;br /&gt;
* [https://groups.google.com/forum/#!msg/joomla-dev-cms/4CAASJqFY-k/PvPj14gP29EJ Google Groups - joomla-dev-cms thread]&lt;br /&gt;
* [https://groups.google.com/forum/#!msg/joomla-dev-cms/uNmhX98sKbE/p8p68Jke680J Google Groups - joomla-dev-cms thread]&lt;br /&gt;
&lt;br /&gt;
=== Administration section ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;administration&amp;gt;&lt;br /&gt;
		&amp;lt;!-- various elements --&amp;gt;&lt;br /&gt;
	&amp;lt;/administration&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The administration section is defined in the &amp;lt;code&amp;gt;&amp;lt;administration&amp;gt;&amp;lt;/code&amp;gt; element. Since only [[Component|components]] apply to both the [[Site (Application)|site]] and the [[Administrator (Application)|administrator]], '''only component manifests can include this element'''.&lt;br /&gt;
&lt;br /&gt;
==== Back-end files ====&lt;br /&gt;
&lt;br /&gt;
Files to copy to the back-end directory should be placed in the &amp;lt;code&amp;gt;&amp;lt;files&amp;gt;&amp;lt;/code&amp;gt; element under the &amp;lt;code&amp;gt;&amp;lt;administration&amp;gt;&amp;lt;/code&amp;gt;. You can use the optional &amp;lt;code&amp;gt;folder&amp;lt;/code&amp;gt; attribute to specify a directory '''in the ZIP package''' to copy '''from'''. See ''Front-end files'' for further rules.&lt;br /&gt;
&lt;br /&gt;
==== Menu links and submenus ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;menu&amp;gt;COM_EXAMPLE&amp;lt;/menu&amp;gt;&lt;br /&gt;
	&amp;lt;submenu&amp;gt;&lt;br /&gt;
		&amp;lt;menu link=&amp;quot;anoption=avalue&amp;quot;&amp;gt;COM_EXAMPLE_SUBMENU_ANOPTION&amp;lt;/menu&amp;gt;&lt;br /&gt;
		&amp;lt;menu view=&amp;quot;viewname&amp;quot;&amp;gt;COM_EXAMPLE_SUBMENU_VIEWNAME&amp;lt;/menu&amp;gt;&lt;br /&gt;
	&amp;lt;/submenu&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The text for the main menu item for the component is defined in the &amp;lt;code&amp;gt;&amp;lt;menu&amp;gt;&amp;lt;/code&amp;gt; item, a child of &amp;lt;code&amp;gt;&amp;lt;administration&amp;gt;&amp;lt;/code&amp;gt;. A &amp;lt;code&amp;gt;&amp;lt;submenu&amp;gt;&amp;lt;/code&amp;gt; element may also be present (also a child of &amp;lt;code&amp;gt;&amp;lt;administration&amp;gt;&amp;lt;/code&amp;gt;), which may contain more menu items defined by &amp;lt;code&amp;gt;&amp;lt;menu&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Additionally, each &amp;lt;code&amp;gt;&amp;lt;menu&amp;gt;&amp;lt;/code&amp;gt; item can define the following attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 150px&amp;quot; | Attribute || Description&lt;br /&gt;
|-&lt;br /&gt;
| link || A link to send the user to when the menu item is clicked&lt;br /&gt;
|-&lt;br /&gt;
| img || The (relative) path to an image (16x16 pixels) to appear beside the menu item. &lt;br /&gt;
&amp;lt;u&amp;gt;Must be an url compatible as a file too (e.g. no spaces) !&amp;lt;/u&amp;gt;&lt;br /&gt;
| alt ||&lt;br /&gt;
|-&lt;br /&gt;
| ''string'' || An URL parameter to add to the link.  For example, &amp;lt;code&amp;gt;&amp;lt;menu view=&amp;quot;cpanel&amp;quot;&amp;gt;COM_EXAMPLE&amp;lt;/menu&amp;gt;&amp;lt;/code&amp;gt; in com_example's XML manifest would cause the URL of the menu item to be &amp;lt;tt&amp;gt;index.php?option=com_example&amp;amp;view=cpanel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value inside the tag is the menu's label. Unlike Joomla! 1.5, you can not use a natural language string. For example, if you would enter &amp;quot;Example Component&amp;quot; instead of COM_EXAMPLE, it would result in your component name appearing as example-component in the menu and you would be unable to provide a translation. In order to provide a translation you need to create a file named en-GB.com_example.sys.ini in administrator/languages/en-GB (you can use the manifest's &amp;lt;code&amp;gt;&amp;lt;languages&amp;gt;&amp;lt;/code&amp;gt; tag to copy it during installation) or in administrator/components/com_example/language/en-GB. In the latter case, you must not include the translation file in the &amp;lt;code&amp;gt;&amp;lt;languages&amp;gt;&amp;lt;/code&amp;gt; tag. As long as you have placed the language directory in your &amp;lt;code&amp;gt;&amp;lt;files&amp;gt;&amp;lt;/code&amp;gt; tag, it will be copied along when the component is being installed.&lt;br /&gt;
&lt;br /&gt;
The contents of that file should be:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
COM_EXAMPLE=&amp;quot;Example Component&amp;quot;&lt;br /&gt;
COM_EXAMPLE_SUBMENU_ANOPTION=&amp;quot;Another Option&amp;quot;&lt;br /&gt;
COM_EXAMPLE_SUBMENU_VIEWNAME=&amp;quot;Another View&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that the language string must be enclosed in double quotes, as per Joomla!'s translation standards. Important note: Joomla! 1.6 and later sorts the Component menu items based on the actual translation of the key you supply in your XML manifest. This means that the sorting order is correct no matter what you call your translation key and no matter which language the site is being displayed in. Essentially, Joomla! 1.6 fixed the wrong sorting of the Components menu for the majority (non-English speaking!) of Joomla! users experienced under Joomla! 1.5.&lt;br /&gt;
&lt;br /&gt;
{{Needsinfo|In Platform 11.1 no alt attribute processed and if link provide in menu tag other provided attributes were ignore. The other tags are task, view, controller, act, layout, sub. Please confirm this, please.}}&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
{{warning|Components '''do not support''' configuration definitions '''in the manifest'''. This is a way implemented in Joomla! 1.5. They can define configuration options for multiple levels using [[Component configuration metadata]].}}&lt;br /&gt;
The &amp;lt;code&amp;gt;&amp;lt;config&amp;gt;&amp;lt;/code&amp;gt; element, a child of the root, describes the configuration options for the extension. If applicable, the options will be shown by the appropriate Manager (Plugin Manager, Module Manager or Template Manager). '''Configuration options can also be defined in a separate file named &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt;. Its root element should be &amp;lt;code&amp;gt;&amp;lt;config&amp;gt;&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
{{:XML JForm form definitions}}&lt;br /&gt;
&lt;br /&gt;
=== SQL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;install folder=&amp;quot;admin&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;sql&amp;gt;&lt;br /&gt;
            &amp;lt;file driver=&amp;quot;mysql&amp;quot; charset=&amp;quot;utf8&amp;quot;&amp;gt;sql/example.install.sql&amp;lt;/file&amp;gt;&lt;br /&gt;
        &amp;lt;/sql&amp;gt;&lt;br /&gt;
    &amp;lt;/install&amp;gt;&lt;br /&gt;
    &amp;lt;uninstall folder=&amp;quot;admin&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;sql&amp;gt;&lt;br /&gt;
            &amp;lt;file driver=&amp;quot;mysql&amp;quot; charset=&amp;quot;utf8&amp;quot;&amp;gt;sql/example.uninstall.sql&amp;lt;/file&amp;gt;&lt;br /&gt;
        &amp;lt;/sql&amp;gt;&lt;br /&gt;
    &amp;lt;/uninstall&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In above example, we put sql files in &amp;quot;admin/sql&amp;quot; folder of installation package. You have to include &amp;quot;sql&amp;quot; folder in administration files.&lt;br /&gt;
&lt;br /&gt;
You can execute SQL during installation and/or uninstallation using the &amp;lt;code&amp;gt;&amp;lt;install&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;uninstall&amp;gt;&amp;lt;/code&amp;gt; elements, respectively. An &amp;lt;code&amp;gt;&amp;lt;sql&amp;gt;&amp;lt;/code&amp;gt; element should appear as a child of these elements. &amp;lt;code&amp;gt;&amp;lt;sql&amp;gt;&amp;lt;/code&amp;gt; can contain any number of &amp;lt;code&amp;gt;&amp;lt;file&amp;gt;&amp;lt;/code&amp;gt; elements, each defining a single SQL file to execute. Their database driver types are described by the &amp;lt;code&amp;gt;driver&amp;lt;/code&amp;gt; attribute, their character sets by the &amp;lt;code&amp;gt;charset&amp;lt;/code&amp;gt; attribute.&lt;br /&gt;
&lt;br /&gt;
==== Update of the SQL schema ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;update&amp;gt;&lt;br /&gt;
		&amp;lt;schemas&amp;gt;&lt;br /&gt;
			&amp;lt;schemapath type=&amp;quot;mysql&amp;quot;&amp;gt;sql/updates/mysql&amp;lt;/schemapath&amp;gt;&lt;br /&gt;
			&amp;lt;schemapath type=&amp;quot;sqlsrv&amp;quot;&amp;gt;sql/updates/sqlsrv&amp;lt;/schemapath&amp;gt;&lt;br /&gt;
		&amp;lt;/schemas&amp;gt;&lt;br /&gt;
	&amp;lt;/update&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since 1.6, there is also an &amp;lt;code&amp;gt;&amp;lt;update&amp;gt;&amp;lt;/code&amp;gt; tag, which allows to provide a series of SQL files to update the current schema.&lt;br /&gt;
&lt;br /&gt;
=== Language files ===&lt;br /&gt;
In Joomla! 1.5, we put extension language files in Joomla! main language file, using &amp;lt;languages&amp;gt;..&amp;lt;/languages&amp;gt; tag as shown below. '''This tag considered to be deprecated since Joomla! 1.6.''' We encourage you to put extension 's language files in extension folder and Joomla! is responsible for loading of required language files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Joomla! 1.5 language tag, deprecated since Joomla! 1.6 --&amp;gt;&lt;br /&gt;
&amp;lt;languages folder=&amp;quot;langfiles&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;en-GB.com_example.ini&amp;lt;/language&amp;gt;&lt;br /&gt;
&amp;lt;/languages&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Storing extension language files in extension folder, you gain benefit when removing some language from Joomla! installation. As your language files were not removed, when reinstall the language again you can use that files without install them again.&lt;br /&gt;
&lt;br /&gt;
The structure of language folder for frontend and backend is the same. You put them in &amp;lt;language&amp;gt; tag of your folder e.g. language/en-GB/. You have to specify these folders in front-end and back-end files too.&lt;br /&gt;
&lt;br /&gt;
During development you can turn on language debuggin in Joomla! global configuration. So you can investigate if the problems exists.&lt;br /&gt;
&lt;br /&gt;
=== Script file ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;scriptfile&amp;gt;example.script.php&amp;lt;/scriptfile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An optional '''script file''' (PHP code that is run before, during and/or after installation, uninstallation and upgrading) can be defined using a &amp;lt;code&amp;gt;&amp;lt;scriptfile&amp;gt;&amp;lt;/code&amp;gt; element. This file should contain a class named &amp;quot;&amp;lt;element_name&amp;gt;IntallerScript&amp;quot; where &amp;lt;element_name&amp;gt; is the name of your extension (e.g. com_componentname, mod_modulename, etc.). Plugins requires to state the group (e.g. plgsystempluginname). The structure of the class is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class com_componentnameInstallerScript&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 */&lt;br /&gt;
	public function __constructor(JAdapterInstance $adapter);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called before any type of action&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   string  $route  Which action is happening (install|uninstall|discover_install)&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success&lt;br /&gt;
	 */&lt;br /&gt;
	public function preflight($route, JAdapterInstance $adapter);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called after any type of action&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   string  $route  Which action is happening (install|uninstall|discover_install)&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success&lt;br /&gt;
	 */&lt;br /&gt;
	public function postflight($route, JAdapterInstance $adapter);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called on installation&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success&lt;br /&gt;
	 */&lt;br /&gt;
	public function install(JAdapterInstance $adapter);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called on update&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success&lt;br /&gt;
	 */&lt;br /&gt;
	public function update(JAdapterInstance $adapter);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called on uninstallation&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   JAdapterInstance  $adapter  The object responsible for running this script&lt;br /&gt;
	 */&lt;br /&gt;
	public function uninstall(JAdapterInstance $adapter);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update servers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&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;Extension Update Site&amp;quot;&amp;gt;http://example.com/extension.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
        &amp;lt;server type=&amp;quot;collection&amp;quot; priority=&amp;quot;2&amp;quot; name=&amp;quot;Collection Update Site&amp;quot;&amp;gt;http://example.com/collection.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;/updateservers&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update servers can be defined in the &amp;lt;code&amp;gt;&amp;lt;updateservers&amp;gt;&amp;lt;/code&amp;gt; element, a child of the root. This element may contain one or more &amp;lt;code&amp;gt;&amp;lt;server&amp;gt;&amp;lt;/code&amp;gt; element, each describing a location to fetch updates from. Each &amp;lt;code&amp;gt;&amp;lt;server&amp;gt;&amp;lt;/code&amp;gt; item can define the following attributes:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 150px&amp;quot; | Attribute || style=&amp;quot;width: 150px&amp;quot; | Values || Description&lt;br /&gt;
|-&lt;br /&gt;
| type || &amp;lt;code&amp;gt;extension&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;collection&amp;lt;/code&amp;gt; || The update server type&lt;br /&gt;
|-&lt;br /&gt;
| priority || ''integer'' || The priority of the update server&lt;br /&gt;
|-&lt;br /&gt;
| name || ''string'' || The name of the update server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
For a real-life example, see [http://joomlacode.org/gf/project/joomla/scmsvn/?action=browse&amp;amp;path=%2Fdevelopment%2Ftags%2F1.6.x%2F1.6.5%2Fadministrator%2Fcomponents%2Fcom_banners%2Fbanners.xml&amp;amp;view=markup the manifest of the Banner component in version 1.6.5].&lt;br /&gt;
&lt;br /&gt;
The Joomla testing process uses several extensions to test whether the installer works correctly. The latest versions of the manifests of these extensions are:&lt;br /&gt;
&lt;br /&gt;
* [http://svn.joomla.org/project/cms/development/trunk/tests/_data/installer_packages/com_alpha/alpha.xml com_alpha manifest]&lt;br /&gt;
* [http://svn.joomla.org/project/cms/development/trunk/tests/_data/installer_packages/mod_alpha/mod_alpha.xml mod_alpha manifest]&lt;br /&gt;
* [http://svn.joomla.org/project/cms/development/trunk/tests/_data/installer_packages/plg_system_alpha/alpha.xml plg_system_alpha manifest]&lt;br /&gt;
* [http://svn.joomla.org/project/cms/development/trunk/tests/_data/installer_packages/tpl_simple/templateDetails.xml tpl_simple manifest]&lt;br /&gt;
* [http://svn.joomla.org/project/cms/development/trunk/tests/_data/installer_packages/lng_xx-XX/xx-XX.xml lng_xx-XX manifest]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
*[[User:akede|Alex Kempkens]]&lt;br /&gt;
*[[User:dperaza|Daniel Peraza]]&lt;br /&gt;
*[[User:nikosdion|Nicholas K. Dionysopoulos]]&lt;br /&gt;
*[[User:mrs.siam|Prasit Gebsaap]]&lt;br /&gt;
*[[User:cppl|Craig Phillips]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extension development]]&lt;br /&gt;
[[Category:Specifications]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Release_and_support_cycle</id>
		<title>Release and support cycle</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Release_and_support_cycle"/>
				<updated>2013-01-20T20:55:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Fixed numbering inconsistencies - please be careful when editing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla! is developed using a fixed release cycle. '''Every six months''', the Joomla! Project releases a new ''minor'' or ''major'' version of Joomla!. Joomla!'s version format is:&lt;br /&gt;
:{{dablink|&amp;lt;tt&amp;gt;[major].[minor].[maintenance]&amp;lt;/tt&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Each version of Joomla! is supported by the Joomla! Project for a limited amount of time. There are two classifications for support: short term support (STS) and long term support (LTS). Every '''fourth''' release will be assigned long term support.&lt;br /&gt;
&lt;br /&gt;
:*'''STS (short term support)''' releases are supported for '''seven months'''. Their support ends one month after the next release of Joomla is released.  They are one click upgrades to the next STS or LTS version.&lt;br /&gt;
&lt;br /&gt;
:*'''LTS (long term support)''' releases are supported for '''twenty-seven months'''.&lt;br /&gt;
&lt;br /&gt;
Please note that both STS and LTS releases, once they have reached the ''GA (General Availability)'' status, are fully functional and ready to be used in production environment. The disadvantage of using STS releases is that you will need to update your installation of Joomla! every six months, while the advantage is that you will have access to new features and extensions earlier.&lt;br /&gt;
&lt;br /&gt;
Generally, the first STS release after an LTS release indicates the beginning of a new ''major release cycle''. This STS release introduces fundamentally new features and changes that break compatibility with the previous LTS. Two more STS releases follow (usually compatible with the first STS release), and the release cycle is finished by the release of an LTS release which finalizes the work of the three STS releases. The four releases in one cycle will usually be numbered &amp;lt;tt&amp;gt;[major].0&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;[major].1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;[major].2&amp;lt;/tt&amp;gt; (STS) and &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; (LTS). For example, the STS release 3.0 will include breaking changes from 2.5, and 3.5 will include matured versions of the changes in 3.0, 3.1 and 3.2.&lt;br /&gt;
&lt;br /&gt;
Usually, there will be a migration path (an officially supported way of migrating to the next version) between two LTS releases (from &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[next major].5&amp;lt;/tt&amp;gt;) and between an LTS release and the STS releases in its major release cycle (from &amp;lt;tt&amp;gt;[major].2&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt;, for example), but not necessarily to the '''following''' STS releases (from &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[next major].0&amp;lt;/tt&amp;gt;). In the case of 1.5 to 2.5 (LTS to LTS), for example, there is a migration path. Note that in the case of 2.5 to 3.0 (LTS to STS), there is also built-in migration path, since the changes aren't too incompatible.&lt;br /&gt;
&lt;br /&gt;
For more information, see [http://developer.joomla.org/strategy.html the official Development Strategy].&lt;br /&gt;
&lt;br /&gt;
The latest STS version documented on this Wiki is {{CurrentSTSVer}} (see [[:Category:Joomla! {{CurrentSTSVer|minor}}]]). The latest LTS version documented on this Wiki is {{CurrentLTSVer}} (see [[:Category:Joomla! {{CurrentLTSVer|minor}}]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J1.5:Upgrading_1.5_from_an_existing_1.5x_version</id>
		<title>J1.5:Upgrading 1.5 from an existing 1.5x version</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J1.5:Upgrading_1.5_from_an_existing_1.5x_version"/>
				<updated>2013-01-19T23:10:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: /* Step 1: Download the upgrade file */ Updated download link and added link to package list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{upgrade-intro}}&lt;br /&gt;
&lt;br /&gt;
For some basic information on patching and migrating, see [[Upgrading and Migrating FAQs]] and [[Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
You can also use a Joomla! extension to automate the process of loading version updates. See [http://extensions.joomla.org/extensions/core-enhancements/installers/9332 Update Manager for Joomla!] for more information. &lt;br /&gt;
&lt;br /&gt;
Review the release notes for the new version.&lt;br /&gt;
&lt;br /&gt;
When upgrading from a version that is not the most recent, review [http://www.joomla.org/announcements/release-news release notes for the prior releases.]&lt;br /&gt;
&lt;br /&gt;
==Step 1: Download the upgrade file==&lt;br /&gt;
&lt;br /&gt;
To download the most recent patch package and to obtain the MD5 hash:&lt;br /&gt;
&lt;br /&gt;
* Visit the [http://joomlacode.org/gf/project/joomla/frs/?action=index release download index].&lt;br /&gt;
* Find the correct update file. The Joomla 1.5 downloads are located at the bottom of the page.&lt;br /&gt;
** If you are on the version ''prior to the current one'', use the file that updates from the prior version to the current version (for example,  [http://joomlacode.org/gf/download/frsrelease/16891/73387/Joomla_1.5.25_to_1.5.26-Stable-Patch_Package.zip Joomla_1.5.25_to_1.5.26-Stable-Patch_Package]).&lt;br /&gt;
** If you are on an ''older'' version, use the 1.5.0 to current version file (for example, [http://joomlacode.org/gf/download/frsrelease/16891/73384/Joomla_1.5.0_to_1.5.26-Stable-Patch_Package.zip Joomla_1.5.0_to_1.5.26-Stable-Patch_Package]). &lt;br /&gt;
** Select the archive format (zip, tar.gz or tar.bz2) that is most convenient for you. &lt;br /&gt;
* Verify the download using the MD5 hash listed in the right column on the same line as the package you selected.&lt;br /&gt;
&lt;br /&gt;
If you have questions about these instructions, read the ''Additional Information'' below this table.&lt;br /&gt;
&lt;br /&gt;
'''Additional information:'''&lt;br /&gt;
&lt;br /&gt;
{{Ambox|image=notice|text=[[Chunk:patch|What is a patch?]]|style=width:400px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Ambox|image=notice|text=[[Unpacking a package file|Which package format should I use?]]|style=width:400px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Ambox|image=notice|text=[[How to determine a package checksum|How do I use the MD5 hash to check the package?]]|style=width:400px}}&lt;br /&gt;
&lt;br /&gt;
==Step 2: Backup your site==&lt;br /&gt;
Before you actually upgrade, you really should make a backup of your site. Backup your existing Joomla site files and store all the files and database in case something gets messed up, you wont have any problem reverting back.&lt;br /&gt;
&lt;br /&gt;
All upgrades should be first tested on a copy of your site before being applied to a live site.&lt;br /&gt;
&lt;br /&gt;
==Step 3: Install the upgrade file==&lt;br /&gt;
{{installing a package file}}&lt;br /&gt;
&lt;br /&gt;
==Step 4: Check your live site to make sure it is working correctly==&lt;br /&gt;
Don't assume that the upgrade will work flawlessly just because the test upgrade worked.  Check to make sure that nothing untoward has happened.  It could be that differences between the live site and test site platforms will bring out a problem that you did not notice during testing.  If you find a problem and it cannot be resolved quickly you might have to rollback the upgrade using the backup copy you created in step 2.&lt;br /&gt;
&lt;br /&gt;
Hopefully all will be well and you can relax.  If you have any questions before, during, or after the upgrade then please ask them on the [http://forum.joomla.org/index.php/board,430.0.html Joomla! 1.5 Migrating and Upgrading Forum].&lt;br /&gt;
&lt;br /&gt;
Return to [[Upgrade Instructions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Upgrading]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Supporting_SEF_URLs_in_your_component</id>
		<title>Supporting SEF URLs in your component</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Supporting_SEF_URLs_in_your_component"/>
				<updated>2012-11-25T18:17:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added information and removed Incomplete template - this page is not complete, but contains enough information to be useful&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{:Search Engine Friendly URLs}}&lt;br /&gt;
In Joomla!, each [[component]] is responsible for handling its own SEF URLs. Therefore, as the [[Developers|developer]] of a component, you will have to create your own '''router''' to allow your component to use SEF URLs.&lt;br /&gt;
&lt;br /&gt;
== The Concept ==&lt;br /&gt;
&lt;br /&gt;
Assuming you are following standard development practices, your component is probably using &amp;quot;system URLs&amp;quot; that look a lot like &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, and your goal is to transform this into &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. As the developer, you have two tasks: signalling the system that certain pieces of text are URLs and need to be transformed, and explaining the system how to transform URLs.&lt;br /&gt;
&lt;br /&gt;
=== Applying &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
It is difficult and inefficient for Joomla! to figure out which parts of your component's output are URLs. To support SEF URLs, you will need to change URL-generating code so that it applies &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; before outputting the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo JRoute::_('index.php?view=article&amp;amp;id=1&amp;amp;catid=20');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that it is possible to leave out the parameters &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; defaults to the name of the component currently being executed, and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; defaults to the current menu item's ID.&lt;br /&gt;
&lt;br /&gt;
In general, you should only apply this to URLs that users and/or search engines are able to see. For example, there is no need to transform URLs used in redirects that immediately result in other redirects.&lt;br /&gt;
&lt;br /&gt;
If the user turns off SEF URLs in the site's settings, &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; will produce working non-SEF URLs without any changes to the code.&lt;br /&gt;
&lt;br /&gt;
=== Writing a router ===&lt;br /&gt;
&lt;br /&gt;
You'll also need to write a router, which is a single file with two functions that convert system URLs to and from SEF URLs. This file needs to be placed at &amp;lt;tt&amp;gt;/components/com_yourcomponent/router.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first function, &amp;lt;code&amp;gt;[componentname]BuildRoute(&amp;amp;$query)&amp;lt;/code&amp;gt;, must transform an array of URL parameters into an array of segments that will form the SEF URL. Schematically, the transformation works as follows:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt;, called by your component or any other extension&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentBuildRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal route building (for display)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second function, &amp;lt;code&amp;gt;[componentname]ParseRoute($segments)&amp;lt;/code&amp;gt;, must transform an array of segments back into an array of URL parameters. Schematically:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal route parsing&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentParseRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two functions must cooperate in such a way that the original URL can be reconstructed. You can think of &amp;lt;code&amp;gt;BuildRoute&amp;lt;/code&amp;gt; as a form of [[wikipedia:Encoding|encoding]] and &amp;lt;code&amp;gt;ParseRoute&amp;lt;/code&amp;gt; as the corresponding decoding. When the original URL isn't properly reproduced, your component will stop working.&lt;br /&gt;
&lt;br /&gt;
== Preparing Your Data for Routing ==&lt;br /&gt;
&lt;br /&gt;
=== The Alias ===&lt;br /&gt;
&lt;br /&gt;
The first step is the generation of the so called alias. The alias is used in the URL instead of the title (the alias is the text you want to have in the URL). The alias has to be URI safe, which means accented UTF­8 characters are replaced by their ASCII­7 equivalents, white spaces by hyphens, etc.&lt;br /&gt;
&lt;br /&gt;
The alias can be defined by the user, but you should ensure that the above requirements for a URL safe alias are met. A good way to do so is to use the JTable::check() method during the save process. Have a look at this example code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function check()&lt;br /&gt;
{&lt;br /&gt;
    jimport( 'joomla.filter.output' );&lt;br /&gt;
    if(empty($this-&amp;gt;alias)) {&lt;br /&gt;
	    $this-&amp;gt;alias = $this-&amp;gt;title;&lt;br /&gt;
    }&lt;br /&gt;
    $this-&amp;gt;alias = JFilterOutput::stringURLSafe($this-&amp;gt;alias);&lt;br /&gt;
&lt;br /&gt;
    /* All your other checks */&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the alias field is empty the title will be used as alias. Then the alias will be made URLSafe using the &amp;lt;code&amp;gt;JFilterOutput::stringURLSafe()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== The Slug ===&lt;br /&gt;
&lt;br /&gt;
Continuing with the same example, the &amp;quot;slug&amp;quot; - &amp;quot;1­:welcome­-to­-joomla&amp;quot; has two parts. The first part is the article identifier (id) and the second is the alias. They are separated by a colon. These two elements were combined during the database query in the model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$query = 'SELECT a.*, '.&lt;br /&gt;
         'CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(&amp;quot;:&amp;quot;, a.id, a.alias) ELSE a.id END as slug,'&lt;br /&gt;
         /*...*/;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this step the slug is used instead of the id.&lt;br /&gt;
&lt;br /&gt;
== Routing URLs ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; method translates the internal Joomla! URL to a custom URL. &amp;lt;tt&amp;gt;JRoute&amp;lt;/tt&amp;gt; has three parameters and its prototype is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( $url, $xhtml = true, $ssl=null );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt; is a string containing the absolute or relative internal Joomla! URL.&lt;br /&gt;
* &amp;lt;code&amp;gt;$xhtml&amp;lt;/code&amp;gt; is a boolean value that specifies whether or not the output should be in XHTML. This parameter is optional and if omitted defaults to true.&lt;br /&gt;
* &amp;lt;code&amp;gt;$ssl&amp;lt;/code&amp;gt; is an integer value that specifies whether the URI should be secure. It should be set to 1 to force the URI to be secure using the global secure site URI, 0 to leave it in the same state as when it was passed, and -1 to force the URI to be unsecure using the global unsecure site URI.&lt;br /&gt;
&lt;br /&gt;
The most important parameter is &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;. A call to this method might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( 'index.php?view=article&amp;amp;id='.$row-&amp;gt;slug );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$row-­&amp;gt;slug&amp;lt;/code&amp;gt; is the value that was generated in step 2 from a combination of id and title alias.&lt;br /&gt;
&lt;br /&gt;
Another advantage of using JRoute is that the router now handles $option (the component name) and the $Itemid (the menu item ID). The component itself doesn’t have to know its name ($option) or the active menu item ($Itemid) like it did in previous version of Joomla!.&lt;br /&gt;
&lt;br /&gt;
It is important that you think about the sequence of the URL parameter in this stage. This will be more clear when we have a deeper look at the router.php in the next section.&lt;br /&gt;
&lt;br /&gt;
The building process of JRouter is divided into two steps:&lt;br /&gt;
&lt;br /&gt;
* Create the application route. The application route is fully handled by JRouter and the component developer doesn’t have to do anything to make it work.&lt;br /&gt;
* Create the component route. To create the component route, JRouter looks for the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; in the component directory which is responsible for building the route for the component.&lt;br /&gt;
&lt;br /&gt;
== The Component Router ==&lt;br /&gt;
&lt;br /&gt;
We will have two functions in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt;. One is responsible for building the URL and the other is responsible for parsing it. In the next examples, a very basic and a more advanced one, we assume that we have three views that links can point to. The first is a categories overview (&amp;lt;code&amp;gt;view=categories&amp;lt;/code&amp;gt;), the second is a single category (&amp;lt;code&amp;gt;view=category&amp;lt;/code&amp;gt;) and the third is a single article (&amp;lt;code&amp;gt;view=article&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; should be in the site area of your component. It is not used on admin/backend pages. Don't forget to add it to your XML [[Manifest files|manifest file]] in the site folder.&lt;br /&gt;
&lt;br /&gt;
=== A Simple Example ===&lt;br /&gt;
&lt;br /&gt;
This simple example will illustrate the basics of implementing a router for your component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]BuildRoute( &amp;amp;$query )&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset($query['view']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['view'];&lt;br /&gt;
                unset( $query['view'] );&lt;br /&gt;
       }&lt;br /&gt;
       if(isset($query['id']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; passes a $query array to the &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; function. This function will add the relevant parts of the array to the $segments array in the right order and will return the properly ordered array. The content of the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array needs to be unset, otherwise &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; will add it to the URL in the form of a query string (i.e. any variables that are not handled by the router will be passed in the query string).&lt;br /&gt;
&lt;br /&gt;
The prefix ''componentname'' is the name for your component, as found in the directory holding the component's files. For instance, a component &amp;quot;Magic&amp;quot; in directory &amp;lt;tt&amp;gt;/components/com_magic/...&amp;lt;/tt&amp;gt; would use a prefix &amp;lt;code&amp;gt;magic&amp;lt;/code&amp;gt; (all lower case).&lt;br /&gt;
&lt;br /&gt;
The next function in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; parses the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]ParseRoute( $segments )&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       switch($segments[0])&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       $vars['view'] = 'categories';&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $vars['view'] = 'category';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'article':&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here? In the function &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; we arranged the items in the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array in a specific sequence. This means that in this example the view is first and the id is second in the array.&lt;br /&gt;
&lt;br /&gt;
By reading &amp;lt;code&amp;gt;$segments[0]&amp;lt;/code&amp;gt;, we access the name of the view. We set the right view and/or identifier depending on its value and we return the &amp;lt;code&amp;gt;$vars&amp;lt;/code&amp;gt; array to &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt;. $vars should be an associative array similar to the array that was passed to the BuildRoute method.&lt;br /&gt;
&lt;br /&gt;
The above example of the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; is a very simple way to generate sef URL's but should show how this works quite clearly.&lt;br /&gt;
&lt;br /&gt;
The generated URL in this example contains the name of the view and doesn't reflect the content hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[view]/[slug]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A More Advanced Example ===&lt;br /&gt;
&lt;br /&gt;
In the next example we will try to get rid of the need for the view and we will try to reflect the current hierarchy level in the URL.&lt;br /&gt;
&lt;br /&gt;
The goal is URL's that look like:&lt;br /&gt;
&lt;br /&gt;
* When viewing an article: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]/[article]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing a category: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing the categories overview: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's assume we have done step 1 and 2 also for the category.&lt;br /&gt;
&lt;br /&gt;
The link to the article would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=article&amp;amp;catid='.$row-­&amp;gt;catslug .'&amp;amp;id='.$row-­&amp;gt;slug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the Link to the category would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=category&amp;amp;id='.$row-&amp;gt;catslug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&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;
function [''Componentname'']BuildRoute(&amp;amp;$query)&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset( $query['catid'] ))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['catid'];&lt;br /&gt;
                unset( $query['catid'] );&lt;br /&gt;
       };&lt;br /&gt;
       if( isset($query['id']) )&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       unset( $query['view'] );&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The difference now is that we don’t add the name of the view to the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array. We still unset the view key since otherwise, &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; would add it to the URL as part of the query string. Another new thing here is the additional parameter catid that we push into the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [''Componentname'']ParseRoute($segments)&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       $app =&amp;amp; JFactory::getApplication();&lt;br /&gt;
       $menu =&amp;amp; $app-&amp;gt;getMenu();&lt;br /&gt;
       $item =&amp;amp; $menu-&amp;gt;getActive();&lt;br /&gt;
       // Count segments&lt;br /&gt;
       $count = count( $segments );&lt;br /&gt;
       //Handle View and Identifier&lt;br /&gt;
       switch( $item-&amp;gt;query['view'] )&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       if($count == 1) {&lt;br /&gt;
                               $vars['view'] = 'category';&lt;br /&gt;
                       }&lt;br /&gt;
                       if($count == 2) {&lt;br /&gt;
                               $vars['view'] = 'article';&lt;br /&gt;
                       }&lt;br /&gt;
                       $id = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $id   = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id']   = (int) $id[0];&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see that this ParseRoute function has a lot of different code parts in comparison to the previous. The reason for this is simple. We don’t have the name of the view in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array and we need to find another way to determine it.&lt;br /&gt;
&lt;br /&gt;
We need to find out which level of hierarchy we are in by receiving the root element. We do this by looking to the view name of the active menu item:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-­&amp;gt;query['view']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also we need to know the number of items in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$count = count( $segments );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this information we can correctly set the view for all possible three cases:&lt;br /&gt;
&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has two items (&amp;lt;code&amp;gt;$catid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to an article.&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has one item (&amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to a category.&lt;br /&gt;
* The menu item is a link to a category. In this case, we know that any item in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array is the identifier for an article.&lt;br /&gt;
&lt;br /&gt;
The result of all this code is clean and human-readable component URLs.&lt;br /&gt;
&lt;br /&gt;
== Routers and Menu Items ==&lt;br /&gt;
&lt;br /&gt;
A last important part of creating a router is considering what to do with menu items. As explained on [[Search Engine Friendly URLs]], the output of the component router is used ''after'' the first segment of a route, the first segment being the menu item's alias. This creates a difficult question: how is your router and/or other code to know which menu item to route through?&lt;br /&gt;
&lt;br /&gt;
Suppose, for example, that your component is currently producing output for the page &amp;lt;tt&amp;gt;/dogs&amp;lt;/tt&amp;gt;, which lists all dogs in the system. Of course, the items in the list need to be links to pages that display more details about one dog. What should the URL to the dog with ID 21 and name Fido become? Using a router that works according to the principles we've seen so far, the route that is produced is &amp;lt;tt&amp;gt;dogs/21-fido&amp;lt;/tt&amp;gt;, or with some additional work &amp;lt;tt&amp;gt;/dogs/fido&amp;lt;/tt&amp;gt;. But perhaps the user has created a menu item with the alias &amp;lt;tt&amp;gt;mydoggy&amp;lt;/tt&amp;gt; which displays exactly that dog's details. Then it is probably the user's intention to route this URL through that menu item, and the item in the list should link to the page &amp;lt;tt&amp;gt;/mydoggy&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
More generally, whenever you are building a route, you will need to find the menu item that is most suitable as a ''starting point'' for building your route. The term ''starting point'' is emphasized because the rest of the route depends on the configuration of the menu item. In our example above, &amp;lt;tt&amp;gt;/dogs/21-fido&amp;lt;/tt&amp;gt; is an acceptable route, &amp;lt;tt&amp;gt;/mydoggy&amp;lt;/tt&amp;gt; is arguably even better, but &amp;lt;tt&amp;gt;/mydoggy/21-fido&amp;lt;/tt&amp;gt; is simply wrong, since &amp;lt;tt&amp;gt;/mydoggy&amp;lt;/tt&amp;gt; is in itself a menu item that is set up to display &amp;lt;tt&amp;gt;fido&amp;lt;/tt&amp;gt;'s information.&lt;br /&gt;
&lt;br /&gt;
Several approaches are available to tackle this problem. Joomla!'s core components take a mixed approach, separating responsibilities in two units of code: the router itself and the so-called &amp;lt;code&amp;gt;[componentname]RouteHelper&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;[componentname]RouteHelper&amp;lt;/code&amp;gt; provides methods that find the most suitable menu item for a given piece of data to be displayed, while the router analyzes the menu item and puts any information that is not determined by the menu item's configuration into the route. This does mean that the ''calling code'' must explicitly call the helper's method before routing (&amp;lt;code&amp;gt;echo JRoute::_(DogsRouteHelper::getDogRoute(21));&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
There is a useful thread on this subject here: [[jtopic:148632]] (note, may be out of date)&lt;br /&gt;
&lt;br /&gt;
For details on the internals of routing, see [[Routing implementation details]].&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Tutorials]][[Category:Component Development]][[Category:Search Engine Friendly URLs]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Search_Engine_Friendly_URLs</id>
		<title>Search Engine Friendly URLs</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Search_Engine_Friendly_URLs"/>
				<updated>2012-11-25T17:03:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Improved wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
'''Search engine friendly (SEF)''', '''human-readable''' or  [[wikipedia:Clean_URL|clean URLs]] are URLs that make sense to both humans and search engines because they explain the path to the particular page they point to. Since version 1.5, Joomla! is capable of creating and parsing URLs in any format, including SEF URLs. This does not depend on URL rewriting executed by the web server, so it works even if Joomla! runs a server other than Apache with the mod_rewrite module. The SEF URLs follow a certain fixed pattern, but the user can define a [[Alias|short descriptive text (alias)]] for each segment of the URL.&lt;br /&gt;
&lt;br /&gt;
Internally, the local part of a SEF URL (the part after the domain name) is called a '''route'''. Creating and processing SEF URLs is therefore referred to as '''routing''', and the relevant code is called a '''router'''.&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
A good example of routing is the URL to &amp;quot;Welcome to Joomla!&amp;quot; article in the sample data.&lt;br /&gt;
&lt;br /&gt;
* Without SEF URLs turned on, the URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With SEF URLs on and mod_rewrite off, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php/the-­news/1-­latest­-news/1­-welcome­-to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With both SEF URLs and mod_rewrite on, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search engine friendly URLs can be activated by turning on the '''Search Engine Friendly URLs''' option in the ''Global Configuration''. This option is on by default since Joomla! 1.6. See [[Enabling Search Engine Friendly (SEF) URLs]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== What do the numbers in the URL mean? ===&lt;br /&gt;
By comparing the old and the new URL we can see numbers in the old URL,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but also in the new URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These numbers are the parameters that are needed by Joomla! to get the internal URL and show the page you want to see. (In this case, the first numeral one is the ID of the category, the second numeral one is the ID of the article.)&lt;br /&gt;
&lt;br /&gt;
=== There is no &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; in the URL anymore. Can I delete the file now? ===&lt;br /&gt;
No! The URL may doesn't contain the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; anymore, but internally the mod_rewrite will only redirect to the original path without showing it to you.&lt;br /&gt;
&lt;br /&gt;
=== What is the [[Alias]] value? And how does it get created? ===&lt;br /&gt;
Alias is listed beneath the Title field in Articles, Categories, Sections and Menu Items. Joomla! can automatically create the alias for you. An automatic alias begins with the title. All upper case letters are changed to lower case. Spaces and special characters not allowed in a URL; they are changed to dashes.&lt;br /&gt;
&lt;br /&gt;
=== I want to specify my own value for Alias. ===&lt;br /&gt;
If you do not like the alias provided by Joomla!, you can enter a value of your choosing into that field. Many believe using good keywords in your URL helps search engine optimization. You can do so by including those keywords in your title, and allowing Joomla! to create the alias, or by creating the alias yourself.&lt;br /&gt;
&lt;br /&gt;
=== How is Alias used in a URL? ===&lt;br /&gt;
For a menu item, Joomla! uses the alias as the URL plug. Assume that you use the first two SEF URL options and you create a menu item called Products. Your URL would be example.com/products.&lt;br /&gt;
&lt;br /&gt;
Joomla! also uses the primary key values of data within the URL to help the router navigate to the correct page. Continuing with the previous example, if your products menu item was for an Article­/Category Blog, the link for the Article Title and/or Read More link would have three parts:&lt;br /&gt;
&lt;br /&gt;
* The menu item URL - example.com/products;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Category and the Category alias - 32-fruit;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Article and the Article alias - 1-apple;&lt;br /&gt;
&lt;br /&gt;
The complete URL is: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I get rid of the numbers in the SEF URLs? ===&lt;br /&gt;
The numbers in the SEF URL are needed by Joomla!'s router to know how to direct site traffic. Once the router logic stabilizes, simple third party system plugins can be developed to augment the router capabilities by allowing more choice. At that time, numbers will likely be removed from the URL.&lt;br /&gt;
&lt;br /&gt;
== Route Formats and the Routing Mechanism ==&lt;br /&gt;
&lt;br /&gt;
''This section describes Joomla!'s core (built-in) routing mechanism. Routing extensions may change the way routes are created on your system.''&lt;br /&gt;
&lt;br /&gt;
=== Route Formats ===&lt;br /&gt;
&lt;br /&gt;
To describe the Joomla! routing mechanism in more detail, we first need to pin down what we refer to as a '''route'''. Suppose that Joomla! has been installed in &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. The installation path is generally referred to as the '''base URL'''. A possible example URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. The first part of this URL is the aforementioned base URL, and neither Joomla! nor any component router can create URLs with a different first part. The second part, &amp;lt;tt&amp;gt;products/32-fruit/1-apple&amp;lt;/tt&amp;gt;, is a '''route''', consisting of three '''segment'''s.&lt;br /&gt;
&lt;br /&gt;
The first segment of a route is, for regular URLs, the alias of a menu item. The SEF URL is said to be '''routed through''' that menu item. The other segments are determined entirely by the router of the component that provides the type of the menu item. The ''Category - Blog'' menu item type, for example, is provided by the [[Content]] component, and therefore that component's router is responsible for building and parsing the remaining segments.&lt;br /&gt;
&lt;br /&gt;
It is also possible (for extensions) to ask the system to create a route without supplying a menu item to route through. In that case, the system will usually decide to create a special route that has the word &amp;lt;tt&amp;gt;component&amp;lt;/tt&amp;gt; as the first segment. These routes are created using a fixed format: the name of the component (without the leading &amp;lt;tt&amp;gt;com_&amp;lt;/tt&amp;gt;) is selected as the second segment and any parameters as the other segments.&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
It is important to note creating a menu item is the ''only'' way for a Joomla! user to define a route that leads to a specific component. It is, however, possible to create a route without showing it on the site (in a menu). An often-applied method is to create a menu item in a menu that isn't displayed anywhere. Such a menu is usually called a [[Menu|hidden menu]].&lt;br /&gt;
&lt;br /&gt;
The previous paragraph implies that it is not possible to make one component responsible for handling all routes. For example, it is not possible to specify that the URL &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/thealias&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; should display the Content item with the alias &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt; could be any word. If this needs to be done for a small number of articles, menu items can be created manually for these. Else a routing extension is necessary.&lt;br /&gt;
&lt;br /&gt;
This routing mechanism is therefore not as flexible as users sometimes require. On the other hand, it has one large advantage: it reduces the chance of ambiguous routes (routes that could lead to two different pages). Since the first segment of a route is always a menu item alias, the system immediately knows which component's router must be used to parse it.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
=== Handling Routes ===&lt;br /&gt;
&lt;br /&gt;
''This section describes the routing implementation. If you are a component developer, see [[Supporting SEF URLs in your component]].''&lt;br /&gt;
&lt;br /&gt;
Joomla routes are created and resolved by [[JRouter|the JRouter class]]. This class looks in the component root of the currently active component (specified in the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; parameter in the query string) and includes the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in that component's root directory. It then calls one of two functions: one for creating the SEF URL and one for interpreting the SEF URL.&lt;br /&gt;
&lt;br /&gt;
The JRouter class is overridden by the Joomla CMS in &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;. In this file the build and parse functions are overridden to properly build and parse the URLs for the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in each component (for example, &amp;lt;tt&amp;gt;/components/com_content/router.php&amp;lt;/tt&amp;gt;) should contain the following two functions:&lt;br /&gt;
* ContentBuildRoute - this builds the SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $query - this is a named array containing the querystring variables&lt;br /&gt;
** Returns: an array of segments where each segment is separated by a '/' when later combined to create the actual URL (the items in the array should not contain '/' characters)&lt;br /&gt;
* ContentParseRoute - this interprets an SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $segments - this is an array that contains the segments of the URL requested.&lt;br /&gt;
** Returns: a name =&amp;gt; value array of the querystring variables that the link maps to&lt;br /&gt;
&lt;br /&gt;
=== The SEF Plugin ===&lt;br /&gt;
The Joomla ''System - SEF'' plugin inherits &amp;lt;code&amp;gt;JPlugin&amp;lt;/code&amp;gt; and implements the &amp;lt;code&amp;gt;onAfterRender()&amp;lt;/code&amp;gt; function. In this function the body of the response that will be sent to the browser is retrieved using &amp;lt;code&amp;gt;JResponse::getBody()&amp;lt;/code&amp;gt;. The body of the response is then searched for links containing &amp;lt;tt&amp;gt;/index.php...&amp;lt;/tt&amp;gt; and replaces them with a correct SEF URL by calling &amp;lt;code&amp;gt;JRoute::_(''url'')&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JRoute builds SEF URLs by instantiating a &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; object and requesting that it build the correct link from the passed in URL.&lt;br /&gt;
&lt;br /&gt;
=== Handling SEF URLs ===&lt;br /&gt;
By default the SEF URLs are handled by the &amp;lt;code&amp;gt;JRouterSite&amp;lt;/code&amp;gt; object (from &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;) and is called by a call to &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; in index.php. This call is made on the &amp;lt;code&amp;gt;$app&amp;lt;/code&amp;gt; variable which is actually an instance of &amp;lt;code&amp;gt;JSite&amp;lt;/code&amp;gt; (from &amp;lt;tt&amp;gt;/includes/application.php&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; has a non-destructive result on the &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; array. That is, &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; sets variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;JRequest::set()&amp;lt;/code&amp;gt; with the overwrite flag set to false. Thus if a variable name is returned from &amp;lt;code&amp;gt;JRouter::route()&amp;lt;/code&amp;gt; that is already in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;, it will not put that value into &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;. This allows for custom routing.&lt;br /&gt;
&lt;br /&gt;
=== Custom Routing ===&lt;br /&gt;
Joomla allows you to create your own routing mechanism. In order to create this mechanism you must have a plugin that overrides the &amp;lt;code&amp;gt;JPlugin::onAfterInitialise()&amp;lt;/code&amp;gt; function. This function then parses the URL and creates the needed variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; before the standard Joomla routing is done.&lt;br /&gt;
&lt;br /&gt;
''See [[Creating a System Plugin to augment JRouter]] for an example.''&lt;br /&gt;
&lt;br /&gt;
[[Category:Search Engine Friendly URLs| ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Search_Engine_Friendly_URLs</id>
		<title>Search Engine Friendly URLs</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Search_Engine_Friendly_URLs"/>
				<updated>2012-11-25T16:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adjusted layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
'''Search engine friendly (SEF)''', '''human-readable''' or  [[wikipedia:Clean_URL|clean URLs]] are URLs that make sense to both humans and search engines because they explain the path to the particular page they point to. Since version 1.5, Joomla! is capable of creating and parsing URLs in any format, including SEF URLs. This does not depend on URL rewriting executed by the web server, so it works even if Joomla! runs a server other than Apache with the mod_rewrite module. The SEF URLs follow a certain fixed pattern, but the user can define a [[Alias|short descriptive text (alias)]] for each segment of the URL.&lt;br /&gt;
&lt;br /&gt;
Internally, the local part of a SEF URL (the part after the domain name) is called a '''route'''. Creating and processing SEF URLs is therefore referred to as '''routing''', and the relevant code is called a '''router'''.&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
A good example of routing is the URL to &amp;quot;Welcome to Joomla!&amp;quot; article in the sample data.&lt;br /&gt;
&lt;br /&gt;
* Without SEF URLs turned on, the URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With SEF URLs on and mod_rewrite off, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php/the-­news/1-­latest­-news/1­-welcome­-to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With both SEF URLs and mod_rewrite on, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search engine friendly URLs can be activated by turning on the '''Search Engine Friendly URLs''' option in the ''Global Configuration''. This option is on by default since Joomla! 1.6. See [[Enabling Search Engine Friendly (SEF) URLs]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== What do the numbers in the URL mean? ===&lt;br /&gt;
By comparing the old and the new URL we can see numbers in the old URL,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but also in the new URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These numbers are the parameters that are needed by Joomla! to get the internal URL and show the page you want to see. (In this case, the first numeral one is the ID of the category, the second numeral one is the ID of the article.)&lt;br /&gt;
&lt;br /&gt;
=== There is no &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; in the URL anymore. Can I delete the file now? ===&lt;br /&gt;
No! The URL may doesn't contain the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; anymore, but internally the mod_rewrite will only redirect to the original path without showing it to you.&lt;br /&gt;
&lt;br /&gt;
=== What is the [[Alias]] value? And how does it get created? ===&lt;br /&gt;
Alias is listed beneath the Title field in Articles, Categories, Sections and Menu Items. Joomla! can automatically create the alias for you. An automatic alias begins with the title. All upper case letters are changed to lower case. Spaces and special characters not allowed in a URL; they are changed to dashes.&lt;br /&gt;
&lt;br /&gt;
=== I want to specify my own value for Alias. ===&lt;br /&gt;
If you do not like the alias provided by Joomla!, you can enter a value of your choosing into that field. Many believe using good keywords in your URL helps search engine optimization. You can do so by including those keywords in your title, and allowing Joomla! to create the alias, or by creating the alias yourself.&lt;br /&gt;
&lt;br /&gt;
=== How is Alias used in a URL? ===&lt;br /&gt;
For a menu item, Joomla! uses the alias as the URL plug. Assume that you use the first two SEF URL options and you create a menu item called Products. Your URL would be example.com/products.&lt;br /&gt;
&lt;br /&gt;
Joomla! also uses the primary key values of data within the URL to help the router navigate to the correct page. Continuing with the previous example, if your products menu item was for an Article­/Category Blog, the link for the Article Title and/or Read More link would have three parts:&lt;br /&gt;
&lt;br /&gt;
* The menu item URL - example.com/products;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Category and the Category alias - 32-fruit;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Article and the Article alias - 1-apple;&lt;br /&gt;
&lt;br /&gt;
The complete URL is: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I get rid of the numbers in the SEF URLs? ===&lt;br /&gt;
The numbers in the SEF URL are needed by Joomla!'s router to know how to direct site traffic. Once the router logic stabilizes, simple third party system plugins can be developed to augment the router capabilities by allowing more choice. At that time, numbers will likely be removed from the URL.&lt;br /&gt;
&lt;br /&gt;
== Route Formats and the Routing Mechanism ==&lt;br /&gt;
&lt;br /&gt;
''This section describes Joomla!'s core (built-in) routing mechanism. Routing extensions may change the way routes are created on your system.''&lt;br /&gt;
&lt;br /&gt;
=== Route Formats ===&lt;br /&gt;
&lt;br /&gt;
To describe the Joomla! routing mechanism in more detail, we first need to pin down what we refer to as a '''route'''. In our example URL, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; is the part of the URL that is the same for all URLs managed by a Joomla! installation. It is generally referred to as the '''base URL'''. Neither Joomla! nor any component router can create URLs with a different first part. The second part, &amp;lt;tt&amp;gt;products/32-fruit/1-apple&amp;lt;/tt&amp;gt;, is a '''route''', consisting of three '''segment'''s.&lt;br /&gt;
&lt;br /&gt;
The first segment of a route is, for regular URLs, the alias of a menu item. The SEF URL is said to be '''routed through''' that menu item. The other segments are determined entirely by the router of the component that provides the type of the menu item. The ''Category - Blog'' menu item type, for example, is provided by the [[Content]] component, and therefore that component's router is responsible for building and parsing the remaining segments.&lt;br /&gt;
&lt;br /&gt;
It is also possible (for extensions) to ask the system to create a route without supplying a menu item to route through. In that case, the system will usually decide to create a special route that has the word &amp;lt;tt&amp;gt;component&amp;lt;/tt&amp;gt; as the first segment. These routes are created using a fixed format: the name of the component (without the leading &amp;lt;tt&amp;gt;com_&amp;lt;/tt&amp;gt;) is selected as the second segment and any parameters as the other segments.&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
It is important to note creating a menu item is the ''only'' way for a Joomla! user to define a route that leads to a specific component. It is, however, possible to create a route without showing it on the site (in a menu). An often-applied method is to create a menu item in a menu that isn't displayed anywhere. Such a menu is usually called a [[Menu|hidden menu]].&lt;br /&gt;
&lt;br /&gt;
The previous paragraph implies that it is not possible to make one component responsible for handling all routes. For example, it is not possible to specify that the URL &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/thealias&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; should display the Content item with the alias &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt; could be any word. If this needs to be done for a small number of articles, menu items can be created manually for these. Else a routing extension is necessary.&lt;br /&gt;
&lt;br /&gt;
This routing mechanism is therefore not as flexible as users sometimes require. On the other hand, it has one large advantage: it reduces the chance of ambiguous routes (routes that could lead to two different pages). Since the first segment of a route is always a menu item alias, the system immediately knows which component's router must be used to parse it.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
=== Handling Routes ===&lt;br /&gt;
&lt;br /&gt;
''This section describes the routing implementation. If you are a component developer, see [[Supporting SEF URLs in your component]].''&lt;br /&gt;
&lt;br /&gt;
Joomla routes are created and resolved by [[JRouter|the JRouter class]]. This class looks in the component root of the currently active component (specified in the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; parameter in the query string) and includes the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in that component's root directory. It then calls one of two functions: one for creating the SEF URL and one for interpreting the SEF URL.&lt;br /&gt;
&lt;br /&gt;
The JRouter class is overridden by the Joomla CMS in &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;. In this file the build and parse functions are overridden to properly build and parse the URLs for the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in each component (for example, &amp;lt;tt&amp;gt;/components/com_content/router.php&amp;lt;/tt&amp;gt;) should contain the following two functions:&lt;br /&gt;
* ContentBuildRoute - this builds the SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $query - this is a named array containing the querystring variables&lt;br /&gt;
** Returns: an array of segments where each segment is separated by a '/' when later combined to create the actual URL (the items in the array should not contain '/' characters)&lt;br /&gt;
* ContentParseRoute - this interprets an SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $segments - this is an array that contains the segments of the URL requested.&lt;br /&gt;
** Returns: a name =&amp;gt; value array of the querystring variables that the link maps to&lt;br /&gt;
&lt;br /&gt;
=== The SEF Plugin ===&lt;br /&gt;
The Joomla ''System - SEF'' plugin inherits &amp;lt;code&amp;gt;JPlugin&amp;lt;/code&amp;gt; and implements the &amp;lt;code&amp;gt;onAfterRender()&amp;lt;/code&amp;gt; function. In this function the body of the response that will be sent to the browser is retrieved using &amp;lt;code&amp;gt;JResponse::getBody()&amp;lt;/code&amp;gt;. The body of the response is then searched for links containing &amp;lt;tt&amp;gt;/index.php...&amp;lt;/tt&amp;gt; and replaces them with a correct SEF URL by calling &amp;lt;code&amp;gt;JRoute::_(''url'')&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JRoute builds SEF URLs by instantiating a &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; object and requesting that it build the correct link from the passed in URL.&lt;br /&gt;
&lt;br /&gt;
=== Handling SEF URLs ===&lt;br /&gt;
By default the SEF URLs are handled by the &amp;lt;code&amp;gt;JRouterSite&amp;lt;/code&amp;gt; object (from &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;) and is called by a call to &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; in index.php. This call is made on the &amp;lt;code&amp;gt;$app&amp;lt;/code&amp;gt; variable which is actually an instance of &amp;lt;code&amp;gt;JSite&amp;lt;/code&amp;gt; (from &amp;lt;tt&amp;gt;/includes/application.php&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; has a non-destructive result on the &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; array. That is, &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; sets variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;JRequest::set()&amp;lt;/code&amp;gt; with the overwrite flag set to false. Thus if a variable name is returned from &amp;lt;code&amp;gt;JRouter::route()&amp;lt;/code&amp;gt; that is already in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;, it will not put that value into &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;. This allows for custom routing.&lt;br /&gt;
&lt;br /&gt;
=== Custom Routing ===&lt;br /&gt;
Joomla allows you to create your own routing mechanism. In order to create this mechanism you must have a plugin that overrides the &amp;lt;code&amp;gt;JPlugin::onAfterInitialise()&amp;lt;/code&amp;gt; function. This function then parses the URL and creates the needed variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; before the standard Joomla routing is done.&lt;br /&gt;
&lt;br /&gt;
''See [[Creating a System Plugin to augment JRouter]] for an example.''&lt;br /&gt;
&lt;br /&gt;
[[Category:Search Engine Friendly URLs| ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Search_Engine_Friendly_URLs</id>
		<title>Search Engine Friendly URLs</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Search_Engine_Friendly_URLs"/>
				<updated>2012-11-25T15:43:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added information - second attempt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
'''Search engine friendly (SEF)''', '''human-readable''' or  [[wikipedia:Clean_URL|clean URLs]] are URLs that make sense to both humans and search engines because they explain the path to the particular page they point to. Since version 1.5, Joomla! is capable of creating and parsing URLs in any format, including SEF URLs. This does not depend on URL rewriting executed by the web server, so it works even if Joomla! runs a server other than Apache with the mod_rewrite module. The SEF URLs follow a certain fixed pattern, but the user can define a [[Alias|short descriptive text (alias)]] for each segment of the URL.&lt;br /&gt;
&lt;br /&gt;
Internally, the local part of a SEF URL (the part after the domain name) is called a '''route'''. Creating and processing SEF URLs is therefore referred to as '''routing''', and the relevant code is called a '''router'''.&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
A good example of routing is the URL to &amp;quot;Welcome to Joomla!&amp;quot; article in the sample data.&lt;br /&gt;
&lt;br /&gt;
* Without SEF URLs turned on, the URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With SEF URLs on and mod_rewrite off, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php/the-­news/1-­latest­-news/1­-welcome­-to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With both SEF URLs and mod_rewrite on, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search engine friendly URLs can be activated by turning on the '''Search Engine Friendly URLs''' option in the ''Global Configuration''. This option is on by default since Joomla! 1.6. See [[Enabling Search Engine Friendly (SEF) URLs]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== What do the numbers in the URL mean? ===&lt;br /&gt;
By comparing the old and the new URL we can see numbers in the old URL,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but also in the new URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These numbers are the parameters that are needed by Joomla! to get the internal URL and show the page you want to see. (In this case, the first numeral one is the ID of the category, the second numeral one is the ID of the article.)&lt;br /&gt;
&lt;br /&gt;
=== There is no &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; in the URL anymore. Can I delete the file now? ===&lt;br /&gt;
No! The URL may doesn't contain the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; anymore, but internally the mod_rewrite will only redirect to the original path without showing it to you.&lt;br /&gt;
&lt;br /&gt;
=== What is the [[Alias]] value? And how does it get created? ===&lt;br /&gt;
Alias is listed beneath the Title field in Articles, Categories, Sections and Menu Items. Joomla! can automatically create the alias for you. An automatic alias begins with the title. All upper case letters are changed to lower case. Spaces and special characters not allowed in a URL; they are changed to dashes.&lt;br /&gt;
&lt;br /&gt;
=== I want to specify my own value for Alias. ===&lt;br /&gt;
If you do not like the alias provided by Joomla!, you can enter a value of your choosing into that field. Many believe using good keywords in your URL helps search engine optimization. You can do so by including those keywords in your title, and allowing Joomla! to create the alias, or by creating the alias yourself.&lt;br /&gt;
&lt;br /&gt;
=== How is Alias used in a URL? ===&lt;br /&gt;
For a menu item, Joomla! uses the alias as the URL plug. Assume that you use the first two SEF URL options and you create a menu item called Products. Your URL would be example.com/products.&lt;br /&gt;
&lt;br /&gt;
Joomla! also uses the primary key values of data within the URL to help the router navigate to the correct page. Continuing with the previous example, if your products menu item was for an Article­/Category Blog, the link for the Article Title and/or Read More link would have three parts:&lt;br /&gt;
&lt;br /&gt;
* The menu item URL - example.com/products;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Category and the Category alias - 32-fruit;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Article and the Article alias - 1-apple;&lt;br /&gt;
&lt;br /&gt;
The complete URL is: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I get rid of the numbers in the SEF URLs? ===&lt;br /&gt;
The numbers in the SEF URL are needed by Joomla!'s router to know how to direct site traffic. Once the router logic stabilizes, simple third party system plugins can be developed to augment the router capabilities by allowing more choice. At that time, numbers will likely be removed from the URL.&lt;br /&gt;
&lt;br /&gt;
== Route Formats and the Routing Mechanism ==&lt;br /&gt;
&lt;br /&gt;
''This section describes Joomla!'s core (built-in) routing mechanism. Routing extensions may change the way routes are created on your system.''&lt;br /&gt;
&lt;br /&gt;
To describe the Joomla! routing mechanism in more detail, we first need to pin down what we refer to as a '''route'''. In our example URL, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; is the part of the URL that is the same for all URLs managed by a Joomla! installation. It is generally referred to as the '''base URL'''. Neither Joomla! nor any component router can create URLs with a different first part. The second part, &amp;lt;tt&amp;gt;products/32-fruit/1-apple&amp;lt;/tt&amp;gt;, is a '''route''', consisting of three '''segment'''s.&lt;br /&gt;
&lt;br /&gt;
The first segment of a route is, for regular URLs, the alias of a menu item. The SEF URL is said to be '''routed through''' that menu item. The other segments are determined entirely by the router of the component that provides the type of the menu item. The ''Category - Blog'' menu item type, for example, is provided by the [[Content]] component, and therefore that component's router is responsible for building and parsing the remaining segments.&lt;br /&gt;
&lt;br /&gt;
It is also possible (for extensions) to ask the system to create a route without supplying a menu item to route through. In that case, the system will usually decide to create a special route that has the word &amp;lt;tt&amp;gt;component&amp;lt;/tt&amp;gt; as the first segment. These routes are created using a fixed format: the name of the component (without the leading &amp;lt;tt&amp;gt;com_&amp;lt;/tt&amp;gt;) is selected as the second segment and any parameters as the other segments.&lt;br /&gt;
&lt;br /&gt;
It is important to note creating a menu item is the ''only'' way for a Joomla! user to define a route that leads to a specific component. It is, however, possible to create a route without showing it on the site (in a menu). An often-applied method is to create a menu item in a menu that isn't displayed anywhere. Such a menu is usually called a [[Menu|hidden menu]].&lt;br /&gt;
&lt;br /&gt;
The previous paragraph implies that it is not possible to make one component responsible for handling all routes. For example, it is not possible to specify that the URL &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/thealias&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; should display the Content item with the alias &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;thealias&amp;lt;/tt&amp;gt; could be any word. If this needs to be done for a small number of articles, menu items can be created manually for these. Else a routing extension is necessary.&lt;br /&gt;
&lt;br /&gt;
This routing mechanism is therefore not as flexible as users sometimes require. On the other hand, it has one large advantage: it reduces the chance of ambiguous routes (routes that could lead to two different pages). Since the first segment of a route is always a menu item alias, the system immediately knows which component's router must be used to parse it.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
=== Joomla Routes ===&lt;br /&gt;
&lt;br /&gt;
''This section describes the routing implementation. If you are a component developer, see [[Supporting SEF URLs in your component]].''&lt;br /&gt;
&lt;br /&gt;
Joomla routes are created and resolved by [[JRouter|the JRouter class]]. This class looks in the component root of the currently active component (specified in the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; parameter in the query string) and includes the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in that component's root directory. It then calls one of two functions: one for creating the SEF URL and one for interpreting the SEF URL.&lt;br /&gt;
&lt;br /&gt;
The JRouter class is overridden by the Joomla CMS in &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;. In this file the build and parse functions are overridden to properly build and parse the URLs for the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in each component (for example, &amp;lt;tt&amp;gt;/components/com_content/router.php&amp;lt;/tt&amp;gt;) should contain the following two functions:&lt;br /&gt;
* ContentBuildRoute - this builds the SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $query - this is a named array containing the querystring variables&lt;br /&gt;
** Returns: an array of segments where each segment is separated by a '/' when later combined to create the actual URL (the items in the array should not contain '/' characters)&lt;br /&gt;
* ContentParseRoute - this interprets an SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $segments - this is an array that contains the segments of the URL requested.&lt;br /&gt;
** Returns: a name =&amp;gt; value array of the querystring variables that the link maps to&lt;br /&gt;
&lt;br /&gt;
=== The SEF Plugin ===&lt;br /&gt;
The Joomla ''System - SEF'' plugin inherits &amp;lt;code&amp;gt;JPlugin&amp;lt;/code&amp;gt; and implements the &amp;lt;code&amp;gt;onAfterRender()&amp;lt;/code&amp;gt; function. In this function the body of the response that will be sent to the browser is retrieved using &amp;lt;code&amp;gt;JResponse::getBody()&amp;lt;/code&amp;gt;. The body of the response is then searched for links containing &amp;lt;tt&amp;gt;/index.php...&amp;lt;/tt&amp;gt; and replaces them with a correct SEF URL by calling &amp;lt;code&amp;gt;JRoute::_(''url'')&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JRoute builds SEF URLs by instantiating a &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; object and requesting that it build the correct link from the passed in URL.&lt;br /&gt;
&lt;br /&gt;
=== Handling SEF URLs ===&lt;br /&gt;
By default the SEF URLs are handled by the &amp;lt;code&amp;gt;JRouterSite&amp;lt;/code&amp;gt; object (from &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;) and is called by a call to &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; in index.php. This call is made on the &amp;lt;code&amp;gt;$app&amp;lt;/code&amp;gt; variable which is actually an instance of &amp;lt;code&amp;gt;JSite&amp;lt;/code&amp;gt; (from &amp;lt;tt&amp;gt;/includes/application.php&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; has a non-destructive result on the &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; array. That is, &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; sets variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;JRequest::set()&amp;lt;/code&amp;gt; with the overwrite flag set to false. Thus if a variable name is returned from &amp;lt;code&amp;gt;JRouter::route()&amp;lt;/code&amp;gt; that is already in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;, it will not put that value into &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;. This allows for custom routing.&lt;br /&gt;
&lt;br /&gt;
=== Custom Routing ===&lt;br /&gt;
Joomla allows you to create your own routing mechanism. In order to create this mechanism you must have a plugin that overrides the &amp;lt;code&amp;gt;JPlugin::onAfterInitialise()&amp;lt;/code&amp;gt; function. This function then parses the URL and creates the needed variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; before the standard Joomla routing is done.&lt;br /&gt;
&lt;br /&gt;
''See [[Creating a System Plugin to augment JRouter]] for an example.''&lt;br /&gt;
&lt;br /&gt;
[[Category:Search Engine Friendly URLs| ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Supporting_SEF_URLs_in_your_component</id>
		<title>Supporting SEF URLs in your component</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Supporting_SEF_URLs_in_your_component"/>
				<updated>2012-11-25T00:55:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Split off parts to Routing implementation details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{incomplete}}&lt;br /&gt;
{{:Search Engine Friendly URLs}}&lt;br /&gt;
In Joomla!, each [[component]] is responsible for handling its own SEF URLs. Therefore, as the [[Developers|developer]] of a component, you will have to create your own '''router''' to allow your component to use SEF URLs.&lt;br /&gt;
&lt;br /&gt;
== The Concept ==&lt;br /&gt;
&lt;br /&gt;
Assuming you are following standard development practices, your component is probably using &amp;quot;system URLs&amp;quot; that look a lot like &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, and your goal is to transform this into &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. As the developer, you have two tasks: signalling the system that certain pieces of text are URLs and need to be transformed, and explaining the system how to transform URLs.&lt;br /&gt;
&lt;br /&gt;
=== Applying &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
It is difficult and inefficient for Joomla! to figure out which parts of your component's output are URLs. To support SEF URLs, you will need to change URL-generating code so that it applies &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; before outputting the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo JRoute::_('index.php?view=article&amp;amp;id=1&amp;amp;catid=20');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that it is possible to leave out the parameters &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; defaults to the name of the component currently being executed, and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; defaults to the current menu item's ID.&lt;br /&gt;
&lt;br /&gt;
In general, you should only apply this to URLs that users and/or search engines are able to see. For example, there is no need to transform URLs used in redirects that immediately result in other redirects.&lt;br /&gt;
&lt;br /&gt;
If the user turns off SEF URLs in the site's settings, &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; will produce working non-SEF URLs without any changes to the code.&lt;br /&gt;
&lt;br /&gt;
=== Writing a router ===&lt;br /&gt;
&lt;br /&gt;
You'll also need to write a router, which is a single file with two functions that convert system URLs to and from SEF URLs. This file needs to be placed at &amp;lt;tt&amp;gt;/components/com_yourcomponent/router.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first function, &amp;lt;code&amp;gt;[componentname]BuildRoute(&amp;amp;$query)&amp;lt;/code&amp;gt;, must transform an array of URL parameters into an array of segments that will form the SEF URL. Schematically, the transformation works as follows:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt;, called by your component or any other extension&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentBuildRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing (for display)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second function, &amp;lt;code&amp;gt;[componentname]ParseRoute($segments)&amp;lt;/code&amp;gt;, must transform an array of segments back into an array of URL parameters. Schematically:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentParseRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two functions must cooperate in such a way that the original URL can be reconstructed. You can think of &amp;lt;code&amp;gt;BuildRoute&amp;lt;/code&amp;gt; as a form of [[wikipedia:Encoding|encoding]] and &amp;lt;code&amp;gt;ParseRoute&amp;lt;/code&amp;gt; as the corresponding decoding. When the original URL isn't properly reproduced, your component will stop working.&lt;br /&gt;
&lt;br /&gt;
== Preparing Your Data for Routing ==&lt;br /&gt;
&lt;br /&gt;
=== The Alias ===&lt;br /&gt;
&lt;br /&gt;
The first step is the generation of the so called alias. The alias is used in the URL instead of the title (the alias is the text you want to have in the URL). The alias has to be URI safe, which means accented UTF­8 characters are replaced by their ASCII­7 equivalents, white spaces by hyphens, etc.&lt;br /&gt;
&lt;br /&gt;
The alias can be defined by the user, but you should ensure that the above requirements for a URL safe alias are met. A good way to do so is to use the JTable::check() method during the save process. Have a look at this example code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function check()&lt;br /&gt;
{&lt;br /&gt;
    jimport( 'joomla.filter.output' );&lt;br /&gt;
    if(empty($this-&amp;gt;alias)) {&lt;br /&gt;
	    $this-&amp;gt;alias = $this-&amp;gt;title;&lt;br /&gt;
    }&lt;br /&gt;
    $this-&amp;gt;alias = JFilterOutput::stringURLSafe($this-&amp;gt;alias);&lt;br /&gt;
&lt;br /&gt;
    /* All your other checks */&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the alias field is empty the title will be used as alias. Then the alias will be made URLSafe using the &amp;lt;code&amp;gt;JFilterOutput::stringURLSafe()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== The Slug ===&lt;br /&gt;
&lt;br /&gt;
Continuing with the same example, the &amp;quot;slug&amp;quot; - &amp;quot;1­:welcome­-to­-joomla&amp;quot; has two parts. The first part is the article identifier (id) and the second is the alias. They are separated by a colon. These two elements were combined during the database query in the model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$query = 'SELECT a.*, '.&lt;br /&gt;
         'CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(&amp;quot;:&amp;quot;, a.id, a.alias) ELSE a.id END as slug,'&lt;br /&gt;
         /*...*/;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this step the slug is used instead of the id.&lt;br /&gt;
&lt;br /&gt;
== Routing URLs ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; method translates the internal Joomla! URL to a custom URL. &amp;lt;tt&amp;gt;JRoute&amp;lt;/tt&amp;gt; has three parameters and its prototype is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( $url, $xhtml = true, $ssl=null );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt; is a string containing the absolute or relative internal Joomla! URL.&lt;br /&gt;
* &amp;lt;code&amp;gt;$xhtml&amp;lt;/code&amp;gt; is a boolean value that specifies whether or not the output should be in XHTML. This parameter is optional and if omitted defaults to true.&lt;br /&gt;
* &amp;lt;code&amp;gt;$ssl&amp;lt;/code&amp;gt; is an integer value that specifies whether the URI should be secure. It should be set to 1 to force the URI to be secure using the global secure site URI, 0 to leave it in the same state as when it was passed, and -1 to force the URI to be unsecure using the global unsecure site URI.&lt;br /&gt;
&lt;br /&gt;
The most important parameter is &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;. A call to this method might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( 'index.php?view=article&amp;amp;id='.$row-&amp;gt;slug );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$row-­&amp;gt;slug&amp;lt;/code&amp;gt; is the value that was generated in step 2 from a combination of id and title alias.&lt;br /&gt;
&lt;br /&gt;
Another advantage of using JRoute is that the router now handles $option (the component name) and the $Itemid (the menu item ID). The component itself doesn’t have to know its name ($option) or the active menu item ($Itemid) like it did in previous version of Joomla!.&lt;br /&gt;
&lt;br /&gt;
It is important that you think about the sequence of the URL parameter in this stage. This will be more clear when we have a deeper look at the router.php in the next section.&lt;br /&gt;
&lt;br /&gt;
The building process of JRouter is divided into two steps:&lt;br /&gt;
&lt;br /&gt;
* Create the application route. The application route is fully handled by JRouter and the component developer doesn’t have to do anything to make it work.&lt;br /&gt;
* Create the component route. To create the component route, JRouter looks for the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; in the component directory which is responsible for building the route for the component.&lt;br /&gt;
&lt;br /&gt;
== The Component Router ==&lt;br /&gt;
&lt;br /&gt;
We will have two functions in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt;. One is responsible for building the URL and the other is responsible for parsing it. In the next examples, a very basic and a more advanced one, we assume that we have three views that links can point to. The first is a categories overview (&amp;lt;code&amp;gt;view=categories&amp;lt;/code&amp;gt;), the second is a single category (&amp;lt;code&amp;gt;view=category&amp;lt;/code&amp;gt;) and the third is a single article (&amp;lt;code&amp;gt;view=article&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; should be in the site area of your component. It is not used on admin/backend pages. Don't forget to add it to your XML [[Manifest files|manifest file]] in the site folder.&lt;br /&gt;
&lt;br /&gt;
=== A Simple Example ===&lt;br /&gt;
&lt;br /&gt;
This simple example will illustrate the basics of implementing a router for your component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]BuildRoute( &amp;amp;$query )&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset($query['view']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['view'];&lt;br /&gt;
                unset( $query['view'] );&lt;br /&gt;
       }&lt;br /&gt;
       if(isset($query['id']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; passes a $query array to the &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; function. This function will add the relevant parts of the array to the $segments array in the right order and will return the properly ordered array. The content of the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array needs to be unset, otherwise &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; will add it to the URL in the form of a query string (i.e. any variables that are not handled by the router will be passed in the query string).&lt;br /&gt;
&lt;br /&gt;
The prefix ''componentname'' is the name for your component, as found in the directory holding the component's files. For instance, a component &amp;quot;Magic&amp;quot; in directory &amp;lt;tt&amp;gt;/components/com_magic/...&amp;lt;/tt&amp;gt; would use a prefix &amp;lt;code&amp;gt;magic&amp;lt;/code&amp;gt; (all lower case).&lt;br /&gt;
&lt;br /&gt;
The next function in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; parses the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]ParseRoute( $segments )&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       switch($segments[0])&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       $vars['view'] = 'categories';&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $vars['view'] = 'category';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'article':&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here? In the function &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; we arranged the items in the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array in a specific sequence. This means that in this example the view is first and the id is second in the array.&lt;br /&gt;
&lt;br /&gt;
By reading &amp;lt;code&amp;gt;$segments[0]&amp;lt;/code&amp;gt;, we access the name of the view. We set the right view and/or identifier depending on its value and we return the &amp;lt;code&amp;gt;$vars&amp;lt;/code&amp;gt; array to &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt;. $vars should be an associative array similar to the array that was passed to the BuildRoute method.&lt;br /&gt;
&lt;br /&gt;
The above example of the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; is a very simple way to generate sef URL's but should show how this works quite clearly.&lt;br /&gt;
&lt;br /&gt;
The generated URL in this example contains the name of the view and doesn't reflect the content hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[view]/[slug]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A More Advanced Example ===&lt;br /&gt;
&lt;br /&gt;
In the next example we will try to get rid of the need for the view and we will try to reflect the current hierarchy level in the URL.&lt;br /&gt;
&lt;br /&gt;
The goal is URL's that look like:&lt;br /&gt;
&lt;br /&gt;
* When viewing an article: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]/[article]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing a category: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing the categories overview: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's assume we have done step 1 and 2 also for the category.&lt;br /&gt;
&lt;br /&gt;
The link to the article would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=article&amp;amp;catid='.$row-­&amp;gt;catslug .'&amp;amp;id='.$row-­&amp;gt;slug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the Link to the category would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=category&amp;amp;id='.$row-&amp;gt;catslug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&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;
function [''Componentname'']BuildRoute(&amp;amp;$query)&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset( $query['catid'] ))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['catid'];&lt;br /&gt;
                unset( $query['catid'] );&lt;br /&gt;
       };&lt;br /&gt;
       if( isset($query['id']) )&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       unset( $query['view'] );&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The difference now is that we don’t add the name of the view to the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array. We still unset the view key since otherwise, &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; would add it to the URL as part of the query string. Another new thing here is the additional parameter catid that we push into the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [''Componentname'']ParseRoute($segments)&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       $app =&amp;amp; JFactory::getApplication();&lt;br /&gt;
       $menu =&amp;amp; $app-&amp;gt;getMenu();&lt;br /&gt;
       $item =&amp;amp; $menu-&amp;gt;getActive();&lt;br /&gt;
       // Count segments&lt;br /&gt;
       $count = count( $segments );&lt;br /&gt;
       //Handle View and Identifier&lt;br /&gt;
       switch( $item-&amp;gt;query['view'] )&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       if($count == 1) {&lt;br /&gt;
                               $vars['view'] = 'category';&lt;br /&gt;
                       }&lt;br /&gt;
                       if($count == 2) {&lt;br /&gt;
                               $vars['view'] = 'article';&lt;br /&gt;
                       }&lt;br /&gt;
                       $id = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $id   = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id']   = (int) $id[0];&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see that this ParseRoute function has a lot of different code parts in comparison to the previous. The reason for this is simple. We don’t have the name of the view in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array and we need to find another way to determine it.&lt;br /&gt;
&lt;br /&gt;
We need to find out which level of hierarchy we are in by receiving the root element. We do this by looking to the view name of the active menu item:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-­&amp;gt;query['view']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also we need to know the number of items in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$count = count( $segments );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this information we can correctly set the view for all possible three cases:&lt;br /&gt;
&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has two items (&amp;lt;code&amp;gt;$catid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to an article.&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has one item (&amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to a category.&lt;br /&gt;
* The menu item is a link to a category. In this case, we know that any item in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array is the identifier for an article.&lt;br /&gt;
&lt;br /&gt;
The result of all this code is clean and human-readable component URLs.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
There is a useful thread on this subject here: [[jtopic:148632]] (note, may be out of date)&lt;br /&gt;
&lt;br /&gt;
For details on the internals of routing, see [[Routing implementation details]].&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Tutorials]][[Category:Component Development]][[Category:Search Engine Friendly URLs]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Routing_implementation_details</id>
		<title>Routing implementation details</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Routing_implementation_details"/>
				<updated>2012-11-25T00:53:43Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Split off page from http://docs.joomla.org/index.php?title=Supporting_SEF_URLs_in_your_component&amp;amp;oldid=9893 (5 August 2008)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{incomplete}}&lt;br /&gt;
&lt;br /&gt;
== Application Route Parsing ==&lt;br /&gt;
&lt;br /&gt;
The [[Application execution order]] outlines that the route (URL) is parsed immediately after initialisation is complete.  Since fancy URL's are not treated (yet) in the Administrator, we will follow the route parsing process in detail when &amp;lt;code&amp;gt;JSite::route&amp;lt;/code&amp;gt; in the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
* Call to &amp;lt;code&amp;gt;JApplication::route&amp;lt;/code&amp;gt;&lt;br /&gt;
** Clone the URI&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JApplication::getRouter&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::getInstance&amp;lt;/code&amp;gt; passing the type (&amp;quot;site&amp;quot;)&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JRouterSite::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
*** Strip the suffix if applicable (added to $vars['format'])&lt;br /&gt;
*** Re-set the route (URI)&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** Call to &amp;lt;code&amp;gt;JRouterSite::_processParseRules&amp;lt;/code&amp;gt; passing the URI (this will call custom route rules)&lt;br /&gt;
***** Call to &amp;lt;code&amp;gt;JRouter::_processParseRules&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
****** Call any custom routing rules (probably added via a system plugin using the &amp;lt;code&amp;gt;onAfterInitialise&amp;lt;/code&amp;gt; event trigger) passing the URI&lt;br /&gt;
****** Returns an array of vars&lt;br /&gt;
***** If SEF mode, replace &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; variable with &amp;lt;/code&amp;gt;limitstart&amp;lt;/code&amp;gt;&lt;br /&gt;
**** If raw mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseRawRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** If SEF mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseSefRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
***** If the route (the URI path) is empty, load it from the default menu item; set the active menu item as the default&lt;br /&gt;
***** If first part is &amp;lt;code&amp;gt;/component/com_content&amp;lt;/code&amp;gt;, set the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; as the second segement.  Null the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;.&lt;br /&gt;
***** Else, loop through menu alias values and take off segments that match as the menu tree is traversed.  Set &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; based on the last menu item found.&lt;br /&gt;
***** If the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; is set in the URL, set the active menu item based on this value.&lt;br /&gt;
***** Push the vars collected so far (eg, &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;, etc) into the router object (&amp;lt;code&amp;gt;$this&amp;lt;/code&amp;gt;).&lt;br /&gt;
***** If the route and &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; is set, load the component router;&lt;br /&gt;
***** Else, get the active menu item and get the route vars from it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application Route Building ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Custom Router Rules ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Supporting_SEF_URLs_in_your_component</id>
		<title>Supporting SEF URLs in your component</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Supporting_SEF_URLs_in_your_component"/>
				<updated>2012-11-24T17:51:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adjusted layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{incomplete}}&lt;br /&gt;
{{:Search Engine Friendly URLs}}&lt;br /&gt;
In Joomla!, each [[component]] is responsible for handling its own SEF URLs. Therefore, as the [[Developers|developer]] of a component, you will have to create your own '''router''' to allow your component to use SEF URLs.&lt;br /&gt;
&lt;br /&gt;
== The Concept ==&lt;br /&gt;
&lt;br /&gt;
Assuming you are following standard development practices, your component is probably using &amp;quot;system URLs&amp;quot; that look a lot like &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, and your goal is to transform this into &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. As the developer, you have two tasks: signalling the system that certain pieces of text are URLs and need to be transformed, and explaining the system how to transform URLs.&lt;br /&gt;
&lt;br /&gt;
=== Applying &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
It is difficult and inefficient for Joomla! to figure out which parts of your component's output are URLs. To support SEF URLs, you will need to change URL-generating code so that it applies &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; before outputting the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo JRoute::_('index.php?view=article&amp;amp;id=1&amp;amp;catid=20');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that it is possible to leave out the parameters &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; defaults to the name of the component currently being executed, and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; defaults to the current menu item's ID.&lt;br /&gt;
&lt;br /&gt;
In general, you should only apply this to URLs that users and/or search engines are able to see. For example, there is no need to transform URLs used in redirects that immediately result in other redirects.&lt;br /&gt;
&lt;br /&gt;
If the user turns off SEF URLs in the site's settings, &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; will produce working non-SEF URLs without any changes to the code.&lt;br /&gt;
&lt;br /&gt;
=== Writing a router ===&lt;br /&gt;
&lt;br /&gt;
You'll also need to write a router, which is a single file with two functions that convert system URLs to and from SEF URLs. This file needs to be placed at &amp;lt;tt&amp;gt;/components/com_yourcomponent/router.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first function, &amp;lt;code&amp;gt;[componentname]BuildRoute(&amp;amp;$query)&amp;lt;/code&amp;gt;, must transform an array of URL parameters into an array of segments that will form the SEF URL. Schematically, the transformation works as follows:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt;, called by your component or any other extension&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentBuildRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing (for display)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second function, &amp;lt;code&amp;gt;[componentname]ParseRoute($segments)&amp;lt;/code&amp;gt;, must transform an array of segments back into an array of URL parameters. Schematically:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentParseRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two functions must cooperate in such a way that the original URL can be reconstructed. You can think of &amp;lt;code&amp;gt;BuildRoute&amp;lt;/code&amp;gt; as a form of [[wikipedia:Encoding|encoding]] and &amp;lt;code&amp;gt;ParseRoute&amp;lt;/code&amp;gt; as the corresponding decoding. When the original URL isn't properly reproduced, your component will stop working.&lt;br /&gt;
&lt;br /&gt;
== Preparing Your Data for Routing ==&lt;br /&gt;
&lt;br /&gt;
=== The Alias ===&lt;br /&gt;
&lt;br /&gt;
The first step is the generation of the so called alias. The alias is used in the URL instead of the title (the alias is the text you want to have in the URL). The alias has to be URI safe, which means accented UTF­8 characters are replaced by their ASCII­7 equivalents, white spaces by hyphens, etc.&lt;br /&gt;
&lt;br /&gt;
The alias can be defined by the user, but you should ensure that the above requirements for a URL safe alias are met. A good way to do so is to use the JTable::check() method during the save process. Have a look at this example code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function check()&lt;br /&gt;
{&lt;br /&gt;
    jimport( 'joomla.filter.output' );&lt;br /&gt;
    if(empty($this-&amp;gt;alias)) {&lt;br /&gt;
	    $this-&amp;gt;alias = $this-&amp;gt;title;&lt;br /&gt;
    }&lt;br /&gt;
    $this-&amp;gt;alias = JFilterOutput::stringURLSafe($this-&amp;gt;alias);&lt;br /&gt;
&lt;br /&gt;
    /* All your other checks */&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the alias field is empty the title will be used as alias. Then the alias will be made URLSafe using the &amp;lt;code&amp;gt;JFilterOutput::stringURLSafe()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== The Slug ===&lt;br /&gt;
&lt;br /&gt;
Continuing with the same example, the &amp;quot;slug&amp;quot; - &amp;quot;1­:welcome­-to­-joomla&amp;quot; has two parts. The first part is the article identifier (id) and the second is the alias. They are separated by a colon. These two elements were combined during the database query in the model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$query = 'SELECT a.*, '.&lt;br /&gt;
         'CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(&amp;quot;:&amp;quot;, a.id, a.alias) ELSE a.id END as slug,'&lt;br /&gt;
         /*...*/;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this step the slug is used instead of the id.&lt;br /&gt;
&lt;br /&gt;
== Routing URLs ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; method translates the internal Joomla! URL to a custom URL. &amp;lt;tt&amp;gt;JRoute&amp;lt;/tt&amp;gt; has three parameters and its prototype is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( $url, $xhtml = true, $ssl=null );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt; is a string containing the absolute or relative internal Joomla! URL.&lt;br /&gt;
* &amp;lt;code&amp;gt;$xhtml&amp;lt;/code&amp;gt; is a boolean value that specifies whether or not the output should be in XHTML. This parameter is optional and if omitted defaults to true.&lt;br /&gt;
* &amp;lt;code&amp;gt;$ssl&amp;lt;/code&amp;gt; is an integer value that specifies whether the URI should be secure. It should be set to 1 to force the URI to be secure using the global secure site URI, 0 to leave it in the same state as when it was passed, and -1 to force the URI to be unsecure using the global unsecure site URI.&lt;br /&gt;
&lt;br /&gt;
The most important parameter is &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;. A call to this method might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( 'index.php?view=article&amp;amp;id='.$row-&amp;gt;slug );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$row-­&amp;gt;slug&amp;lt;/code&amp;gt; is the value that was generated in step 2 from a combination of id and title alias.&lt;br /&gt;
&lt;br /&gt;
Another advantage of using JRoute is that the router now handles $option (the component name) and the $Itemid (the menu item ID). The component itself doesn’t have to know its name ($option) or the active menu item ($Itemid) like it did in previous version of Joomla!.&lt;br /&gt;
&lt;br /&gt;
It is important that you think about the sequence of the URL parameter in this stage. This will be more clear when we have a deeper look at the router.php in the next section.&lt;br /&gt;
&lt;br /&gt;
The building process of JRouter is divided into two steps:&lt;br /&gt;
&lt;br /&gt;
* Create the application route. The application route is fully handled by JRouter and the component developer doesn’t have to do anything to make it work.&lt;br /&gt;
* Create the component route. To create the component route, JRouter looks for the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; in the component directory which is responsible for building the route for the component.&lt;br /&gt;
&lt;br /&gt;
== The Component Router ==&lt;br /&gt;
&lt;br /&gt;
We will have two functions in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt;. One is responsible for building the URL and the other is responsible for parsing it. In the next examples, a very basic and a more advanced one, we assume that we have three views that links can point to. The first is a categories overview (&amp;lt;code&amp;gt;view=categories&amp;lt;/code&amp;gt;), the second is a single category (&amp;lt;code&amp;gt;view=category&amp;lt;/code&amp;gt;) and the third is a single article (&amp;lt;code&amp;gt;view=article&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; should be in the site area of your component. It is not used on admin/backend pages. Don't forget to add it to your XML [[Manifest files|manifest file]] in the site folder.&lt;br /&gt;
&lt;br /&gt;
=== A Simple Example ===&lt;br /&gt;
&lt;br /&gt;
This simple example will illustrate the basics of implementing a router for your component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]BuildRoute( &amp;amp;$query )&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset($query['view']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['view'];&lt;br /&gt;
                unset( $query['view'] );&lt;br /&gt;
       }&lt;br /&gt;
       if(isset($query['id']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; passes a $query array to the &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; function. This function will add the relevant parts of the array to the $segments array in the right order and will return the properly ordered array. The content of the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array needs to be unset, otherwise &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; will add it to the URL in the form of a query string (i.e. any variables that are not handled by the router will be passed in the query string).&lt;br /&gt;
&lt;br /&gt;
The prefix ''componentname'' is the name for your component, as found in the directory holding the component's files. For instance, a component &amp;quot;Magic&amp;quot; in directory &amp;lt;tt&amp;gt;/components/com_magic/...&amp;lt;/tt&amp;gt; would use a prefix &amp;lt;code&amp;gt;magic&amp;lt;/code&amp;gt; (all lower case).&lt;br /&gt;
&lt;br /&gt;
The next function in the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; parses the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]ParseRoute( $segments )&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       switch($segments[0])&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       $vars['view'] = 'categories';&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $vars['view'] = 'category';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'article':&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here? In the function &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; we arranged the items in the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array in a specific sequence. This means that in this example the view is first and the id is second in the array.&lt;br /&gt;
&lt;br /&gt;
By reading &amp;lt;code&amp;gt;$segments[0]&amp;lt;/code&amp;gt;, we access the name of the view. We set the right view and/or identifier depending on its value and we return the &amp;lt;code&amp;gt;$vars&amp;lt;/code&amp;gt; array to &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt;. $vars should be an associative array similar to the array that was passed to the BuildRoute method.&lt;br /&gt;
&lt;br /&gt;
The above example of the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; is a very simple way to generate sef URL's but should show how this works quite clearly.&lt;br /&gt;
&lt;br /&gt;
The generated URL in this example contains the name of the view and doesn't reflect the content hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[view]/[slug]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A More Advanced Example ===&lt;br /&gt;
&lt;br /&gt;
In the next example we will try to get rid of the need for the view and we will try to reflect the current hierarchy level in the URL.&lt;br /&gt;
&lt;br /&gt;
The goal is URL's that look like:&lt;br /&gt;
&lt;br /&gt;
* When viewing an article: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]/[article]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing a category: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* When viewing the categories overview: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's assume we have done step 1 and 2 also for the category.&lt;br /&gt;
&lt;br /&gt;
The link to the article would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=article&amp;amp;catid='.$row-­&amp;gt;catslug .'&amp;amp;id='.$row-­&amp;gt;slug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the Link to the category would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=category&amp;amp;id='.$row-&amp;gt;catslug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&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;
function [''Componentname'']BuildRoute(&amp;amp;$query)&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset( $query['catid'] ))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['catid'];&lt;br /&gt;
                unset( $query['catid'] );&lt;br /&gt;
       };&lt;br /&gt;
       if( isset($query['id']) )&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       unset( $query['view'] );&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The difference now is that we don’t add the name of the view to the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array. We still unset the view key since otherwise, &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; would add it to the URL as part of the query string. Another new thing here is the additional parameter catid that we push into the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [''Componentname'']ParseRoute($segments)&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       $app =&amp;amp; JFactory::getApplication();&lt;br /&gt;
       $menu =&amp;amp; $app-&amp;gt;getMenu();&lt;br /&gt;
       $item =&amp;amp; $menu-&amp;gt;getActive();&lt;br /&gt;
       // Count segments&lt;br /&gt;
       $count = count( $segments );&lt;br /&gt;
       //Handle View and Identifier&lt;br /&gt;
       switch( $item-&amp;gt;query['view'] )&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       if($count == 1) {&lt;br /&gt;
                               $vars['view'] = 'category';&lt;br /&gt;
                       }&lt;br /&gt;
                       if($count == 2) {&lt;br /&gt;
                               $vars['view'] = 'article';&lt;br /&gt;
                       }&lt;br /&gt;
                       $id = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $id   = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id']   = (int) $id[0];&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see that this ParseRoute function has a lot of different code parts in comparison to the previous. The reason for this is simple. We don’t have the name of the view in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array and we need to find another way to determine it.&lt;br /&gt;
&lt;br /&gt;
We need to find out which level of hierarchy we are in by receiving the root element. We do this by looking to the view name of the active menu item:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-­&amp;gt;query['view']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also we need to know the number of items in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$count = count( $segments );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this information we can correctly set the view for all possible three cases:&lt;br /&gt;
&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has two items (&amp;lt;code&amp;gt;$catid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to an article.&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has one item (&amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to a category.&lt;br /&gt;
* The menu item is a link to a category. In this case, we know that any item in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array is the identifier for an article.&lt;br /&gt;
&lt;br /&gt;
The result of all this code is clean and human-readable component URLs.&lt;br /&gt;
&lt;br /&gt;
== Application Route Parsing ==&lt;br /&gt;
&lt;br /&gt;
The [[Application execution order]] outlines that the route (URL) is parsed immediately after initialisation is complete.  Since fancy URL's are not treated (yet) in the Administrator, we will follow the route parsing process in detail when &amp;lt;code&amp;gt;JSite::route&amp;lt;/code&amp;gt; in the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
* Call to &amp;lt;code&amp;gt;JApplication::route&amp;lt;/code&amp;gt;&lt;br /&gt;
** Clone the URI&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JApplication::getRouter&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::getInstance&amp;lt;/code&amp;gt; passing the type (&amp;quot;site&amp;quot;)&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JRouterSite::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
*** Strip the suffix if applicable (added to $vars['format'])&lt;br /&gt;
*** Re-set the route (URI)&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** Call to &amp;lt;code&amp;gt;JRouterSite::_processParseRules&amp;lt;/code&amp;gt; passing the URI (this will call custom route rules)&lt;br /&gt;
***** Call to &amp;lt;code&amp;gt;JRouter::_processParseRules&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
****** Call any custom routing rules (probably added via a system plugin using the &amp;lt;code&amp;gt;onAfterInitialise&amp;lt;/code&amp;gt; event trigger) passing the URI&lt;br /&gt;
****** Returns an array of vars&lt;br /&gt;
***** If SEF mode, replace &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; variable with &amp;lt;/code&amp;gt;limitstart&amp;lt;/code&amp;gt;&lt;br /&gt;
**** If raw mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseRawRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** If SEF mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseSefRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
***** If the route (the URI path) is empty, load it from the default menu item; set the active menu item as the default&lt;br /&gt;
***** If first part is &amp;lt;code&amp;gt;/component/com_content&amp;lt;/code&amp;gt;, set the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; as the second segement.  Null the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;.&lt;br /&gt;
***** Else, loop through menu alias values and take off segments that match as the menu tree is traversed.  Set &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; based on the last menu item found.&lt;br /&gt;
***** If the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; is set in the URL, set the active menu item based on this value.&lt;br /&gt;
***** Push the vars collected so far (eg, &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;, etc) into the router object (&amp;lt;code&amp;gt;$this&amp;lt;/code&amp;gt;).&lt;br /&gt;
***** If the route and &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; is set, load the component router;&lt;br /&gt;
***** Else, get the active menu item and get the route vars from it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application Route Building ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Custom Router Rules ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Additional References ==&lt;br /&gt;
&lt;br /&gt;
There is a useful thread on this subject here: [[jtopic:148632]] (note, may be out of date)&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Tutorials]][[Category:Component Development]][[Category:Search Engine Friendly URLs]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Supporting_SEF_URLs_in_your_component</id>
		<title>Supporting SEF URLs in your component</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Supporting_SEF_URLs_in_your_component"/>
				<updated>2012-11-24T17:33:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{incomplete}}&lt;br /&gt;
{{:Search Engine Friendly URLs}}&lt;br /&gt;
In Joomla!, each [[component]] is responsible for handling its own SEF URLs. Therefore, as the [[Developers|developer]] of a component, you will have to create your own '''router''' to allow your component to use SEF URLs.&lt;br /&gt;
&lt;br /&gt;
== The Concept ==&lt;br /&gt;
&lt;br /&gt;
Assuming you are following standard development practices, your component is probably using &amp;quot;system URLs&amp;quot; that look a lot like &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, and your goal is to transform this into &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. As the developer, you have two tasks: signalling the system that certain pieces of text are URLs and need to be transformed, and explaining the system how to transform URLs.&lt;br /&gt;
&lt;br /&gt;
=== Applying &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
It is difficult and inefficient for Joomla! to figure out which parts of your component's output are URLs. To support SEF URLs, you will need to change URL-generating code so that it applies &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; before outputting the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo JRoute::_('index.php?view=article&amp;amp;id=1&amp;amp;catid=20');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that it is possible to leave out the parameters &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; defaults to the name of the component currently being executed, and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; defaults to the current menu item's ID.&lt;br /&gt;
&lt;br /&gt;
In general, you should only apply this to URLs that users and/or search engines are able to see. For example, there is no need to transform URLs used in redirects that immediately result in other redirects.&lt;br /&gt;
&lt;br /&gt;
If the user turns off SEF URLs in the site's settings, &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; will produce working non-SEF URLs without any changes to the code.&lt;br /&gt;
&lt;br /&gt;
=== Writing a router ===&lt;br /&gt;
&lt;br /&gt;
You'll also need to write a router, which is a single file with two functions that convert system URLs to and from SEF URLs. This file needs to be placed at &amp;lt;tt&amp;gt;/components/com_yourcomponent/router.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first function, &amp;lt;code&amp;gt;[componentname]BuildRoute(&amp;amp;$query)&amp;lt;/code&amp;gt;, must transform an array of URL parameters into an array of segments that will form the SEF URL. Schematically, the transformation works as follows:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_yourcomponent&amp;amp;view=article&amp;amp;id=1&amp;amp;catid=20&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt;, called by your component or any other extension&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentBuildRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing (for display)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second function, &amp;lt;code&amp;gt;[componentname]ParseRoute($segments)&amp;lt;/code&amp;gt;, must transform an array of segments back into an array of URL parameters. Schematically:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/example-menu-item/20/1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Joomla's internal routing&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$segments = array(20, 1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;span style=&amp;quot;font-size: xx-large&amp;quot;&amp;gt;&amp;amp;darr;&amp;lt;/span&amp;gt; Your router's &amp;lt;code&amp;gt;com_yourcomponentParseRoute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$query = array('view' =&amp;gt; 'article', 'id' =&amp;gt; 1, 'catid' =&amp;gt; 20)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two functions must cooperate in such a way that the original URL can be reconstructed. You can think of &amp;lt;code&amp;gt;BuildRoute&amp;lt;/code&amp;gt; as a form of [[wikipedia:Encoding|encoding]] and &amp;lt;code&amp;gt;ParseRoute&amp;lt;/code&amp;gt; as the corresponding decoding. When the original URL isn't properly reproduced, your component will stop working.&lt;br /&gt;
&lt;br /&gt;
== Preparing Your Data for Routing ==&lt;br /&gt;
&lt;br /&gt;
=== The Alias ===&lt;br /&gt;
&lt;br /&gt;
The first step is the generation of the so called alias. The alias is used in the URL instead of the title (the alias is the text you want to have in the URL). The alias has to be URI safe, which means accented UTF­8 characters are replaced by their ASCII­7 equivalents, white spaces by hyphens, etc.&lt;br /&gt;
&lt;br /&gt;
The alias can be defined by the user, but you should ensure that the above requirements for a URL safe alias are met. A good way to do so is to use the JTable::check() method during the save process. Have a look at this example code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function check()&lt;br /&gt;
{&lt;br /&gt;
    jimport( 'joomla.filter.output' );&lt;br /&gt;
    if(empty($this-&amp;gt;alias)) {&lt;br /&gt;
	    $this-&amp;gt;alias = $this-&amp;gt;title;&lt;br /&gt;
    }&lt;br /&gt;
    $this-&amp;gt;alias = JFilterOutput::stringURLSafe($this-&amp;gt;alias);&lt;br /&gt;
&lt;br /&gt;
    /* All your other checks */&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the alias field is empty the title will be used as alias. Then the alias will be made URLSafe using the JFilterOutput::stringURLSafe() method.&lt;br /&gt;
&lt;br /&gt;
=== The Slug ===&lt;br /&gt;
&lt;br /&gt;
Continuing with the same example, the &amp;quot;slug&amp;quot; - &amp;quot;1­:welcome­-to­-joomla&amp;quot; has two parts. The first part is the article identifier (id) and the second is the alias. They are separated by a colon. These two elements were combined during the database query in the model:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$query = 'SELECT a.*, '.&lt;br /&gt;
         'CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(&amp;quot;:&amp;quot;, a.id, a.alias) ELSE a.id END as slug,'&lt;br /&gt;
         /*...*/;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this step the slug is used instead of the id.&lt;br /&gt;
&lt;br /&gt;
== Routing URLs ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;JRoute::_&amp;lt;/code&amp;gt; method translates the internal Joomla! URL to a custom URL. &amp;lt;code&amp;gt;JRoute&amp;lt;/code&amp;gt; has three parameters and its prototype is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( $url, $xhtml = true, $ssl=null );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt; is a string containing the absolute or relative internal Joomla! URL.&lt;br /&gt;
* &amp;lt;code&amp;gt;$xhtml&amp;lt;/code&amp;gt; is a boolean value that specifies whether or not the output should be in XHTML. This parameter is optional and if omitted defaults to true.&lt;br /&gt;
* &amp;lt;code&amp;gt;$ssl&amp;lt;/code&amp;gt; is an integer value that specifies whether the URI should be secure. It should be set to 1 to force the URI to be secure using the global secure site URI, 0 to leave it in the same state as when it was passed, and -1 to force the URI to be unsecure using the global unsecure site URI.&lt;br /&gt;
&lt;br /&gt;
The most important parameter is &amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;. A call to this method might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;JRoute::_( 'index.php?view=article&amp;amp;id='.$row-&amp;gt;slug );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$row-­&amp;gt;slug&amp;lt;/code&amp;gt; is the value that was generated in step 2 from a combination of id and title alias.&lt;br /&gt;
&lt;br /&gt;
Another advantage of using JRoute is that the router now handles $option (the component name) and the $Itemid (the menu item ID). The component itself doesn’t have to know its name ($option) or the active menu item ($Itemid) like it did in previous version of Joomla!.&lt;br /&gt;
&lt;br /&gt;
It is important that you think about the sequence of the URL parameter in this stage. This will be more clear when we have a deeper look at the router.php in the next section.&lt;br /&gt;
&lt;br /&gt;
The building process of JRouter is divided into two steps:&lt;br /&gt;
&lt;br /&gt;
* Create the application route. The application route is fully handled by JRouter and the component developer doesn’t have to do anything to make it work.&lt;br /&gt;
* Create the component route. To create the component route, JRouter looks for the router.php in the component directory which is responsible for building the route for the component.&lt;br /&gt;
&lt;br /&gt;
== The Component Router ==&lt;br /&gt;
&lt;br /&gt;
We will have two functions in the router.php. One is responsible for building the URL and the other is responsible for parsing it. In the next examples, a very basic and a more advanced one, we assume that we have three views that links can point to. The first is a categories overview (view=categories), the second is a single category (view=category) and the third is a single article (view=article).&lt;br /&gt;
&lt;br /&gt;
The file router.php should be in the site area of your component. It is not used on admin/backend pages. Don't forget to add it to your installation XML in the site folder.&lt;br /&gt;
&lt;br /&gt;
=== A Simple Example ===&lt;br /&gt;
&lt;br /&gt;
This simple example will illustrate the basics of implementing a router for your component.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]BuildRoute( &amp;amp;$query )&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset($query['view']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['view'];&lt;br /&gt;
                unset( $query['view'] );&lt;br /&gt;
       }&lt;br /&gt;
       if(isset($query['id']))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; passes a $query array to the &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; function. This function will add the relevant parts of the array to the $segments array in the right order and will return the properly ordered array. The content of the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array needs to be unset, otherwise &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; will add it to the URL in the form of a query string (i.e. any variables that are not handled by the router will be passed in the query string).&lt;br /&gt;
&lt;br /&gt;
The prefix ''componentname'' is the name for your component, as found in the directory holding the component's files. For instance, a component &amp;quot;Magic&amp;quot; in directory &amp;lt;code&amp;gt;/components/com_magic/...&amp;lt;/code&amp;gt; would use a prefix &amp;lt;code&amp;gt;magic&amp;lt;/code&amp;gt; (all lower case).&lt;br /&gt;
&lt;br /&gt;
The next function in the &amp;lt;code&amp;gt;router.php&amp;lt;/code&amp;gt; parses the URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [componentname]ParseRoute( $segments )&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       switch($segments[0])&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       $vars['view'] = 'categories';&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $vars['view'] = 'category';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'article':&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       $id = explode( ':', $segments[1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens here? In the function &amp;lt;code&amp;gt;[''componentname'']BuildRoute&amp;lt;/code&amp;gt; we arranged the items in the &amp;lt;code&amp;gt;$query&amp;lt;/code&amp;gt; array in a specific sequence. This means that in this example the view is first and the id is second in the array.&lt;br /&gt;
&lt;br /&gt;
By reading &amp;lt;code&amp;gt;$segments[0]&amp;lt;/code&amp;gt;, we access the name of the view. We set the right view and/or identifier depending on its value and we return the &amp;lt;code&amp;gt;$vars&amp;lt;/code&amp;gt; array to &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt;. $vars should be an associative array similar to the array that was passed to the BuildRoute method.&lt;br /&gt;
&lt;br /&gt;
The above example of the &amp;lt;code&amp;gt;router.php&amp;lt;/code&amp;gt; is a very simple way to generate sef URL's but should show how this works quite clearly.&lt;br /&gt;
&lt;br /&gt;
The generated URL in this example contains the name of the view and doesn't reflect the content hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[view]/[slug]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A More Advanced Example ===&lt;br /&gt;
&lt;br /&gt;
In the next example we will try to get rid of the need for the view and we will try to reflect the current hierarchy level in the URL.&lt;br /&gt;
&lt;br /&gt;
The goal is URL's that look like:&lt;br /&gt;
&lt;br /&gt;
* When viewing an article: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]/[article]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* When viewing a category: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]/[category]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* When viewing the categories overview: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/[menualias]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's assume we have done step 1 and 2 also for the category.&lt;br /&gt;
&lt;br /&gt;
The link to the article would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=article&amp;amp;catid='.$row-­&amp;gt;catslug .'&amp;amp;id='.$row-­&amp;gt;slug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the Link to the category would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JRoute::_( 'index.php?view=category&amp;amp;id='.$row-&amp;gt;catslug );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding &amp;lt;code&amp;gt;router.php&amp;lt;/code&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;
function [''Componentname'']BuildRoute(&amp;amp;$query)&lt;br /&gt;
{&lt;br /&gt;
       $segments = array();&lt;br /&gt;
       if(isset( $query['catid'] ))&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['catid'];&lt;br /&gt;
                unset( $query['catid'] );&lt;br /&gt;
       };&lt;br /&gt;
       if( isset($query['id']) )&lt;br /&gt;
       {&lt;br /&gt;
                $segments[] = $query['id'];&lt;br /&gt;
                unset( $query['id'] );&lt;br /&gt;
       };&lt;br /&gt;
       unset( $query['view'] );&lt;br /&gt;
       return $segments;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The difference now is that we don’t add the name of the view to the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array. We still unset the view key since otherwise, &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; would add it to the URL as part of the query string. Another new thing here is the additional parameter catid that we push into the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function [''Componentname'']ParseRoute($segments)&lt;br /&gt;
{&lt;br /&gt;
       $vars = array();&lt;br /&gt;
       $app =&amp;amp; JFactory::getApplication();&lt;br /&gt;
       $menu =&amp;amp; $app-&amp;gt;getMenu();&lt;br /&gt;
       $item =&amp;amp; $menu-&amp;gt;getActive();&lt;br /&gt;
       // Count segments&lt;br /&gt;
       $count = count( $segments );&lt;br /&gt;
       //Handle View and Identifier&lt;br /&gt;
       switch( $item-&amp;gt;query['view'] )&lt;br /&gt;
       {&lt;br /&gt;
               case 'categories':&lt;br /&gt;
                       if($count == 1) {&lt;br /&gt;
                               $vars['view'] = 'category';&lt;br /&gt;
                       }&lt;br /&gt;
                       if($count == 2) {&lt;br /&gt;
                               $vars['view'] = 'article';&lt;br /&gt;
                       }&lt;br /&gt;
                       $id = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id'] = (int) $id[0];&lt;br /&gt;
                       break;&lt;br /&gt;
               case 'category':&lt;br /&gt;
                       $id   = explode( ':', $segments[$count-1] );&lt;br /&gt;
                       $vars['id']   = (int) $id[0];&lt;br /&gt;
                       $vars['view'] = 'article';&lt;br /&gt;
                       break;&lt;br /&gt;
       }&lt;br /&gt;
       return $vars;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see that this ParseRoute function has a lot of different code parts in comparison to the previous. The reason for this is simple. We don’t have the name of the view in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array and we need to find another way to determine it.&lt;br /&gt;
&lt;br /&gt;
We need to find out which level of hierarchy we are in by receiving the root element. We do this by looking to the view name of the active menu item:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-­&amp;gt;query['view']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also we need to know the number of items in the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$count = count( $segments );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this information we can correctly set the view for all possible three cases:&lt;br /&gt;
&lt;br /&gt;
* The menu item is a link to the categories view and the &amp;lt;code&amp;gt;$segments&amp;lt;/code&amp;gt; array has two items (&amp;lt;code&amp;gt;$catid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$id&amp;lt;/code&amp;gt;). In this case we know that we need to parse a link to an article.&lt;br /&gt;
* The menu item is a link to the categories view and the $segments array has one item ($id). In this case we know that we need to parse a link to a category.&lt;br /&gt;
* The menu item is a link to a category. In this case, we know that any item in the $segments array is the identifier for an article.&lt;br /&gt;
&lt;br /&gt;
The result of all this code is clean and human-readable component URLs.&lt;br /&gt;
&lt;br /&gt;
== Application Route Parsing ==&lt;br /&gt;
&lt;br /&gt;
The [[Application execution order]] outlines that the route (URL) is parsed immediately after initialisation is complete.  Since fancy URL's are not treated (yet) in the Administrator, we will follow the route parsing process in detail when &amp;lt;code&amp;gt;JSite::route&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;index.php&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
* Call to &amp;lt;code&amp;gt;JApplication::route&amp;lt;/code&amp;gt;&lt;br /&gt;
** Clone the URI&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JApplication::getRouter&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::getInstance&amp;lt;/code&amp;gt; passing the type (&amp;quot;site&amp;quot;)&lt;br /&gt;
** Call to &amp;lt;code&amp;gt;JRouterSite::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
*** Strip the suffix if applicable (added to $vars['format'])&lt;br /&gt;
*** Re-set the route (URI)&lt;br /&gt;
*** Call to &amp;lt;code&amp;gt;JRouter::parse&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** Call to &amp;lt;code&amp;gt;JRouterSite::_processParseRules&amp;lt;/code&amp;gt; passing the URI (this will call custom route rules)&lt;br /&gt;
***** Call to &amp;lt;code&amp;gt;JRouter::_processParseRules&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
****** Call any custom routing rules (probably added via a system plugin using the &amp;lt;code&amp;gt;onAfterInitialise&amp;lt;/code&amp;gt; event trigger) passing the URI&lt;br /&gt;
****** Returns an array of vars&lt;br /&gt;
***** If SEF mode, replace &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; variable with &amp;lt;/code&amp;gt;limitstart&amp;lt;/code&amp;gt;&lt;br /&gt;
**** If raw mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseRawRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
**** If SEF mode, call to &amp;lt;code&amp;gt;JRouterSite::_parseSefRoute&amp;lt;/code&amp;gt; passing the URI&lt;br /&gt;
***** If the route (the URI path) is empty, load it from the default menu item; set the active menu item as the default&lt;br /&gt;
***** If first part is &amp;lt;code&amp;gt;/component/com_content&amp;lt;/code&amp;gt;, set the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; as the second segement.  Null the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;.&lt;br /&gt;
***** Else, loop through menu alias values and take off segments that match as the menu tree is traversed.  Set &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; based on the last menu item found.&lt;br /&gt;
***** If the &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt; is set in the URL, set the active menu item based on this value.&lt;br /&gt;
***** Push the vars collected so far (eg, &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Itemid&amp;lt;/code&amp;gt;, etc) into the router object (&amp;lt;code&amp;gt;$this&amp;lt;/code&amp;gt;).&lt;br /&gt;
***** If the route and &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; is set, load the component router;&lt;br /&gt;
***** Else, get the active menu item and get the route vars from it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application Route Building ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Custom Router Rules ==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Additional References ==&lt;br /&gt;
&lt;br /&gt;
There is a useful thread on this subject here: [[jtopic:148632]] (note, may be out of date)&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Tutorials]][[Category:Component Development]][[Category:Search Engine Friendly URLs]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Search_Engine_Friendly_URLs</id>
		<title>Search Engine Friendly URLs</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Search_Engine_Friendly_URLs"/>
				<updated>2012-11-21T01:26:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added information - first attempt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
'''Search engine friendly (SEF)''', '''human-readable''' or  [[wikipedia:Clean_URL|clean URLs]] are URLs that make sense to both humans and search engines because they explain the path to the particular page they point to. Since version 1.5, Joomla! is capable of creating and parsing URLs in any format, including SEF URLs. This does not depend on URL rewriting executed by the web server, so it works even if Joomla! runs a server other than Apache with the mod_rewrite module. The SEF URLs follow a certain fixed pattern, but the user can define a [[Alias|short descriptive text (alias)]] for each segment of the URL.&lt;br /&gt;
&lt;br /&gt;
Internally, the local part of a SEF URL (the part after the domain name) is called a '''route'''. Creating and processing SEF URLs is therefore referred to as '''routing''', and the relevant code is called a '''router'''.&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
A good example of routing is the URL to &amp;quot;Welcome to Joomla!&amp;quot; article in the sample data.&lt;br /&gt;
&lt;br /&gt;
* Without SEF URLs turned on, the URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With SEF URLs on and mod_rewrite off, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php/the-­news/1-­latest­-news/1­-welcome­-to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With both SEF URLs and mod_rewrite on, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search engine friendly URLs can be activated by turning on the '''Search Engine Friendly URLs''' option in the ''Global Configuration''. This option is on by default since Joomla! 1.6. See [[Enabling Search Engine Friendly (SEF) URLs]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== What do the numbers in the URL mean? ===&lt;br /&gt;
By comparing the old and the new URL we can see numbers in the old URL,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but also in the new URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These numbers are the parameters that are needed by Joomla! to get the internal URL and show the page you want to see. (In this case, the first numeral one is the ID of the category, the second numeral one is the ID of the article.)&lt;br /&gt;
&lt;br /&gt;
=== There is no &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; in the URL anymore. Can I delete the file now? ===&lt;br /&gt;
No! The URL may doesn't contain the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; anymore, but internally the mod_rewrite will only redirect to the original path without showing it to you.&lt;br /&gt;
&lt;br /&gt;
=== What is the [[Alias]] value? And how does it get created? ===&lt;br /&gt;
Alias is listed beneath the Title field in Articles, Categories, Sections and Menu Items. Joomla! can automatically create the alias for you. An automatic alias begins with the title. All upper case letters are changed to lower case. Spaces and special characters not allowed in a URL; they are changed to dashes.&lt;br /&gt;
&lt;br /&gt;
=== I want to specify my own value for Alias. ===&lt;br /&gt;
If you do not like the alias provided by Joomla!, you can enter a value of your choosing into that field. Many believe using good keywords in your URL helps search engine optimization. You can do so by including those keywords in your title, and allowing Joomla! to create the alias, or by creating the alias yourself.&lt;br /&gt;
&lt;br /&gt;
=== How is Alias used in a URL? ===&lt;br /&gt;
For a menu item, Joomla! uses the alias as the URL plug. Assume that you use the first two SEF URL options and you create a menu item called Products. Your URL would be example.com/products.&lt;br /&gt;
&lt;br /&gt;
Joomla! also uses the primary key values of data within the URL to help the router navigate to the correct page. Continuing with the previous example, if your products menu item was for an Article­/Category Blog, the link for the Article Title and/or Read More link would have three parts:&lt;br /&gt;
&lt;br /&gt;
* The menu item URL - example.com/products;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Category and the Category alias - 32-fruit;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Article and the Article alias - 1-apple;&lt;br /&gt;
&lt;br /&gt;
The complete URL is: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I get rid of the numbers in the SEF URLs? ===&lt;br /&gt;
The numbers in the SEF URL are needed by Joomla!'s router to know how to direct site traffic. Once the router logic stabilizes, simple third party system plugins can be developed to augment the router capabilities by allowing more choice. At that time, numbers will likely be removed from the URL.&lt;br /&gt;
&lt;br /&gt;
== Route Formats and Routing Mechanism ==&lt;br /&gt;
&lt;br /&gt;
''This section describes Joomla!'s core (built-in) routing mechanism. Routing extensions may change the way routes are created on your system.''&lt;br /&gt;
&lt;br /&gt;
To describe the Joomla! routing mechanism in more detail, we first need to pin down what we refer to as a '''route'''. In our example URL, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/sites/first/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; is the part of the URL that is the same for all URLs managed by a Joomla! installation. It is generally referred to as the '''base URL'''. Neither Joomla! nor any component router can create URLs with a different first part. The second part, &amp;lt;tt&amp;gt;products/32-fruit/1-apple&amp;lt;/tt&amp;gt;, is a '''route''', consisting of three '''segment'''s.&lt;br /&gt;
&lt;br /&gt;
The first segment of a route is, for regular URLs, the alias of a menu item. This means that only routes that use menu items will function entirely correctly. The SEF URL is said to be '''routed through''' that menu item. The other segments are determined entirely by the router of the component that provides the type of the menu item. The ''Category - Blog'' menu item type, for example, is provided by the [[Content]] component, and therefore that component's router is responsible for building and parsing the remaining segements.&lt;br /&gt;
&lt;br /&gt;
It is also possible (for extensions) to ask the system to create a route without supplying a menu item to route through. In that case, the system will usually decide to create a ''component route'', meaning the first segment of the route will be the word &amp;lt;tt&amp;gt;component&amp;lt;/tt&amp;gt;. The component router follows a fixed format, choosing the name of the component (without the leading &amp;lt;tt&amp;gt;com_&amp;lt;/tt&amp;gt;) as the second segment and any parameters as the other segments.&lt;br /&gt;
&lt;br /&gt;
It is important to note that it is not possible for a Joomla! user to define a route that leads to a specific component without making a menu item. (Systems that do have this possibility usually call it a ''global route''.) This reduces the chance of ambiguous routes, i.e. routes that could lead to two different pages, since the menu item alias directly specifies which component's router is allowed to parse a certain route. Also, creating a route that behaves as a global route is not difficult. An often-applied method is to create a menu item in a menu that isn't displayed anywhere. Such a menu is usually called a [[Menu|hidden menu]].&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
=== Joomla Routes ===&lt;br /&gt;
&lt;br /&gt;
''This section describes the routing implementation. If you are a component developer, see [[Supporting SEF URLs in your component]].''&lt;br /&gt;
&lt;br /&gt;
Joomla routes are created and resolved by [[JRouter|the JRouter class]]. This class looks in the component root of the currently active component (specified in the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; parameter in the query string) and includes the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in that component's root directory. It then calls one of two functions: one for creating the SEF URL and one for interpreting the SEF URL.&lt;br /&gt;
&lt;br /&gt;
The JRouter class is overridden by the Joomla CMS in &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;. In this file the build and parse functions are overridden to properly build and parse the URLs for the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in each component (for example, &amp;lt;tt&amp;gt;/components/com_content/router.php&amp;lt;/tt&amp;gt;) should contain the following two functions:&lt;br /&gt;
* ContentBuildRoute - this builds the SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $query - this is a named array containing the querystring variables&lt;br /&gt;
** Returns: an array of segments where each segment is separated by a '/' when later combined to create the actual URL (the items in the array should not contain '/' characters)&lt;br /&gt;
* ContentParseRoute - this interprets an SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $segments - this is an array that contains the segments of the URL requested.&lt;br /&gt;
** Returns: a name =&amp;gt; value array of the querystring variables that the link maps to&lt;br /&gt;
&lt;br /&gt;
=== The SEF Plugin ===&lt;br /&gt;
The Joomla ''System - SEF'' plugin inherits &amp;lt;code&amp;gt;JPlugin&amp;lt;/code&amp;gt; and implements the &amp;lt;code&amp;gt;onAfterRender()&amp;lt;/code&amp;gt; function. In this function the body of the response that will be sent to the browser is retrieved using &amp;lt;code&amp;gt;JResponse::getBody()&amp;lt;/code&amp;gt;. The body of the response is then searched for links containing &amp;lt;tt&amp;gt;/index.php...&amp;lt;/tt&amp;gt; and replaces them with a correct SEF URL by calling &amp;lt;code&amp;gt;JRoute::_(''url'')&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JRoute builds SEF URLs by instantiating a &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; object and requesting that it build the correct link from the passed in URL.&lt;br /&gt;
&lt;br /&gt;
=== Handling SEF URLs ===&lt;br /&gt;
By default the SEF URLs are handled by the &amp;lt;code&amp;gt;JRouterSite&amp;lt;/code&amp;gt; object (from &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;) and is called by a call to &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; in index.php. This call is made on the &amp;lt;code&amp;gt;$app&amp;lt;/code&amp;gt; variable which is actually an instance of &amp;lt;code&amp;gt;JSite&amp;lt;/code&amp;gt; (from &amp;lt;tt&amp;gt;/includes/application.php&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; has a non-destructive result on the &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; array. That is, &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; sets variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;JRequest::set()&amp;lt;/code&amp;gt; with the overwrite flag set to false. Thus if a variable name is returned from &amp;lt;code&amp;gt;JRouter::route()&amp;lt;/code&amp;gt; that is already in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;, it will not put that value into &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;. This allows for custom routing.&lt;br /&gt;
&lt;br /&gt;
=== Custom Routing ===&lt;br /&gt;
Joomla allows you to create your own routing mechanism. In order to create this mechanism you must have a plugin that overrides the &amp;lt;code&amp;gt;JPlugin::onAfterInitialise()&amp;lt;/code&amp;gt; function. This function then parses the URL and creates the needed variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; before the standard Joomla routing is done.&lt;br /&gt;
&lt;br /&gt;
''See [[Creating a System Plugin to augment JRouter]] for an example.''&lt;br /&gt;
&lt;br /&gt;
[[Category:Search Engine Friendly URLs| ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Search_Engine_Friendly_URLs</id>
		<title>Search Engine Friendly URLs</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Search_Engine_Friendly_URLs"/>
				<updated>2012-11-20T22:25:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adjusted layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
'''Search engine friendly (SEF)''', '''human-readable''' or  [[wikipedia:Clean_URL|clean URLs]] are URLs that make sense to both humans and search engines because they explain the path to the particular page they point to. Since version 1.5, Joomla! is capable of creating and parsing URLs in any format, including SEF URLs. This does not depend on URL rewriting executed by the web server, so it works even if Joomla! runs a server other than Apache with the mod_rewrite module. The SEF URLs follow a certain fixed pattern, but the user can define a [[Alias|short descriptive text (alias)]] for each segment of the URL. Internally, creating and processing SEF URLs is called '''routing''', and the relevant code is called a '''router'''.&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
A good example of routing is the URL to &amp;quot;Welcome to Joomla!&amp;quot; article in the sample data.&lt;br /&gt;
&lt;br /&gt;
* Without SEF URLs turned on, the URL is &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With SEF URLs on and mod_rewrite off, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php/the-­news/1-­latest­-news/1­-welcome­-to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* With both SEF URLs and mod_rewrite on, it's &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search engine friendly URLs can be activated by turning on the '''Search Engine Friendly URLs''' option in the ''Global Configuration''. This option is on by default since Joomla! 1.6. See [[Enabling Search Engine Friendly (SEF) URLs]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== What do the numbers in the URL mean? ===&lt;br /&gt;
By comparing the old and the new URL we can see numbers in the old URL,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1:welcome-to-joomla&amp;amp;catid=1:latest-news&amp;amp;Itemid=50&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but also in the new URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://www.example.com/the-­news/1­-latest-­news/1-­welcome-­to­-joomla&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These numbers are the parameters that are needed by Joomla! to get the internal URL and show the page you want to see. (In this case, the first numeral one is the ID of the category, the second numeral one is the ID of the article.)&lt;br /&gt;
&lt;br /&gt;
=== There is no &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; in the URL anymore. Can I delete the file now? ===&lt;br /&gt;
No! The URL may doesn't contain the &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt; anymore, but internally the mod_rewrite will only redirect to the original path without showing it to you.&lt;br /&gt;
&lt;br /&gt;
=== What is the [[Alias]] value? And how does it get created? ===&lt;br /&gt;
Alias is listed beneath the Title field in Articles, Categories, Sections and Menu Items. Joomla! can automatically create the alias for you. An automatic alias begins with the title. All upper case letters are changed to lower case. Spaces and special characters not allowed in a URL; they are changed to dashes.&lt;br /&gt;
&lt;br /&gt;
=== I want to specify my own value for Alias. ===&lt;br /&gt;
If you do not like the alias provided by Joomla!, you can enter a value of your choosing into that field. Many believe using good keywords in your URL helps search engine optimization. You can do so by including those keywords in your title, and allowing Joomla! to create the alias, or by creating the alias yourself.&lt;br /&gt;
&lt;br /&gt;
=== How is Alias used in a URL? ===&lt;br /&gt;
For a menu item, Joomla! uses the alias as the URL plug. Assume that you use the first two SEF URL options and you create a menu item called Products. Your URL would be example.com/products.&lt;br /&gt;
&lt;br /&gt;
Joomla! also uses the primary key values of data within the URL to help the router navigate to the correct page. Continuing with the previous example, if your products menu item was for an Article­/Category Blog, the link for the Article Title and/or Read More link would have three parts:&lt;br /&gt;
&lt;br /&gt;
* The menu item URL - example.com/products;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Category and the Category alias - 32-fruit;&lt;br /&gt;
&lt;br /&gt;
* Plus, the primary key for the Article and the Article alias - 1-apple;&lt;br /&gt;
&lt;br /&gt;
The complete URL is: &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://example.com/products/32-fruit/1-apple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I get rid of the numbers in the SEF URLs? ===&lt;br /&gt;
The numbers in the SEF URL are needed by Joomla!'s router to know how to direct site traffic. Once the router logic stabilizes, simple third party system plugins can be developed to augment the router capabilities by allowing more choice. At that time, numbers will likely be removed from the URL.&lt;br /&gt;
&lt;br /&gt;
== Implementation Details ==&lt;br /&gt;
=== Joomla Routes ===&lt;br /&gt;
&lt;br /&gt;
''This section describes the routing implementation. If you are a component developer, see [[Supporting SEF URLs in your component]].''&lt;br /&gt;
&lt;br /&gt;
Joomla routes are created and resolved by [[JRouter|the JRouter class]]. This class looks in the component root of the currently active component (specified in the &amp;lt;code&amp;gt;option&amp;lt;/code&amp;gt; parameter in the query string) and includes the &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in that component's root directory. It then calls one of two functions: one for creating the SEF URL and one for interpreting the SEF URL.&lt;br /&gt;
&lt;br /&gt;
The JRouter class is overridden by the Joomla CMS in &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;. In this file the build and parse functions are overridden to properly build and parse the URLs for the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;router.php&amp;lt;/tt&amp;gt; file in each component (for example, &amp;lt;tt&amp;gt;/components/com_content/router.php&amp;lt;/tt&amp;gt;) should contain the following two functions:&lt;br /&gt;
* ContentBuildRoute - this builds the SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $query - this is a named array containing the querystring variables&lt;br /&gt;
** Returns: an array of segments where each segment is separated by a '/' when later combined to create the actual URL (the items in the array should not contain '/' characters)&lt;br /&gt;
* ContentParseRoute - this interprets an SEF URL&lt;br /&gt;
** Parameters&lt;br /&gt;
*** $segments - this is an array that contains the segments of the URL requested.&lt;br /&gt;
** Returns: a name =&amp;gt; value array of the querystring variables that the link maps to&lt;br /&gt;
&lt;br /&gt;
=== The SEF Plugin ===&lt;br /&gt;
The Joomla ''System - SEF'' plugin inherits &amp;lt;code&amp;gt;JPlugin&amp;lt;/code&amp;gt; and implements the &amp;lt;code&amp;gt;onAfterRender()&amp;lt;/code&amp;gt; function. In this function the body of the response that will be sent to the browser is retrieved using &amp;lt;code&amp;gt;JResponse::getBody()&amp;lt;/code&amp;gt;. The body of the response is then searched for links containing &amp;lt;tt&amp;gt;/index.php...&amp;lt;/tt&amp;gt; and replaces them with a correct SEF URL by calling &amp;lt;code&amp;gt;JRoute::_(''url'')&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
JRoute builds SEF URLs by instantiating a &amp;lt;code&amp;gt;JRouter&amp;lt;/code&amp;gt; object and requesting that it build the correct link from the passed in URL.&lt;br /&gt;
&lt;br /&gt;
=== Handling SEF URLs ===&lt;br /&gt;
By default the SEF URLs are handled by the &amp;lt;code&amp;gt;JRouterSite&amp;lt;/code&amp;gt; object (from &amp;lt;tt&amp;gt;/includes/router.php&amp;lt;/tt&amp;gt;) and is called by a call to &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; in index.php. This call is made on the &amp;lt;code&amp;gt;$app&amp;lt;/code&amp;gt; variable which is actually an instance of &amp;lt;code&amp;gt;JSite&amp;lt;/code&amp;gt; (from &amp;lt;tt&amp;gt;/includes/application.php&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; has a non-destructive result on the &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; array. That is, &amp;lt;code&amp;gt;JApplication::route()&amp;lt;/code&amp;gt; sets variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; by calling &amp;lt;code&amp;gt;JRequest::set()&amp;lt;/code&amp;gt; with the overwrite flag set to false. Thus if a variable name is returned from &amp;lt;code&amp;gt;JRouter::route()&amp;lt;/code&amp;gt; that is already in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;, it will not put that value into &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt;. This allows for custom routing.&lt;br /&gt;
&lt;br /&gt;
=== Custom Routing ===&lt;br /&gt;
Joomla allows you to create your own routing mechanism. In order to create this mechanism you must have a plugin that overrides the &amp;lt;code&amp;gt;JPlugin::onAfterInitialise()&amp;lt;/code&amp;gt; function. This function then parses the URL and creates the needed variables in &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; before the standard Joomla routing is done.&lt;br /&gt;
&lt;br /&gt;
[[Category:Search Engine Friendly URLs| ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J2.5:Developing_a_MVC_Component/Example_of_a_frontend_update_function</id>
		<title>J2.5:Developing a MVC Component/Example of a frontend update function</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J2.5:Developing_a_MVC_Component/Example_of_a_frontend_update_function"/>
				<updated>2012-11-17T19:43:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added warning and removed incorrect entry from file listings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|The methods used in this document do not adhere to best practices and do not make optimal use of the flexibility provided by Joomla. More specifically, it is possible and recommended to reuse the model and form created during [[{{BASEPAGENAME}}/Adding_backend_actions|Part 9 (Adding backend actions)]] for front-end editing. Also, when using &amp;lt;code&amp;gt;JModelForm&amp;lt;/code&amp;gt;, one should use the data manipulation methods provided by &amp;lt;code&amp;gt;JModelForm&amp;lt;/code&amp;gt; instead of a custom &amp;lt;code&amp;gt;updItem&amp;lt;/code&amp;gt; method. '''This code is not harmful''' and can be used in components, but could be written in a simpler and more maintainable way. If you are an expert developer, please consider editing this page to use the capabilities mentioned.}}&lt;br /&gt;
{{review|technical|This article needs to be reviewed by someone who knows what they're doing.}}&lt;br /&gt;
{{version/tutor|2.5}}&lt;br /&gt;
{{Chunk:Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Contents}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This tutorial is part of the [[Developing a Model-View-Controller (MVC) Component for Joomla!2.5]] tutorial. You are encouraged to read the previous parts of the tutorial before reading this.&lt;br /&gt;
&lt;br /&gt;
== Basic frontend form ==&lt;br /&gt;
Designing the frontend interface leads us to create a Model-View-Controller triptych similar to the backend in Part 7.&lt;br /&gt;
&lt;br /&gt;
== Create the specific controller ==&lt;br /&gt;
The entry point now gets an instance of an ''UpdHelloWorld'' prefixed controller which extends the function of JControllerForm. Let's create a basic controllerform for the site part:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/controllers/updhelloworld.php&amp;quot;&amp;gt;&lt;br /&gt;
''site/controllers/updhelloworld.php''&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;
// No direct access.&lt;br /&gt;
defined('_JEXEC') or die;&lt;br /&gt;
&lt;br /&gt;
// Include dependancy of the main controllerform class&lt;br /&gt;
jimport('joomla.application.component.controllerform');&lt;br /&gt;
&lt;br /&gt;
class HelloWorldControllerUpdHelloWorld extends JControllerForm&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	public function getModel($name = '', $prefix = '', $config = array('ignore_request' =&amp;gt; true))&lt;br /&gt;
	{&lt;br /&gt;
		return parent::getModel($name, $prefix, array('ignore_request' =&amp;gt; false));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function submit()&lt;br /&gt;
	{&lt;br /&gt;
		// Check for request forgeries.&lt;br /&gt;
		JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN'));&lt;br /&gt;
&lt;br /&gt;
		// Initialise variables.&lt;br /&gt;
		$app	= JFactory::getApplication();&lt;br /&gt;
		$model	= $this-&amp;gt;getModel('updhelloworld');&lt;br /&gt;
&lt;br /&gt;
		// Get the data from the form POST&lt;br /&gt;
		$data = JRequest::getVar('jform', array(), 'post', 'array');&lt;br /&gt;
&lt;br /&gt;
        // Now update the loaded data to the database via a function in the model&lt;br /&gt;
        $upditem	= $model-&amp;gt;updItem($data);&lt;br /&gt;
&lt;br /&gt;
    	// check if ok and display appropriate message.  This can also have a redirect if desired.&lt;br /&gt;
        if ($upditem) {&lt;br /&gt;
            echo &amp;quot;&amp;lt;h2&amp;gt;Updated Greeting has been saved&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            echo &amp;quot;&amp;lt;h2&amp;gt;Updated Greeting failed to be saved&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
        }&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;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controller will display the appropriate message after the form is submitted.&lt;br /&gt;
&lt;br /&gt;
== Create the view ==&lt;br /&gt;
&lt;br /&gt;
With your favorite file manager and editor, create a file ''site/views/updhelloworld/view.html.php'' containing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/views/updhelloworld/view.html.php&amp;quot;&amp;gt;&lt;br /&gt;
''site/views/updhelloworld/view.html.php''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
// import Joomla view library&lt;br /&gt;
jimport('joomla.application.component.view');&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * HTML View class for the UpdHelloWorld Component&lt;br /&gt;
 */&lt;br /&gt;
class HelloWorldViewUpdHelloWorld extends JView&lt;br /&gt;
{&lt;br /&gt;
	// Overwriting JView display method&lt;br /&gt;
	function display($tpl = null) &lt;br /&gt;
	{&lt;br /&gt;
		$app		= JFactory::getApplication();&lt;br /&gt;
		$params		= $app-&amp;gt;getParams();&lt;br /&gt;
		$dispatcher = JDispatcher::getInstance();&lt;br /&gt;
&lt;br /&gt;
		// Get some data from the models&lt;br /&gt;
		$state		= $this-&amp;gt;get('State');&lt;br /&gt;
		$item		= $this-&amp;gt;get('Item');&lt;br /&gt;
		$this-&amp;gt;form	= $this-&amp;gt;get('Form');&lt;br /&gt;
&lt;br /&gt;
		// Check for errors.&lt;br /&gt;
		if (count($errors = $this-&amp;gt;get('Errors'))) &lt;br /&gt;
		{&lt;br /&gt;
			JError::raiseError(500, implode('&amp;lt;br /&amp;gt;', $errors));&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		// Display the view&lt;br /&gt;
		parent::display($tpl);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Joomla, views display data using a layout. With your favorite file manager and editor, put a file ''site/views/updhelloworld/tmpl/default.php'' containing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/views/updhelloworld/tmpl/default.php&amp;quot;&amp;gt;&lt;br /&gt;
''site/views/updhelloworld/tmpl/default.php''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
JHtml::_('behavior.keepalive');&lt;br /&gt;
JHtml::_('behavior.formvalidation');&lt;br /&gt;
JHtml::_('behavior.tooltip');&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
    &amp;lt;h2&amp;gt;Update the Hello World greeting&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form class=&amp;quot;form-validate&amp;quot; action=&amp;quot;&amp;lt;?php echo JRoute::_('index.php'); ?&amp;gt;&amp;quot; method=&amp;quot;post&amp;quot; id=&amp;quot;updhelloworld&amp;quot; name=&amp;quot;updhelloworld&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;fieldset&amp;gt;&lt;br /&gt;
        	&amp;lt;dl&amp;gt;&lt;br /&gt;
          	    &amp;lt;dt&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel('id'); ?&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
             	&amp;lt;dd&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput('id'); ?&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
                &amp;lt;dt&amp;gt;&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
        	    &amp;lt;dt&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel('greeting'); ?&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
        	    &amp;lt;dd&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput('greeting'); ?&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
                &amp;lt;dt&amp;gt;&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;/dd&amp;gt;&lt;br /&gt;
                &amp;lt;dt&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
            	&amp;lt;dd&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;option&amp;quot; value=&amp;quot;com_helloworld&amp;quot; /&amp;gt;&lt;br /&gt;
            	    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;task&amp;quot; value=&amp;quot;updhelloworld.submit&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/dd&amp;gt;&lt;br /&gt;
                &amp;lt;dt&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
                &amp;lt;dd&amp;gt;&amp;lt;button type=&amp;quot;submit&amp;quot; class=&amp;quot;button&amp;quot;&amp;gt;&amp;lt;?php echo JText::_('Submit'); ?&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
			                &amp;lt;?php echo JHtml::_('form.token'); ?&amp;gt;&lt;br /&gt;
                &amp;lt;/dd&amp;gt;&lt;br /&gt;
        	&amp;lt;/dl&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;clr&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This layout utilises the forms design which resides with the related model.  The getLabel and getInput will pickup the xml fields defined and display appropriately.  More on the xml file within the models section of this tutorial.&lt;br /&gt;
&lt;br /&gt;
Create a file ''site/views/updhelloworld/tmpl/default.xml'' containing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/views/updhelloworld/tmpl/default.xml&amp;quot;&amp;gt;&lt;br /&gt;
''site/views/updhelloworld/tmpl/default.xml''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;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;metadata&amp;gt;&lt;br /&gt;
	&amp;lt;layout title=&amp;quot;COM_HELLOWORLD_UPDHELLOWORLD_VIEW_DEFAULT_TITLE&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;message&amp;gt;COM_HELLOWORLD_UPDHELLOWORLD_VIEW_DEFAULT_DESC&amp;lt;/message&amp;gt;&lt;br /&gt;
	&amp;lt;/layout&amp;gt;&lt;br /&gt;
&amp;lt;/metadata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This enables a menu option to be allocated to the frontend form.&lt;br /&gt;
&lt;br /&gt;
== Create the model ==&lt;br /&gt;
The ''UpdHelloWorld'' model sets up the data through from the related form and allows the mechanism to save the subsequent data loaded into the form into the database.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/models/updhelloworld.php&amp;quot;&amp;gt;&lt;br /&gt;
''site/models/updhelloworld.php''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
// Include dependancy of the main model form&lt;br /&gt;
jimport('joomla.application.component.modelform');&lt;br /&gt;
// import Joomla modelitem library&lt;br /&gt;
jimport('joomla.application.component.modelitem');&lt;br /&gt;
// Include dependancy of the dispatcher&lt;br /&gt;
jimport('joomla.event.dispatcher');&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UpdHelloWorld Model&lt;br /&gt;
 */&lt;br /&gt;
class HelloWorldModelUpdHelloWorld extends JModelForm&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * @var object item&lt;br /&gt;
	 */&lt;br /&gt;
	protected $item;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get the data for a new qualification&lt;br /&gt;
	 */&lt;br /&gt;
	public function getForm($data = array(), $loadData = true)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
        $app = JFactory::getApplication('site');&lt;br /&gt;
&lt;br /&gt;
        // Get the form.&lt;br /&gt;
		$form = $this-&amp;gt;loadForm('com_helloworld.updhelloworld', 'updhelloworld', array('control' =&amp;gt; 'jform', 'load_data' =&amp;gt; true));&lt;br /&gt;
		if (empty($form)) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		return $form;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get the message&lt;br /&gt;
	 * @return object The message to be displayed to the user&lt;br /&gt;
	 */&lt;br /&gt;
	function &amp;amp;getItem()&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		if (!isset($this-&amp;gt;_item))&lt;br /&gt;
		{&lt;br /&gt;
			$cache = JFactory::getCache('com_helloworld', '');&lt;br /&gt;
			$id = $this-&amp;gt;getState('helloworld.id');&lt;br /&gt;
			$this-&amp;gt;_item =  $cache-&amp;gt;get($id);&lt;br /&gt;
			if ($this-&amp;gt;_item === false) {&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return $this-&amp;gt;_item;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function updItem($data)&lt;br /&gt;
	{&lt;br /&gt;
        // set the variables from the passed data&lt;br /&gt;
        $id = $data['id'];&lt;br /&gt;
        $greeting = $data['greeting'];&lt;br /&gt;
&lt;br /&gt;
        // set the data into a query to update the record&lt;br /&gt;
		$db		= $this-&amp;gt;getDbo();&lt;br /&gt;
		$query	= $db-&amp;gt;getQuery(true);&lt;br /&gt;
        $query-&amp;gt;clear();&lt;br /&gt;
		$query-&amp;gt;update(' #__helloworld ');&lt;br /&gt;
		$query-&amp;gt;set(' greeting = '.$db-&amp;gt;Quote($greeting) );&lt;br /&gt;
		$query-&amp;gt;where(' id = ' . (int) $id );&lt;br /&gt;
&lt;br /&gt;
		$db-&amp;gt;setQuery((string)$query);&lt;br /&gt;
&lt;br /&gt;
        if (!$db-&amp;gt;query()) {&lt;br /&gt;
            JError::raiseError(500, $db-&amp;gt;getErrorMsg());&lt;br /&gt;
        	return false;&lt;br /&gt;
        } else {&lt;br /&gt;
        	return true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following file ''updhelloworld.xml'' should be created using your favourite editor and saved in the forms folder under the models directory.  The first of the fields being referenced id using the sql type so that I returns the results from the query into a dropdown list form to be selected.&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/models/forms/updhelloworld.xml&amp;quot;&amp;gt;&lt;br /&gt;
''site/models/forms/updhelloworld.xml''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;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;form name=&amp;quot;updhelloworld&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;fieldset name=&amp;quot;updhelloworld&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;field&lt;br /&gt;
            name=&amp;quot;id&amp;quot;&lt;br /&gt;
            type=&amp;quot;sql&amp;quot;&lt;br /&gt;
            multiple=&amp;quot;false&amp;quot;&lt;br /&gt;
            size=&amp;quot;1&amp;quot;&lt;br /&gt;
            label=&amp;quot;COM_HELLOWORLD_FORM_LBL_UPDHELLOWORLD_ID&amp;quot;&lt;br /&gt;
            description=&amp;quot;COM_HELLOWORLD_FORM_DESC_UPDHELLOWORLD_ID&amp;quot;&lt;br /&gt;
            query=&amp;quot;select id, greeting from #__helloworld&amp;quot;&lt;br /&gt;
            key_field=&amp;quot;id&amp;quot;&lt;br /&gt;
            value_field=&amp;quot;greeting&amp;quot;&lt;br /&gt;
            default=&amp;quot;0&amp;quot;&lt;br /&gt;
	    required=&amp;quot;true&amp;quot;&lt;br /&gt;
            &amp;gt;&lt;br /&gt;
                &amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;JOPTION_SELECT_ID&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;greeting&amp;quot;&lt;br /&gt;
            type=&amp;quot;text&amp;quot;&lt;br /&gt;
	    description=&amp;quot;COM_HELLOWORLD_FORM_DESC_UPDHELLOWORLD_GREETING&amp;quot;&lt;br /&gt;
	    label=&amp;quot;COM_HELLOWORLD_FORM_LBL_UPDHELLOWORLD_GREETING&amp;quot;&lt;br /&gt;
	    required=&amp;quot;true&amp;quot;&lt;br /&gt;
	    size=&amp;quot;50&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adding some language keys ==&lt;br /&gt;
&lt;br /&gt;
This file provides the text link between the label in the model form definition to be displayed in the view.  And being for the frontend, it resides in the site folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site/language/en-GB/en-GB.com_helloworld.ini&amp;quot;&amp;gt;&lt;br /&gt;
''site/language/en-GB/en-GB.com_helloworld.ini''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
COM_HELLOWORLD_FORM_LBL_UPDHELLOWORLD_ID=&amp;quot;Greeting ID&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_FORM_DESC_UPDHELLOWORLD_ID=&amp;quot;This is the ID of the Greeting record&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_FORM_LBL_UPDHELLOWORLD_GREETING=&amp;quot;Greeting&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_FORM_DESC_UPDHELLOWORLD_GREETING=&amp;quot;Greeting description&amp;quot;&lt;br /&gt;
JOPTION_SELECT_ID=&amp;quot; -- Select Greeting to Update -- &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the last 2 lines to the ''admin/language/en-GB/en-GB.com_helloworld.sys.ini'' file to provide the text link for the menu type display.  And being for the backend, it resides in the admin language folder.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;admin/language/en-GB/en-GB.com_helloworld.sys.ini&amp;quot;&amp;gt;&lt;br /&gt;
''admin/language/en-GB/en-GB.com_helloworld.sys.ini''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
COM_HELLOWORLD=&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_DESCRIPTION=&amp;quot;This is the Hello World description&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC=&amp;quot;This view displays a selected message&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE=&amp;quot;Hello World&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_INSTALL_TEXT=&amp;quot;HelloWorld Install script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_MENU=&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_POSTFLIGHT_DISCOVER_INSTALL_TEXT=&amp;quot;HelloWorld postlight discover install script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_POSTFLIGHT_INSTALL_TEXT=&amp;quot;HelloWorld postflight install script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_POSTFLIGHT_UNINSTALL_TEXT=&amp;quot;HelloWorld postflight uninstall script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_POSTFLIGHT_UPDATE_TEXT=&amp;quot;HelloWorld postflight update script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_PREFLIGHT_DISCOVER_INSTALL_TEXT=&amp;quot;HelloWorld preflight discover install script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_PREFLIGHT_INSTALL_TEXT=&amp;quot;HelloWorld preflight install script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_PREFLIGHT_UNINSTALL_TEXT=&amp;quot;HelloWorld preflight uninstall script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_PREFLIGHT_UPDATE_TEXT=&amp;quot;HelloWorld preflight update script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_UNINSTALL_TEXT=&amp;quot;HelloWorld Uninstall script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_UPDATE_TEXT=&amp;quot;HelloWorld Update script&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_UPDHELLOWORLD_VIEW_DEFAULT_TITLE=&amp;quot;Update the Greeting&amp;quot;&lt;br /&gt;
COM_HELLOWORLD_UPDHELLOWORLD_VIEW_DEFAULT_DESC=&amp;quot;Update greeting here&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ''_populateState'' method is, by default, automatically called when a state is read by the ''getState'' method.&lt;br /&gt;
&lt;br /&gt;
== Packaging the component ==&lt;br /&gt;
&lt;br /&gt;
Content of your code directory-&lt;br /&gt;
* ''[[#helloworld.xml|helloworld.xml]]''&lt;br /&gt;
* ''[[#script.php|script.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_02#site/helloworld.php|site/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_02#site/controller.php|site/controller.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/controllers/updhelloworld.php|site/controllers/updhelloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/controllers/index.html|site/controllers/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/helloworld/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/views/updhelloworld/view.html.php|site/views/updhelloworld/view.html.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/helloworld/tmpl/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/updhelloworld/tmpl/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_06#site/views/helloworld/tmpl/default.xml|site/views/helloworld/tmpl/default.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/views/updhelloworld/tmpl/default.xml|site/views/updhelloworld/tmpl/default.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/views/updhelloworld/tmpl/default.php|site/views/updhelloworld/tmpl/default.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/models/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#site/models/helloworld.php|site/models/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/models/updhelloworld.php|site/models/updhelloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_18#site/models/forms/updhelloworld.xml|site/models/forms/updhelloworld.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/models/forms/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/language/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/language/en-GB/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_08#site/language/en-GB/en-GB.com_helloworld.ini|site/language/en-GB/en-GB.com_helloworld.ini]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/access.xml|admin/access.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/config.xml|admin/config.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/helloworld.php|admin/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_12#admin/controller.php|admin/controller.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#admin/sql/install.mysql.utf8.sql|admin/sql/install.mysql.utf8.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_06#admin/sql/uninstall.mysql.utf8.sql|admin/sql/uninstall.mysql.utf8.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/updates/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/updates/mysql/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#admin/sql/updates/mysql/0.0.1.sql|admin/sql/updates/mysql/0.0.1.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_06#admin/sql/install.mysql.utf8.sql|admin/sql/updates/mysql/0.0.6.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_12#admin/sql/updates/mysql/0.0.12.sql|admin/sql/updates/mysql/0.0.12.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#admin/sql/updates/mysql/0.0.13.sql|admin/sql/updates/mysql/0.0.13.sql]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/models/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/models/fields/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_12#admin/models/fields/helloworld.php|admin/models/fields/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/models/forms/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/models/rules/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/models/helloworld.php|admin/models/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_09#admin/models/helloworlds.php|admin/models/helloworlds.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/views/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/views/helloworlds/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/views/helloworlds/tmpl/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_07#admin/views/helloworlds/tmpl/default_head.php|admin/views/helloworlds/tmpl/default_head.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_07#admin/views/helloworlds/tmpl/default_body.php|admin/views/helloworlds/tmpl/default_body.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_07#admin/views/helloworlds/tmpl/default_foot.php|admin/views/helloworlds/tmpl/default_foot.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/views/helloworld/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/views/helloworld/tmpl/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/helpers/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/helpers/helloworld.php|admin/helpers/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/tables/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_14#admin/tables/helloworld.php|admin/tables/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_13#admin/language/en-GB/en-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]''&lt;br /&gt;
* ''[[#admin/language/en-GB/en-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/controllers/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/controllers/helloworld.php|admin/controllers/helloworld.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_11#admin/controllers/helloworlds.php|admin/controllers/helloworlds.php]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_08#language/en-GB/en-GB.ini|language/en-GB/en-GB.ini]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|media/index.html]]''&lt;br /&gt;
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|media/images/index.html]]''&lt;br /&gt;
* ''media/images/tux-16x16.png''&lt;br /&gt;
* ''media/images/tux-48x48.png''&lt;br /&gt;
&lt;br /&gt;
Create a compressed file of this directory or directly download the [http://joomlacode.org/gf/download/frsrelease/11394/58397/com_helloworld-1.6-part07.zip archive] and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;helloworld.xml&amp;quot;&amp;gt;&lt;br /&gt;
''helloworld.xml''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;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;component&amp;quot; version=&amp;quot;2.5.0&amp;quot; method=&amp;quot;upgrade&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;name&amp;gt;COM_HELLOWORLD&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;!-- The following elements are optional and free of formatting conttraints --&amp;gt;&lt;br /&gt;
	&amp;lt;creationDate&amp;gt;November 2009&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;John Doe&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;authorEmail&amp;gt;john.doe@example.org&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
	&amp;lt;authorUrl&amp;gt;http://www.example.org&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
	&amp;lt;copyright&amp;gt;Copyright Info&amp;lt;/copyright&amp;gt;&lt;br /&gt;
	&amp;lt;license&amp;gt;License Info&amp;lt;/license&amp;gt;&lt;br /&gt;
	&amp;lt;!--  The version string is recorded in the components table --&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;0.0.18&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;!-- The description is optional and defaults to the name --&amp;gt;&lt;br /&gt;
	&amp;lt;description&amp;gt;COM_HELLOWORLD_DESCRIPTION&amp;lt;/description&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;!-- Runs on install/uninstall/update; New in 2.5 --&amp;gt;&lt;br /&gt;
	&amp;lt;scriptfile&amp;gt;script.php&amp;lt;/scriptfile&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;install&amp;gt; &amp;lt;!-- Runs on install --&amp;gt;&lt;br /&gt;
		&amp;lt;sql&amp;gt;&lt;br /&gt;
			&amp;lt;file driver=&amp;quot;mysql&amp;quot; charset=&amp;quot;utf8&amp;quot;&amp;gt;sql/install.mysql.utf8.sql&amp;lt;/file&amp;gt;&lt;br /&gt;
		&amp;lt;/sql&amp;gt;&lt;br /&gt;
	&amp;lt;/install&amp;gt;&lt;br /&gt;
	&amp;lt;uninstall&amp;gt; &amp;lt;!-- Runs on uninstall --&amp;gt;&lt;br /&gt;
		&amp;lt;sql&amp;gt;&lt;br /&gt;
			&amp;lt;file driver=&amp;quot;mysql&amp;quot; charset=&amp;quot;utf8&amp;quot;&amp;gt;sql/uninstall.mysql.utf8.sql&amp;lt;/file&amp;gt;&lt;br /&gt;
		&amp;lt;/sql&amp;gt;&lt;br /&gt;
	&amp;lt;/uninstall&amp;gt;&lt;br /&gt;
	&amp;lt;update&amp;gt; &amp;lt;!-- Runs on update; New in 2.5 --&amp;gt;&lt;br /&gt;
		&amp;lt;schemas&amp;gt;&lt;br /&gt;
			&amp;lt;schemapath type=&amp;quot;mysql&amp;quot;&amp;gt;sql/updates/mysql&amp;lt;/schemapath&amp;gt;&lt;br /&gt;
		&amp;lt;/schemas&amp;gt;&lt;br /&gt;
	&amp;lt;/update&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;!-- Site Main File Copy Section --&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Note the folder attribute: This attribute describes the folder&lt;br /&gt;
		to copy FROM in the package to install therefore files copied&lt;br /&gt;
		in this section are copied from /site/ in the package --&amp;gt;&lt;br /&gt;
	&amp;lt;files folder=&amp;quot;site&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;index.html&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;helloworld.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;controller.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;views&amp;lt;/folder&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;models&amp;lt;/folder&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;controllers&amp;lt;/folder&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;language&amp;lt;/folder&amp;gt;&lt;br /&gt;
	&amp;lt;/files&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;media destination=&amp;quot;com_helloworld&amp;quot; folder=&amp;quot;media&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;filename&amp;gt;index.html&amp;lt;/filename&amp;gt;&lt;br /&gt;
		&amp;lt;folder&amp;gt;images&amp;lt;/folder&amp;gt;&lt;br /&gt;
	&amp;lt;/media&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;administration&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Administration Menu Section --&amp;gt;&lt;br /&gt;
		&amp;lt;menu img=&amp;quot;../media/com_helloworld/images/tux-16x16.png&amp;quot;&amp;gt;COM_HELLOWORLD_MENU&amp;lt;/menu&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Administration Main File Copy Section --&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Note the folder attribute: This attribute describes the folder&lt;br /&gt;
			to copy FROM in the package to install therefore files copied&lt;br /&gt;
			in this section are copied from /admin/ in the package --&amp;gt;&lt;br /&gt;
		&amp;lt;files folder=&amp;quot;admin&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;!-- Admin Main File Copy Section --&amp;gt;&lt;br /&gt;
			&amp;lt;filename&amp;gt;index.html&amp;lt;/filename&amp;gt;&lt;br /&gt;
			&amp;lt;filename&amp;gt;config.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
			&amp;lt;filename&amp;gt;access.xml&amp;lt;/filename&amp;gt;&lt;br /&gt;
			&amp;lt;filename&amp;gt;helloworld.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
			&amp;lt;filename&amp;gt;controller.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
			&amp;lt;!-- SQL files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;sql&amp;lt;/folder&amp;gt;&lt;br /&gt;
			&amp;lt;!-- tables files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;tables&amp;lt;/folder&amp;gt;&lt;br /&gt;
			&amp;lt;!-- models files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;models&amp;lt;/folder&amp;gt;&lt;br /&gt;
			&amp;lt;!-- views files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;views&amp;lt;/folder&amp;gt;&lt;br /&gt;
			&amp;lt;!-- controllers files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;controllers&amp;lt;/folder&amp;gt;&lt;br /&gt;
			&amp;lt;!-- helpers files section --&amp;gt;&lt;br /&gt;
			&amp;lt;folder&amp;gt;helpers&amp;lt;/folder&amp;gt;&lt;br /&gt;
		&amp;lt;/files&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;languages folder=&amp;quot;admin&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB/en-GB.com_helloworld.ini&amp;lt;/language&amp;gt;&lt;br /&gt;
			&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB/en-GB.com_helloworld.sys.ini&amp;lt;/language&amp;gt;&lt;br /&gt;
		&amp;lt;/languages&amp;gt;&lt;br /&gt;
	&amp;lt;/administration&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;!-- UPDATESERVER DEFINITION --&amp;gt;&lt;br /&gt;
	&amp;lt;updateservers&amp;gt;&lt;br /&gt;
		&amp;lt;!-- Note: No spaces or linebreaks allowed between the server tags --&amp;gt;&lt;br /&gt;
		&amp;lt;server type=&amp;quot;extension&amp;quot; priority=&amp;quot;1&amp;quot; name=&amp;quot;HelloWorld Update Site&amp;quot;&amp;gt;http://yourdomain.com/update/helloworld-update.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
	&amp;lt;/updateservers&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can see in your component '''hello-world''' an array with two colums, two rows and checkboxes. You can click the checkboxes in order to select the different options you want.&lt;br /&gt;
&lt;br /&gt;
== Navigate ==&lt;br /&gt;
&lt;br /&gt;
[[Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Part 17|Prev: Adding an update server]]&lt;br /&gt;
[[Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Part 19|Next: Example of Menu Parameters &amp;amp; Stylesheets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;br /&gt;
[[Category:Joomla! 1.7]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Release_and_support_cycle</id>
		<title>Release and support cycle</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Release_and_support_cycle"/>
				<updated>2012-10-09T20:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Corrected mistake, adjusted layout, added examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla! is developed using a fixed release cycle. '''Every six months''', the Joomla! Project releases a new ''minor'' or ''major'' version of Joomla!. Joomla!'s version format is:&lt;br /&gt;
:&amp;lt;tt&amp;gt;[major].[minor].[maintenance]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each version of Joomla! is supported by the Joomla! Project for a limited amount of time. There are two classifications for support: standard support (STS) and long term support (LTS). Every '''third''' release will be assigned long term support.&lt;br /&gt;
&lt;br /&gt;
*'''STS (standard support)''' releases are supported for '''seven months'''. Their support ends one month after the next release of Joomla is released.&lt;br /&gt;
*'''LTS (long term support)''' releases are supported for '''twenty-one months'''.&lt;br /&gt;
&lt;br /&gt;
Please note that both STS and LTS releases, once they have reached the ''GA (General Availability)'' status, are fully functional and ready to be used in production environment. The disadvantage of using STS releases is that you will need to update your installation of Joomla! every six months, while the advantage is that you will have access to new features and extensions earlier.&lt;br /&gt;
&lt;br /&gt;
Generally, the first STS release after an LTS release indicates the beginning of a new ''major release cycle''. This STS release introduces fundamentally new features and changes that break compatibility with the previous LTS. One more STS release follows (usually compatible with the first STS release), and the release cycle is finished by the release of an LTS release which finalizes of the work of the two STS releases. The three releases in one cycle will usually be numbered &amp;lt;tt&amp;gt;[major].0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;[major].1&amp;lt;/tt&amp;gt; (STS) and &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; (LTS). For example, the STS release 3.0 will include breaking changes from 2.5, and 3.5 will include matured versions of the changes in 3.0 and 3.1.&lt;br /&gt;
&lt;br /&gt;
Usually, there will be a migration path (an officially supported way of migrating to the next version) between two LTS releases (from &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[next major].5&amp;lt;/tt&amp;gt;) and between an LTS release and the STS releases in its major release cycle (from &amp;lt;tt&amp;gt;[major].1&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt;, for example), but not necessarily to the '''following''' STS releases (from &amp;lt;tt&amp;gt;[major].5&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;[next major].0&amp;lt;/tt&amp;gt;). In the case of 1.5 to 2.5 (LTS to LTS), for example, there is a migration path. Note that in the case of 2.5 to 3.0 (LTS to STS), there is also built-in migration path, since the changes aren't too incompatible.&lt;br /&gt;
&lt;br /&gt;
For more information, see [http://developer.joomla.org/strategy.html the official Development Strategy].&lt;br /&gt;
&lt;br /&gt;
The latest STS version documented on this Wiki is {{CurrentSTSVer}} (see [[:Category:Joomla! {{CurrentSTSVer|minor}}]]). The latest LTS version documented on this Wiki is {{CurrentLTSVer}} (see [[:Category:Joomla! {{CurrentLTSVer|minor}}]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Developers/Projects</id>
		<title>Developers/Projects</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Developers/Projects"/>
				<updated>2012-09-02T16:40:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adapted the suggested titles to the continuous tense used in most tutorial titles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Suggested topics ==&lt;br /&gt;
This is a short list of articles that might be written to support developers.  Please feel free to add further topic ideas.&lt;br /&gt;
&lt;br /&gt;
* [[Adding configuration objects to modules and plugins]].&lt;br /&gt;
* [[Storing data in the session between page loads]].&lt;br /&gt;
* [[Suppressing output of extra HTML]].&lt;br /&gt;
* [[Using the filter package]].&lt;br /&gt;
*: Describe how and when to use the Filter package and explain what needs to be filtered for various situations (for queries, for URLs, etc)&lt;br /&gt;
* [[Using the registry package]]&lt;br /&gt;
* [[Using JSimpleXML]].&lt;br /&gt;
*: How to load and store XML files and how to work with them&lt;br /&gt;
* [[Creating component feeds]] (RSS/ATOM)&lt;br /&gt;
* [[Generating paths for client side and server side]]&lt;br /&gt;
* [[Acessing information from the request]]&lt;br /&gt;
*: This focuses on using the JBrowser class to retrieve information about the features available in the user's browser.&lt;br /&gt;
* [[Creating an editor plugin]]&lt;br /&gt;
* [[What can be done with a user plugin]]&lt;br /&gt;
* [[Working with parameters]]&lt;br /&gt;
* [[Cloaking email addresses]]&lt;br /&gt;
* [[Using the caching system in your component]]. This might be enough (for now?) -&amp;gt; [[Cache]]&lt;br /&gt;
* [[Extending Joomla's MVC Architecture]]&amp;lt;noinclude&amp;gt;[[Category:Landing subpages|{{PAGENAME}}]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/preamble</id>
		<title>User:MarkRS/cascading cheat sheets/components/preamble</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/preamble"/>
				<updated>2012-08-27T20:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Changed absolute link into relative link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain {{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat-sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
= Component? =&lt;br /&gt;
&lt;br /&gt;
Components deliver main areas of functionality, for example an event diary (there are many available as extensions), or the core functions of user management and displaying articles.&lt;br /&gt;
&lt;br /&gt;
You'll find the code for components in the directories&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/administration/components&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first one is for for front end functionality, the second for back end (administration) functionality.  The code for each component is in a subdirectory of one of these named &amp;lt;tt&amp;gt;com_&amp;lt;component name&amp;gt;&amp;lt;/tt&amp;gt;.  Components, by definition, need functionality in both areas.&lt;br /&gt;
&lt;br /&gt;
You should be able to find the, for example, content component (&amp;quot;com_content&amp;quot;), which is for displaying articles, the user component (&amp;quot;com_user&amp;quot;), which is for for managing website accounts, and several others.&lt;br /&gt;
&lt;br /&gt;
This naming is one of those Joomla principles. You probably can hack it so that you can name a component directory “freds_diner”, but a whole load of defaults just won't work and you'll be fighting every step of the way.&lt;br /&gt;
&lt;br /&gt;
= Component Internals =&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
We're going to zoom through the actions occurring from a website URL appearing to the beginning of a component running.  We're going to start in the only possible place, the middle.   It's going to look a little slow, but only for a very short while, and I think you'll find this will explain many of the Joomla idioms which will make your overall learning curve much quicker.  Let's imagine we are looking at a component that allows website users to answer a questionnaire that is presented to them, stores their answers, and allows an administrator to look at their answers.  To keep it nice and simple, we'll imagine our administrator has too much time on his hands and hard codes a new questionnaire into the front end every day.&lt;br /&gt;
&lt;br /&gt;
Here's the process of events for the user&lt;br /&gt;
&lt;br /&gt;
By selecting our questionnaire component, let's imagine that a URL like this&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;yoursite&amp;gt;/questionnaire&lt;br /&gt;
&lt;br /&gt;
is generated.  Whilst this is not something that Joomla can directly work with, this is quite possibly the way it'll be.  It could be the case if you had, for example, a SEF module enabled.&lt;br /&gt;
&lt;br /&gt;
== Everything goes through index.php ==&lt;br /&gt;
&lt;br /&gt;
This is the first step of every Joomla page.  There are two different versions of index.php, one for the back end and a separate one for the front end.  You'll find the front end file in the site root.&lt;br /&gt;
&lt;br /&gt;
Have a look in this file and you'll see the first two active lines are&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	define('_JEXEC', 1);&lt;br /&gt;
	define('DS', DIRECTORY_SEPARATOR);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line defines a constant called _JEXEC and gives it the value “1”.  The value is pretty irrelevant but its simple existence is part of the system security.  You'll see that many Joomla code files start with a check for this (or some other) constant, exiting immediately if it's not found.  This helps prevent miscreants from going directly to internal parts of the system.&lt;br /&gt;
&lt;br /&gt;
The second line is about to disappear in Joomla 3.0,  since php handles converting “/” to the requirements of the platform you're actually running on.  My advice is don't use DS, it's just BS these days.&lt;br /&gt;
&lt;br /&gt;
The next three blocks are dull, simply loading defines files that are required for the core running.  Even the line after doesn't really concern us yet, just setting a marker point used during debugging.&lt;br /&gt;
&lt;br /&gt;
The line after that,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	$app = JFactory::getApplication('site');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
might look fairly dull, but it creates the application object that contains the top level scaffolding that defines Joomla.  You start to get a sense of this with the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	$app-&amp;gt;initialise();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which, it's easy to guess, will set up a whole bunch of things to prepare Joomla for the job at hand.&lt;br /&gt;
&lt;br /&gt;
== I know “factory”, but how does “JFactory” work? ==&lt;br /&gt;
&lt;br /&gt;
Let's take a quick sidestep that helps make this very common Joomla style clearer.&lt;br /&gt;
Just taking the case above, as an OOP-aware developer you're familiar with the idea of an object factory, that thing that allows OOP people to tell themselves that they're not using global objects.  But what about the “J”?&lt;br /&gt;
&lt;br /&gt;
When you see stuff like this in the code, and there's a lot of it (JFactory, JForm, JText, and on and on), Joomla goes to the directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to look for something with that name (without the “J”).  So, for example there is a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/factory.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
that contains a class called JFactory, and, surprise surprise, it has a method named “getApplication”. This is a very standard way of Joomla calling core functionality.  Some functionality is more detailed and so gets a whole directory in that location.  For example the call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
JUser::getInstance()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finds a file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;.  That file contains the definition of a class JUser, and you won't be shocked to find that it contains a method &amp;quot;getInstance&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Any call that looks like “J&amp;lt;Something&amp;gt;::function” will be using this mechanism.  Now you know where to go when you need to know what a function like this does and the only answer you can get from the Joomla cognescenti is “read the code”!  It's the same location for back end code as well as front end.&lt;br /&gt;
&lt;br /&gt;
== And now, back to the records... ==&lt;br /&gt;
&lt;br /&gt;
After another profiler call that I'm not going to talk about either, we come to the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$app-&amp;gt;route();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You remember I said that Joomla couldn't directly work with that URL we started with?  The &amp;quot;route&amp;quot; method &amp;quot;decodes&amp;quot; the URL into something that Joomla can process.  If we'd started with the URL&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;your site&amp;gt;/index.php?option=com_questions&lt;br /&gt;
&lt;br /&gt;
this &amp;quot;decoding&amp;quot; would have been at its simplest.  Anything else will get converted back to this type of format, which is what the rest of the internals of the framework actually work with.&lt;br /&gt;
&lt;br /&gt;
That all just brings us to the point where we can actually start doing something.  You'll have realised that the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$app-&amp;gt;dispatch();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
means that the application class (which, of course, is defined in the file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/application/application.php&amp;lt;/tt&amp;gt;), that our factory class created for us initially, has a method “dispatch”. This method does a little bit of setting up and then starts the heavy lifting with the component.  Having a brief look through that code, it's mostly easy to see this happening. But no, wait!  Clearly the critical line doing this is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$contents = JComponentHelper::renderComponent($component);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but not only did we not pass in a value for $component to this method, but there's no file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/componenthelper&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Well, no, that seems to be more of the internal wiring that does so much for you, you want to look in&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/application/component&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where you'll find the file you want, “helper.php”.&lt;br /&gt;
&lt;br /&gt;
And, when the framework doesn't find a component name stored in that variable, the dispatch method finds the component to load from the data that was stored during the &amp;quot;route&amp;quot; method.  And, in case, like me, you're confused by this use of words; the not-so-obvious piece of information is that &amp;quot;renderComponent&amp;quot; is not the same as &amp;quot;render&amp;quot;.  The first one generates the output from a specific component.  The second one takes that component output and fits it into the overall page that your user sees on screen.&lt;br /&gt;
&lt;br /&gt;
So now we have arrived at the point that the component can start to do its work.  The dispatcher has brought us there.  Time to look at the details of component design!&lt;br /&gt;
&lt;br /&gt;
I'm going to start developing an example of a simple component that looks after a little bit of data, shows it to some people and allows some people to edit it.  In short, a &amp;quot;hello world&amp;quot; program for people who actually want to do something.&lt;br /&gt;
&lt;br /&gt;
Follow along at [[{{#titleparts:{{FULLPAGENAME}}|-1}}/overview|Component Overview]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview</id>
		<title>User:MarkRS/cascading cheat sheets/components/overview</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview"/>
				<updated>2012-08-27T20:22:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Changed absolute link into relative link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
= Component Overview =&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain&lt;br /&gt;
{{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
The previous article in this series was [[{{#titleparts:{{FULLPAGENAME}}|-1}}/preamble|Component Preamble]]&lt;br /&gt;
&lt;br /&gt;
== Ready... ==&lt;br /&gt;
&lt;br /&gt;
The framework has set the scene, it's ready and waiting to swing into action for you, you've just got to string the right sequences together.&lt;br /&gt;
&lt;br /&gt;
== Steady... ==&lt;br /&gt;
&lt;br /&gt;
To start your component Joomla looks for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_&amp;lt;component-name&amp;gt;/&amp;lt;component name&amp;gt;.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where your component takes over.&lt;br /&gt;
In the simplest case, Joomla already has the rigging to do most of what you want.&lt;br /&gt;
&lt;br /&gt;
Your file can be as simple, and standard, as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;18&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
    // import joomla controller library&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
 &lt;br /&gt;
    // Get an instance of the controller prefixed by the component name&lt;br /&gt;
$controller = JController::getInstance('questions');&lt;br /&gt;
 &lt;br /&gt;
    // Perform the Request task&lt;br /&gt;
$controller-&amp;gt;execute(JRequest::getCmd('task'));&lt;br /&gt;
 &lt;br /&gt;
    // Redirect if set by the controller&lt;br /&gt;
$controller-&amp;gt;redirect();&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base controller class (from the third line above. You know where to find that if you've been following this series) just looks for a file called “controller.php” in the component main directory.  Just to be clear, in this case that means that the controller file is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/controller.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that is an instance of a controller class called QuestionsController then everything will be set for the next phase.&lt;br /&gt;
&lt;br /&gt;
Of course, at the moment the URL doesn't contain &amp;quot;task=&amp;lt;something&amp;gt;&amp;quot; for the command JRequest::getCmd('task') to find, so the default setting is to display the first view of the component.  What's the first view?  Of course you'd guess (correctly) that the default view is &amp;quot;questions&amp;quot;, nice and simple.&lt;br /&gt;
&lt;br /&gt;
== Go... ==&lt;br /&gt;
&lt;br /&gt;
Well, almost go.&lt;br /&gt;
&lt;br /&gt;
In fact, certainly for the front end, it may well be that you don't need to add anything at all to the existing controller class except a name of your own. Your controller class could be as simple as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
&lt;br /&gt;
class QuestionsController extends JController&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Just an empty class definition to establish our own component controller class, but not adding anything to the base class.&lt;br /&gt;
&lt;br /&gt;
Even so, there's already a bit of Joomla idiom and scaffolding going on. Clearly the class that we're subclassing here is Jcontroller, but the less obvious part is that the name of our controller class is quite important, get it right and the framework will make all sorts of correct guesses for us. The class naming convention that gives you all this extra magic is&lt;br /&gt;
&lt;br /&gt;
{component name}{type name}{element name}&lt;br /&gt;
&lt;br /&gt;
Our component name, without its &amp;quot;com_&amp;quot; prefix, is questions.  This class is a controller and, because it's such an easy (or perhaps “simple”) thing, there's no element name in this case. By convention Joomla class names are in camel case. Php ignores case in class names. Beware, it does not do the same thing to filesystem names, the simple rule is camel-case class (&amp;amp;tc) names, lowercase file and directory names. No, you don't have to, but do yourself a favour and do do.&lt;br /&gt;
&lt;br /&gt;
The check for _JEXEC is a really good idea for the top of every file, and the import line is fairly obvious, why use dots instead of slashes? I don't know, but it's easy to put two and two together from our previous discussion of “Jfactory” and come up with the correct supposition that jimport(some.dotted.path) imports a file &amp;lt;site root&amp;gt;/libraries/some/dotted/path.php into the current file.&lt;br /&gt;
&lt;br /&gt;
== Really Go ==&lt;br /&gt;
&lt;br /&gt;
From here, the controller loads your first view, which probably gets some data out of your model, for your user to interact with.&lt;br /&gt;
&lt;br /&gt;
The simplest way this happens is that you just let the controller set up its defaults so that it loads you initial view file. If you just let it do this it will assume you want a view called “questions” (it got this from the first part of its own name, “QuestionsController”, see, I told you it was a good idea).&lt;br /&gt;
&lt;br /&gt;
== A view? How does that work? ==&lt;br /&gt;
&lt;br /&gt;
Like this. In short the framework tries to load a view class file, which pulls in the data it needs to show and displays it using a layout file. Easy. Of course, the framework will make a whole load of assumptions for you about how to pull that all together. If you don't give it any further clues or directives, the assumptions it makes are as follows.&lt;br /&gt;
&lt;br /&gt;
It looks for the view definition file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/views/questions/view.html.php&lt;br /&gt;
&lt;br /&gt;
From what you know already you'd be quite happy with all of that. If you guessed that the “html” in the middle of the filename means this file is the default for a normal webpage view and you could have all sorts of different files with things like “pdf” or “rss” in the names to make different types of output, then you'd really be ahead of the game!&lt;br /&gt;
&lt;br /&gt;
Anyway, let's stick with html for the moment. The bare bones of the file look like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.view');&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * HTML View class for the Questions Component front screen&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
class QuestionsViewQuestions extends JView&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	function display($tpl = null)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;questions = $this-&amp;gt;get('Items');&lt;br /&gt;
&lt;br /&gt;
			// Display the view&lt;br /&gt;
		parent::display($tpl);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
JView is the base view class, and we've given our subclass of it a name matching the template I gave you above {component}{type}{element}, nice and consistent.&lt;br /&gt;
&lt;br /&gt;
We load our questions and display them. Very little for us to do, with Joomla's little legs flailing along like crazy under the surface, just the way it ought to be!&lt;br /&gt;
&lt;br /&gt;
The view's &amp;quot;get&amp;quot; function is a highly flexible piece of code, &amp;quot;getting&amp;quot; all manner of things.  In this instance though what it's doing is getting data out of the data model, using what might appear a long winded route.  However, by carefully picking the places to intervene in this pathway, Joomla does the grubby work of loading our data and we can just do the fun bit!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load our questions? That sounds like data! Is that the “model” bit? ==&lt;br /&gt;
&lt;br /&gt;
Yup, here comes the first part of the &amp;quot;model&amp;quot; interaction.&lt;br /&gt;
&lt;br /&gt;
The view already has enough information to find the corresponding data model, if you handled your naming conventions correctly!&lt;br /&gt;
From the name of this view, the framework will look for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although this is very easy to follow, there are a lot very specific things going on here.&lt;br /&gt;
I have very carefully called this view &amp;quot;questions&amp;quot;, plural.  This is because we are going to show the user a list of questions.  I could have called it &amp;quot;questionnaire&amp;quot;, but that's a singular thing, and Joomla is set up not only to distinguish between singular things (ie one row from a table) and multiple things (ie a list containing several rows from a table!), but also to guess the singular name from the plural name.  I'm fairly sure it can guess &amp;quot;question&amp;quot; from &amp;quot;questions&amp;quot;, but I don't think it would get there from &amp;quot;questionnaire&amp;quot;.  But we're getting ahead of ourselves.&lt;br /&gt;
&lt;br /&gt;
In order to make our display easy, ie get Joomla to do most of the work for us, we'll define our &amp;quot;questions&amp;quot; class like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site root/components/com_questions/models/questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;31&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.modellist');&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Questions list Model ie a questionnaire&lt;br /&gt;
     */&lt;br /&gt;
class QuestionsModelQuestions extends JModelList&lt;br /&gt;
{&lt;br /&gt;
	protected function getListQuery()&lt;br /&gt;
	{&lt;br /&gt;
		$db = $this-&amp;gt;getDbo();&lt;br /&gt;
		$query = $db-&amp;gt;getQuery(true);&lt;br /&gt;
&lt;br /&gt;
			// Select the required fields from the table.&lt;br /&gt;
		$query-&amp;gt;select('*');&lt;br /&gt;
		$query-&amp;gt;from('#__questions_questions');&lt;br /&gt;
&lt;br /&gt;
		$query-&amp;gt;where('questionnaire_id=1');&lt;br /&gt;
&lt;br /&gt;
		return $query;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looks simple, but again, take notice of the little details and suddenly a lot more becomes clear.&lt;br /&gt;
We're extending a class called &amp;quot;JModelList&amp;quot;, a class that's specifically set up for handling result sets of multiple rows.  You'll be pleased, and unsurprised, to know there's a JModel class for single row result types, two of them in fact, but you'll probably be able to guess a lot about them from seeing this one.&lt;br /&gt;
&lt;br /&gt;
So what's going on here?  This is the only part of a chain of actions that we need to concern ourselves with in this simple instance.  This method just defines the query object that the framework needs to select the precise pieces of data we want to see.  You can guess that we've set up a &amp;quot;questions&amp;quot; table that has a field which groups questions into individual questionnaires.  I've cheated here, let's pretend our fictitious admin with too much time on his hands puts these rows into the table manually, and changes this class every day.  On other days he may select a different questionnaire number, just so we don't have to worry about how to pick one!&lt;br /&gt;
&lt;br /&gt;
A protected function?  Yes, it's internal to the chain of actions already in place to give us the list of questions in questionnaire &amp;quot;1&amp;quot; ready to display, and all we had to do was write one little query.  How easy is that!&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview</id>
		<title>User:MarkRS/cascading cheat sheets/components/overview</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview"/>
				<updated>2012-08-27T20:09:32Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Undo revision 71903: not in line with the intention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
= Component Overview =&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain&lt;br /&gt;
{{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
The previous article in this series was [[User:MarkRS/cascading_cheat_sheets/components/preamble|Component Preamble]]&lt;br /&gt;
&lt;br /&gt;
== Ready... ==&lt;br /&gt;
&lt;br /&gt;
The framework has set the scene, it's ready and waiting to swing into action for you, you've just got to string the right sequences together.&lt;br /&gt;
&lt;br /&gt;
== Steady... ==&lt;br /&gt;
&lt;br /&gt;
To start your component Joomla looks for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_&amp;lt;component-name&amp;gt;/&amp;lt;component name&amp;gt;.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where your component takes over.&lt;br /&gt;
In the simplest case, Joomla already has the rigging to do most of what you want.&lt;br /&gt;
&lt;br /&gt;
Your file can be as simple, and standard, as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;18&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
    // import joomla controller library&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
 &lt;br /&gt;
    // Get an instance of the controller prefixed by the component name&lt;br /&gt;
$controller = JController::getInstance('questions');&lt;br /&gt;
 &lt;br /&gt;
    // Perform the Request task&lt;br /&gt;
$controller-&amp;gt;execute(JRequest::getCmd('task'));&lt;br /&gt;
 &lt;br /&gt;
    // Redirect if set by the controller&lt;br /&gt;
$controller-&amp;gt;redirect();&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base controller class (from the third line above. You know where to find that if you've been following this series) just looks for a file called “controller.php” in the component main directory.  Just to be clear, in this case that means that the controller file is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/controller.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that is an instance of a controller class called QuestionsController then everything will be set for the next phase.&lt;br /&gt;
&lt;br /&gt;
Of course, at the moment the URL doesn't contain &amp;quot;task=&amp;lt;something&amp;gt;&amp;quot; for the command JRequest::getCmd('task') to find, so the default setting is to display the first view of the component.  What's the first view?  Of course you'd guess (correctly) that the default view is &amp;quot;questions&amp;quot;, nice and simple.&lt;br /&gt;
&lt;br /&gt;
== Go... ==&lt;br /&gt;
&lt;br /&gt;
Well, almost go.&lt;br /&gt;
&lt;br /&gt;
In fact, certainly for the front end, it may well be that you don't need to add anything at all to the existing controller class except a name of your own. Your controller class could be as simple as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
&lt;br /&gt;
class QuestionsController extends JController&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Just an empty class definition to establish our own component controller class, but not adding anything to the base class.&lt;br /&gt;
&lt;br /&gt;
Even so, there's already a bit of Joomla idiom and scaffolding going on. Clearly the class that we're subclassing here is Jcontroller, but the less obvious part is that the name of our controller class is quite important, get it right and the framework will make all sorts of correct guesses for us. The class naming convention that gives you all this extra magic is&lt;br /&gt;
&lt;br /&gt;
{component name}{type name}{element name}&lt;br /&gt;
&lt;br /&gt;
Our component name, without its &amp;quot;com_&amp;quot; prefix, is questions.  This class is a controller and, because it's such an easy (or perhaps “simple”) thing, there's no element name in this case. By convention Joomla class names are in camel case. Php ignores case in class names. Beware, it does not do the same thing to filesystem names, the simple rule is camel-case class (&amp;amp;tc) names, lowercase file and directory names. No, you don't have to, but do yourself a favour and do do.&lt;br /&gt;
&lt;br /&gt;
The check for _JEXEC is a really good idea for the top of every file, and the import line is fairly obvious, why use dots instead of slashes? I don't know, but it's easy to put two and two together from our previous discussion of “Jfactory” and come up with the correct supposition that jimport(some.dotted.path) imports a file &amp;lt;site root&amp;gt;/libraries/some/dotted/path.php into the current file.&lt;br /&gt;
&lt;br /&gt;
== Really Go ==&lt;br /&gt;
&lt;br /&gt;
From here, the controller loads your first view, which probably gets some data out of your model, for your user to interact with.&lt;br /&gt;
&lt;br /&gt;
The simplest way this happens is that you just let the controller set up its defaults so that it loads you initial view file. If you just let it do this it will assume you want a view called “questions” (it got this from the first part of its own name, “QuestionsController”, see, I told you it was a good idea).&lt;br /&gt;
&lt;br /&gt;
== A view? How does that work? ==&lt;br /&gt;
&lt;br /&gt;
Like this. In short the framework tries to load a view class file, which pulls in the data it needs to show and displays it using a layout file. Easy. Of course, the framework will make a whole load of assumptions for you about how to pull that all together. If you don't give it any further clues or directives, the assumptions it makes are as follows.&lt;br /&gt;
&lt;br /&gt;
It looks for the view definition file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/views/questions/view.html.php&lt;br /&gt;
&lt;br /&gt;
From what you know already you'd be quite happy with all of that. If you guessed that the “html” in the middle of the filename means this file is the default for a normal webpage view and you could have all sorts of different files with things like “pdf” or “rss” in the names to make different types of output, then you'd really be ahead of the game!&lt;br /&gt;
&lt;br /&gt;
Anyway, let's stick with html for the moment. The bare bones of the file look like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.view');&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * HTML View class for the Questions Component front screen&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
class QuestionsViewQuestions extends JView&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	function display($tpl = null)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;questions = $this-&amp;gt;get('Items');&lt;br /&gt;
&lt;br /&gt;
			// Display the view&lt;br /&gt;
		parent::display($tpl);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
JView is the base view class, and we've given our subclass of it a name matching the template I gave you above {component}{type}{element}, nice and consistent.&lt;br /&gt;
&lt;br /&gt;
We load our questions and display them. Very little for us to do, with Joomla's little legs flailing along like crazy under the surface, just the way it ought to be!&lt;br /&gt;
&lt;br /&gt;
The view's &amp;quot;get&amp;quot; function is a highly flexible piece of code, &amp;quot;getting&amp;quot; all manner of things.  In this instance though what it's doing is getting data out of the data model, using what might appear a long winded route.  However, by carefully picking the places to intervene in this pathway, Joomla does the grubby work of loading our data and we can just do the fun bit!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load our questions? That sounds like data! Is that the “model” bit? ==&lt;br /&gt;
&lt;br /&gt;
Yup, here comes the first part of the &amp;quot;model&amp;quot; interaction.&lt;br /&gt;
&lt;br /&gt;
The view already has enough information to find the corresponding data model, if you handled your naming conventions correctly!&lt;br /&gt;
From the name of this view, the framework will look for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although this is very easy to follow, there are a lot very specific things going on here.&lt;br /&gt;
I have very carefully called this view &amp;quot;questions&amp;quot;, plural.  This is because we are going to show the user a list of questions.  I could have called it &amp;quot;questionnaire&amp;quot;, but that's a singular thing, and Joomla is set up not only to distinguish between singular things (ie one row from a table) and multiple things (ie a list containing several rows from a table!), but also to guess the singular name from the plural name.  I'm fairly sure it can guess &amp;quot;question&amp;quot; from &amp;quot;questions&amp;quot;, but I don't think it would get there from &amp;quot;questionnaire&amp;quot;.  But we're getting ahead of ourselves.&lt;br /&gt;
&lt;br /&gt;
In order to make our display easy, ie get Joomla to do most of the work for us, we'll define our &amp;quot;questions&amp;quot; class like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site root/components/com_questions/models/questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;31&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.modellist');&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Questions list Model ie a questionnaire&lt;br /&gt;
     */&lt;br /&gt;
class QuestionsModelQuestions extends JModelList&lt;br /&gt;
{&lt;br /&gt;
	protected function getListQuery()&lt;br /&gt;
	{&lt;br /&gt;
		$db = $this-&amp;gt;getDbo();&lt;br /&gt;
		$query = $db-&amp;gt;getQuery(true);&lt;br /&gt;
&lt;br /&gt;
			// Select the required fields from the table.&lt;br /&gt;
		$query-&amp;gt;select('*');&lt;br /&gt;
		$query-&amp;gt;from('#__questions_questions');&lt;br /&gt;
&lt;br /&gt;
		$query-&amp;gt;where('questionnaire_id=1');&lt;br /&gt;
&lt;br /&gt;
		return $query;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looks simple, but again, take notice of the little details and suddenly a lot more becomes clear.&lt;br /&gt;
We're extending a class called &amp;quot;JModelList&amp;quot;, a class that's specifically set up for handling result sets of multiple rows.  You'll be pleased, and unsurprised, to know there's a JModel class for single row result types, two of them in fact, but you'll probably be able to guess a lot about them from seeing this one.&lt;br /&gt;
&lt;br /&gt;
So what's going on here?  This is the only part of a chain of actions that we need to concern ourselves with in this simple instance.  This method just defines the query object that the framework needs to select the precise pieces of data we want to see.  You can guess that we've set up a &amp;quot;questions&amp;quot; table that has a field which groups questions into individual questionnaires.  I've cheated here, let's pretend our fictitious admin with too much time on his hands puts these rows into the table manually, and changes this class every day.  On other days he may select a different questionnaire number, just so we don't have to worry about how to pick one!&lt;br /&gt;
&lt;br /&gt;
A protected function?  Yes, it's internal to the chain of actions already in place to give us the list of questions in questionnaire &amp;quot;1&amp;quot; ready to display, and all we had to do was write one little query.  How easy is that!&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview</id>
		<title>User:MarkRS/cascading cheat sheets/components/overview</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview"/>
				<updated>2012-08-26T23:06:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
= Component Overview =&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain&lt;br /&gt;
{{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
The previous article in this series was [[User:MarkRS/cascading_cheat_sheets/components/preamble|Component Preamble]]&lt;br /&gt;
&lt;br /&gt;
== Ready... ==&lt;br /&gt;
&lt;br /&gt;
The framework has set the scene, it's ready and waiting to swing into action for you, you've just got to string the right sequences together.&lt;br /&gt;
&lt;br /&gt;
== Steady... ==&lt;br /&gt;
&lt;br /&gt;
To start your component Joomla looks for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_&amp;lt;component-name&amp;gt;/&amp;lt;component name&amp;gt;.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where your component takes over. Joomla places no restrictions on what you do from this point. You could decide to put all the code of the entire component into this file. However, you would probably like to avoid making an unmaintainable mess of your component, and take advantage of more of Joomla's built-in capabilities. To do this, you need to use the [[Model-View-Controller]] (MVC) pattern.&lt;br /&gt;
&lt;br /&gt;
In Joomla's MVC implementation, a component has a base controller and can have any number of subcontrollers. Therefore the first step in using it to is to find and activate the controller you need. There is a simple and standard way to do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;18&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
    // import joomla controller library&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
 &lt;br /&gt;
    // Get an instance of the controller prefixed by the component name&lt;br /&gt;
$controller = JController::getInstance('questions');&lt;br /&gt;
 &lt;br /&gt;
    // Perform the Request task&lt;br /&gt;
$controller-&amp;gt;execute(JRequest::getCmd('task'));&lt;br /&gt;
 &lt;br /&gt;
    // Redirect if set by the controller&lt;br /&gt;
$controller-&amp;gt;redirect();&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The getInstance method in the &amp;lt;code&amp;gt;JController&amp;lt;/code&amp;gt; class (on the third line above. You know where to find that if you've been following this series) is a factory method that will create the right type of controller based on the value of the &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt; URL parameter (&amp;lt;tt&amp;gt;index.php?option=com_questions&amp;amp;task=&amp;lt;something&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Of course, at the moment the URL doesn't contain &amp;quot;task=&amp;lt;something&amp;gt;&amp;quot; for the command &amp;lt;code&amp;gt;JRequest::getCmd('task')&amp;lt;/code&amp;gt; to find, so the default is to look for the base controller in a file called “controller.php” in the component main directory. Just to be clear, in this case that means that the controller file is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/controller.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Go... ==&lt;br /&gt;
&lt;br /&gt;
Well, almost go.&lt;br /&gt;
&lt;br /&gt;
In fact, certainly for the front end, it may well be that you don't need to add anything at all to the existing controller class except a name of your own. Your controller class could be as simple as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
&lt;br /&gt;
class QuestionsController extends JController&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Just an empty class definition to establish our own component controller class, but not adding anything to the base class.&lt;br /&gt;
&lt;br /&gt;
Even so, there's already a bit of Joomla idiom and scaffolding going on. Clearly the class that we're subclassing here is JController, but the less obvious part is that the name of our controller class is quite important, get it right and the framework will make all sorts of correct guesses for us. The class naming convention that gives you all this extra magic is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{component name}{type name}{element name}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our component name, without its &amp;quot;com_&amp;quot; prefix, is questions.  This class is a controller and, because it's such an easy (or perhaps “simple”) thing, there's no element name in this case. By convention Joomla class names are in camel case. PHP ignores case in class names. Beware, it does not do the same thing to filesystem names, the simple rule is camel-case class (&amp;amp;tc) names, lowercase file and directory names. No, you don't have to, but do yourself a favour and do do.&lt;br /&gt;
&lt;br /&gt;
The check for _JEXEC is a really good idea for the top of every file, and the import line is fairly obvious, why use dots instead of slashes? I don't know, but it's easy to put two and two together from our previous discussion of “JFactory” and come up with the correct supposition that jimport(some.dotted.path) imports a file &amp;lt;site root&amp;gt;/libraries/some/dotted/path.php into the current file.&lt;br /&gt;
&lt;br /&gt;
== Really Go ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;starter code&amp;quot; in your index.php will now have created an instance of the &amp;lt;code&amp;gt;QuestionsController&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; method is being processed. Because the &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt; URL parameter is empty, it will determine that a subcontroller is not needed. It also means that no task has been specified, so the default method of the base controller will be executed: the &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; method. Since we haven't overridden that method, it will behave like it normally does: it will display the first view of the component.  What's the first view?  Of course you'd guess (correctly) that the default view is &amp;quot;questions&amp;quot;, nice and simple.&lt;br /&gt;
&lt;br /&gt;
The simplest way this happens is that you just let the controller set up its defaults so that it loads you initial view file. If you just let it do this it will assume you want a view called “questions” (it got this from the first part of its own name, “QuestionsController”, see, I told you it was a good idea).&lt;br /&gt;
&lt;br /&gt;
== A view? How does that work? ==&lt;br /&gt;
&lt;br /&gt;
Like this. In short the framework tries to load a view class file, which pulls in the data it needs to show and displays it using a layout file. Easy. Of course, the framework will make a whole load of assumptions for you about how to pull that all together. If you don't give it any further clues or directives, the assumptions it makes are as follows.&lt;br /&gt;
&lt;br /&gt;
It looks for the view definition file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/views/questions/view.html.php&lt;br /&gt;
&lt;br /&gt;
From what you know already you'd be quite happy with all of that. If you guessed that the “html” in the middle of the filename means this file is the default for a normal webpage view and you could have all sorts of different files with things like “pdf” or “rss” in the names to make different types of output, then you'd really be ahead of the game!&lt;br /&gt;
&lt;br /&gt;
Anyway, let's stick with html for the moment. The bare bones of the file look like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.view');&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * HTML View class for the Questions Component front screen&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
class QuestionsViewQuestions extends JView&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	function display($tpl = null)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;questions = $this-&amp;gt;get('Items');&lt;br /&gt;
&lt;br /&gt;
			// Display the view&lt;br /&gt;
		parent::display($tpl);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
JView is the base view class, and we've given our subclass of it a name matching the template I gave you above {component}{type}{element}, nice and consistent.&lt;br /&gt;
&lt;br /&gt;
We load our questions and display them. Very little for us to do, with Joomla's little legs flailing along like crazy under the surface, just the way it ought to be!&lt;br /&gt;
&lt;br /&gt;
The view's &amp;quot;get&amp;quot; function is a highly flexible piece of code, &amp;quot;getting&amp;quot; all manner of things.  In this instance though what it's doing is getting data out of the data model, using what might appear a long winded route.  However, by carefully picking the places to intervene in this pathway, Joomla does the grubby work of loading our data and we can just do the fun bit!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load our questions? That sounds like data! Is that the “model” bit? ==&lt;br /&gt;
&lt;br /&gt;
Yup, here comes the first part of the &amp;quot;model&amp;quot; interaction.&lt;br /&gt;
&lt;br /&gt;
The view already has enough information to find the corresponding data model, if you handled your naming conventions correctly!&lt;br /&gt;
From the name of this view, the framework will look for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although this is very easy to follow, there are a lot very specific things going on here.&lt;br /&gt;
I have very carefully called this view &amp;quot;questions&amp;quot;, plural.  This is because we are going to show the user a list of questions.  I could have called it &amp;quot;questionnaire&amp;quot;, but that's a singular thing, and Joomla is set up not only to distinguish between singular things (ie one row from a table) and multiple things (ie a list containing several rows from a table!), but also to guess the singular name from the plural name.  I'm fairly sure it can guess &amp;quot;question&amp;quot; from &amp;quot;questions&amp;quot;, but I don't think it would get there from &amp;quot;questionnaire&amp;quot;.  But we're getting ahead of ourselves.&lt;br /&gt;
&lt;br /&gt;
In order to make our display easy, ie get Joomla to do most of the work for us, we'll define our &amp;quot;questions&amp;quot; class like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site root/components/com_questions/models/questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;31&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.modellist');&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Questions list Model ie a questionnaire&lt;br /&gt;
     */&lt;br /&gt;
class QuestionsModelQuestions extends JModelList&lt;br /&gt;
{&lt;br /&gt;
	protected function getListQuery()&lt;br /&gt;
	{&lt;br /&gt;
		$db = $this-&amp;gt;getDbo();&lt;br /&gt;
		$query = $db-&amp;gt;getQuery(true);&lt;br /&gt;
&lt;br /&gt;
			// Select the required fields from the table.&lt;br /&gt;
		$query-&amp;gt;select('*');&lt;br /&gt;
		$query-&amp;gt;from('#__questions_questions');&lt;br /&gt;
&lt;br /&gt;
		$query-&amp;gt;where('questionnaire_id=1');&lt;br /&gt;
&lt;br /&gt;
		return $query;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looks simple, but again, take notice of the little details and suddenly a lot more becomes clear.&lt;br /&gt;
We're extending a class called &amp;quot;JModelList&amp;quot;, a class that's specifically set up for handling result sets of multiple rows.  You'll be pleased, and unsurprised, to know there's a JModel class for single row result types, two of them in fact, but you'll probably be able to guess a lot about them from seeing this one.&lt;br /&gt;
&lt;br /&gt;
So what's going on here?  This is the only part of a chain of actions that we need to concern ourselves with in this simple instance.  This method just defines the query object that the framework needs to select the precise pieces of data we want to see.  You can guess that we've set up a &amp;quot;questions&amp;quot; table that has a field which groups questions into individual questionnaires.  I've cheated here, let's pretend our fictitious admin with too much time on his hands puts these rows into the table manually, and changes this class every day.  On other days he may select a different questionnaire number, just so we don't have to worry about how to pick one!&lt;br /&gt;
&lt;br /&gt;
A protected function?  Yes, it's internal to the chain of actions already in place to give us the list of questions in questionnaire &amp;quot;1&amp;quot; ready to display, and all we had to do was write one little query.  How easy is that!&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview</id>
		<title>User:MarkRS/cascading cheat sheets/components/overview</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/overview"/>
				<updated>2012-08-26T17:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Applied template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
= Component Overview =&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain&lt;br /&gt;
{{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
The previous article in this series was [[User:MarkRS/cascading_cheat_sheets/components/preamble|Component Preamble]]&lt;br /&gt;
&lt;br /&gt;
== Ready... ==&lt;br /&gt;
&lt;br /&gt;
The framework has set the scene, it's ready and waiting to swing into action for you, you've just got to string the right sequences together.&lt;br /&gt;
&lt;br /&gt;
== Steady... ==&lt;br /&gt;
&lt;br /&gt;
To start your component Joomla looks for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_&amp;lt;component-name&amp;gt;/&amp;lt;component name&amp;gt;.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where your component takes over.&lt;br /&gt;
In the simplest case, Joomla already has the rigging to do most of what you want.&lt;br /&gt;
&lt;br /&gt;
Your file can be as simple, and standard, as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;18&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // No direct access to this file&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
 &lt;br /&gt;
    // import joomla controller library&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
 &lt;br /&gt;
    // Get an instance of the controller prefixed by the component name&lt;br /&gt;
$controller = JController::getInstance('questions');&lt;br /&gt;
 &lt;br /&gt;
    // Perform the Request task&lt;br /&gt;
$controller-&amp;gt;execute(JRequest::getCmd('task'));&lt;br /&gt;
 &lt;br /&gt;
    // Redirect if set by the controller&lt;br /&gt;
$controller-&amp;gt;redirect();&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The base controller class (from the third line above. You know where to find that if you've been following this series) just looks for a file called “controller.php” in the component main directory.  Just to be clear, in this case that means that the controller file is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/controller.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provided that is an instance of a controller class called QuestionsController then everything will be set for the next phase.&lt;br /&gt;
&lt;br /&gt;
Of course, at the moment the URL doesn't contain &amp;quot;task=&amp;lt;something&amp;gt;&amp;quot; for the command JRequest::getCmd('task') to find, so the default setting is to display the first view of the component.  What's the first view?  Of course you'd guess (correctly) that the default view is &amp;quot;questions&amp;quot;, nice and simple.&lt;br /&gt;
&lt;br /&gt;
== Go... ==&lt;br /&gt;
&lt;br /&gt;
Well, almost go.&lt;br /&gt;
&lt;br /&gt;
In fact, certainly for the front end, it may well be that you don't need to add anything at all to the existing controller class except a name of your own. Your controller class could be as simple as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
jimport('joomla.application.component.controller');&lt;br /&gt;
&lt;br /&gt;
class QuestionsController extends JController&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Just an empty class definition to establish our own component controller class, but not adding anything to the base class.&lt;br /&gt;
&lt;br /&gt;
Even so, there's already a bit of Joomla idiom and scaffolding going on. Clearly the class that we're subclassing here is Jcontroller, but the less obvious part is that the name of our controller class is quite important, get it right and the framework will make all sorts of correct guesses for us. The class naming convention that gives you all this extra magic is&lt;br /&gt;
&lt;br /&gt;
{component name}{type name}{element name}&lt;br /&gt;
&lt;br /&gt;
Our component name, without its &amp;quot;com_&amp;quot; prefix, is questions.  This class is a controller and, because it's such an easy (or perhaps “simple”) thing, there's no element name in this case. By convention Joomla class names are in camel case. Php ignores case in class names. Beware, it does not do the same thing to filesystem names, the simple rule is camel-case class (&amp;amp;tc) names, lowercase file and directory names. No, you don't have to, but do yourself a favour and do do.&lt;br /&gt;
&lt;br /&gt;
The check for _JEXEC is a really good idea for the top of every file, and the import line is fairly obvious, why use dots instead of slashes? I don't know, but it's easy to put two and two together from our previous discussion of “Jfactory” and come up with the correct supposition that jimport(some.dotted.path) imports a file &amp;lt;site root&amp;gt;/libraries/some/dotted/path.php into the current file.&lt;br /&gt;
&lt;br /&gt;
== Really Go ==&lt;br /&gt;
&lt;br /&gt;
From here, the controller loads your first view, which probably gets some data out of your model, for your user to interact with.&lt;br /&gt;
&lt;br /&gt;
The simplest way this happens is that you just let the controller set up its defaults so that it loads you initial view file. If you just let it do this it will assume you want a view called “questions” (it got this from the first part of its own name, “QuestionsController”, see, I told you it was a good idea).&lt;br /&gt;
&lt;br /&gt;
== A view? How does that work? ==&lt;br /&gt;
&lt;br /&gt;
Like this. In short the framework tries to load a view class file, which pulls in the data it needs to show and displays it using a layout file. Easy. Of course, the framework will make a whole load of assumptions for you about how to pull that all together. If you don't give it any further clues or directives, the assumptions it makes are as follows.&lt;br /&gt;
&lt;br /&gt;
It looks for the view definition file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/views/questions/view.html.php&lt;br /&gt;
&lt;br /&gt;
From what you know already you'd be quite happy with all of that. If you guessed that the “html” in the middle of the filename means this file is the default for a normal webpage view and you could have all sorts of different files with things like “pdf” or “rss” in the names to make different types of output, then you'd really be ahead of the game!&lt;br /&gt;
&lt;br /&gt;
Anyway, let's stick with html for the moment. The bare bones of the file look like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.view');&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * HTML View class for the Questions Component front screen&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
class QuestionsViewQuestions extends JView&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	function display($tpl = null)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;questions = $this-&amp;gt;get('Items');&lt;br /&gt;
&lt;br /&gt;
			// Display the view&lt;br /&gt;
		parent::display($tpl);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
JView is the base view class, and we've given our subclass of it a name matching the template I gave you above {component}{type}{element}, nice and consistent.&lt;br /&gt;
&lt;br /&gt;
We load our questions and display them. Very little for us to do, with Joomla's little legs flailing along like crazy under the surface, just the way it ought to be!&lt;br /&gt;
&lt;br /&gt;
The view's &amp;quot;get&amp;quot; function is a highly flexible piece of code, &amp;quot;getting&amp;quot; all manner of things.  In this instance though what it's doing is getting data out of the data model, using what might appear a long winded route.  However, by carefully picking the places to intervene in this pathway, Joomla does the grubby work of loading our data and we can just do the fun bit!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load our questions? That sounds like data! Is that the “model” bit? ==&lt;br /&gt;
&lt;br /&gt;
Yup, here comes the first part of the &amp;quot;model&amp;quot; interaction.&lt;br /&gt;
&lt;br /&gt;
The view already has enough information to find the corresponding data model, if you handled your naming conventions correctly!&lt;br /&gt;
From the name of this view, the framework will look for a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although this is very easy to follow, there are a lot very specific things going on here.&lt;br /&gt;
I have very carefully called this view &amp;quot;questions&amp;quot;, plural.  This is because we are going to show the user a list of questions.  I could have called it &amp;quot;questionnaire&amp;quot;, but that's a singular thing, and Joomla is set up not only to distinguish between singular things (ie one row from a table) and multiple things (ie a list containing several rows from a table!), but also to guess the singular name from the plural name.  I'm fairly sure it can guess &amp;quot;question&amp;quot; from &amp;quot;questions&amp;quot;, but I don't think it would get there from &amp;quot;questionnaire&amp;quot;.  But we're getting ahead of ourselves.&lt;br /&gt;
&lt;br /&gt;
In order to make our display easy, ie get Joomla to do most of the work for us, we'll define our &amp;quot;questions&amp;quot; class like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;site root/components/com_questions/models/questions.php&amp;quot;&amp;gt;&lt;br /&gt;
'''&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components/com_questions/models/questions.php&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;31&amp;quot;&amp;gt;&lt;br /&gt;
jimport('joomla.application.component.modellist');&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Questions list Model ie a questionnaire&lt;br /&gt;
     */&lt;br /&gt;
class QuestionsModelQuestions extends JModelList&lt;br /&gt;
{&lt;br /&gt;
	protected function getListQuery()&lt;br /&gt;
	{&lt;br /&gt;
		$db = $this-&amp;gt;getDbo();&lt;br /&gt;
		$query = $db-&amp;gt;getQuery(true);&lt;br /&gt;
&lt;br /&gt;
			// Select the required fields from the table.&lt;br /&gt;
		$query-&amp;gt;select('*');&lt;br /&gt;
		$query-&amp;gt;from('#__questions_questions');&lt;br /&gt;
&lt;br /&gt;
		$query-&amp;gt;where('questionnaire_id=1');&lt;br /&gt;
&lt;br /&gt;
		return $query;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looks simple, but again, take notice of the little details and suddenly a lot more becomes clear.&lt;br /&gt;
We're extending a class called &amp;quot;JModelList&amp;quot;, a class that's specifically set up for handling result sets of multiple rows.  You'll be pleased, and unsurprised, to know there's a JModel class for single row result types, two of them in fact, but you'll probably be able to guess a lot about them from seeing this one.&lt;br /&gt;
&lt;br /&gt;
So what's going on here?  This is the only part of a chain of actions that we need to concern ourselves with in this simple instance.  This method just defines the query object that the framework needs to select the precise pieces of data we want to see.  You can guess that we've set up a &amp;quot;questions&amp;quot; table that has a field which groups questions into individual questionnaires.  I've cheated here, let's pretend our fictitious admin with too much time on his hands puts these rows into the table manually, and changes this class every day.  On other days he may select a different questionnaire number, just so we don't have to worry about how to pick one!&lt;br /&gt;
&lt;br /&gt;
A protected function?  Yes, it's internal to the chain of actions already in place to give us the list of questions in questionnaire &amp;quot;1&amp;quot; ready to display, and all we had to do was write one little query.  How easy is that!&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/preamble</id>
		<title>User:MarkRS/cascading cheat sheets/components/preamble</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/User:MarkRS/cascading_cheat_sheets/components/preamble"/>
				<updated>2012-08-26T17:46:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Applied template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inprogressbyuser}}&lt;br /&gt;
&lt;br /&gt;
Let the Frame(work) Take The Strain {{JVer|2.5}}&lt;br /&gt;
&lt;br /&gt;
Cascading cheat-sheets for the expert beginner.&lt;br /&gt;
&lt;br /&gt;
= Component? =&lt;br /&gt;
&lt;br /&gt;
Components deliver main areas of functionality, for example an event diary (there are many available as extensions), or the core functions of user management and displaying articles.&lt;br /&gt;
&lt;br /&gt;
You'll find the code for components in the directories&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/components&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/administration/components&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first one is for for front end functionality, the second for back end (administration) functionality.  The code for each component is in a subdirectory of one of these named &amp;lt;tt&amp;gt;com_&amp;lt;component name&amp;gt;&amp;lt;/tt&amp;gt;.  Components, by definition, need functionality in both areas.&lt;br /&gt;
&lt;br /&gt;
You should be able to find the, for example, content component (&amp;quot;com_content&amp;quot;), which is for displaying articles, the user component (&amp;quot;com_user&amp;quot;), which is for for managing website accounts, and several others.&lt;br /&gt;
&lt;br /&gt;
This naming is one of those Joomla principles. You probably can hack it so that you can name a component directory “freds_diner”, but a whole load of defaults just won't work and you'll be fighting every step of the way.&lt;br /&gt;
&lt;br /&gt;
= Component Internals =&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
We're going to zoom through the actions occurring from a website URL appearing to the beginning of a component running.  We're going to start in the only possible place, the middle.   It's going to look a little slow, but only for a very short while, and I think you'll find this will explain many of the Joomla idioms which will make your overall learning curve much quicker.  Let's imagine we are looking at a component that allows website users to answer a questionnaire that is presented to them, stores their answers, and allows an administrator to look at their answers.  To keep it nice and simple, we'll imagine our administrator has too much time on his hands and hard codes a new questionnaire into the front end every day.&lt;br /&gt;
&lt;br /&gt;
Here's the process of events for the user&lt;br /&gt;
&lt;br /&gt;
By selecting our questionnaire component, let's imagine that a URL like this&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;yoursite&amp;gt;/questionnaire&lt;br /&gt;
&lt;br /&gt;
is generated.  Whilst this is not something that Joomla can directly work with, this is quite possibly the way it'll be.  It could be the case if you had, for example, a SEF module enabled.&lt;br /&gt;
&lt;br /&gt;
== Everything goes through index.php ==&lt;br /&gt;
&lt;br /&gt;
This is the first step of every Joomla page.  There are two different versions of index.php, one for the back end and a separate one for the front end.  You'll find the front end file in the site root.&lt;br /&gt;
&lt;br /&gt;
Have a look in this file and you'll see the first two active lines are&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	define('_JEXEC', 1);&lt;br /&gt;
	define('DS', DIRECTORY_SEPARATOR);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line defines a constant called _JEXEC and gives it the value “1”.  The value is pretty irrelevant but its simple existence is part of the system security.  You'll see that many Joomla code files start with a check for this (or some other) constant, exiting immediately if it's not found.  This helps prevent miscreants from going directly to internal parts of the system.&lt;br /&gt;
&lt;br /&gt;
The second line is about to disappear in Joomla 3.0,  since php handles converting “/” to the requirements of the platform you're actually running on.  My advice is don't use DS, it's just BS these days.&lt;br /&gt;
&lt;br /&gt;
The next three blocks are dull, simply loading defines files that are required for the core running.  Even the line after doesn't really concern us yet, just setting a marker point used during debugging.&lt;br /&gt;
&lt;br /&gt;
The line after that,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	$app = JFactory::getApplication('site');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
might look fairly dull, but it creates the application object that contains the top level scaffolding that defines Joomla.  You start to get a sense of this with the next line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
	$app-&amp;gt;initialise();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which, it's easy to guess, will set up a whole bunch of things to prepare Joomla for the job at hand.&lt;br /&gt;
&lt;br /&gt;
== I know “factory”, but how does “JFactory” work? ==&lt;br /&gt;
&lt;br /&gt;
Let's take a quick sidestep that helps make this very common Joomla style clearer.&lt;br /&gt;
Just taking the case above, as an OOP-aware developer you're familiar with the idea of an object factory, that thing that allows OOP people to tell themselves that they're not using global objects.  But what about the “J”?&lt;br /&gt;
&lt;br /&gt;
When you see stuff like this in the code, and there's a lot of it (JFactory, JForm, JText, and on and on), Joomla goes to the directory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to look for something with that name (without the “J”).  So, for example there is a file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/factory.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
that contains a class called JFactory, and, surprise surprise, it has a method named “getApplication”. This is a very standard way of Joomla calling core functionality.  Some functionality is more detailed and so gets a whole directory in that location.  For example the call&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
JUser::getInstance()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finds a file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;.  That file contains the definition of a class JUser, and you won't be shocked to find that it contains a method &amp;quot;getInstance&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Any call that looks like “J&amp;lt;Something&amp;gt;::function” will be using this mechanism.  Now you know where to go when you need to know what a function like this does and the only answer you can get from the Joomla cognescenti is “read the code”!  It's the same location for back end code as well as front end.&lt;br /&gt;
&lt;br /&gt;
== And now, back to the records... ==&lt;br /&gt;
&lt;br /&gt;
After another profiler call that I'm not going to talk about either, we come to the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$app-&amp;gt;route();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You remember I said that Joomla couldn't directly work with that URL we started with?  The &amp;quot;route&amp;quot; method &amp;quot;decodes&amp;quot; the URL into something that Joomla can process.  If we'd started with the URL&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;your site&amp;gt;/index.php?option=com_questions&lt;br /&gt;
&lt;br /&gt;
this &amp;quot;decoding&amp;quot; would have been at its simplest.  Anything else will get converted back to this type of format, which is what the rest of the internals of the framework actually work with.&lt;br /&gt;
&lt;br /&gt;
That all just brings us to the point where we can actually start doing something.  You'll have realised that the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$app-&amp;gt;dispatch();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
means that the application class (which, of course, is defined in the file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/application/application.php&amp;lt;/tt&amp;gt;), that our factory class created for us initially, has a method “dispatch”. This method does a little bit of setting up and then starts the heavy lifting with the component.  Having a brief look through that code, it's mostly easy to see this happening. But no, wait!  Clearly the critical line doing this is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot; highlight=&amp;quot;33&amp;quot;&amp;gt;&lt;br /&gt;
$contents = JComponentHelper::renderComponent($component);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but not only did we not pass in a value for $component to this method, but there's no file &amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/componenthelper&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Well, no, that seems to be more of the internal wiring that does so much for you, you want to look in&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;site root&amp;gt;/libraries/joomla/application/component&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where you'll find the file you want, “helper.php”.&lt;br /&gt;
&lt;br /&gt;
And, when the framework doesn't find a component name stored in that variable, the dispatch method finds the component to load from the data that was stored during the &amp;quot;route&amp;quot; method.  And, in case, like me, you're confused by this use of words; the not-so-obvious piece of information is that &amp;quot;renderComponent&amp;quot; is not the same as &amp;quot;render&amp;quot;.  The first one generates the output from a specific component.  The second one takes that component output and fits it into the overall page that your user sees on screen.&lt;br /&gt;
&lt;br /&gt;
So now we have arrived at the point that the component can start to do its work.  The dispatcher has brought us there.  Time to look at the details of component design!&lt;br /&gt;
&lt;br /&gt;
I'm going to start developing an example of a simple component that looks after a little bit of data, shows it to some people and allows some people to edit it.  In short, a &amp;quot;hello world&amp;quot; program for people who actually want to do something.&lt;br /&gt;
&lt;br /&gt;
Follow along at [[User:MarkRS/cascading_cheat_sheets/components/overview|Component Overview]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Joomla! 2.5]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Template:Inprogressbyuser</id>
		<title>Template:Inprogressbyuser</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Template:Inprogressbyuser"/>
				<updated>2012-08-26T17:42:23Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created template using Template:Incomplete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{NAMESPACE}}|{{ns:User}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0em 0em 1em 0em; width:100% vertical-align:top; text-align: center; border:1px solid #A0522D; background-color:#FFF8DC;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #A0522D; background-color:#F5DEB3; padding:0.2em 0.5em 0.2em 0.5em; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;Note&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; padding:1em 5em 1em 1em;&amp;quot;&amp;gt; &amp;lt;!--Note: Top, right, bottom, left --&amp;gt;&lt;br /&gt;
This user subpage is a work in progress being written by [[{{#titleparts:{{FULLPAGENAME}}|1}}]]. Please {{#ifexist:{{TALKPAGENAME}}|discuss this page on [[{{TALKPAGENAME}}|its talk page]]|[[{{ns:User talk}}:{{#titleparts:{{PAGENAME}}|1}}|contact this user]]}} before editing it.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Template:Incomplete</id>
		<title>Template:Incomplete</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Template:Incomplete"/>
				<updated>2012-08-26T15:45:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Changed layout &amp;lt;table&amp;gt; into &amp;lt;div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin:0em 0em 1em 0em; width:100% vertical-align:top; text-align: center; border:1px solid #A0522D; background-color:#FFF8DC;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #A0522D; background-color:#F5DEB3; padding:0.2em 0.5em 0.2em 0.5em; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;Note&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; padding:1em 5em 1em 1em;&amp;quot;&amp;gt; &amp;lt;!--Note: Top, right, bottom, left --&amp;gt;&lt;br /&gt;
Please note that the content on this page is currently incomplete.  Please treat it as a work in progress.&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left;&amp;quot;&amp;gt;{{#if:{{{1|}}}|{{needs|{{{1|}}}|{{{2|}}}}}|}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;includeonly&amp;gt;{{#if:{{{1|}}}||{{#ifeq:{{NAMESPACE}}|Template||[[Category:Joomla! Wiki need pages|{{PAGENAME}}]][[Category:Needs completion|{{PAGENAME}}]]}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;!-- &lt;br /&gt;
add categories to the documentation subpage, not here --&amp;gt;&lt;br /&gt;
{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Framework</id>
		<title>Chunk:Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Framework"/>
				<updated>2012-08-25T13:39:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Removed reference: the link is already in the text itself&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|The Joomla! Framework&amp;lt;ref&amp;gt;See also [[Subpackages]]&amp;lt;/ref&amp;gt; was an important part of the [[CMS Architecture in 1.5 and 1.6|Joomla! CMS architecture in the versions 1.5 and 1.6]]. It was based on modern object-oriented design patterns that make the Joomla core highly maintainable and easily extendable. Between April and July 2011, the Framework was rebranded as the Joomla! [[Platform]] and is now being developed separately from the Joomla! [[CMS]]. The first version of the CMS to ship with the Platform was version [[:Category:Joomla! 1.7|1.7]].&lt;br /&gt;
&lt;br /&gt;
Third party developers benefit from the rich, and easily accessible functionality that the Joomla Framework provides.&lt;br /&gt;
|[[Image:JoomlaArchitecture0.png|thumb|425px|The Joomla Architecture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Joomla_CMS</id>
		<title>Joomla CMS</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Joomla_CMS"/>
				<updated>2012-08-24T21:46:15Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created landing page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[CMS]]&lt;br /&gt;
[[Category:Landing Pages]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Joomla!_CMS</id>
		<title>Joomla! CMS</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Joomla!_CMS"/>
				<updated>2012-08-24T21:45:44Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created landing page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[CMS]]&lt;br /&gt;
[[Category:Landing Pages]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Joomla_Platform</id>
		<title>Joomla Platform</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Joomla_Platform"/>
				<updated>2012-08-24T21:45:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created landing page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Platform]]&lt;br /&gt;
[[Category:Landing Pages]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Joomla!_Platform</id>
		<title>Joomla! Platform</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Joomla!_Platform"/>
				<updated>2012-08-24T21:44:33Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created landing page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Platform]]&lt;br /&gt;
[[Category:Landing Pages]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/CMS</id>
		<title>CMS</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/CMS"/>
				<updated>2012-08-24T21:43:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Changed page into article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{For|content management systems in general|Content Management System}}&lt;br /&gt;
&lt;br /&gt;
The Joomla! CMS is a PHP-based system for creating dynamic web pages. The CMS contains built-in functionality for managing and displaying HTML [[content]] items as well as a variety of data such as contacts and web links. Additionally, its flexible and extensible structure allows functionality to be added using [[Extension|extensions]].&lt;br /&gt;
&lt;br /&gt;
In 2011, the underlying libraries were collected and released as the Joomla! [[Platform]]. The Joomla! project was split up and the Platform is now being developed as a separate project. The Joomla! CMS project uses the Platform releases as a framework to build the CMS on.&lt;br /&gt;
&lt;br /&gt;
The home of the Joomla! CMS project is [http://joomla.org/ Joomla.org], which contains end-user information. [https://github.com/joomla/joomla-cms The ''joomla/joomla-cms'' GitHub repository] contains the source code, while the [[bug tracker]] and this documentation wiki are operated separately.&lt;br /&gt;
&lt;br /&gt;
[[Category:Landing Pages]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Main_Page</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Main_Page"/>
				<updated>2012-08-24T16:42:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; style=&amp;quot;width:100%; vertical-align:top; border:1px solid #B356C1; background-color:#fff; -moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#fff; padding:0.8em 1.1em 0 1.1em; margin:0 7px;&amp;quot;&amp;gt;&amp;lt;h1&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot;&amp;gt;Joomla! Official Documentation&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:1em 1em 1em 1em;&amp;quot;&amp;gt; &amp;lt;!--Note: Top, right, bottom, left --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #fff;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold; -moz-border-radius:10px 10px 0 0;  border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Reader profiles&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
Find the profile that most accurately describes your role and you will find the documentation that you need more quickly.  These are the most frequent profiles...&lt;br /&gt;
* [[Beginners]]&lt;br /&gt;
* [[Developers]]&lt;br /&gt;
* [[Web designers]]&lt;br /&gt;
* [[Administrators]]&lt;br /&gt;
* [[Evaluators]]&lt;br /&gt;
None of the above?  Then look for [[Start here|more user profiles]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top; background-color: #fff;-moz-border-radius:10px;  border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#fff; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Quick links&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
* [[:Category:FAQ|Frequently Asked Questions]]&lt;br /&gt;
* [[:Category:Tips and tricks|Tips and tricks]]&lt;br /&gt;
* [[:Category:Security Checklist|Joomla! Security Checklist]]&lt;br /&gt;
* [[Vulnerable Extensions List]]&lt;br /&gt;
* [[:Category:Top_Level|Browse all categories]]&lt;br /&gt;
* [[JDOC:Wiki policy|Wiki policy]]&lt;br /&gt;
* [[JEDL|Documentation license]]&lt;br /&gt;
* [[Glossary]]&lt;br /&gt;
* [[References]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top; border:none; background-color:#fff;&amp;quot; |&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
[[Image:documentation_all_together.jpg|border|right]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #f1f5fc;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Getting started&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
If you have only recently starting working with Joomla you will probably have experienced the pain of learning a new system.  New terminology, new ways of doing things, perhaps even the web itself may be new to you.  Then let these guides relieve some of that pain.&lt;br /&gt;
&lt;br /&gt;
* [[Getting Started with Joomla!]] {{JVer|2.5}}&lt;br /&gt;
* [[Getting Started with Joomla! 1.5]] {{JVer|1.5}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid Gold; background-color: LightYellow;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #Gold; background-color:#ffffaa; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Important&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
'''You don't need to register here if you just want to read the documentation.'''&lt;br /&gt;
&lt;br /&gt;
You should only register if you want to make changes to the information contained here.  Also note that registration on this wiki is entirely separate from registration on our other sites, such as the [http://forum.joomla.org forum].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #f1f5fc;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0;  border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Coming soon&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
With Joomla 2.5 safely released the focus of development is shifting to 3.0, currently scheduled for release in September 2012.  This will be the first of a new series (3.0/3.1/3.5) and maintaining backwards compatibility with 2.5 will not be required.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid Gold; background-color: LightYellow;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #Gold; background-color:#ffffaa; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Joomla [[Platform]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
The Joomla Platform is available.  Development will be time-based with roughly a three-month release cycle.&lt;br /&gt;
* {{JVer|11.1}} [[Platform/11.1|Joomla Platform API Reference]]&lt;br /&gt;
* {{JVer|11.1}} [https://github.com/joomla/joomla-platform Joomla Platform on Github]&lt;br /&gt;
* {{JVer|11.1}} [[Potential_backward_compatibility_issues_in_Joomla_1.7_and_Joomla_Platform_11.1 | Backward Compatibility Tracking]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #f1f5fc;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Quick links for [[Administrators]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
* [[Joomla Installation|Installation]]&lt;br /&gt;
* [[Template Management]]&lt;br /&gt;
* [[Article Management]]&lt;br /&gt;
* [[User Management|User and Access Management]]&lt;br /&gt;
* [[Menu Management]]&lt;br /&gt;
* [[Security]]&lt;br /&gt;
* [[Module Management]]&lt;br /&gt;
* [[Component Management]]&lt;br /&gt;
* [[Category Management]]&lt;br /&gt;
* [[Plugin Management]]&lt;br /&gt;
* [[Global Configuration Management]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid Gold; background-color: LightYellow;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #Gold; background-color:#ffffaa; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;{{JVer|{{CurrentLTSVer|minor}}}} Joomla! {{CurrentLTSVer|minor}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
Joomla! {{CurrentLTSVer|minor}} is the current [[Release and support cycle|LTS version]]. The previous LTS version, Joomla 1.5, is still widely used and will be supported with security fixes only until September 2012.&lt;br /&gt;
* [[Migrating from Joomla 1.5 to Joomla 2.5]]&lt;br /&gt;
* [[:Category:Version {{CurrentLTSVer}} FAQ|Version {{CurrentLTSVer}} FAQ]]&lt;br /&gt;
* [http://www.joomla.org/about-joomla/technical-requirements.html Technical Requirements]&lt;br /&gt;
* [[Installing Joomla!]]&lt;br /&gt;
* [[Upgrading from Joomla 1.7 to Joomla 2.5]]&lt;br /&gt;
&lt;br /&gt;
For more information see the [[:Category:Joomla! {{CurrentLTSVer|minor}}|Joomla {{CurrentLTSVer|minor}} category page]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #f1f5fc;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Quick links for [[Developers]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
* [http://api.joomla.org/ Platform API Documentation]&lt;br /&gt;
* [[Template Development|Templates]]&lt;br /&gt;
* [[Component Development|Components]]&lt;br /&gt;
* [[Module Development|Modules]]&lt;br /&gt;
* [[Language Development|Languages]]&lt;br /&gt;
* [[Plugin Development|Plugins]]&lt;br /&gt;
* [[CMS]] versus [[Platform]]&lt;br /&gt;
* [http://developer.joomla.org Joomla! Developer Portal]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid Gold; background-color: LightYellow;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #Gold; background-color:#ffffaa; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;{{JVer|{{CurrentSTSVer|minor}}}} Joomla! {{CurrentSTSVer|minor}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
Joomla {{CurrentSTSVer|minor}} was the last [[Release and support cycle|STS version]] prior to Joomla 2.5. Support for Joomla {{CurrentSTSVer|minor}} ended on 24 February 2012.&lt;br /&gt;
* [[Technical requirements]]&lt;br /&gt;
* [[{{NewestPageVer|Installing Joomla! }}|Installation]]&lt;br /&gt;
* [[What's new in Joomla 1.6|What's new]]&lt;br /&gt;
* [[ACL Tutorial for Joomla 1.6|Access control system]]&lt;br /&gt;
* [[International Enhancements for Version 1.6|International enhancements]]&lt;br /&gt;
* [[Layout Overrides in Joomla 1.6|Layout overrides]]&lt;br /&gt;
* [[:Category:Version {{CurrentSTSVer}} FAQ|Version {{CurrentSTSVer}} FAQ]]&lt;br /&gt;
&lt;br /&gt;
For more information see the [[:Category:Joomla! {{CurrentSTSVer|minor}}|Joomla {{CurrentSTSVer|minor}} category page]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; style=&amp;quot;width:100%; vertical-align:top; border:1px solid Sienna; background-color:Cornsilk;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid Sienna; background-color:Wheat; padding:0.2em 0.5em 0.2em 0.5em; font-size:130%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Helping with the documentation effort&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:1em 1em 1em 1em;&amp;quot;&amp;gt; &amp;lt;!--Note: Top, right, bottom, left --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:0em 0em 1em 0em; width:100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid #abd5f5; background-color: #f1f5fc;-moz-border-radius:10px; border-radius:10px;&amp;quot; rowspan=&amp;quot;1&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid abd5f5; background-color:#d0e5f5; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Documentation Projects&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON LEFT OF TWO BOX SECTION --&amp;gt;&lt;br /&gt;
You don't need to join the [[Documentation Working Group]] to help us improve the documentation.  Just [[Special:UserLogin|register]] on this wiki and get started.  Feel free to fix any errors you find; take a look in the [[JDOC:Cookie jar|Cookie jar]]; or consider helping out in one of our mini-projects...&lt;br /&gt;
&lt;br /&gt;
{{:JDOC:Projects}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;padding:0em 0.5em 0em 0.5em;background-color:CornSilk;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; vertical-align:top; border:1px solid Gold; background-color: White;-moz-border-radius:10px; border-radius:10px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-bottom:1px solid #Gold; background-color:#ffffaa; padding:0.2em 0.5em 0.2em 0.5em; font-size:110%; font-weight:bold;-moz-border-radius:10px 10px 0 0; border-radius:10px 10px 0 0;&amp;quot;&amp;gt;Most popular pages&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.4em 1em 0.3em 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- PICTURE ON RIGHT OF TWO BOX SECTION--&amp;gt;&lt;br /&gt;
{{Most popular pages}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==License==&lt;br /&gt;
{{license}}&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Standard_form_field_types</id>
		<title>Standard form field types</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Standard_form_field_types"/>
				<updated>2012-08-24T16:06:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Numerous types of [[form field]] are built into Joomla!. The following table lists these standard types and their availability. Use the [[/Single-page reference|single-page reference]] if you want to print all existing form field documentation.&lt;br /&gt;
&lt;br /&gt;
{{JVer|1.5}} Please note that many of these fields are available as [[Parameter|parameter types]] in Joomla! 1.5. For a list of parameter types, see [[Standard parameter types]]. For a comparison between form field and parameter types, see [[Standard form field and parameter types]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;vertical-align:top; border:1px solid Sienna; background-color:Cornsilk;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:Wheat; font-weight:bold; text-align: left;&amp;quot;&lt;br /&gt;
!width=15%|Type&lt;br /&gt;
!width=70%|Description&lt;br /&gt;
!width=15%|Availability&lt;br /&gt;
|-&lt;br /&gt;
|[[Accesslevel form field type|accesslevel]]&lt;br /&gt;
|provides a drop down list of viewing access levels.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Cachehandler form field type|cachehandler]]&lt;br /&gt;
|provides a list of available cache handling options.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Calendar form field type|calendar]]&lt;br /&gt;
|provides a text box for entry of a date. An icon next to the text box provides a link to a pop-up calendar, which can also be used to enter the date value.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Category form field type|category]]&lt;br /&gt;
|provides a drop down list of categories for an extension.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Checkbox form field type|checkbox]]&lt;br /&gt;
|provides a single checkbox to be checked or unchecked&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Checkboxes form field type|checkboxes]]&lt;br /&gt;
|provides unlimited checkboxes that can be used for multi-select.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Combo form field type|combo]]&lt;br /&gt;
|provides a combo box field.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Componentlayout form field type|componentlayout]]&lt;br /&gt;
|provides a grouped list of core and template alternate layouts for a component item.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Contentlanguage form field type|contentlanguage]]&lt;br /&gt;
|provides a list of installed content languages for use in conjunction with the language switcher plugin.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Editor form field type|editor]]&lt;br /&gt;
|provides an editor area field.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Editors form field type|editors]]&lt;br /&gt;
|provides a drop down list of the available WYSIWYG editors.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[File form field type|file]]&lt;br /&gt;
|&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Filelist form field type|filelist]]&lt;br /&gt;
|provides a drop down list of files from a specified directory.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Folderlist form field type|folderlist]]&lt;br /&gt;
|provides a drop down list of folders from a specified directory.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Groupedlist form field type|groupedlist]]&lt;br /&gt;
|provides a drop down list of items organized into groups.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Helpsite form field type|helpsite]]&lt;br /&gt;
|provides a drop down list of the help sites for your Joomla installation.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Hidden form field type|hidden]]&lt;br /&gt;
|provides a hidden field for saving a form field whose value cannot be altered directly by a user in the Administrator (it can be altered in code or by editing the ''params.ini'' file).&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Imagelist form field type|imagelist]]&lt;br /&gt;
|provides a drop down list of image files in a specified directory.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[[Integer form field type|integer]]&lt;br /&gt;
|provides a drop down list of integers between a minimum and maximum.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Language form field type|language]]&lt;br /&gt;
|provides a drop down list of the installed languages for the Front-end or Back-end.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[List form field type|list]]&lt;br /&gt;
|provides a drop down list of custom-defined entries.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Media form field type|media]]&lt;br /&gt;
|provides modal access to the media manager for insertion of images with upload for users with appropriate permissions.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Menu form field type|menu]]&lt;br /&gt;
|provides a drop down list of the available menus from your Joomla site.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Menuitem form field type|menuitem]]&lt;br /&gt;
|provides a drop down list of the available menu items from your Joomla site.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Modulelayout form field type|modulelayout]]&lt;br /&gt;
|provides a list of alternative layout for a module grouped by core and template.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Password form field type|password]]&lt;br /&gt;
|provides a text box for entry of a password.  The password characters will be obscured as they are entered.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Radio form field type|radio]]&lt;br /&gt;
|provides radio buttons to select different options.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Rules form field type|rules]]&lt;br /&gt;
|provides a matrix of group by action options for managing access control. Display depends on context.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Sessionhandler form field type|sessionhandler]]&lt;br /&gt;
|provides a drop down list of session handler options.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Spacer form field type|spacer]]&lt;br /&gt;
|provides a visual separator between form fields.  It is purely a visual aid and no value is stored.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[SQL form field type|sql]]&lt;br /&gt;
|provides a drop down list of entries obtained by running a query on the Joomla Database.  The first results column returned by the query provides the values for the drop down box.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Templatestyle form field type|templatestyle]]&lt;br /&gt;
|provides a drop down list of template styles.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Text form field type|text]]&lt;br /&gt;
|provides a text box for data entry.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Textarea form field type|textarea]]&lt;br /&gt;
|provides a text area for entry of multi-line text.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Timezone form field type|timezone]]&lt;br /&gt;
|provides a drop down list of time zones.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[User form field type|user]]&lt;br /&gt;
|provides a modal list of users.&lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|-&lt;br /&gt;
|[[Usergroup form field type|usergroup]]&lt;br /&gt;
|provides a drop down list of user groups. &lt;br /&gt;
|{{JVer|1.6}} and newer&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Checkbox_form_field_type</id>
		<title>Checkbox form field type</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Checkbox_form_field_type"/>
				<updated>2012-08-24T16:00:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Changed examples for consistency with other form field types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''checkbox''' form field type provides a single checkbox.  If the parameter has a saved value this is selected when the page is first loaded.  If not, the default value (if any) is selected.&lt;br /&gt;
&lt;br /&gt;
* '''type''' (mandatory) must be checkbox&lt;br /&gt;
* '''name''' (mandatory) is the unique name of the parameter.&lt;br /&gt;
* '''label''' (mandatory) (translatable) is the descriptive title of the field.&lt;br /&gt;
* '''value''' (optional) is the default value of the checkbox. If exist the checkbox will be checked by default.&lt;br /&gt;
* '''description''' (optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the label.&lt;br /&gt;
* '''class''' (optional) is a CSS class name for the HTML form field.  If omitted this will default to 'inputbox'.&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Example XML field definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;field name=&amp;quot;show_title&amp;quot; type=&amp;quot;checkbox&amp;quot; label=&amp;quot;Show title&amp;quot; description=&amp;quot;Show the title of the item&amp;quot; value=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [[Standard form field types|List of standard form field types]]&lt;br /&gt;
[[Category:Standard form field types]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Standard_form_field_types/Single-page_reference</id>
		<title>Standard form field types/Single-page reference</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Standard_form_field_types/Single-page_reference"/>
				<updated>2012-08-24T15:55:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all documented [[form field]] types together. Use [http://docs.joomla.org/index.php?title={{FULLPAGENAMEE}}&amp;amp;printable=yes the printable version of this page]  to print this reference.&lt;br /&gt;
&amp;lt;DPL&amp;gt;&lt;br /&gt;
noresultsheader=\n &lt;br /&gt;
include=*&lt;br /&gt;
format=,\n== [[%TITLE%|%TITLE%]] ==\n&lt;br /&gt;
reset=categories&lt;br /&gt;
category=Standard form field types&lt;br /&gt;
&amp;lt;/DPL&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Platform</id>
		<title>Chunk:Platform</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Platform"/>
				<updated>2012-08-24T13:51:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|&amp;lt;blockquote style=&amp;quot;width:auto; border:1px solid grey; background-color:cornsilk; padding:5px; font-style:italic;&amp;quot;&amp;gt;The Joomla Platform is a platform for writing Web and command line applications in PHP. It is free and open source software, distributed under the GNU General Public License version 2 or later. The Joomla Content Management System (CMS) is built on top of the Joomla Platform.&amp;lt;ref&amp;gt;https://github.com/joomla/joomla-platform&amp;lt;/ref&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|The release of the Joomla Platform on 5 July 2011&amp;lt;ref&amp;gt;http://developer.joomla.org/news/362-version-11-1-of-the-joomla-platform-released.html&amp;lt;/ref&amp;gt; marked an important change in the Joomla! CMS architecture. From the very beginning of Joomla!, the Joomla! CMS and its Framework, which the Joomla! CMS Application was built on, were an integral part of each other. The main difference now with the release of the Joomla! Platform is the separation of the Joomla! [[Framework]] from the Joomla! CMS Application. Before,  from the previous Joomla! Framework could not be used separate from the Joomla! CMS Application. Now, the Joomla! Platform is a completely independent set of libraries which do not require the Joomla! CMS Application. These libraries are made up of libraries maintained by the Joomla! Project and libraries maintained by other 3rd party developers. 'Connectors' or 'Event Listeners' which are simply called Plugins, can now be created by 3rd party developers to interact with either or both libraries to create Applications independent of the Joomla! CMS Application.&lt;br /&gt;
&lt;br /&gt;
The home of the Joomla! Platform is [https://github.com/joomla/joomla-platform the ''joomla/joomla-platform'' GitHub repository] that contains the source, documentation and means to contribute (pull requests).&lt;br /&gt;
|[[File:Architecture Joomla Platform.png|thumb|500px|The Joomla! Platform]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Framework</id>
		<title>Chunk:Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Framework"/>
				<updated>2012-08-24T13:42:55Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adjusted link after page move&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|The Joomla! Framework&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;See also [[Subpackages]]&amp;lt;/ref&amp;gt; was an important part of the [[CMS Architecture in 1.5 and 1.6|Joomla! CMS architecture in the versions 1.5 and 1.6]]. It was based on modern object-oriented design patterns that make the Joomla core highly maintainable and easily extendable. Between April and July 2011, the Framework was rebranded as the Joomla! [[Platform]] and is now being developed separately from the Joomla! [[CMS]]. The first version of the CMS to ship with the Platform was version [[:Category:Joomla! 1.7|1.7]].&lt;br /&gt;
&lt;br /&gt;
Third party developers benefit from the rich, and easily accessible functionality that the Joomla Framework provides.&lt;br /&gt;
|[[Image:JoomlaArchitecture0.png|thumb|425px|The Joomla Architecture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/CMS_Architecture_in_1.5_and_1.6</id>
		<title>CMS Architecture in 1.5 and 1.6</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/CMS_Architecture_in_1.5_and_1.6"/>
				<updated>2012-08-24T13:39:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Updated contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
&lt;br /&gt;
The [[:Category:Joomla! 1.5|1.5]] and [[:Category:Joomla! 1.6|1.6]] versions of the Joomla! [[CMS]] are based on a three-tiered system that consists of the following:&lt;br /&gt;
&lt;br /&gt;
[[File:JoomlaArchitecture0.png|thumb|425px|Joomla! 1.5 Architecture]]&lt;br /&gt;
# The top, Extensions layer, consists of [[Extension|Extensions]] to the Joomla [[Framework]] and its applications:&lt;br /&gt;
#*[[Module|Modules]]&lt;br /&gt;
#*[[Component|Components]]&lt;br /&gt;
#*[[Template|Templates]]&lt;br /&gt;
# The middle, Application layer, consists of applications that extend the Framework [[JApplication]] class. Currently, there are four applications included in the Joomla distribution:&lt;br /&gt;
#*[[JInstallation]] is responsible for installing Joomla on a web server and is deleted after the installation procedure has been completed.&lt;br /&gt;
#*[[JAdministrator]] is responsible for the back-end website administration.&lt;br /&gt;
#*[[JSite]] is responsible for the front-end of the website.&lt;br /&gt;
#*[[XML-RPC]] supports remote administration of the Joomla website.&lt;br /&gt;
# The bottom, Framework layer, consists of:&lt;br /&gt;
#*the Joomla! [[Framework|Framework]]&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[[Joomla! Framework vs Joomla! Platform]]&amp;lt;/ref&amp;gt; itself, whose classes are listed [[Framework/1.5#Packages and Classes|here]].&lt;br /&gt;
#*[[Library|Libraries]] that are required by the [[Framework]] or are installed for use by third-party developers.&lt;br /&gt;
#*[[Plugin|Plugins]] extend the functionality available in the [[Framework]].&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Explanations]][[Category:Framework]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/About_the_Joomla_Framework</id>
		<title>About the Joomla Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/About_the_Joomla_Framework"/>
				<updated>2012-08-24T13:36:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: moved About the Joomla Framework to CMS Architecture in 1.5 and 1.6: This page describes the entire architecture of the CMS in those two releases and not just the Framework.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[CMS Architecture in 1.5 and 1.6]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/CMS_Architecture_in_1.5_and_1.6</id>
		<title>CMS Architecture in 1.5 and 1.6</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/CMS_Architecture_in_1.5_and_1.6"/>
				<updated>2012-08-24T13:36:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: moved About the Joomla Framework to CMS Architecture in 1.5 and 1.6: This page describes the entire architecture of the CMS in those two releases and not just the Framework.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
&lt;br /&gt;
==The Joomla! Framework&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;See also [[Framework]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[[Joomla! Framework vs Joomla! Platform]]&amp;lt;/ref&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
The [[:Category:Joomla! 1.5|Joomla! 1.5]] and [[:Category:Joomla! 1.6|Joomla! 1.6]] is a three tiered system consisting of the following:&lt;br /&gt;
&lt;br /&gt;
[[File:JoomlaArchitecture0.png|thumb|425px|Joomla! 1.5 Architecture]]&lt;br /&gt;
# The top, Extensions layer, consists of [[Extension|Extensions]] to the Joomla [[Framework]] and its applications:&lt;br /&gt;
#*[[Module|Modules]]&lt;br /&gt;
#*[[Component|Components]]&lt;br /&gt;
#*[[Template|Templates]]&lt;br /&gt;
# The middle, Application layer, consists of applications that extend the Framework [[JApplication]] class.  Currently there are four applications included in the Joomla distribution:-&lt;br /&gt;
#*[[JInstallation]] is responsible for installing Joomla on a web server and is deleted after the installation procedure has been completed.&lt;br /&gt;
#*[[JAdministrator]] is responsible for the back-end website administration.&lt;br /&gt;
#*[[JSite]] is responsible for the front-end of the website.&lt;br /&gt;
#*[[XML-RPC]] supports remote administration of the Joomla website.&lt;br /&gt;
# The bottom, Framework layer, consists of:-&lt;br /&gt;
#*the Joomla! 1.5 [[Framework/1.5|Framework]] itself, whose classes are listed [[Framework/1.5#Packages and Classes|here]].&lt;br /&gt;
#*[[Library|Libraries]] that are required by the [[Framework]] or are installed for use by third-party developers.&lt;br /&gt;
#*[[Plugin|Plugins]] extend the functionality available in the [[Framework]].&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]][[Category:Framework]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Framework</id>
		<title>Chunk:Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Framework"/>
				<updated>2012-08-24T13:33:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Updated contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|The Joomla Framework&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;See also [[Subpackages]]&amp;lt;/ref&amp;gt; was an important part of the Joomla architecture in the versions 1.5 and 1.6. It was based on modern object-oriented design patterns that make the Joomla core highly maintainable and easily extendable ([[About the Joomla Framework|Learn more about the Joomla Framework]]). Between April and July 2011, the Framework was rebranded as the Joomla! [[Platform]], which is now being developed separately from the Joomla! [[CMS]]. The first version of the CMS to ship with the Platform was version 1.7.&lt;br /&gt;
&lt;br /&gt;
Third party developers benefit from the rich, and easily accessible functionality that the Joomla Framework provides.&lt;br /&gt;
|[[Image:JoomlaArchitecture0.png|thumb|425px|The Joomla Architecture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Framework</id>
		<title>Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Framework"/>
				<updated>2012-08-24T13:31:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Adjusted layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chunk:Framework quote}}&lt;br /&gt;
{{Chunk:Framework}}&lt;br /&gt;
== API Reference ==&lt;br /&gt;
&lt;br /&gt;
On this page we'd like to provide you a way to reference of all classes and respective methods. Use the links below to navigate to further information about framework versions or the version classes which include, where possible, examples of use.&lt;br /&gt;
&lt;br /&gt;
If you would like to help us improve this resource, please read about the [[API Reference Project]].&lt;br /&gt;
&lt;br /&gt;
{{splist}}&lt;br /&gt;
=== See Also ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Framework]][[Category:Subpackages]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Framework</id>
		<title>Chunk:Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Framework"/>
				<updated>2012-08-24T13:31:14Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Moved reference-specific text to Framework&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|The Joomla Framework&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;See also [[Subpackages]]&amp;lt;/ref&amp;gt; was an important part of the Joomla architecture in the versions 1.5 and 1.6. It was based on modern object-oriented design patterns that make the Joomla core highly maintainable and easily extendable ([[About the Joomla Framework|Learn more about the Joomla Framework]]). In April 2011, the Framework was rebranded as the Joomla! [[Platform]], which is now being developed separately from the Joomla! [[CMS]]. The first version of the CMS to ship with the Platform was version 1.7.&lt;br /&gt;
&lt;br /&gt;
Third party developers benefit from the rich, and easily accessible functionality that the Joomla Framework provides.&lt;br /&gt;
|[[Image:JoomlaArchitecture0.png|thumb|425px|The Joomla Architecture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Framework</id>
		<title>Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Framework"/>
				<updated>2012-08-24T13:30:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Moved reference-specific text from Chunk:Platform&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chunk:Framework quote}}&lt;br /&gt;
{{Chunk:Framework}}&lt;br /&gt;
== API Reference ==&lt;br /&gt;
&lt;br /&gt;
On this page we'd like to provide you a way to reference of all classes and respective methods. Use the links below to navigate to further information about framework versions or the version classes which include, where possible, examples of use.&lt;br /&gt;
&lt;br /&gt;
If you would like to help us improve this resource, please read about the [[API Reference Project]].&lt;br /&gt;
&lt;br /&gt;
{{splist}}&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Framework]][[Category:Subpackages]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Chunk:Framework</id>
		<title>Chunk:Framework</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Chunk:Framework"/>
				<updated>2012-08-24T13:28:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Updated contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{chunk}}&amp;lt;/noinclude&amp;gt;__NOTOC__&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|The Joomla Framework&amp;lt;ref&amp;gt;See also [[Platform]]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;See also [[Subpackages]]&amp;lt;/ref&amp;gt; was an important part of the Joomla architecture in the versions 1.5 and 1.6. It was based on modern object-oriented design patterns that make the Joomla core highly maintainable and easily extendable ([[About the Joomla Framework|Learn more about the Joomla Framework]]). In April 2011, the Framework was rebranded as the Joomla! [[Platform]], which is now being developed separately from the Joomla! [[CMS]]. The first version of the CMS to ship with the Platform was version 1.7.&lt;br /&gt;
&lt;br /&gt;
Third party developers benefit from the rich, and easily accessible functionality that the Joomla Framework provides. On this page we'd like to provide you a way to reference of all classes and respective methods. Use the links below to navigate to further information about framework versions or the version classes which include, where possible, examples of use.&lt;br /&gt;
&lt;br /&gt;
If you would like to help us improve this resource, please read about the [[API Reference Project]].&lt;br /&gt;
|[[Image:JoomlaArchitecture0.png|thumb|425px|The Joomla Architecture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;references/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Where_are_the_web_pages_%3F</id>
		<title>Where are the web pages ?</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Where_are_the_web_pages_%3F"/>
				<updated>2012-08-23T19:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: moved Where are the web pages ? to Where are the web pages?: Fixed spelling error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Where are the web pages?]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Where_are_the_web_pages%3F</id>
		<title>Where are the web pages?</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Where_are_the_web_pages%3F"/>
				<updated>2012-08-23T19:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: moved Where are the web pages ? to Where are the web pages?: Fixed spelling error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you are coming from a traditional website made up of separate HTML pages, you may well wonder where the pages are.&lt;br /&gt;
&lt;br /&gt;
In Joomla! almost everything that you would normally think of as a web page is actually stored in a MySQL database. When you create a new page, your content is stored in a database record, not in a separate file.&lt;br /&gt;
&lt;br /&gt;
Then when your site is viewed, Joomla! calls up different items from your database and puts them together to make what is displayed to the user.&lt;br /&gt;
&lt;br /&gt;
One exception is that your images are usually stored in the images directory and not the database.&lt;br /&gt;
&lt;br /&gt;
Your MySQL database usually is created by you during the installation process (unless you use a Fantastico or a similar installer that will create the database automatically). If you have a control panel on a linux host, you can usually access MySQL through a program called [http://www.phpmyadmin.net/ phpMyAdmin]. This will allow you to view your database.&lt;br /&gt;
&lt;br /&gt;
For a short tutorial on converting a static HTML web site to Joomla!, see [[Converting an existing website to a Joomla! website]].&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ]]&lt;br /&gt;
[[Category:Administration FAQ]]&lt;br /&gt;
[[Category:Getting Started FAQ]]&lt;br /&gt;
[[Category:Version 1.5 FAQ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Entering_raw_HTML_in_editors</id>
		<title>Entering raw HTML in editors</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Entering_raw_HTML_in_editors"/>
				<updated>2012-08-23T18:59:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Only the redirect page should be in the FAQ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to enter raw [[wikipedia:HTML|HTML]] in a Joomla! editor field, you may encounter problems such as tags and attributes disappearing after you save the item you are editing. This is usually caused by a filtering mechanism; either your editor's or Joomla!'s.&lt;br /&gt;
&lt;br /&gt;
On the [[Administrator (Application)|Administrator panel]], take the following steps to disable filtering:&lt;br /&gt;
&lt;br /&gt;
* '''Disable your editor'''. Since each editor has its own filtering mechanism and it is not always possible to turn it off, disabling your editor is the easiest way of eliminating it as a possible source of the problem. Open ''My Profile'' from the ''Site'' menu, set ''Editor'' under ''Basic Settings'' to ''Editor - None'' and click ''Save &amp;amp; Close''.&lt;br /&gt;
* '''Disable Joomla's filtering'''. Open the ''Global Configuration'' from the ''Site'' menu and go to the ''Text Filters'' tab. Set the ''Filter Type'' to ''No Filtering'' for the user group that you are in - ''Administrator'', ''Super Users'', or both (this is site-dependent). '''Caution''': Do not use the ''No Filtering'' setting for user groups that are not fully trusted &amp;amp;ndash; that would introduce a sizeable security risk.'''&lt;br /&gt;
&lt;br /&gt;
You should be able to enter raw HTML in any editor field now. You may try to re-enable your editor to see whether it influences the process. If the editor does mangle the HTML you are trying to enter, consult its documentation to see if there is a way to disable its filtering.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Article Management]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/How_do_you_enter_raw_HTML_in_editors%3F</id>
		<title>How do you enter raw HTML in editors?</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/How_do_you_enter_raw_HTML_in_editors%3F"/>
				<updated>2012-08-23T18:58:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Created FAQ question&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Entering raw HTML in editors]]&lt;br /&gt;
[[Category:Administration FAQ]]&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Platform</id>
		<title>Platform</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Platform"/>
				<updated>2012-08-23T16:30:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mvangeest: Added references to additional documentation. These should not be part of the Chunk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chunk:Platform}}&lt;br /&gt;
{{splist|API documentation is available for the following Joomla Platform versions}}&lt;br /&gt;
&lt;br /&gt;
The Platform project maintains its own documentation that may be more up-to-date than the documentation found on this Wiki:&lt;br /&gt;
&lt;br /&gt;
* [http://api.joomla.org/ An automatically genenerated '''API reference''']&lt;br /&gt;
* [http://developer.joomla.org/manual/ A DocBook '''developer manual''' inside the source tree]&lt;br /&gt;
&lt;br /&gt;
===See Also===&lt;br /&gt;
* [[Framework]]&lt;br /&gt;
* [[Subpackages]]&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Platform]][[Category:Subpackages]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mvangeest</name></author>	</entry>

	</feed>