<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dextercowley</id>
	<title>Joomla! Documentation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dextercowley"/>
	<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/Special:Contributions/Dextercowley"/>
	<updated>2026-08-10T16:47:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Plugin/Events/User&amp;diff=492398</id>
		<title>Plugin/Events/User</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Plugin/Events/User&amp;diff=492398"/>
		<updated>2018-07-01T00:16:22Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
In a standard installation of Joomla! we have several predefined User events which, when triggered, call functions in the associated plugins.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserAuthorisation==&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This event authorises that a particular user should be able to login.&lt;br /&gt;
The system triggers this event after the user has been authenticated and before he has been signed in the website. It is possible to be triggered by plugin types &#039;&#039;&#039;User&#039;&#039;&#039; and &#039;&#039;&#039;Authentication&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - an object [http://api.joomla.org/cms-3/classes/JAuthenticationResponse.html JAuthenticationResponse]&lt;br /&gt;
* &#039;&#039;&#039;$options&#039;&#039;&#039; - an associative array containing these keys: [&amp;quot;remember&amp;quot;] =&amp;gt; bool, [&amp;quot;return&amp;quot;] =&amp;gt; string, [&amp;quot;entry_url&amp;quot;] =&amp;gt; string, [&amp;quot;action&amp;quot;] =&amp;gt; string&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
JAuthenticationResponse or NULL (NULL if you would like to miss the authorisation)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:6--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/user/authentication.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:7--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;[https://github.com/ITPrism/Plugin-User-FaceControl/blob/master/facecontrol.php Plugin User - Face Control]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserAuthorisationFailure==&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
The system triggers this event when the user has been authenticated but he has not been authorised to login. You should only use this event in &#039;&#039;&#039;User&#039;&#039;&#039; plugins. &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - an object [http://api.joomla.org/cms-3/classes/JAuthenticationResponse.html JAuthenticationResponse]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
void (it does not return any value or object)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:6--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/cms/application/cms.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserLogin==&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This event is triggered after the user is authenticated against the Joomla! user-base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
If you need to abort the login process (authentication), you will need to use [[Plugin/Events/Authentication#onUserAuthenticate|onUserAuthenticate]] instead.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - an associative array of [http://api.joomla.org/cms-3/classes/JAuthenticationResponse.html JAuthenticationResponse] type (see link for array keys)&lt;br /&gt;
* &#039;&#039;&#039;$options&#039;&#039;&#039; - an associative array containing these keys: [&amp;quot;remember&amp;quot;] =&amp;gt; bool, [&amp;quot;return&amp;quot;] =&amp;gt; string, [&amp;quot;entry_url&amp;quot;] =&amp;gt; string&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Boolean&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:6--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/application/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/joomla.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:7--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserLogout==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
This event is triggered before the user is logged out of the system. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
If any plugin returns false, the global logout fails and the onUserLogoutFailure event is fired; if it succeeds, onUserAfterLogout event is triggered instead. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
NOTE: as of 3.3.6, returning false does not work correctly, because stock components perform their logout operation during the onUserLogout event. So even if your plugin returns false, the stock ones have already run anyway. Thus, the user will be &amp;quot;mostly&amp;quot; logged out even if you return false. There is no actual way to cleanly abort logout.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$credentials&#039;&#039;&#039; - an associative array containing these keys: [&amp;quot;username&amp;quot;] =&amp;gt; string, [&amp;quot;id&amp;quot;] =&amp;gt; int&lt;br /&gt;
* &#039;&#039;&#039;$options&#039;&#039;&#039; - an associative array containing this key: [&amp;quot;clientid&amp;quot;] =&amp;gt; int&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
Boolean&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:13--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/cms/application/cms.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/joomla/joomla.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/system/logout.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/system/remember/remember.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:14--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserLoginFailure==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
This event is triggered whenever a user authentication request is failed by any plugin.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
Two parameters. The credentials array for the user (see onAuthenticate), and the JAuthenticationResponse that caused the failure.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
Unknown. The return value appears to be ignored in any case.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in file=== &amp;lt;!--T:23--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/application/user/authentication.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserAfterLogin==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
This event is triggered whenever a user is successfully logged in.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
Options is array with:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* remember&lt;br /&gt;
* return&lt;br /&gt;
* entry_url&lt;br /&gt;
* action&lt;br /&gt;
* user  - JUser Object&lt;br /&gt;
* responseType&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
Boolean&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:27--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/legacy/application/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/cms/application/cms.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/authentication/cookie/cookie.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserBeforeSave==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
This event is triggered before an update of a user record.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
The old and new user parameters are provided; commonly-used members are: username, name, email, password, password_clear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
The password array entry is the hashed password value. If the user has just changed the password, you may retrieve the cleartext password from $newUser[&#039;password_clear&#039;]. (It will be set to &amp;quot;&amp;quot; if the password has not been changed.)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$oldUser&#039;&#039;&#039; - An associative array of the columns in the user table (current values).&lt;br /&gt;
* &#039;&#039;&#039;$isnew&#039;&#039;&#039; - Boolean to identify if this is a new user (true - insert) or an existing one (false - update)&lt;br /&gt;
* &#039;&#039;&#039;$newUser&#039;&#039;&#039; - An associative array of the columns in the user table (new values).&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
Boolean. Whether the user-save should proceed or not. Any plugin that returns false aborts the save.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in file=== &amp;lt;!--T:33--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:34--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserAfterSave==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
This event is triggered after an update of a user record, or when a new user has been stored in the database.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
Password in $user array is already hashed at this point. You may retrieve the cleartext password using $_POST[&#039;password&#039;].&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - An associative array of the columns in the user table.&lt;br /&gt;
* &#039;&#039;&#039;$isnew&#039;&#039;&#039; - Boolean to identify if this is a new user (true - insert) or an existing one (false - update)&lt;br /&gt;
* &#039;&#039;&#039;$success&#039;&#039;&#039; - Boolean to identify if the store was successful&lt;br /&gt;
* &#039;&#039;&#039;$msg&#039;&#039;&#039; - Error message if store failed&lt;br /&gt;
Note: The old values that were just updated are not available here or afterwards. In case you need the old values, use onBeforeStoreUser().&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
None&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in file=== &amp;lt;!--T:39--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:40--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserBeforeDelete==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
The event is triggered when a user is about to be deleted from the system.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - An associative array of the columns in the user table.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
None. If you want to prevent the user from being deleted, you may abort the delete by redirecting back to the User Manager. For example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if ($this-&amp;gt;deleteNotAllowed($data))&lt;br /&gt;
		{&lt;br /&gt;
			$url = JRoute::_(&#039;index.php?option=com_users&amp;amp;view=users&#039;, false);&lt;br /&gt;
			$msg = JText::sprintf(&#039;PLG_USER_DELETE_NOT_ALLOWED&#039;, $data[&#039;username&#039;]);&lt;br /&gt;
			$app = Factory::getApplication();&lt;br /&gt;
			$app-&amp;gt;enqueueMessage($msg, &#039;error&#039;);&lt;br /&gt;
			$app-&amp;gt;redirect($url);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Used in files=== &amp;lt;!--T:44--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/joomla.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;===Example=== &amp;lt;!--T:45--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onUserAfterDelete==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Description=== &amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
The event is triggered after a user has been deleted from the system.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Parameters=== &amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; - An associative array of the columns in the user table.&lt;br /&gt;
* &#039;&#039;&#039;$succes&#039;&#039;&#039; - Boolean to identify if the deletion was successful&lt;br /&gt;
* &#039;&#039;&#039;$msg&#039;&#039;&#039; - Error message if delete failed ([http://api.joomla.org/cms-3/classes/JError.html JError] object detailing the error, if any)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Return Value=== &amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
None.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Used in files=== &amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;libraries/joomla/user/user.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/joomla.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===Example=== &amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/user/example.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==Order of execution== &amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
To modify Joomla! login process upon your needs (e.g. creating AJAX output for login), it may be useful to know the order of the events to be fired.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
Wrong credentials&amp;lt;/translate&amp;gt; !! &amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
CORRECT CREDENTIALS and the user is not blocked (is activated)&amp;lt;/translate&amp;gt; !! &amp;lt;translate&amp;gt;&amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
CORRECT CREDENTIALS and the user is blocked (is not activated)&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
onUserAuthenticate&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
returns&lt;br /&gt;
TRUE or FALSE&amp;lt;/translate&amp;gt;&lt;br /&gt;
	 |&lt;br /&gt;
	 |&lt;br /&gt;
	\ /&lt;br /&gt;
onUserLoginFailure&amp;lt;/pre&amp;gt; || &amp;lt;pre&amp;gt;&lt;br /&gt;
onUserAuthenticate&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:60--&amp;gt;&lt;br /&gt;
returns&lt;br /&gt;
TRUE or FALSE&amp;lt;/translate&amp;gt;&lt;br /&gt;
	 |&lt;br /&gt;
	 |&lt;br /&gt;
	\ /&lt;br /&gt;
onUserLogin	&amp;lt;translate&amp;gt;&amp;lt;!--T:61--&amp;gt;&lt;br /&gt;
returns FALSE -&amp;gt; END&lt;br /&gt;
returns TRUE&amp;lt;/translate&amp;gt;&lt;br /&gt;
	 |&lt;br /&gt;
	 |&lt;br /&gt;
	\ /&lt;br /&gt;
onUserAfterLogin&amp;lt;/pre&amp;gt; || &amp;lt;pre&amp;gt;&lt;br /&gt;
onUserAuthenticate&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
returns&lt;br /&gt;
TRUE or FALSE&amp;lt;/translate&amp;gt;&lt;br /&gt;
	 |&lt;br /&gt;
	 |&lt;br /&gt;
	\ /&lt;br /&gt;
onUserLogin&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
returns&lt;br /&gt;
TRUE or FALSE&amp;lt;/translate&amp;gt;&lt;br /&gt;
	 |&lt;br /&gt;
	 |&lt;br /&gt;
	\ /&lt;br /&gt;
	END&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Example idea&#039;&#039;&#039;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
Let&#039;s assume you want to preform Ajax login. You have already overriden a mod_login form so it&#039;s posted to Joomla! via an AJAX call. You added a field named &#039;&#039;&#039;ajax&#039;&#039;&#039; to the form.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
So when the form is posted and authentication is failed, your custom plugin must return some JSON data.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function onUserLoginFailure($response)&lt;br /&gt;
{&lt;br /&gt;
	$input  = JFactory::getApplication()-&amp;gt;input;&lt;br /&gt;
&lt;br /&gt;
	// If a non-ajax form was posted, we do not modify the behavior&lt;br /&gt;
	if (!$input-&amp;gt;post-&amp;gt;get(&#039;ajax&#039;, false))&lt;br /&gt;
	{&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$app = JFactory::getApplication();&lt;br /&gt;
	$task_failed = false; &lt;br /&gt;
&lt;br /&gt;
	// Fill this array with the data you want to return, e.g. $response[&#039;status&#039;] may be useful&lt;br /&gt;
	// Check libraries/joomla/user/authentication.php for available status codes &lt;br /&gt;
	$data = array(&#039;status&#039; =&amp;gt; $response[&#039;status&#039;]);&lt;br /&gt;
        &lt;br /&gt;
        // At least here in the plugin it&#039;s a must to send proper headers&lt;br /&gt;
        JFactory::getApplication()-&amp;gt;setHeader(&#039;Content-Type&#039;, &#039;application/json&#039;, true)-&amp;gt;sendHeaders();&lt;br /&gt;
	echo new JResponseJson($data, $response[&#039;error_message&#039;], $task_failed);&lt;br /&gt;
&lt;br /&gt;
	// Closing app is a must here to return JSON immideately&lt;br /&gt;
	$app-&amp;gt;close();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
[[Category:Plugin Development]]&lt;br /&gt;
[[Category:Specifications]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Deploying_an_Update_Server&amp;diff=104940</id>
		<title>Deploying an Update Server</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Deploying_an_Update_Server&amp;diff=104940"/>
		<updated>2013-11-12T00:27:07Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: make it clear that client is required for modules&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version/tutor|2.5,3.x}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This tutorial is designed to teach developers how to create an update server for integration with the update system introduced in Joomla!.  By adding an update server listing to your extension&#039;s manifest, developers enable users to update their extensions via the Extension Manager&#039;s Update (see [[Help25:Extensions Extension Manager Update|Joomla 2.5]] and [[Help31:Extensions Extension Manager Update|Joomla 3.x]] helpscreens) view with only a few clicks.&lt;br /&gt;
&lt;br /&gt;
== Defining an update server ==&lt;br /&gt;
In order to use this feature, an update server must be defined in your extension&#039;s manifest.  This definition can be used in all Joomla! 2.5 and newer compatible extensions but is not available for templates.  You can use two options for your server type; collection or extension.  These will be explained in detail shortly.  This code should be added to the extension manifest file, within the root &amp;quot;extension&amp;quot; element. The update server is defined as follows for each type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;extension&amp;gt;&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
 &amp;lt;updateservers&amp;gt;&lt;br /&gt;
    &amp;lt;server type=&amp;quot;collection&amp;quot;&amp;gt;http://example.com/list.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;server type=&amp;quot;extension&amp;quot; priority=&amp;quot;2&amp;quot; name=&amp;quot;My Extension&#039;s Updates&amp;quot;&amp;gt;http://example.com/extension.xml&amp;lt;/server&amp;gt;&lt;br /&gt;
 &amp;lt;/updateservers&amp;gt;&lt;br /&gt;
 &amp;lt;/extension&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple servers can be defined within the &amp;lt;updateservers&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
== Server types ==&lt;br /&gt;
=== Collection ===&lt;br /&gt;
The collection server type allows developers to define an extension&#039;s manifest to pull updates from a collection.  This type of server can be used if the developer wants to define all of their extension&#039;s updates in a single file (not recommended) or if their extension has multiple sub-extensions which are not distributed or updated at the same time (such as a package extension type).  The below example is the collection definition used by the updater when processing core Joomla! updates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;extensionset name=&amp;quot;Joomla Core&amp;quot; description=&amp;quot;Joomla! Core&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;extension name=&amp;quot;Joomla&amp;quot; element=&amp;quot;joomla&amp;quot; type=&amp;quot;file&amp;quot; version=&amp;quot;1.7.0&amp;quot; detailsurl=&amp;quot;http://update.joomla.org/core/extension.xml&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/extensionset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All definitions must be defined between &amp;lt;extensionset&amp;gt; tags in your collection manifest.  The &amp;lt;extensionset&amp;gt; tag has two optional parameters; name and description.  For each extension that this collection references, a separate &amp;lt;extension&amp;gt; tag is required.  The &amp;lt;extension&amp;gt; tag has the following parameters, all of which are required for updates to properly process:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; - The name of the extension&lt;br /&gt;
* &#039;&#039;&#039;element&#039;&#039;&#039; - The untranslated extension name i.e. mod_custom&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; - The extension type (component, module, plugin, etc.)&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039; - The latest version of the extension&lt;br /&gt;
* &#039;&#039;&#039;detailsurl&#039;&#039;&#039; - The URL of the XML file which contains that extension&#039;s individual update definitions&lt;br /&gt;
&lt;br /&gt;
=== Extension ===&lt;br /&gt;
The extension server type allows developers to define an extension&#039;s manifest to pull updates from a single extension&#039;s manifest.  All collection manifests eventually point to this XML file.  All updates in this file must be defined after an &amp;lt;updates&amp;gt; tag at the beginning of the file.  The below example is the update definition for the Joomla! 1.7.0 release:&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;name&amp;gt;Joomla! 1.7&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;Joomla! 1.7 CMS&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;element&amp;gt;joomla&amp;lt;/element&amp;gt;&lt;br /&gt;
    &amp;lt;type&amp;gt;file&amp;lt;/type&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;infourl title=&amp;quot;Joomla!&amp;quot;&amp;gt;http://www.joomla.org/&amp;lt;/infourl&amp;gt;&lt;br /&gt;
    &amp;lt;downloads&amp;gt;&lt;br /&gt;
        &amp;lt;downloadurl type=&amp;quot;full&amp;quot; format=&amp;quot;zip&amp;quot;&amp;gt;http://joomlacode.org/gf/download/frsrelease/15279/66552/Joomla_1.6.5_to_1.7.0_Package.zip&amp;lt;/downloadurl&amp;gt;&lt;br /&gt;
    &amp;lt;/downloads&amp;gt;&lt;br /&gt;
    &amp;lt;tags&amp;gt;&lt;br /&gt;
        &amp;lt;tag&amp;gt;stable&amp;lt;/tag&amp;gt;&lt;br /&gt;
    &amp;lt;/tags&amp;gt;&lt;br /&gt;
    &amp;lt;maintainer&amp;gt;Sam Moffatt&amp;lt;/maintainer&amp;gt;&lt;br /&gt;
    &amp;lt;maintainerurl&amp;gt;http://sammoffatt.com.au&amp;lt;/maintainerurl&amp;gt;&lt;br /&gt;
    &amp;lt;section&amp;gt;Testing&amp;lt;/section&amp;gt;&lt;br /&gt;
    &amp;lt;targetplatform name=&amp;quot;joomla&amp;quot; version=&amp;quot;1.6&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/update&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following section describes the elements of a single update entity.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039; - The name of the extension, this name will appear in the Name column of the Extension Manager&#039;s Update view (required)&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; - A short description of the extension (optional) -- if you choose to use &amp;lt;![CDATA[]]&amp;gt;, double-quotes will break the HTML formatting.  Use single quotes with your HTML entities.&lt;br /&gt;
* &#039;&#039;&#039;element&#039;&#039;&#039; - The installed name of the extension (required). For plugins, this needs to be same as plugin attribute value for main file in plugin manifest. For &amp;lt;filename plugin=&amp;quot;pluginname&amp;quot;&amp;gt;pluginname.php&amp;lt;/filename&amp;gt;, element value should be &#039;&#039;&#039;pluginname&#039;&#039;&#039;. &lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; - The type of extension (component, module, plugin, etc.) (required)&lt;br /&gt;
* &#039;&#039;&#039;folder&#039;&#039;&#039; - Specific to plugins, this tag describes the type of plugin being updated (content, system, etc.) (required for plugins)&lt;br /&gt;
* &#039;&#039;&#039;client&#039;&#039;&#039; Required for modules as of 3.2.0. - The client ID of the extension, which can be found by looking inside the #__extensions table. To date, use 0 for &amp;quot;site&amp;quot; and 1 for &amp;quot;administrator&amp;quot;. Plugins and front-end modules are automatically installed with a client of 0 (site), but you will need to specify the client in an update or it will default to 1 (administrator) and then found update would not be shown because it would not match any extension. Components are automatically installed with a client of 1, which is currently the default.&lt;br /&gt;
** &#039;&#039;Warning&#039;&#039;: The tag name is &amp;lt;&#039;&#039;&#039;client&#039;&#039;&#039;&amp;gt; for Joomla! 2.5 and &amp;lt;&#039;&#039;&#039;client_id&#039;&#039;&#039;&amp;gt; for 1.6 and 1.7. If you use &amp;lt;client_id&amp;gt; (rather than &amp;lt;client&amp;gt;) on a 2.5 site, it will be ignored.&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039; - The version of the release (required)&lt;br /&gt;
* &#039;&#039;&#039;infourl&#039;&#039;&#039; - A URL to point users to containing information about the update (optional) (In CMS 2.5, if set, this URL will be displayed in the update view)&lt;br /&gt;
* &#039;&#039;&#039;downloads&#039;&#039;&#039; - The section which lists all download locations&lt;br /&gt;
** &#039;&#039;&#039;downloadurl&#039;&#039;&#039; - The URL to download the extension from; the &amp;lt;downloadurl&amp;gt; tag has two required parameters:&lt;br /&gt;
*** &#039;&#039;&#039;type&#039;&#039;&#039; - The type of package (full or upgrade)&lt;br /&gt;
*** &#039;&#039;&#039;format&#039;&#039;&#039; - The format of the package (zip, tar, etc.)&lt;br /&gt;
* &#039;&#039;&#039;tags&#039;&#039;&#039; - Optional (unknown use)&lt;br /&gt;
* &#039;&#039;&#039;maintainer&#039;&#039;&#039; - The name of the extension maintainer (similar to the &amp;lt;author&amp;gt; tag in a manifest) (optional)&lt;br /&gt;
* &#039;&#039;&#039;maintainerurl&#039;&#039;&#039; - The website of the extension maintainer (similar to the &amp;lt;authorUrl&amp;gt; tag in a manifest) (optional)&lt;br /&gt;
* &#039;&#039;&#039;section&#039;&#039;&#039; - Optional (unknown use)&lt;br /&gt;
* &#039;&#039;&#039;targetplatform&#039;&#039;&#039; - A tag to define platform requirements, requires the following elements&lt;br /&gt;
** &#039;&#039;&#039;name&#039;&#039;&#039; - The name of the platform dependency; as of this writing, it should ONLY be &amp;quot;joomla&amp;quot;&lt;br /&gt;
** &#039;&#039;&#039;version&#039;&#039;&#039; - The version of Joomla! the extension supports&lt;br /&gt;
** &#039;&#039;&#039;min_dev_level&#039;&#039;&#039; and &#039;&#039;&#039;max_dev_level&#039;&#039;&#039; - These attributes were added in 3.0.1 to allow you to select a target platform based on the developer level (&amp;quot;z&amp;quot; in x.y.z). They are optional. You can specifiy either one or both. If omitted, all developer levels are matched. For example, the following matches versions 4.0.0 and 4.0.1. &amp;lt;code&amp;gt;&amp;lt;targetplatform name=&amp;quot;joomla&amp;quot; version=&amp;quot;4.0&amp;quot; min_dev_level=&amp;quot;0&amp;quot; max_dev_level=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;Note:&#039;&#039;&#039; If your extension is Joomla! 2.5 and/or 3.1 compatible, you will be required to have separate &amp;lt;update&amp;gt; definitions for each version due to the manner in which the updater checks the version if you specify a number. However to show your extension on all Joomla versions that support automatic updates add &amp;lt;code&amp;gt;&amp;lt;targetplatform name=&amp;quot;joomla&amp;quot; version=&amp;quot;.*&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;. If you want your extension to show on all {{JVer|3.x}} versions then rather than specifying a version in the version tag add in &amp;lt;code&amp;gt;&amp;lt;targetplatform name=&amp;quot;joomla&amp;quot; version=&amp;quot;3.[012345]&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;. This will show the update to all 3.x versions.&lt;br /&gt;
&lt;br /&gt;
A separate &amp;lt;update&amp;gt; definition will be required for each version of your extension you release.&lt;br /&gt;
&lt;br /&gt;
The values of &#039;&#039;&#039;element&#039;&#039;&#039;, &#039;&#039;&#039;type&#039;&#039;&#039;, &#039;&#039;&#039;client_id&#039;&#039;&#039; and &#039;&#039;&#039;folder&#039;&#039;&#039; should match those in the table #__extensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important for plugins:&#039;&#039;&#039; Plugins have to include &amp;lt;folder&amp;gt; and &amp;lt;client&amp;gt; elements to work properly&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
* &#039;&#039;&#039;SQL update script is not executed during update.&#039;&#039;&#039; &lt;br /&gt;
:If the SQL update script (for example, in the folder &amp;lt;code&amp;gt;sql/updates/mysql&amp;lt;/code&amp;gt;) does not get executed during the update process, it could be because there is no version number in the &amp;lt;code&amp;gt;#__schemas&amp;lt;/code&amp;gt; table for this extension &#039;&#039;prior to the update&#039;&#039;. This value is determined by the last script name in the SQL updates folder. If this value is blank, no SQL scripts will be executed during that update cycle. To make sure this value is set correctly, make sure you have a SQL script in this folder with its name as the version number (for example, 1.2.3.sql if the version is 1.2.3). The file can be empty or just have a SQL comment line. This should be done in the old version -- the one before the update. Alternatively, you can add this value to the &amp;lt;code&amp;gt;#__schemas&amp;lt;/code&amp;gt; using a SQL query. &lt;br /&gt;
&lt;br /&gt;
== Supporting Tools ==&lt;br /&gt;
Maintaining your update server files can be difficult depending on the manner in which you set up your files.  An extension which can help you to maintain this is the Akeeba Release System, available free of charge from https://www.akeebabackup.com&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
*[[User:mbabker|Michael Babker]]&lt;br /&gt;
*[[User:Renekorss|Rene Korss]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Bug_Tracking_Process&amp;diff=104915</id>
		<title>Bug Tracking Process</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Bug_Tracking_Process&amp;diff=104915"/>
		<updated>2013-11-10T17:27:28Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: removed old 2.5 tracker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC|33%}}&lt;br /&gt;
This article documents the current Joomla! bug tracking process from the time a new bug is reported to the time it is closed.&lt;br /&gt;
&lt;br /&gt;
Joomla! bugs are tracked in the follower tracker:&lt;br /&gt;
;*[http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemBrowse&amp;amp;tracker_id=8103 Joomla! CMS Issue Tracker] - Active.&lt;br /&gt;
:This is for issues with supported Joomla Versions. As of November 2013, this is version 2.5 and 3.2.&lt;br /&gt;
&lt;br /&gt;
==Reporting Issues==&lt;br /&gt;
&lt;br /&gt;
[[Image:ReportingIssues.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
The process is normally started in one of two ways: the bug is added to the respective tracker, or a user reports the bug in the [http://forum.joomla.org/viewforum.php?f=199 Joomla! Bug Forum] for the given maintenance release.&lt;br /&gt;
&lt;br /&gt;
=== Issues reported on the forum ===&lt;br /&gt;
&lt;br /&gt;
JBS members scan the forums to determine when issues need to be put into the tracker. If the issue can be reproduced, is clearly a bug, and there are step-by-step instructions for how to reproduce it, it can be entered into the tracker with a status of Confirmed. If it is not as clear-cut, it can be entered with a status of Open, so that other JBS members will know it needs further investigation.&lt;br /&gt;
&lt;br /&gt;
=== Issues directly reported to the tracker ===&lt;br /&gt;
&lt;br /&gt;
When an issue is added to the tracker, the status will be either &lt;br /&gt;
1. Open &lt;br /&gt;
2. Confirmed&lt;br /&gt;
3. or Pending &lt;br /&gt;
depending on the situation. If the issue needs more investigation, then it should be set to Open. If the issue (1) is a bug and (2) can be reproduced and (3) has good test instructions, it should be set to Confirmed. If it meets the three Confirmed criteria and also has a good patch attached, it should be set to Pending. See below for more information about the status codes.&lt;br /&gt;
&lt;br /&gt;
=== Issue Priorities ===&lt;br /&gt;
&lt;br /&gt;
Most issues are priority 3, or Normal. The artifacts are prioritized according to the following characteristics:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Critical (1):&#039;&#039;&#039;&lt;br /&gt;
The trunk is not working at all. Significant parts of the source are broken preventing key operations.  Examples would be login, installation, extension installers, javascript errors that prevent you from moving a save or similar action, etc.  Also includes the generation of Fatal PHP errors and major security issues in a prerelease (Security issues for a stable release should NOT be reported in the tracker but instead reported to the security team security@joomla.org).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Major (2):&#039;&#039;&#039;&lt;br /&gt;
Parts of the source are obstructing operation in a serious way or causing a major loss in advertised function.  Examples would includes PHP notices and warnings and reported javascript errors.  Major issues will also typically prevent the release cycle from moving from Beta to Release Candidate (RC), or Release Candidate to General Availability (GA).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normal: (3)&#039;&#039;&#039;&lt;br /&gt;
Issues that are hindering advertised behavior but the application is still workable.  Examples would include parameters not working as advertised, language files not loading as expected, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Minor (4):&#039;&#039;&#039;&lt;br /&gt;
Minor loss of function and generally annoying behavior.  May include less common platform or browser specific problems that while they may be technically major in those environments, they represent a minority.  Also include missing translation strings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivial (5):&#039;&#039;&#039;&lt;br /&gt;
Cosmetic problems, misspelled words, graphically misaligned object, less common issues with parameters, etc.&lt;br /&gt;
&lt;br /&gt;
== Resolving Issues ==&lt;br /&gt;
&lt;br /&gt;
The bug squad takes care of the Joomla releases. For example, that means getting the 3.0.1, 3.0.2, 3.0.3, 3.0.4  etc releases ready by fixing problems that come up. The idea is to make the release increasingly stable and take care of issues that come up. At the same time, it is vitally important not to break anything that is working. That&#039;s called software regression and it&#039;s not something you want at this stage.&lt;br /&gt;
&lt;br /&gt;
In the trackers there are several common statuses, mainly: open, confirmed, pending, ready to commit.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open&#039;&#039;&#039; means it&#039;s reported, but it hasn&#039;t been determined for sure whether it is a real bug or not. Many Open issues are not actually bugs. If the issue fits into one of the categories below, then the status is changed as indicated and the bug is closed:&lt;br /&gt;
** Cannot be reproduced. We have tried the same thing the reported did but the software appears to work correctly. (In many cases, more information is needed to be able to reproduce a bug. See &amp;quot;Information Required&amp;quot; below.) Change status to &#039;&#039;&#039;Unable to confirm&#039;&#039;&#039;.&lt;br /&gt;
** Has already been reported in a different issue number. Change status to &#039;&#039;&#039;Duplicate report&#039;&#039;&#039; and add the number on the duplicates tab.&lt;br /&gt;
** Is a known limitation of the software. Change status to &#039;&#039;&#039;Known issue&#039;&#039;&#039;.&lt;br /&gt;
** Is a feature request, a mistake made by a user, or is the way the software is intended to work. Change status to &#039;&#039;&#039;Not a bug&#039;&#039;&#039;.&lt;br /&gt;
** Is a bug with an extension or some other external program or a server issue that will not be addressed. Change status to &#039;&#039;&#039;Not Joomla! core&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Information Required&#039;&#039;&#039; is used if we need more information &#039;&#039;from the person who reported the issue&#039;&#039; to decide about the issue. For example, there are questions about how to reproduce the problem or other questions about the issue. If we get the information we need, then we can continue processing the issue. If we don&#039;t get the information within two weeks, then we can change the status to Unable to confirm (or another of the closed status codes if that is more applicable).&lt;br /&gt;
* &#039;&#039;&#039;Needs Review&#039;&#039;&#039; is used if we need a JBS Coordinator, Development Coordinator, or other experienced developer to review the issue. This is different from Information Required, which means that we need more information from the person who reported the issue.&lt;br /&gt;
* &#039;&#039;&#039;Started&#039;&#039;&#039; means that JBS has checked the issue, but is not quite sure if the issue is an actual bug (i.e. confirmed), and that there is discussion going on about the issue, which doesn&#039;t require additional information &#039;&#039;from the person who reported the issue&#039;&#039;.  It is a state that&#039;s between &#039;&#039;&#039;Opened&#039;&#039;&#039; and &#039;&#039;&#039;Confirmed&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Confirmed&#039;&#039;&#039; means that JBS has confirmed that this issue is a bug in Joomla! that should be fixed. That&#039;s when the JBS tries to solve it or consults with the development team about a solution. &#039;&#039;At this point there should be clear step-by-step test instructions that indicate how to reproduce the problem. For version 1.6, use the Test Instructions field for this information.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Pending&#039;&#039;&#039; means that a patch has been submitted that a JBS member or development coordinator or appropriate leadership team member believes fixes the bug. If needed, additional test instructions are entered for the issue. Every Pending issue should have instructions that tell the tester how to reproduce the problem and make sure the patch fixes the problem.&lt;br /&gt;
* &#039;&#039;&#039;In Progress&#039;&#039;&#039; means that an issue is being worked on. This will most likely be a situation where the issue was set to Pending but there were problems with the patch that require additional work. It also may be a case where the issue is complex and will take some time to solve. JBS members can participate in In Progress issues but generally should not start coding before discussing with others working on the issue already.&lt;br /&gt;
* &#039;&#039;&#039;Ready to commit&#039;&#039;&#039; means that (in general) two separate people have successfully tested the same patch file, and it works correctly with the patch. Note that, for some issues that are more complex or higher impact, we may need more than two people to test or may need to test on multiple platforms. For simple issues, such as fixing typos in language strings or comments, one tester is enough.&lt;br /&gt;
* &#039;&#039;&#039;Fixed in SVN&#039;&#039;&#039; means that, after reviewing the code, the JBS commit coordinators have determined that the patch is good and the change has been committed to the Joomla! codebase. At this point, it will be part of the next Joomla! maintenance release.&lt;br /&gt;
&lt;br /&gt;
The flowchart below provides a visual guide to how the process for resolving bugs works.&lt;br /&gt;
&lt;br /&gt;
[[Image:ResolvingIssues.png|800px]]&lt;br /&gt;
&lt;br /&gt;
You do &#039;&#039;not&#039;&#039; need to be a member of the JBS to help fix bugs in Joomla. Anyone can report bugs, test patches, or submit patches. If you want to help with resolving bugs, go to the [http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemBrowse&amp;amp;tracker_id=32 Tracker]. You can help resolve Open issues as outlined above. You can create and submit patches for Confirmed issues. Or you can help test Pending issues. To report about what you have done, login to joomlacode and add a comment. You&#039;ll be amazed at how much impact you can have and how good it feels to contribute to the Joomla! project.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, or are interested in joining the JBS, please contact the [http://community.joomla.org/magazine/author/75-mark-dexter.html JBS Coordinator]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Development Working Group]][[Category:Bug Squad]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
[[Category:Working Groups]]&lt;br /&gt;
[[Category:Bug Tracker]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Joomla_2.5_version_history&amp;diff=104806</id>
		<title>Joomla 2.5 version history</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Joomla_2.5_version_history&amp;diff=104806"/>
		<updated>2013-11-07T16:36:40Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: add 2.5.15 and 2.5.16&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Joomla! 2.5.16 ==&lt;br /&gt;
* 06 Aug 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5518-joomla-2-5-16-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6789 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.16 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.15 ==&lt;br /&gt;
* 06 Aug 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5517-joomla-2-5-15-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6784 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.15 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.14 ==&lt;br /&gt;
* 01 Aug 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5506-joomla-2-5-14-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6737 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.14 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.13 ==&lt;br /&gt;
* 25 July 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5503-joomla-2-5-13-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6730 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.13 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.12 ==&lt;br /&gt;
* Joomla! version 2.5.12 was not publicly released.&lt;br /&gt;
* [[:Category: Version 2.5.12 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.11 ==&lt;br /&gt;
* 26 April 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5498-joomla-2-5-11-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6673 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.11 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.10 ==&lt;br /&gt;
* 24 April 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5493-joomla-2-5-10-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6660 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.10 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.9 ==&lt;br /&gt;
* 4 February 2013&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5477-joomla-2-5-9-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6610 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.9 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.8 ==&lt;br /&gt;
* 8 November 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5470-joomla-2-5-8-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6545 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.8 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.7 ==&lt;br /&gt;
* 13 September 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5463-joomla-2-5-7-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6490 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.7 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.6 ==&lt;br /&gt;
* 19 June 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5428-joomla-256-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6376 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.6 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.5 ==&lt;br /&gt;
* 18 June 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5427-joomla-255-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6374 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.5 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.4 ==&lt;br /&gt;
* 2 April 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5418-joomla-254-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6318 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.4 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.3 ==&lt;br /&gt;
* 15 March 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5416-joomla-253-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6302 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.3 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.2 ==&lt;br /&gt;
* 5 March 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5415-joomla-252-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6296 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.2 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.1 ==&lt;br /&gt;
* 2 February 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5410-joomla-251-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6257 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.1 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
== Joomla! 2.5.0 ==&lt;br /&gt;
* 24 January 2012&lt;br /&gt;
* [http://www.joomla.org/announcements/release-news/5403-joomla-250-released.html Release Notes]&lt;br /&gt;
* [http://joomlacode.org/gf/project/joomla/frs/?action=FrsReleaseBrowse&amp;amp;frs_package_id=6231 Package and MD5s]&lt;br /&gt;
* [[:Category: Version 2.5.0 FAQ|FAQ and known issues]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 2.5]][[Category:Version_History]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104715</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104715"/>
		<updated>2013-11-03T22:13:52Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: add link to final code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: https://github.com/joomla/jdoc-examples/raw/master/zip_archives/com_joomprosubs-3.2.0.zip.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
At this point, everything works. However, when we use the pop-up Preview or Compare windows in the Item Version History modal, we see the database column names instead of the translated label from the form. Also, we see the category and user id numbers instead of the category name and user name.&lt;br /&gt;
&lt;br /&gt;
We can improve the readability of windows by entering in some additional about our component&#039;s table. This information is entered as a JSON-formatted string in the content_history_options column of the #__content_types table. The following information can be entered in this column.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; This is the path to the XML JForm file for this form. If you add this, the Preview and Compare views will look up the labels from this XML file. This way the user will see translated labels instead of the database column name.&lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; Some database columns are not meaningful for the user when viewing the item. For example, asset_id or check_out_time are not things that appear in the form and are not helpful to the user when figuring out the contents of an item. This is entered as an array of column names.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; The content history component uses a &amp;quot;hash&amp;quot; calculation (Sha1) to determine whether an item has changed. This allows you to see which version in history matches the current version. It also prevents duplicate versions from being saved in the content history table (for example, if you press the &amp;quot;save&amp;quot; button without making any changes). For this to work properly, we need to exclude some columns from the hash calculate. The &amp;quot;ignoreChanges&amp;quot; lets you exclude some database columns from the hash so that changes to these columns will not be considered real changes to the item. For example, columns such as &amp;quot;hits&amp;quot; or &amp;quot;modified_time&amp;quot; will change with each save, even if no meaningful data was changed in the item. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; When the hash value is created, it uses a JSON array of the database column values. In some cases, such as start and stop publishing dates, the value might be blank when a row is first created and then a different value after the item is saved. To get a consistent hash value for the first and subsequent saves, these values can be converted to integers before the hash is created. That way, we don&#039;t think a value has changed when it really hasn&#039;t. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; Here we can define how to display more meaningful data, for example, displaying a category title or user name instead of the ID. This is stored as an array of PHP standard class objects. Each object has the following fields.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; The column in the form to replace. For example, the &amp;quot;created_user_id&amp;quot; or &amp;quot;catid&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; The database table to get the title or name. For example, &amp;quot;#__users&amp;quot; or &amp;quot;#__categories&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; The column in the target table to use in the SQL query JOIN statement. For example, &amp;quot;id&amp;quot;.&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; The column in the target table to display in the Preview or Compare pop-up window. For example, &amp;quot;name&amp;quot; or &amp;quot;title&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In our example component, we need the following values.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; checked_out, checked_out_time, params, langauge. The last two columns are not used.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; modified_by, modified, checked_out, checked_out_time. &lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; publish_up, publish_down.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; We look up five fields: catid, group_id, created_by, access, and modified_by. The values for each are as follows.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; catid&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__categories&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; group_id&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__usergroups&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; created_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; access&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__viewlevels&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; modified_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users &lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
The entire JSON string for this column is as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\/components\/com_joomprosubs\/models\/forms\/subscription.xml&amp;quot;, &lt;br /&gt;
&amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &lt;br /&gt;
&amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &lt;br /&gt;
&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &lt;br /&gt;
&amp;quot;displayLookup&amp;quot;:[&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the slashes are escaped inside the JSON string. In order to get this column correctly into the database when our component is installed, we need to modify the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; where we create the #__content_types for for the component as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) VALUES&lt;br /&gt;
(null, &#039;Subscriptions&#039;, &#039;com_joomprosubs.subscription&#039;, &#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_joomprosubs\\/models\\/forms\\/subscription.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;quot;/&amp;quot; characters are now preceeded by two escape &amp;quot;\&amp;quot; characters. The first one is the SQL escape character for the second &amp;quot;\&amp;quot; character. The second &amp;quot;\&amp;quot; is the JSON escape character for the &amp;quot;/&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
With this change to the SQL install file, the changes for content history are complete.&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
To tidy things up, should should edit the uninstall SQL file to remove the rows from the #__content_types table. Also, if your component uses the one-click update feature, you should create a SQL file to create these rows when the component is updated.&lt;br /&gt;
&lt;br /&gt;
Hopefully, this tutorial will help you as you update your component to take advantage of the content history feature in Joomla. You can download the com_joomprosubs component with the code for content history added here: https://github.com/joomla/jdoc-examples/raw/master/zip_archives/com_joomprosubs-3.2.1.zip. &lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104714</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104714"/>
		<updated>2013-11-03T22:11:47Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Update link for zip file.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: https://github.com/joomla/jdoc-examples/raw/master/zip_archives/com_joomprosubs-3.2.0.zip.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
At this point, everything works. However, when we use the pop-up Preview or Compare windows in the Item Version History modal, we see the database column names instead of the translated label from the form. Also, we see the category and user id numbers instead of the category name and user name.&lt;br /&gt;
&lt;br /&gt;
We can improve the readability of windows by entering in some additional about our component&#039;s table. This information is entered as a JSON-formatted string in the content_history_options column of the #__content_types table. The following information can be entered in this column.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; This is the path to the XML JForm file for this form. If you add this, the Preview and Compare views will look up the labels from this XML file. This way the user will see translated labels instead of the database column name.&lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; Some database columns are not meaningful for the user when viewing the item. For example, asset_id or check_out_time are not things that appear in the form and are not helpful to the user when figuring out the contents of an item. This is entered as an array of column names.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; The content history component uses a &amp;quot;hash&amp;quot; calculation (Sha1) to determine whether an item has changed. This allows you to see which version in history matches the current version. It also prevents duplicate versions from being saved in the content history table (for example, if you press the &amp;quot;save&amp;quot; button without making any changes). For this to work properly, we need to exclude some columns from the hash calculate. The &amp;quot;ignoreChanges&amp;quot; lets you exclude some database columns from the hash so that changes to these columns will not be considered real changes to the item. For example, columns such as &amp;quot;hits&amp;quot; or &amp;quot;modified_time&amp;quot; will change with each save, even if no meaningful data was changed in the item. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; When the hash value is created, it uses a JSON array of the database column values. In some cases, such as start and stop publishing dates, the value might be blank when a row is first created and then a different value after the item is saved. To get a consistent hash value for the first and subsequent saves, these values can be converted to integers before the hash is created. That way, we don&#039;t think a value has changed when it really hasn&#039;t. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; Here we can define how to display more meaningful data, for example, displaying a category title or user name instead of the ID. This is stored as an array of PHP standard class objects. Each object has the following fields.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; The column in the form to replace. For example, the &amp;quot;created_user_id&amp;quot; or &amp;quot;catid&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; The database table to get the title or name. For example, &amp;quot;#__users&amp;quot; or &amp;quot;#__categories&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; The column in the target table to use in the SQL query JOIN statement. For example, &amp;quot;id&amp;quot;.&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; The column in the target table to display in the Preview or Compare pop-up window. For example, &amp;quot;name&amp;quot; or &amp;quot;title&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In our example component, we need the following values.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; checked_out, checked_out_time, params, langauge. The last two columns are not used.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; modified_by, modified, checked_out, checked_out_time. &lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; publish_up, publish_down.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; We look up five fields: catid, group_id, created_by, access, and modified_by. The values for each are as follows.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; catid&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__categories&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; group_id&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__usergroups&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; created_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; access&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__viewlevels&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; modified_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users &lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
The entire JSON string for this column is as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\/components\/com_joomprosubs\/models\/forms\/subscription.xml&amp;quot;, &lt;br /&gt;
&amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &lt;br /&gt;
&amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &lt;br /&gt;
&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &lt;br /&gt;
&amp;quot;displayLookup&amp;quot;:[&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the slashes are escaped inside the JSON string. In order to get this column correctly into the database when our component is installed, we need to modify the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; where we create the #__content_types for for the component as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) VALUES&lt;br /&gt;
(null, &#039;Subscriptions&#039;, &#039;com_joomprosubs.subscription&#039;, &#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_joomprosubs\\/models\\/forms\\/subscription.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;quot;/&amp;quot; characters are now preceeded by two escape &amp;quot;\&amp;quot; characters. The first one is the SQL escape character for the second &amp;quot;\&amp;quot; character. The second &amp;quot;\&amp;quot; is the JSON escape character for the &amp;quot;/&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
With this change to the SQL install file, the changes for content history are complete.&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
To tidy things up, should should edit the uninstall SQL file to remove the rows from the #__content_types table. Also, if your component uses the one-click update feature, you should create a SQL file to create these rows when the component is updated.&lt;br /&gt;
&lt;br /&gt;
Hopefully, this tutorial will help you as you update your component to take advantage of the content history feature in Joomla.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104711</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104711"/>
		<updated>2013-11-03T21:19:55Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Update Extension SQL Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
At this point, everything works. However, when we use the pop-up Preview or Compare windows in the Item Version History modal, we see the database column names instead of the translated label from the form. Also, we see the category and user id numbers instead of the category name and user name.&lt;br /&gt;
&lt;br /&gt;
We can improve the readability of windows by entering in some additional about our component&#039;s table. This information is entered as a JSON-formatted string in the content_history_options column of the #__content_types table. The following information can be entered in this column.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; This is the path to the XML JForm file for this form. If you add this, the Preview and Compare views will look up the labels from this XML file. This way the user will see translated labels instead of the database column name.&lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; Some database columns are not meaningful for the user when viewing the item. For example, asset_id or check_out_time are not things that appear in the form and are not helpful to the user when figuring out the contents of an item. This is entered as an array of column names.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; The content history component uses a &amp;quot;hash&amp;quot; calculation (Sha1) to determine whether an item has changed. This allows you to see which version in history matches the current version. It also prevents duplicate versions from being saved in the content history table (for example, if you press the &amp;quot;save&amp;quot; button without making any changes). For this to work properly, we need to exclude some columns from the hash calculate. The &amp;quot;ignoreChanges&amp;quot; lets you exclude some database columns from the hash so that changes to these columns will not be considered real changes to the item. For example, columns such as &amp;quot;hits&amp;quot; or &amp;quot;modified_time&amp;quot; will change with each save, even if no meaningful data was changed in the item. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; When the hash value is created, it uses a JSON array of the database column values. In some cases, such as start and stop publishing dates, the value might be blank when a row is first created and then a different value after the item is saved. To get a consistent hash value for the first and subsequent saves, these values can be converted to integers before the hash is created. That way, we don&#039;t think a value has changed when it really hasn&#039;t. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; Here we can define how to display more meaningful data, for example, displaying a category title or user name instead of the ID. This is stored as an array of PHP standard class objects. Each object has the following fields.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; The column in the form to replace. For example, the &amp;quot;created_user_id&amp;quot; or &amp;quot;catid&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; The database table to get the title or name. For example, &amp;quot;#__users&amp;quot; or &amp;quot;#__categories&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; The column in the target table to use in the SQL query JOIN statement. For example, &amp;quot;id&amp;quot;.&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; The column in the target table to display in the Preview or Compare pop-up window. For example, &amp;quot;name&amp;quot; or &amp;quot;title&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In our example component, we need the following values.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; checked_out, checked_out_time, params, langauge. The last two columns are not used.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; modified_by, modified, checked_out, checked_out_time. &lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; publish_up, publish_down.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; We look up five fields: catid, group_id, created_by, access, and modified_by. The values for each are as follows.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; catid&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__categories&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; group_id&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__usergroups&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; created_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; access&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__viewlevels&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; modified_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users &lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
The entire JSON string for this column is as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\/components\/com_joomprosubs\/models\/forms\/subscription.xml&amp;quot;, &lt;br /&gt;
&amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &lt;br /&gt;
&amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &lt;br /&gt;
&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &lt;br /&gt;
&amp;quot;displayLookup&amp;quot;:[&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the slashes are escaped inside the JSON string. In order to get this column correctly into the database when our component is installed, we need to modify the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; where we create the #__content_types for for the component as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) VALUES&lt;br /&gt;
(null, &#039;Subscriptions&#039;, &#039;com_joomprosubs.subscription&#039;, &#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_joomprosubs\\/models\\/forms\\/subscription.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;quot;/&amp;quot; characters are now preceeded by two escape &amp;quot;\&amp;quot; characters. The first one is the SQL escape character for the second &amp;quot;\&amp;quot; character. The second &amp;quot;\&amp;quot; is the JSON escape character for the &amp;quot;/&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
With this change to the SQL install file, the changes for content history are complete.&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
To tidy things up, should should edit the uninstall SQL file to remove the rows from the #__content_types table. Also, if your component uses the one-click update feature, you should create a SQL file to create these rows when the component is updated.&lt;br /&gt;
&lt;br /&gt;
Hopefully, this tutorial will help you as you update your component to take advantage of the content history feature in Joomla.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104710</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104710"/>
		<updated>2013-11-03T21:17:04Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Labels to Pop-Up Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
At this point, everything works. However, when we use the pop-up Preview or Compare windows in the Item Version History modal, we see the database column names instead of the translated label from the form. Also, we see the category and user id numbers instead of the category name and user name.&lt;br /&gt;
&lt;br /&gt;
We can improve the readability of windows by entering in some additional about our component&#039;s table. This information is entered as a JSON-formatted string in the content_history_options column of the #__content_types table. The following information can be entered in this column.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; This is the path to the XML JForm file for this form. If you add this, the Preview and Compare views will look up the labels from this XML file. This way the user will see translated labels instead of the database column name.&lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; Some database columns are not meaningful for the user when viewing the item. For example, asset_id or check_out_time are not things that appear in the form and are not helpful to the user when figuring out the contents of an item. This is entered as an array of column names.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; The content history component uses a &amp;quot;hash&amp;quot; calculation (Sha1) to determine whether an item has changed. This allows you to see which version in history matches the current version. It also prevents duplicate versions from being saved in the content history table (for example, if you press the &amp;quot;save&amp;quot; button without making any changes). For this to work properly, we need to exclude some columns from the hash calculate. The &amp;quot;ignoreChanges&amp;quot; lets you exclude some database columns from the hash so that changes to these columns will not be considered real changes to the item. For example, columns such as &amp;quot;hits&amp;quot; or &amp;quot;modified_time&amp;quot; will change with each save, even if no meaningful data was changed in the item. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; When the hash value is created, it uses a JSON array of the database column values. In some cases, such as start and stop publishing dates, the value might be blank when a row is first created and then a different value after the item is saved. To get a consistent hash value for the first and subsequent saves, these values can be converted to integers before the hash is created. That way, we don&#039;t think a value has changed when it really hasn&#039;t. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; Here we can define how to display more meaningful data, for example, displaying a category title or user name instead of the ID. This is stored as an array of PHP standard class objects. Each object has the following fields.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; The column in the form to replace. For example, the &amp;quot;created_user_id&amp;quot; or &amp;quot;catid&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; The database table to get the title or name. For example, &amp;quot;#__users&amp;quot; or &amp;quot;#__categories&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; The column in the target table to use in the SQL query JOIN statement. For example, &amp;quot;id&amp;quot;.&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; The column in the target table to display in the Preview or Compare pop-up window. For example, &amp;quot;name&amp;quot; or &amp;quot;title&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In our example component, we need the following values.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; checked_out, checked_out_time, params, langauge. The last two columns are not used.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; modified_by, modified, checked_out, checked_out_time. &lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; publish_up, publish_down.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; We look up five fields: catid, group_id, created_by, access, and modified_by. The values for each are as follows.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; catid&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__categories&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; group_id&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__usergroups&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; created_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; access&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__viewlevels&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; title&lt;br /&gt;
&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; modified_by&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; #__users &lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; id&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; name&lt;br /&gt;
&lt;br /&gt;
The entire JSON string for this column is as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\/components\/com_joomprosubs\/models\/forms\/subscription.xml&amp;quot;, &lt;br /&gt;
&amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &lt;br /&gt;
&amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &lt;br /&gt;
&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &lt;br /&gt;
&amp;quot;displayLookup&amp;quot;:[&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},&lt;br /&gt;
{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the slashes are escaped inside the JSON string. In order to get this column correctly into the database when our component is installed, we need to modify the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; where we create the #__content_types for for the component as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) VALUES&lt;br /&gt;
(null, &#039;Subscriptions&#039;, &#039;com_joomprosubs.subscription&#039;, &#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_joomprosubs\\/models\\/forms\\/subscription.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;params&amp;quot;,&amp;quot;language&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_by&amp;quot;, &amp;quot;modified&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;], &amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;catid&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;group_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__usergroups&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_by&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;} ]}&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;quot;/&amp;quot; characters are now preceeded by two escape &amp;quot;\&amp;quot; characters. The first one is the SQL escape character for the second &amp;quot;\&amp;quot; character. The second &amp;quot;\&amp;quot; is the JSON escape character for the &amp;quot;/&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
With this change to the SQL install file, the changes for content history are complete.&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104709</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104709"/>
		<updated>2013-11-03T20:15:25Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Labels to Pop-Up Windows  -- in progress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
At this point, everything works. However, when we use the pop-up Preview or Compare windows in the Item Version History modal, we see the database column names instead of the translated label from the form. Also, we see the category and user id numbers instead of the category name and user name.&lt;br /&gt;
&lt;br /&gt;
We can improve the readability of windows by entering in some additional about our component&#039;s table. This information is entered as a JSON-formatted string in the content_history_options column of the #__content_types table. The following information can be entered in this column.&lt;br /&gt;
*&#039;&#039;&#039;formfile:&#039;&#039;&#039; This is the path to the XML JForm file for this form. If you add this, the Preview and Compare views will look up the labels from this XML file. This way the user will see translated labels instead of the database column name.&lt;br /&gt;
*&#039;&#039;&#039;hideFields:&#039;&#039;&#039; Some database columns are not meaningful for the user when viewing the item. For example, asset_id or check_out_time are not things that appear in the form and are not helpful to the user when figuring out the contents of an item. This is entered as an array of column names.&lt;br /&gt;
*&#039;&#039;&#039;ignoreChanges:&#039;&#039;&#039; The content history component uses a &amp;quot;hash&amp;quot; calculation (Sha1) to determine whether an item has changed. This allows you to see which version in history matches the current version. It also prevents duplicate versions from being saved in the content history table (for example, if you press the &amp;quot;save&amp;quot; button without making any changes). For this to work properly, we need to exclude some columns from the hash calculate. The &amp;quot;ignoreChanges&amp;quot; lets you exclude some database columns from the hash so that changes to these columns will not be considered real changes to the item. For example, columns such as &amp;quot;hits&amp;quot; or &amp;quot;modified_time&amp;quot; will change with each save, even if no meaningful data was changed in the item. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;convertToInt:&#039;&#039;&#039; When the hash value is created, it uses a JSON array of the database column values. In some cases, such as start and stop publishing dates, the value might be blank when a row is first created and then a different value after the item is saved. To get a consistent hash value for the first and subsequent saves, these values can be converted to integers before the hash is created. That way, we don&#039;t think a value has changed when it really hasn&#039;t. This is an array of database column names.&lt;br /&gt;
*&#039;&#039;&#039;displayLookup:&#039;&#039;&#039; Here we can define how to display more meaningful data, for example, displaying a category title or user name instead of the ID. This is stored as an array of PHP standard class objects. Each object has the following fields.&lt;br /&gt;
:*&#039;&#039;sourceColumn:&#039;&#039; The column in the form to replace. For example, the &amp;quot;created_user_id&amp;quot; or &amp;quot;catid&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetTable:&#039;&#039; The database table to get the title or name. For example, &amp;quot;#__users&amp;quot; or &amp;quot;#__categories&amp;quot;.&lt;br /&gt;
:*&#039;&#039;targetColumn:&#039;&#039; The column in the target table to use in the SQL query JOIN statement. For example, &amp;quot;id&amp;quot;.&lt;br /&gt;
:*&#039;&#039;displayColumn:&#039;&#039; The column in the target table to display in the Preview or Compare pop-up window. For example, &amp;quot;name&amp;quot; or &amp;quot;title&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104708</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104708"/>
		<updated>2013-11-03T19:38:01Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Version Note Field to Form */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
The content history feature adds a new field called &amp;quot;version_note&amp;quot; to the component edit form. This optional field is not saved in the component table. Instead, it is used to label the version in the content history table. &lt;br /&gt;
&lt;br /&gt;
To add this field to our component edit screen, we do changes to two files. First, we add the field to the XML form file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/models/forms/subscription.xml&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;version_note&amp;quot;&lt;br /&gt;
	type=&amp;quot;text&amp;quot;&lt;br /&gt;
	label=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_LABEL&amp;quot;&lt;br /&gt;
	description=&amp;quot;JGLOBAL_FIELD_VERSION_NOTE_DESC&amp;quot;&lt;br /&gt;
	class=&amp;quot;inputbox&amp;quot; size=&amp;quot;45&amp;quot;&lt;br /&gt;
	labelclass=&amp;quot;control-label&amp;quot;&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can add it anywhere inside the fieldset element. Because we will place the field &amp;quot;created_by_alias&amp;quot; on the screen, we add it in the XML file after this element.&lt;br /&gt;
&lt;br /&gt;
Second, we add this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/tmpl/edit.php&amp;lt;/code&amp;gt;, just after the control group for &amp;quot;created_by_alias&amp;quot;, as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;control-group&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;control-label&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getLabel(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&amp;lt;?php echo $this-&amp;gt;form-&amp;gt;getInput(&#039;version_note&#039;); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can add in a version note and see this in the Item Version History modal window.&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104707</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104707"/>
		<updated>2013-11-03T19:22:49Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Versions Button to Tool Bar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
At this point, categories are working completely and we are saving history versions in the #__ucm_history table for our component. However, we need to be able to access these changes on our edit screen. To do this, we need to add the Versions button to the edit screen&#039;s toolbar. We do this by adding this code to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/views/subscription/view.html.php&amp;lt;/code&amp;gt;, just before the code that adds the &amp;quot;cancel&amp;quot; button, as shown here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
else {&lt;br /&gt;
  if ($this-&amp;gt;state-&amp;gt;params-&amp;gt;get(&#039;save_history&#039;, 1) &amp;amp;&amp;amp; $user-&amp;gt;authorise(&#039;core.edit&#039;)) {&lt;br /&gt;
    JToolbarHelper::versions(&#039;com_joomprosubs.subscription&#039;, $this-&amp;gt;item-&amp;gt;id);&lt;br /&gt;
  }&lt;br /&gt;
  JToolBarHelper::cancel(&#039;subscription.cancel&#039;, &#039;JTOOLBAR_CLOSE&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code checks that we have the save_history option set and that we have edit permission for this component. If so, we show the Versions button using the &amp;lt;code&amp;gt;JToolbarHelper::versions()&amp;lt;/code&amp;gt; method. This method has two arguments: the type_alias and the primary key of the component item row in the database.&lt;br /&gt;
&lt;br /&gt;
With this code added, we can now go into the Joomprosubs component, add and save a new subscription, and now see the Versions button. If we click on it, we will see the Item Version History modal window open with our saved version.&lt;br /&gt;
&lt;br /&gt;
There are still two things missing, however. One is that we don&#039;t have a way to add the Version Note to each version. The second is that we don&#039;t currently have meaningful labels for the versions when we use the Preview or Compare features. We will address these in the next two sections of this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104706</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104706"/>
		<updated>2013-11-03T18:48:24Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Update Content History During Table Save and Delete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
Next we need to tell our component to call the content history methods during the save and delete operations. We can do this by adding this line of code to the &amp;lt;code&amp;gt;__construct()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;JoomprosubsTableSubscription&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JObserverMapper::addObserverClassToClass(&#039;JTableObserverContenthistory&#039;, &#039;JoomprosubsTableSubscription&#039;, array(&#039;typeAlias&#039; =&amp;gt; &#039;com_joomprosubs.subscription&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code registers the content history table as an observer class for our component table. When a row is saved or deleted from our table, the appropriate methods are called automatically for the content history table.&lt;br /&gt;
&lt;br /&gt;
At this point, we should be able to see content history working for the Joomprosubs categories. Test this by adding a new category for the component and then clicking on the Versions button in the toolbar. It should work exactly the same as categories for the core Joomla components.&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104705</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104705"/>
		<updated>2013-11-03T18:37:05Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Component Level Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
The content history component uses two options as follows.&lt;br /&gt;
*&#039;&#039;&#039;save_history:&#039;&#039;&#039; If Yes, history is saved. Otherwise, no history is saved.&lt;br /&gt;
*&#039;&#039;&#039;history_limit:&#039;&#039;&#039; If &amp;gt; 0, limits the number of different history versions saved in the database. For example, if this is set to 10, then when the 11th history version is saved, the oldest is deleted automatically.&lt;br /&gt;
&lt;br /&gt;
If our example component, we will add the following lines to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fieldset name=&amp;quot;component&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;field&lt;br /&gt;
		name=&amp;quot;save_history&amp;quot;&lt;br /&gt;
		type=&amp;quot;radio&amp;quot;&lt;br /&gt;
		class=&amp;quot;btn-group btn-group-yesno&amp;quot;&lt;br /&gt;
		default=&amp;quot;1&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;0&amp;quot;&amp;gt;JNO&amp;lt;/option&amp;gt;&lt;br /&gt;
		&amp;lt;option&lt;br /&gt;
			value=&amp;quot;1&amp;quot;&amp;gt;JYES&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;history_limit&amp;quot;&lt;br /&gt;
		type=&amp;quot;text&amp;quot;&lt;br /&gt;
		filter=&amp;quot;integer&amp;quot;&lt;br /&gt;
		label=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&amp;quot;&lt;br /&gt;
		description=&amp;quot;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&amp;quot;&lt;br /&gt;
		default=&amp;quot;5&amp;quot;&lt;br /&gt;
	/&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
With this code, we will now be able to add and save these options. Go into the Options for the component and set save_history to Yes and history_limit to 10.&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104699</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104699"/>
		<updated>2013-11-03T18:12:33Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: tweak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for the category table and one for the component table.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104698</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104698"/>
		<updated>2013-11-03T18:11:24Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: minor fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for its &amp;quot;CRUD&amp;quot; (create/update/delete) operations. If the component does not use JTable then the simplest thing to do is to re-work it to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for each of these.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104638</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104638"/>
		<updated>2013-11-02T23:22:27Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Finish the Add Rows section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for the &amp;quot;CRUD&amp;quot; operations. If your component does not use JTable then the simplest thing to do is to re-work your component to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for each of these.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed. You should also run these commands on your database to add the two rows to your #__content_types table before going to the next section. Remember to change the placeholder prefix &amp;quot;#__&amp;quot; to the actual prefix for your database before running the SQL commands on your local database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; When creating the values for the JSON strings, one trick is to copy from an existing row and edit the strings.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104637</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104637"/>
		<updated>2013-11-02T23:18:44Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Add Rows to Content Types Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for the &amp;quot;CRUD&amp;quot; operations. If your component does not use JTable then the simplest thing to do is to re-work your component to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
The first thing we need to do is to add two new rows into the #__content_types table. This table stores information about the different tables for each content type. As of Joomla version 3.2, this table is used by the com_tags and com_contenthistory components to get information about each content type for which history is stored. The columns for #__content_types are as follows:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_id:&#039;&#039;&#039; auto-increment id number.&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; descriptive title for this table.&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;component name&amp;gt;.&amp;lt;type name&amp;gt;. For example: &amp;quot;com_content.article&amp;quot; or &amp;quot;com_content.category&amp;quot;.&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; JSON string that contains the name of the JTable class and other information about the table.&lt;br /&gt;
*&#039;&#039;&#039;rules:&#039;&#039;&#039; Not used as of Joomla version 3.2. &lt;br /&gt;
*&#039;&#039;&#039;field_mappings:&#039;&#039;&#039; Used by the com_tags component to map database columns from the component table to the ucm_content table.&lt;br /&gt;
*&#039;&#039;&#039;router:&#039;&#039;&#039; Optional location of the component&#039;s router, if any.&lt;br /&gt;
*&#039;&#039;&#039;content_history_options:&#039;&#039;&#039; JSON string used to store information for rendering the pop-up windows in the content history component. We will discuss this in detail later in this tutorial.&lt;br /&gt;
&lt;br /&gt;
Our example component uses a table called #__joompro_subscriptions to store each subscription. In addition, it uses the standard Joomla categories. So we will add a row in #__content_types for each of these.&lt;br /&gt;
&lt;br /&gt;
The row for the categories can be copied from the row for &amp;quot;Weblinks Category&amp;quot; (or any other category row). The only columns that need to be changed are &amp;lt;code&amp;gt;type_title&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt;. The other columns are the same as for &amp;lt;code&amp;gt;com_weblinks.category&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The SQL statement for adding this row is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscription Category&#039;, &lt;br /&gt;
&#039;com_joomprosubs.category&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Category&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;},&amp;quot;common&amp;quot;:   {&amp;quot;dbtable&amp;quot;:&amp;quot;#__ucm_content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;ucm_id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Corecontent&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JTable&amp;quot;,&amp;quot;config&amp;quot;:&amp;quot;array()&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &lt;br /&gt;
&#039;{&amp;quot;common&amp;quot;:{&amp;quot;core_content_item_id&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;core_title&amp;quot;:&amp;quot;title&amp;quot;,&amp;quot;core_state&amp;quot;:&amp;quot;published&amp;quot;,&amp;quot;core_alias&amp;quot;:&amp;quot;alias&amp;quot;,&amp;quot;core_created_time&amp;quot;:&amp;quot;created_time&amp;quot;,&amp;quot;core_modified_time&amp;quot;:&amp;quot;modified_time&amp;quot;,&amp;quot;core_body&amp;quot;:&amp;quot;description&amp;quot;, &amp;quot;core_hits&amp;quot;:&amp;quot;hits&amp;quot;,&amp;quot;core_publish_up&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_publish_down&amp;quot;:&amp;quot;null&amp;quot;,&amp;quot;core_access&amp;quot;:&amp;quot;access&amp;quot;, &amp;quot;core_params&amp;quot;:&amp;quot;params&amp;quot;, &amp;quot;core_featured&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metadata&amp;quot;:&amp;quot;metadata&amp;quot;, &amp;quot;core_language&amp;quot;:&amp;quot;language&amp;quot;, &amp;quot;core_images&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_urls&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_version&amp;quot;:&amp;quot;version&amp;quot;, &amp;quot;core_ordering&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;core_metakey&amp;quot;:&amp;quot;metakey&amp;quot;, &amp;quot;core_metadesc&amp;quot;:&amp;quot;metadesc&amp;quot;, &amp;quot;core_catid&amp;quot;:&amp;quot;parent_id&amp;quot;, &amp;quot;core_xreference&amp;quot;:&amp;quot;null&amp;quot;, &amp;quot;asset_id&amp;quot;:&amp;quot;asset_id&amp;quot;}, &amp;quot;special&amp;quot;:{&amp;quot;parent_id&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;lft&amp;quot;:&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;:&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;:&amp;quot;extension&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;note&amp;quot;}}&#039;, &lt;br /&gt;
&#039;WeblinksHelperRoute::getCategoryRoute&#039;, &lt;br /&gt;
&#039;{&amp;quot;formFile&amp;quot;:&amp;quot;administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml&amp;quot;, &amp;quot;hideFields&amp;quot;:[&amp;quot;asset_id&amp;quot;,&amp;quot;checked_out&amp;quot;,&amp;quot;checked_out_time&amp;quot;,&amp;quot;version&amp;quot;,&amp;quot;lft&amp;quot;,&amp;quot;rgt&amp;quot;,&amp;quot;level&amp;quot;,&amp;quot;path&amp;quot;,&amp;quot;extension&amp;quot;], &amp;quot;ignoreChanges&amp;quot;:[&amp;quot;modified_user_id&amp;quot;, &amp;quot;modified_time&amp;quot;, &amp;quot;checked_out&amp;quot;, &amp;quot;checked_out_time&amp;quot;, &amp;quot;version&amp;quot;, &amp;quot;hits&amp;quot;, &amp;quot;path&amp;quot;],&amp;quot;convertToInt&amp;quot;:[&amp;quot;publish_up&amp;quot;, &amp;quot;publish_down&amp;quot;], &amp;quot;displayLookup&amp;quot;:[{&amp;quot;sourceColumn&amp;quot;:&amp;quot;created_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;access&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__viewlevels&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;modified_user_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__users&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;name&amp;quot;},{&amp;quot;sourceColumn&amp;quot;:&amp;quot;parent_id&amp;quot;,&amp;quot;targetTable&amp;quot;:&amp;quot;#__categories&amp;quot;,&amp;quot;targetColumn&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;displayColumn&amp;quot;:&amp;quot;title&amp;quot;}]}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the actual subscriptions, we only need the following information in the content types table:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;type_title:&#039;&#039;&#039; &amp;lt;code&amp;gt;Subscriptions&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;type_alias:&#039;&#039;&#039; &amp;lt;code&amp;gt;com_joomprosubs.subscription&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;table:&#039;&#039;&#039; &amp;lt;code&amp;gt;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&amp;lt;/code&amp;gt;. This creates a JSON object as follows:&lt;br /&gt;
:special:&lt;br /&gt;
::dbtable = #__joompro_subscriptions&lt;br /&gt;
::key = id&lt;br /&gt;
::type = Subscription&lt;br /&gt;
::prefix = JoomprosubsTable&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type_alias&amp;lt;/code&amp;gt; column is used by the com_contenthistory component to find the row for each component in the #__content_types table. The &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; column gives the com_contenthistory component the information it needs to work with the JTable class for each component. The None of the other columns need to be set for now. Note that we will come back to the &amp;lt;code&amp;gt;content_history_options&amp;lt;/code&amp;gt; column later in the tutorial to improve the appearance of the pop-up window.&lt;br /&gt;
&lt;br /&gt;
The SQL for adding this second row to the #__content_types table is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) &lt;br /&gt;
VALUES&lt;br /&gt;
(null, &lt;br /&gt;
&#039;Subscriptions&#039;, &lt;br /&gt;
&#039;com_joomprosubs.subscription&#039;, &lt;br /&gt;
&#039;{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__joompro_subscriptions&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Subscription&amp;quot;,&amp;quot;prefix&amp;quot;:&amp;quot;JoomprosubsTable&amp;quot;}}&#039;, &lt;br /&gt;
&#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines should be added to the file &amp;lt;code&amp;gt;administrator/components/com_joomprosubs/sql/install.mysql.utf8.sql&amp;lt;/code&amp;gt; so that these rows will be created when the component is installed.&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104632</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104632"/>
		<updated>2013-11-02T22:24:14Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Set up Working Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for the &amp;quot;CRUD&amp;quot; operations. If your component does not use JTable then the simplest thing to do is to re-work your component to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
# Install a new instance of Joomla version 3.2 on your local workstation.&lt;br /&gt;
# Install the example component using the file com_joomprosubs_3.2.0.zip in the Extension Manager: Install screen. You can get the ZIP archive here: &amp;lt;to be filled in when available&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
At this point, you should be able to see the Joompro Subscriptions component in the Components menu in the back end of Joomla. This is the component before we have added content history to it.&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104619</id>
		<title>Using Content History in your Component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Using_Content_History_in_your_Component&amp;diff=104619"/>
		<updated>2013-11-02T17:49:26Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Start work on content history tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 3.2, Joomla added the ability to track content history (also called versions) for all core components. This allows you to view and restore from prior versions of an article, banner, category, and other content types. This feature can easily be added to third-party components. This tutorial shows you how to do this. We will illustrate this by adding content history to an example component.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Note:&#039;&#039;&#039; This tutorial assumes that the component uses a JTable sub-class for the &amp;quot;CRUD&amp;quot; operations. If your component does not use JTable then the simplest thing to do is to re-work your component to use JTable&#039;s store() and delete() methods. If you do that, you will be able to use the methods described in this tutorial.&lt;br /&gt;
&lt;br /&gt;
=Set up Working Environment=&lt;br /&gt;
&lt;br /&gt;
=Add Rows to Content Types Table=&lt;br /&gt;
&lt;br /&gt;
=Add Component Level Options=&lt;br /&gt;
&lt;br /&gt;
=Update Content History During Table Save and Delete=&lt;br /&gt;
&lt;br /&gt;
=Add Versions Button to Tool Bar=&lt;br /&gt;
&lt;br /&gt;
=Add Version Note Field to Form=&lt;br /&gt;
&lt;br /&gt;
=Add Labels to Pop-Up Windows=&lt;br /&gt;
&lt;br /&gt;
=Update Extension SQL Files=&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content History]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104509</id>
		<title>Help310:Components Weblinks Links Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104509"/>
		<updated>2013-10-14T00:41:27Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: adjust image sizes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==Overview==&lt;br /&gt;
This screen lets you create new Web Links and edit existing ones.&lt;br /&gt;
&lt;br /&gt;
==How to Access==&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Help30:Components_Weblinks_Links|Web Links Manager]]. To add a new Web Link, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing Web Link, click the Web Link&#039;s Title, or check the Web Link&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
This is where you add a new Web Link or edit an existing one. Note that you need to create at least one [[Help30:Components_Weblinks_Categories_Edit|Web Links Category]] before you can create your first Web Link.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
===Edit Web Link===&lt;br /&gt;
&lt;br /&gt;
This is where you enter or edit basic link information.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Title&#039;&#039;&#039;. The Title of the Web Link. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;URL&#039;&#039;&#039;. The URL of the Web Link.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|Status}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-publishing-options-tab.png|670px]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Hits}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Options===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-basic-options-tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Target}}&lt;br /&gt;
{{Chunk30:colheader|Width}}&lt;br /&gt;
{{Chunk30:colheader|Height}}&lt;br /&gt;
*&#039;&#039;&#039;Count Clicks.&#039;&#039;&#039; Whether or not to keep track of how many times this web link has been opened.&lt;br /&gt;
&lt;br /&gt;
===Images===&lt;br /&gt;
[[File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:Image|First Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
{{Chunk30:Image|Second Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|Web Links Manager: Web Link|Web Links Manager: Web Link}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
* At least one Web Link Category must be added &#039;&#039;before&#039;&#039; any Web Links can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit Web Link Categories: [[Help30:Components_Weblinks_Categories|Web Link Category Manager]]&lt;br /&gt;
*To find and edit existing Web Links: [[Help30:Components_Weblinks_Links|Web Link Manager]]&lt;br /&gt;
*To create a page layout for Web Links: [[Help30:Menus_Menu_Item_Manager_Edit#Internal_Link_-_Web_Links|Menu Item Manager - New/Edit - Internal Link - Web Links]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|Web Link Manager Help Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=User:Dextercowley/gallery&amp;diff=104508</id>
		<title>User:Dextercowley/gallery</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=User:Dextercowley/gallery&amp;diff=104508"/>
		<updated>2013-10-14T00:40:08Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: commonist 0.4.28&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sun Oct 13 17:39:49 PDT 2013 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab.png|&lt;br /&gt;
File:Help30-Components-Weblinks-Links-Edit-basic-options-tab.png|&lt;br /&gt;
File:Help30-Components-Weblinks-Links-Edit-publishing-options-tab.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 13 16:43:56 PDT 2013 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab.png|&lt;br /&gt;
File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 14 07:12:09 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Easygithub1.png|&lt;br /&gt;
File:Easygithub2.png|&lt;br /&gt;
File:Easygithub4.png|&lt;br /&gt;
File:Easygithub5.png|&lt;br /&gt;
File:Easygithub6.png|&lt;br /&gt;
File:Easygithub7.png|&lt;br /&gt;
File:Easygithub8.png|&lt;br /&gt;
File:Easygithub9.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:34:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-23.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:29:26 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-22.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:18:47 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-18.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-19.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-20.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-21.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 16:54:09 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-17.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 16:02:02 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-16.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 15:20:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-11.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-12.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-13.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-14.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:40:41 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-10.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:37:54 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:32:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:05:13 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-07.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-08.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 09 17:56:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-06.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 09 17:39:00 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-01.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-02.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-03.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-04.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-05.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Oct 08 21:26:49 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Media_1349743656750.png|&lt;br /&gt;
File:Media_1349745128572.png|&lt;br /&gt;
File:Media_1349749085366.png|&lt;br /&gt;
File:Media_1349749557492.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Jun 25 13:04:30 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-manager-options-toolbar.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 20:24:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-manager-options-articles.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-blog-featured-layouts.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-categories.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-category.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-editing-layout.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-integration.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-list-layouts.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-permissions.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-shared-options.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 19:52:18 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-toolbar.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 19:38:37 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-article-edit-permissions.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-permissions.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 17:33:18 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-permissions.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 07:46:27 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-article-options.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-configure-edit-screen.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-images-links.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-metadata-options.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-publishing-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:59:15 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-pagebreak-button.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:49:11 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-image-button.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:38:25 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-codemirror-example.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:16:42 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-editor-tinymce-advanced.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-advanced.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:12:23 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-advanced.png|&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-extended.png|&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-simple.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:04:16 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-editor-buttons.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-buttons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:02:36 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-buttons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jun 12 18:29:34 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-21.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-22.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-22a.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-23.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-24.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jun 12 17:57:24 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-01.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-02.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-03.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-04.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-05.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-06.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-07.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-08.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-09.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-10.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-11.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-12.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-13.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-14.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-15.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-16.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-17.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-18.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-19.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-20.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jun 01 16:20:16 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-document-screenshot-20120530-01.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-02.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-03.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jun 01 16:14:48 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-01.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-01.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-02.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-02.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-03.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-03.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-04.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-04.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-document-screenshot-20120529-01.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-02.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-03.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed May 09 11:44:58 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Eclipse-install-372-screenshot-01.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-02.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-03.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed May 09 11:24:44 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-eclipse-screenshot-01.png|&lt;br /&gt;
File:Git-eclipse-screenshot-02.png|&lt;br /&gt;
File:Git-eclipse-screenshot-03.png|&lt;br /&gt;
File:Git-eclipse-screenshot-03a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-04.png|&lt;br /&gt;
File:Git-eclipse-screenshot-04a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-05.png|&lt;br /&gt;
File:Git-eclipse-screenshot-06.png|&lt;br /&gt;
File:Git-eclipse-screenshot-07.png|&lt;br /&gt;
File:Git-eclipse-screenshot-07a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-08.png|&lt;br /&gt;
File:Git-eclipse-screenshot-09.png|&lt;br /&gt;
File:Git-eclipse-screenshot-10.png|&lt;br /&gt;
File:Git-eclipse-screenshot-11.png|&lt;br /&gt;
File:Git-eclipse-screenshot-12.png|&lt;br /&gt;
File:Git-eclipse-screenshot-13.png|&lt;br /&gt;
File:Git-eclipse-screenshot-14.png|&lt;br /&gt;
File:Git-eclipse-screenshot-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 17:05:54 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-batch-process.png|&lt;br /&gt;
File:Help25-chunk-colheader-pagination.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 15:32:45 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-select-access.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-author.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-category.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-language.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-max-levels.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-status.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 15:04:00 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-filter-field.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 10:23:23 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-order-ascending.png|&lt;br /&gt;
File:Help25-chunk-colheader-order-descending.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 10:06:58 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-order-icons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Apr 17 20:44:13 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-state-icons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 20:55:35 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-create-article-basic-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 19:21:35 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-create-article-front-end-editor.png|&lt;br /&gt;
File:Help25-article-create-article-front-end-language-metadata.png|&lt;br /&gt;
File:Help25-article-create-article-front-end-publishing.png|&lt;br /&gt;
File:Help25-article-create-article-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:59:08 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:58:13 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-blog-layout-options.png]] aborted: exists: [[:File:Help25-chunk-article-category-blog-layout-options.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:50:26 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:53:06 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:23:22 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-category-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:20:43 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-select-category.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 14:14:10 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-blog-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:48:33 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:46:12 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:36:50 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:07:56 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-show-date.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-show-date.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:59:59 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-show-date.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:38:22 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:03:31 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-filter-field-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 08:27:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-filter-field.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 08:23:52 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-display-select.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:15:38 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-menu-item-categories.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:06:01 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Image_20.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:04:39 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-categories-categories-options.png|&lt;br /&gt;
File:Help25-article-categories-category-options.png|&lt;br /&gt;
File:Help25-article-categories-front-end.png|&lt;br /&gt;
File:Help25-article-categories-list-layout-options.png|&lt;br /&gt;
File:Help25-article-categories-required-settings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:04:10 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-categories-article-options.png|&lt;br /&gt;
File:Help25-article-categories-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jan 18 17:25:47 PST 2011 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help16-Content_Article_Manager-Options-screen7.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Content_Article_Manager-Conguration-screen1.png|&lt;br /&gt;
File:Help16-Content_Article_Manager-Options-screen7.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jan 18 17:07:17 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen1.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen2.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen3.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen4.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen5.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen6.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen7.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen8.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jan 16 16:07:40 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Users_User_Manager-Other-Filter-screen.png|&lt;br /&gt;
Image:Help16-Users_User_Manager-Search-Filter-screen.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 17:14:16 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 17:02:08 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-10.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-11.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-12.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-13.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-14.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:52:26 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-11a.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-12a.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:51:20 PST 2011 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screenshot_acl_tutorial_20110111-11.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
*[[:File:Screenshot_acl_tutorial_20110111-12.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screenshot_acl_tutorial_20110111-11.png|&lt;br /&gt;
File:Screenshot_acl_tutorial_20110111-12.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:42:54 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-07.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-08.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 10:11:47 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-01.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-02.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-03.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-04.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-05.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-06.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 08:27:33 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-01.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-02.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-03.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-04.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-05.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-06.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-07.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-08.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-09.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-10.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-11.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-12.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-13.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-14.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-15.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-16.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-17.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-18.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-19.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-20.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-21.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jan 07 15:49:21 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-01.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-02.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-03.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-04.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-05.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-06.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-07.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 14:07:54 PDT 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-16.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 13:48:49 PDT 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-14.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 10:23:57 PDT 2010 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100406-02.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100406-02.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-10.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-11.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-12.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-13.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Apr 06 19:40:09 PDT 2010 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100405-01.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100406-01.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100405-01.png|&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100406-01.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01a.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01b.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01c.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-02.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-03.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-04.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-05.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-06.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-07.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-08.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-09.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-09a.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Jan 04 19:46:24 PST 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Svn_merge_20100104_01.png|&lt;br /&gt;
Image:Svn_merge_20100104_02.png|&lt;br /&gt;
Image:Svn_merge_20100104_03.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:58:01 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_new_group_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:54:35 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_access_level_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:41:06 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_article_mgr_permissions1_20091019.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_article_mgr_permissions1_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:33:12 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_article_mgr_permissions1_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:34:00 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_menu_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:27:55 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_global_config_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:25:16 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_global_config_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 16:52:03 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_article_permissions1_20091018.png|&lt;br /&gt;
Image:Screen_article_permissions2_20091018.png|&lt;br /&gt;
Image:Screen_category_permissions1_20091018.png|&lt;br /&gt;
Image:Screen_category_permissions2_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 08:28:37 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Acl_example_diagram1_20091018.png|&lt;br /&gt;
Image:Acl_example_diagram2_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:29:17 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:28:37 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:26:05 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 15:53:47 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Acl_example_diagram2_20091017.png|&lt;br /&gt;
Image:Acl_example_diagram3_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 01:02:35 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_menu_access_level_20091016.png|&lt;br /&gt;
Image:Screen_user_access_level_20091016.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Oct 16 16:17:18 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_groups_20091016.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 14:45:55 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:22:29 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:19:13 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:17:45 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:13:50 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:10:38 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_content_options_permissions_20091015.png|&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 14 20:01:15 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_content_global_config_20091014.png|&lt;br /&gt;
Image:Screen_content_options_permissions_20091014.png|&lt;br /&gt;
Image:Tutorial_acl_diagram_20091014.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Aug 25 18:01:44 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Selenium_ide_screenshot1_20090821.png|&lt;br /&gt;
Image:Selenium_ide_screenshot2_20090821.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Aug 24 16:03:20 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Commonist-128.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-publishing-options-tab-en.png&amp;diff=104507</id>
		<title>File:Help30-Components-Weblinks-Links-Edit-publishing-options-tab-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-publishing-options-tab-en.png&amp;diff=104507"/>
		<updated>2013-10-14T00:40:06Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:File:Help30-Components-Weblinks-Links-Edit-basic-options-tab.png|&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;]]&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== batch ==&lt;br /&gt;
help screenshots for version 3.2&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== source ==&lt;br /&gt;
screenshot&lt;br /&gt;
&lt;br /&gt;
== date ==&lt;br /&gt;
10/13/2012&lt;br /&gt;
&lt;br /&gt;
== author ==&lt;br /&gt;
Mark Dexter&lt;br /&gt;
&lt;br /&gt;
== permission ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== license ==&lt;br /&gt;
&lt;br /&gt;
{{self2|GFDL|cc-by-sa-2.5,2.0,1.0}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-basic-options-tab-en.png&amp;diff=104506</id>
		<title>File:Help30-Components-Weblinks-Links-Edit-basic-options-tab-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-basic-options-tab-en.png&amp;diff=104506"/>
		<updated>2013-10-14T00:40:05Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab.png|&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;]]&lt;br /&gt;
[[:File:Help30-Components-Weblinks-Links-Edit-publishing-options-tab.png|&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== batch ==&lt;br /&gt;
help screenshots for version 3.2&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== source ==&lt;br /&gt;
screenshot&lt;br /&gt;
&lt;br /&gt;
== date ==&lt;br /&gt;
10/13/2012&lt;br /&gt;
&lt;br /&gt;
== author ==&lt;br /&gt;
Mark Dexter&lt;br /&gt;
&lt;br /&gt;
== permission ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== license ==&lt;br /&gt;
&lt;br /&gt;
{{self2|GFDL|cc-by-sa-2.5,2.0,1.0}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab-en.png&amp;diff=104505</id>
		<title>File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab-en.png&amp;diff=104505"/>
		<updated>2013-10-14T00:40:04Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&lt;br /&gt;
[[:File:Help30-Components-Weblinks-Links-Edit-basic-options-tab.png|&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== batch ==&lt;br /&gt;
help screenshots for version 3.2&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== source ==&lt;br /&gt;
screenshot&lt;br /&gt;
&lt;br /&gt;
== date ==&lt;br /&gt;
10/13/2012&lt;br /&gt;
&lt;br /&gt;
== author ==&lt;br /&gt;
Mark Dexter&lt;br /&gt;
&lt;br /&gt;
== permission ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== license ==&lt;br /&gt;
&lt;br /&gt;
{{self2|GFDL|cc-by-sa-2.5,2.0,1.0}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104504</id>
		<title>Help310:Components Weblinks Links Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104504"/>
		<updated>2013-10-14T00:34:38Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: add images tab&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==Overview==&lt;br /&gt;
This screen lets you create new Web Links and edit existing ones.&lt;br /&gt;
&lt;br /&gt;
==How to Access==&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Help30:Components_Weblinks_Links|Web Links Manager]]. To add a new Web Link, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing Web Link, click the Web Link&#039;s Title, or check the Web Link&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
This is where you add a new Web Link or edit an existing one. Note that you need to create at least one [[Help30:Components_Weblinks_Categories_Edit|Web Links Category]] before you can create your first Web Link.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
===Edit Web Link===&lt;br /&gt;
&lt;br /&gt;
This is where you enter or edit basic link information.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Title&#039;&#039;&#039;. The Title of the Web Link. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;URL&#039;&#039;&#039;. The URL of the Web Link.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|Status}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-publishing-options-tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Hits}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Options===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-basic-options-tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Target}}&lt;br /&gt;
{{Chunk30:colheader|Width}}&lt;br /&gt;
{{Chunk30:colheader|Height}}&lt;br /&gt;
*&#039;&#039;&#039;Count Clicks.&#039;&#039;&#039; Whether or not to keep track of how many times this web link has been opened.&lt;br /&gt;
&lt;br /&gt;
===Images===&lt;br /&gt;
[[File:Help30-Components-Weblinks-Links-Edit-Image-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:Image|First Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
{{Chunk30:Image|Second Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|Web Links Manager: Web Link|Web Links Manager: Web Link}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
* At least one Web Link Category must be added &#039;&#039;before&#039;&#039; any Web Links can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit Web Link Categories: [[Help30:Components_Weblinks_Categories|Web Link Category Manager]]&lt;br /&gt;
*To find and edit existing Web Links: [[Help30:Components_Weblinks_Links|Web Link Manager]]&lt;br /&gt;
*To create a page layout for Web Links: [[Help30:Menus_Menu_Item_Manager_Edit#Internal_Link_-_Web_Links|Menu Item Manager - New/Edit - Internal Link - Web Links]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|Web Link Manager Help Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104503</id>
		<title>Help310:Components Weblinks Links Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104503"/>
		<updated>2013-10-14T00:32:41Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: /* Publishing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==Overview==&lt;br /&gt;
This screen lets you create new Web Links and edit existing ones.&lt;br /&gt;
&lt;br /&gt;
==How to Access==&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Help30:Components_Weblinks_Links|Web Links Manager]]. To add a new Web Link, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing Web Link, click the Web Link&#039;s Title, or check the Web Link&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
This is where you add a new Web Link or edit an existing one. Note that you need to create at least one [[Help30:Components_Weblinks_Categories_Edit|Web Links Category]] before you can create your first Web Link.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
===Edit Web Link===&lt;br /&gt;
&lt;br /&gt;
This is where you enter or edit basic link information.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Title&#039;&#039;&#039;. The Title of the Web Link. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;URL&#039;&#039;&#039;. The URL of the Web Link.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|Status}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-publishing-options-tag.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Hits}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Options===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-basic-options-parmeters.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Target}}&lt;br /&gt;
{{Chunk30:colheader|Width}}&lt;br /&gt;
{{Chunk30:colheader|Height}}&lt;br /&gt;
*&#039;&#039;&#039;Count Clicks.&#039;&#039;&#039; Whether or not to keep track of how many times this web link has been opened.&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|Web Links Manager: Web Link|Web Links Manager: Web Link}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
* At least one Web Link Category must be added &#039;&#039;before&#039;&#039; any Web Links can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit Web Link Categories: [[Help30:Components_Weblinks_Categories|Web Link Category Manager]]&lt;br /&gt;
*To find and edit existing Web Links: [[Help30:Components_Weblinks_Links|Web Link Manager]]&lt;br /&gt;
*To create a page layout for Web Links: [[Help30:Menus_Menu_Item_Manager_Edit#Internal_Link_-_Web_Links|Menu Item Manager - New/Edit - Internal Link - Web Links]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|Web Link Manager Help Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104502</id>
		<title>Help310:Components Weblinks Links Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Weblinks_Links_Edit&amp;diff=104502"/>
		<updated>2013-10-14T00:31:35Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: update for 3.2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==Overview==&lt;br /&gt;
This screen lets you create new Web Links and edit existing ones.&lt;br /&gt;
&lt;br /&gt;
==How to Access==&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Help30:Components_Weblinks_Links|Web Links Manager]]. To add a new Web Link, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing Web Link, click the Web Link&#039;s Title, or check the Web Link&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
This is where you add a new Web Link or edit an existing one. Note that you need to create at least one [[Help30:Components_Weblinks_Categories_Edit|Web Links Category]] before you can create your first Web Link.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
===Edit Web Link===&lt;br /&gt;
&lt;br /&gt;
This is where you enter or edit basic link information.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Title&#039;&#039;&#039;. The Title of the Web Link. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;URL&#039;&#039;&#039;. The URL of the Web Link.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|Status}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-publishing-options-parmeters.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Hits}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Options===&lt;br /&gt;
[[Image:Help30-Components-Weblinks-Links-Edit-basic-options-parmeters.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Target}}&lt;br /&gt;
{{Chunk30:colheader|Width}}&lt;br /&gt;
{{Chunk30:colheader|Height}}&lt;br /&gt;
*&#039;&#039;&#039;Count Clicks.&#039;&#039;&#039; Whether or not to keep track of how many times this web link has been opened.&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|Web Links Manager: Web Link|Web Links Manager: Web Link}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
* At least one Web Link Category must be added &#039;&#039;before&#039;&#039; any Web Links can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit Web Link Categories: [[Help30:Components_Weblinks_Categories|Web Link Category Manager]]&lt;br /&gt;
*To find and edit existing Web Links: [[Help30:Components_Weblinks_Links|Web Link Manager]]&lt;br /&gt;
*To create a page layout for Web Links: [[Help30:Menus_Menu_Item_Manager_Edit#Internal_Link_-_Web_Links|Menu Item Manager - New/Edit - Internal Link - Web Links]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|Web Link Manager Help Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-screen-en.png&amp;diff=104501</id>
		<title>File:Help30-Components-Weblinks-Links-Edit-screen-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Weblinks-Links-Edit-screen-en.png&amp;diff=104501"/>
		<updated>2013-10-14T00:20:08Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Dextercowley uploaded a new version of &amp;amp;quot;File:Help30-Components-Weblinks-Links-Edit-screen.png&amp;amp;quot;: Updated for 3.2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Screenshot&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{JEDL}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104500</id>
		<title>Help310:Components Newsfeeds Feeds Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104500"/>
		<updated>2013-10-14T00:17:55Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==How to Access==&lt;br /&gt;
Navigate to the the [[Help30:Components_Newsfeeds_Feeds|News Feed Manager]]. To add a new News Feed, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing News Feed, click the News Feed&#039;s name, or check the news Feed&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This is where you add a new News Feed or edit an existing one. Note that you need to create at least one [[Help30:Components_Newsfeeds_Categories|News Feed Category]] before you can create your first News Feed.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
[[Image:Help30-Components-Newsfeeds-Feeds-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
==Details and Options==&lt;br /&gt;
===Edit News Feed===&lt;br /&gt;
*&#039;&#039;&#039;Title.&#039;&#039;&#039; The Name of the News Feed. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;Link.&#039;&#039;&#039; The link of this News Feed. This should normally begin with &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|State}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Publishing-Options-Tab.png|670px]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Display===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Number of Articles.&#039;&#039;&#039; The number of articles from the news feed to display on the page.&lt;br /&gt;
*&#039;&#039;&#039;Cache Time.&#039;&#039;&#039; The number of minutes before the system checks for new content from the news feed source.&lt;br /&gt;
*&#039;&#039;&#039;Language Direction.&#039;&#039;&#039; Whether the language for this feed reads from left to right or right to left.&lt;br /&gt;
&lt;br /&gt;
===Images===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:Image|First Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
{{Chunk30:Image|Second Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|News Feed Manager: News Feed|News Feed Manager: News Feed}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
*A News Feed category must be added &#039;&#039;before&#039;&#039; any News Feed can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit News Feed Categories: [[Help30:Components_Newsfeeds_Categories|News Feed Category Manager]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|News Feed Manager Helps Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104499</id>
		<title>Help310:Components Newsfeeds Feeds Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104499"/>
		<updated>2013-10-14T00:17:24Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: update for 3.2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==How to Access==&lt;br /&gt;
Navigate to the the [[Help30:Components_Newsfeeds_Feeds|News Feed Manager]]. To add a new News Feed, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing News Feed, click the News Feed&#039;s name, or check the news Feed&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This is where you add a new News Feed or edit an existing one. Note that you need to create at least one [[Help30:Components_Newsfeeds_Categories|News Feed Category]] before you can create your first News Feed.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
[[Image:Help30-Components-Newsfeeds-Feeds-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
==Details and Options==&lt;br /&gt;
===Edit News Feed===&lt;br /&gt;
*&#039;&#039;&#039;Title.&#039;&#039;&#039; The Name of the News Feed. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;Link.&#039;&#039;&#039; The link of this News Feed. This should normally begin with &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|State}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
===Publishing===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Publishing-Options-Tab.png|670px]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:colheader|Start Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Finish Publishing}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created Date}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By}}&lt;br /&gt;
{{Chunk30:colheader|Enter Created By Alias}}&lt;br /&gt;
{{Chunk30:colheader|Modified Date}}&lt;br /&gt;
{{Chunk30:colheader|Modified By}}&lt;br /&gt;
{{Chunk30:colheader|Revisions}}&lt;br /&gt;
{{Chunk30:colheader|Id}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Description}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Keywords}}&lt;br /&gt;
{{Chunk30:colheader|External Reference}}&lt;br /&gt;
{{Chunk30:colheader|Metadata Robots}}&lt;br /&gt;
{{Chunk30:colheader|Content Help Screens Rights}}&lt;br /&gt;
&lt;br /&gt;
===Display===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Number of Articles.&#039;&#039;&#039; The number of articles from the news feed to display on the page.&lt;br /&gt;
*&#039;&#039;&#039;Cache Time.&#039;&#039;&#039; The number of minutes before the system checks for new content from the news feed source.&lt;br /&gt;
*&#039;&#039;&#039;Language Direction.&#039;&#039;&#039; Whether the language for this feed reads from left to right or right to left.&lt;br /&gt;
&lt;br /&gt;
===Images===&lt;br /&gt;
[[File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab.png]]&lt;br /&gt;
&lt;br /&gt;
{{Chunk30:Image|First Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
{{Chunk30:Image|Second Image}}&lt;br /&gt;
{{Chunk30:colheader|Image Float}}&lt;br /&gt;
{{Chunk30:colheader|Alt text}}&lt;br /&gt;
{{Chunk30:colheader|Caption}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
{{Chunk30:EditAndNewToolbars|News Feed Manager: News Feed|News Feed Manager: News Feed}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
*A News Feed category must be added &#039;&#039;before&#039;&#039; any News Feed can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit News Feed Categories: [[Help30:Components_Newsfeeds_Categories|News Feed Category Manager]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|News Feed Manager Helps Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Image&amp;diff=104498</id>
		<title>Chunk30:Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Image&amp;diff=104498"/>
		<updated>2013-10-14T00:16:24Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;{{{1|Image}}}.&#039;&#039;&#039; Click on Select to select an image to display with this item in the front end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Image&amp;diff=104496</id>
		<title>Chunk30:Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Image&amp;diff=104496"/>
		<updated>2013-10-14T00:16:01Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Image with variable caption.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;{{{1|Image}}}.&#039;&#039;&#039; Click on Select to select an image to display with this item in the front end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104495</id>
		<title>Chunk30:Help screen column header Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104495"/>
		<updated>2013-10-14T00:14:05Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: back to original&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;{{{Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104494</id>
		<title>Chunk30:Help screen column header Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104494"/>
		<updated>2013-10-14T00:12:23Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;{{{1|Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;br /&gt;
*&#039;&#039;&#039;{{{2|Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;br /&gt;
*&#039;&#039;&#039;{{{3|Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104493</id>
		<title>Chunk30:Help screen column header Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104493"/>
		<updated>2013-10-14T00:08:55Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;{{{2|Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104492</id>
		<title>Chunk30:Help screen column header Image</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image&amp;diff=104492"/>
		<updated>2013-10-14T00:07:03Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Make description a variable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;{{{1|Image}}}&#039;&#039;&#039;. Choose an image to be displayed with this item/category in the front-end.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Caption&amp;diff=104491</id>
		<title>Chunk30:Help screen column header Caption</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Caption&amp;diff=104491"/>
		<updated>2013-10-14T00:01:11Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: caption&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;Caption.&#039;&#039;&#039; The caption for the image.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Alt_text&amp;diff=104490</id>
		<title>Chunk30:Help screen column header Alt text</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Alt_text&amp;diff=104490"/>
		<updated>2013-10-14T00:00:35Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: alt text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;Alt text.&#039;&#039;&#039; Alternative text to use for visitors who don&#039;t have access to images. This text is replaced with the caption text if caption text is available.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image_Float&amp;diff=104489</id>
		<title>Chunk30:Help screen column header Image Float</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image_Float&amp;diff=104489"/>
		<updated>2013-10-13T23:59:30Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Image float&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;Image Float.&#039;&#039;&#039; (Use Global/Right/Left/None). Where to place the image relative to the text on the page.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Alt_text&amp;diff=104488</id>
		<title>Chunk30:Help screen column header Alt text</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Alt_text&amp;diff=104488"/>
		<updated>2013-10-13T23:58:26Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: Image float chunk.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;Image Float.&#039;&#039;&#039; (Use Global/Right/Left/None). Where to place the image relative to the text on the page.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=User:Dextercowley/gallery&amp;diff=104487</id>
		<title>User:Dextercowley/gallery</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=User:Dextercowley/gallery&amp;diff=104487"/>
		<updated>2013-10-13T23:44:14Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: commonist 0.4.28&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sun Oct 13 16:43:56 PDT 2013 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab.png|&lt;br /&gt;
File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 14 07:12:09 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Easygithub1.png|&lt;br /&gt;
File:Easygithub2.png|&lt;br /&gt;
File:Easygithub4.png|&lt;br /&gt;
File:Easygithub5.png|&lt;br /&gt;
File:Easygithub6.png|&lt;br /&gt;
File:Easygithub7.png|&lt;br /&gt;
File:Easygithub8.png|&lt;br /&gt;
File:Easygithub9.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:34:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-23.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:29:26 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-22.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 17:18:47 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-18.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-19.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-20.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-21.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 16:54:09 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-17.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 16:02:02 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-16.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 15:20:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-11.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-12.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-13.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-14.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:40:41 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-10.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:37:54 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:32:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 10 11:05:13 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-07.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-08.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 09 17:56:50 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-06.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 09 17:39:00 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-coders-tutorial-20121009-01.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-02.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-03.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-04.png|&lt;br /&gt;
File:Git-coders-tutorial-20121009-05.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Oct 08 21:26:49 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Media_1349743656750.png|&lt;br /&gt;
File:Media_1349745128572.png|&lt;br /&gt;
File:Media_1349749085366.png|&lt;br /&gt;
File:Media_1349749557492.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Jun 25 13:04:30 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-manager-options-toolbar.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 20:24:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-manager-options-articles.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-blog-featured-layouts.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-categories.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-category.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-editing-layout.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-integration.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-list-layouts.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-permissions.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options-shared-options.png|&lt;br /&gt;
File:Help25-screenshot-article-manager-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 19:52:18 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-toolbar.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 19:38:37 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-article-edit-permissions.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-permissions.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 17:33:18 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-permissions.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jun 24 07:46:27 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-article-edit-article-options.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-configure-edit-screen.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-images-links.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-metadata-options.png|&lt;br /&gt;
File:Help25-screenshot-article-edit-publishing-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:59:15 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-pagebreak-button.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:49:11 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-image-button.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 19:38:25 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-codemirror-example.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:16:42 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-editor-tinymce-advanced.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-advanced.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:12:23 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-advanced.png|&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-extended.png|&lt;br /&gt;
File:Help25-screenshot-editor-tinymce-simple.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:04:16 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-screenshot-editor-buttons.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-buttons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Jun 23 16:02:36 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-screenshot-editor-buttons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jun 12 18:29:34 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-21.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-22.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-22a.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-23.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-24.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jun 12 17:57:24 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-01.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-02.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-03.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-04.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-05.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-06.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-07.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-08.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-09.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-10.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-11.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-12.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-13.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-14.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-15.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-16.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-17.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-18.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-19.png|&lt;br /&gt;
File:Tortoisegit-tutorial-screenshot-20120612-20.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jun 01 16:20:16 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-document-screenshot-20120530-01.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-02.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-03.png|&lt;br /&gt;
File:Git-document-screenshot-20120530-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jun 01 16:14:48 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-01.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-01.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-02.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-02.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-03.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-03.png]]&lt;br /&gt;
*[[:File:Git-document-screenshot-20120529-04.png]] aborted: exists: [[:File:Git-document-screenshot-20120529-04.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-document-screenshot-20120529-01.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-02.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-03.png|&lt;br /&gt;
File:Git-document-screenshot-20120529-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed May 09 11:44:58 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Eclipse-install-372-screenshot-01.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-02.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-03.png|&lt;br /&gt;
File:Eclipse-install-372-screenshot-04.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed May 09 11:24:44 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Git-eclipse-screenshot-01.png|&lt;br /&gt;
File:Git-eclipse-screenshot-02.png|&lt;br /&gt;
File:Git-eclipse-screenshot-03.png|&lt;br /&gt;
File:Git-eclipse-screenshot-03a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-04.png|&lt;br /&gt;
File:Git-eclipse-screenshot-04a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-05.png|&lt;br /&gt;
File:Git-eclipse-screenshot-06.png|&lt;br /&gt;
File:Git-eclipse-screenshot-07.png|&lt;br /&gt;
File:Git-eclipse-screenshot-07a.png|&lt;br /&gt;
File:Git-eclipse-screenshot-08.png|&lt;br /&gt;
File:Git-eclipse-screenshot-09.png|&lt;br /&gt;
File:Git-eclipse-screenshot-10.png|&lt;br /&gt;
File:Git-eclipse-screenshot-11.png|&lt;br /&gt;
File:Git-eclipse-screenshot-12.png|&lt;br /&gt;
File:Git-eclipse-screenshot-13.png|&lt;br /&gt;
File:Git-eclipse-screenshot-14.png|&lt;br /&gt;
File:Git-eclipse-screenshot-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 17:05:54 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-batch-process.png|&lt;br /&gt;
File:Help25-chunk-colheader-pagination.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 15:32:45 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-select-access.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-author.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-category.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-language.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-max-levels.png|&lt;br /&gt;
File:Help25-chunk-colheader-select-status.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 15:04:00 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-filter-field.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 10:23:23 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-order-ascending.png|&lt;br /&gt;
File:Help25-chunk-colheader-order-descending.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 18 10:06:58 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-colheader-order-icons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Apr 17 20:44:13 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-state-icons.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 20:55:35 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-create-article-basic-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 19:21:35 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-create-article-front-end-editor.png|&lt;br /&gt;
File:Help25-article-create-article-front-end-language-metadata.png|&lt;br /&gt;
File:Help25-article-create-article-front-end-publishing.png|&lt;br /&gt;
File:Help25-article-create-article-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:59:08 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:58:13 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-blog-layout-options.png]] aborted: exists: [[:File:Help25-chunk-article-category-blog-layout-options.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 17:50:26 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:53:06 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:23:22 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-category-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 16:20:43 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-select-category.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 14:14:10 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-blog-screenshot.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:48:33 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:46:12 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:36:50 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-table-headings.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 10:07:56 PDT 2012 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help25-chunk-article-category-list-show-date.png]] missingparam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-show-date.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:59:59 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-show-date.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:38:22 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-article-category-list-table-headings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 09:03:31 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-filter-field-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 08:27:55 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-filter-field.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Apr 16 08:23:52 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-category-list-display-select.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:15:38 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-chunk-menu-item-categories.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:06:01 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Image_20.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:04:39 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-categories-categories-options.png|&lt;br /&gt;
File:Help25-article-categories-category-options.png|&lt;br /&gt;
File:Help25-article-categories-front-end.png|&lt;br /&gt;
File:Help25-article-categories-list-layout-options.png|&lt;br /&gt;
File:Help25-article-categories-required-settings.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Apr 15 14:04:10 PDT 2012 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Help25-article-categories-article-options.png|&lt;br /&gt;
File:Help25-article-categories-blog-layout-options.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jan 18 17:25:47 PST 2011 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Help16-Content_Article_Manager-Options-screen7.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Content_Article_Manager-Conguration-screen1.png|&lt;br /&gt;
File:Help16-Content_Article_Manager-Options-screen7.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Jan 18 17:07:17 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen1.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen2.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen3.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen4.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen5.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen6.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen7.png|&lt;br /&gt;
Image:Help16-Content_Article_Manager-Options-screen8.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Jan 16 16:07:40 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Help16-Users_User_Manager-Other-Filter-screen.png|&lt;br /&gt;
Image:Help16-Users_User_Manager-Search-Filter-screen.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 17:14:16 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 17:02:08 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-10.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-11.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-12.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-13.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-14.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:52:26 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-11a.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-12a.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:51:20 PST 2011 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screenshot_acl_tutorial_20110111-11.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
*[[:File:Screenshot_acl_tutorial_20110111-12.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screenshot_acl_tutorial_20110111-11.png|&lt;br /&gt;
File:Screenshot_acl_tutorial_20110111-12.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 15:42:54 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-07.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-08.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-09.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 10:11:47 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-01.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-02.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-03.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-04.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-05.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110112-06.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Jan 12 08:27:33 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-01.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-02.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-03.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-04.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-05.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-06.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-07.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-08.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-09.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-10.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-11.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-12.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-13.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-14.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-15.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-16.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-17.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-18.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-19.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-20.png|&lt;br /&gt;
Image:Screenshot_acl_tutorial_20110111-21.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Jan 07 15:49:21 PST 2011 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-01.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-02.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-03.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-04.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-05.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-06.png|&lt;br /&gt;
Image:Screenshot_override_tutorial_20110107-07.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 14:07:54 PDT 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-16.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 13:48:49 PDT 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-14.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-15.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Apr 07 10:23:57 PDT 2010 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100406-02.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100406-02.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-10.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-11.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-12.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-13.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Apr 06 19:40:09 PDT 2010 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100405-01.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
*[[:File:Unit_test_tutorial_screenshot_20100406-01.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100405-01.png|&lt;br /&gt;
File:Unit_test_tutorial_screenshot_20100406-01.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01a.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01b.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-01c.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-02.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-03.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-04.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-05.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-06.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-07.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-08.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-09.png|&lt;br /&gt;
Image:Unit_test_tutorial_screenshot_20100406-09a.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Jan 04 19:46:24 PST 2010 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Svn_merge_20100104_01.png|&lt;br /&gt;
Image:Svn_merge_20100104_02.png|&lt;br /&gt;
Image:Svn_merge_20100104_03.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:58:01 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_new_group_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:54:35 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_access_level_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:41:06 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_article_mgr_permissions1_20091019.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_article_mgr_permissions1_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Oct 20 15:33:12 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_article_mgr_permissions1_20091019.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:34:00 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_menu_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:27:55 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_global_config_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 17:25:16 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_global_config_permissions_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 16:52:03 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_article_permissions1_20091018.png|&lt;br /&gt;
Image:Screen_article_permissions2_20091018.png|&lt;br /&gt;
Image:Screen_category_permissions1_20091018.png|&lt;br /&gt;
Image:Screen_category_permissions2_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sun Oct 18 08:28:37 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Acl_example_diagram1_20091018.png|&lt;br /&gt;
Image:Acl_example_diagram2_20091018.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:29:17 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:28:37 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 16:26:05 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Acl_example_diagram3a_20091017.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Acl_example_diagram3a_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 15:53:47 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Acl_example_diagram2_20091017.png|&lt;br /&gt;
Image:Acl_example_diagram3_20091017.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sat Oct 17 01:02:35 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_menu_access_level_20091016.png|&lt;br /&gt;
Image:Screen_user_access_level_20091016.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fri Oct 16 16:17:18 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_groups_20091016.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 14:45:55 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:22:29 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:19:13 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:17:45 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:13:50 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thu Oct 15 11:10:38 PDT 2009 ==&lt;br /&gt;
=== errors ===&lt;br /&gt;
*[[:File:Screen_user_config_permissions_20091015.png]] UnexpectedAnswerException unexpected response data (UiSimpleActionBase) status	HTTP/1.1 200 OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_content_options_permissions_20091015.png|&lt;br /&gt;
File:Screen_user_config_permissions_20091015.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wed Oct 14 20:01:15 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Screen_content_global_config_20091014.png|&lt;br /&gt;
Image:Screen_content_options_permissions_20091014.png|&lt;br /&gt;
Image:Tutorial_acl_diagram_20091014.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tue Aug 25 18:01:44 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Selenium_ide_screenshot1_20090821.png|&lt;br /&gt;
Image:Selenium_ide_screenshot2_20090821.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mon Aug 24 16:03:20 PDT 2009 ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Commonist-128.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab-en.png&amp;diff=104486</id>
		<title>File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab-en.png&amp;diff=104486"/>
		<updated>2013-10-13T23:44:12Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab.png|&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;]]&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== batch ==&lt;br /&gt;
screenshots for git tutorial&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== source ==&lt;br /&gt;
screenshot&lt;br /&gt;
&lt;br /&gt;
== date ==&lt;br /&gt;
4/14/2012&lt;br /&gt;
&lt;br /&gt;
== author ==&lt;br /&gt;
Mark Dexter&lt;br /&gt;
&lt;br /&gt;
== permission ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== license ==&lt;br /&gt;
&lt;br /&gt;
{{self2|GFDL|cc-by-sa-2.5,2.0,1.0}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab-en.png&amp;diff=104485</id>
		<title>File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab-en.png</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=File:Help30-Components-Newsfeeds-Feed-Edit-Display-Options-Tab-en.png&amp;diff=104485"/>
		<updated>2013-10-13T23:44:11Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&lt;br /&gt;
[[:File:Help30-Components-Newsfeeds-Feed-Edit-Image-Options-Tab.png|&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== batch ==&lt;br /&gt;
screenshots for git tutorial&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== source ==&lt;br /&gt;
screenshot&lt;br /&gt;
&lt;br /&gt;
== date ==&lt;br /&gt;
4/14/2012&lt;br /&gt;
&lt;br /&gt;
== author ==&lt;br /&gt;
Mark Dexter&lt;br /&gt;
&lt;br /&gt;
== permission ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== license ==&lt;br /&gt;
&lt;br /&gt;
{{self2|GFDL|cc-by-sa-2.5,2.0,1.0}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_State&amp;diff=104483</id>
		<title>Chunk30:Help screen column header State</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_State&amp;diff=104483"/>
		<updated>2013-10-13T23:34:45Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: change from State to Status to conform with edit screens&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*&#039;&#039;&#039;Status&#039;&#039;&#039;: Published status of the item. Possible values are:&lt;br /&gt;
**&#039;&#039;Published&#039;&#039;: The item is published. This is the only state that will allow regular website users to view this item.&lt;br /&gt;
**&#039;&#039;Unpublished&#039;&#039;: The item is unpublished.&lt;br /&gt;
**&#039;&#039;Archived&#039;&#039;: The item has been archived. {{#ifeq: {{{IncludeReported}}} | yes | **&#039;&#039;Reported&#039;&#039;: The item has been reported as invalid by a visitor. }}&lt;br /&gt;
**&#039;&#039;Trashed&#039;&#039;: The item has been sent to the Trash.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104482</id>
		<title>Help310:Components Newsfeeds Feeds Edit</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Help310:Components_Newsfeeds_Feeds_Edit&amp;diff=104482"/>
		<updated>2013-10-13T22:52:31Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: details section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Help screen navbox|3.0|Components Help Screens}}&amp;lt;/noinclude&amp;gt;==How to Access==&lt;br /&gt;
Navigate to the the [[Help30:Components_Newsfeeds_Feeds|News Feed Manager]]. To add a new News Feed, click the &amp;quot;New&amp;quot; icon in the toolbar. To edit an existing News Feed, click the News Feed&#039;s name, or check the news Feed&#039;s checkbox and press the &amp;quot;Edit&amp;quot; icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This is where you add a new News Feed or edit an existing one. Note that you need to create at least one [[Help30:Components_Newsfeeds_Categories|News Feed Category]] before you can create your first News Feed.&lt;br /&gt;
&lt;br /&gt;
==Screenshot==&lt;br /&gt;
[[Image:Help30-Components-Newsfeeds-Feeds-Edit-screen.png|670px]]&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Title.&#039;&#039;&#039; The Name of the News Feed. This field is required.&lt;br /&gt;
{{Chunk30:colheader|Alias}}&lt;br /&gt;
*&#039;&#039;&#039;Link.&#039;&#039;&#039; The link of this News Feed. This should normally begin with &amp;lt;nowiki&amp;gt;&amp;quot;http://&amp;quot;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
{{Chunk30:colheader|Description}}&lt;br /&gt;
{{Chunk30:Add Category Quick Edit Buttons}}&lt;br /&gt;
{{Chunk30:colheader|Category}}&lt;br /&gt;
{{Chunk30:colheader|Tags}}&lt;br /&gt;
{{Chunk30:colheader|State}}&lt;br /&gt;
{{Chunk30:colheader|Access}}&lt;br /&gt;
{{Chunk30:colheader|Language}}&lt;br /&gt;
{{Chunk30:colheader|Version Note}}&lt;br /&gt;
&lt;br /&gt;
{{Help30:Publishing-Options}}&lt;br /&gt;
&lt;br /&gt;
{{Help30:Display-Options}}&lt;br /&gt;
&lt;br /&gt;
{{Help30:Metadata}}&lt;br /&gt;
&lt;br /&gt;
==Toolbar==&lt;br /&gt;
At the top left you will see the toolbar:&lt;br /&gt;
&lt;br /&gt;
[[Image:Help30-Save-SaveClose-SaveNew-Cancel-Help-toolbar.png]]&lt;br /&gt;
&lt;br /&gt;
The functions are:&lt;br /&gt;
{{Chunk30:Help_screen_toolbar_icon_Save|news feed}}&lt;br /&gt;
{{Chunk30:Help_screen_toolbar_icon_SaveAndClose|news feed}}&lt;br /&gt;
{{Chunk30:Help_screen_toolbar_icon_SaveAndNew|news feed}}&lt;br /&gt;
{{Chunk30:Help_screen_toolbar_icon_Cancel}}&lt;br /&gt;
{{Chunk30:Help_screen_toolbar_icon_Help}}&lt;br /&gt;
&lt;br /&gt;
==Quick Tips==&lt;br /&gt;
*A News Feed category must be added &#039;&#039;before&#039;&#039; any News Feed can be created.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
*To add or edit News Feed Categories: [[Help30:Components_Newsfeeds_Categories|News Feed Category Manager]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{cathelp|3.0,3.1|News Feed Manager Helps Screens|Components Help Screens}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Add_Category_Quick_Edit_Buttons&amp;diff=104481</id>
		<title>Chunk30:Add Category Quick Edit Buttons</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Add_Category_Quick_Edit_Buttons&amp;diff=104481"/>
		<updated>2013-10-13T22:47:37Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:[[File:Help30-Add-Category-Article-Image-ToggleEditor-buttons.png]]&lt;br /&gt;
{{Chunk30:colheader|Article Button}}&lt;br /&gt;
{{Chunk30:colheader|Image Button}}&lt;br /&gt;
{{Chunk30:colheader|ToggleEditor Button}}&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_ToggleEditor_Button&amp;diff=104480</id>
		<title>Chunk30:Help screen column header ToggleEditor Button</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_ToggleEditor_Button&amp;diff=104480"/>
		<updated>2013-10-13T22:47:22Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:* &#039;&#039;&#039;Toggle Editor&#039;&#039;&#039;. Turns on or off the the editor&#039;s description box &#039;&#039;&#039;WYSIWYG&#039;&#039;&#039; features to show HTML markup.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk4x:Help_screen_column_header_Image_Button&amp;diff=510181</id>
		<title>Chunk4x:Help screen column header Image Button</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk4x:Help_screen_column_header_Image_Button&amp;diff=510181"/>
		<updated>2013-10-13T22:47:09Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:* &#039;&#039;&#039;Image&#039;&#039;&#039;. Click to quickly add an &#039;Image&#039; to the description with a popup window.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image_Button&amp;diff=104479</id>
		<title>Chunk30:Help screen column header Image Button</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk30:Help_screen_column_header_Image_Button&amp;diff=104479"/>
		<updated>2013-10-13T22:47:09Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:* &#039;&#039;&#039;Image&#039;&#039;&#039;. Click to quickly add an &#039;Image&#039; to the description with a popup window.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Chunk4x:Help_screen_column_header_Article_Button&amp;diff=509503</id>
		<title>Chunk4x:Help screen column header Article Button</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Chunk4x:Help_screen_column_header_Article_Button&amp;diff=509503"/>
		<updated>2013-10-13T22:46:43Z</updated>

		<summary type="html">&lt;p&gt;Dextercowley: indent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:* &#039;&#039;&#039;Article&#039;&#039;&#039;. Click to quickly add an &#039;Article&#039; link to the description with a popup window.&lt;/div&gt;</summary>
		<author><name>Dextercowley</name></author>
	</entry>
</feed>