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

	<entry>
		<id>http://docs.joomla.org/Unified_Content_Model</id>
		<title>Unified Content Model</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Unified_Content_Model"/>
				<updated>2013-05-20T11:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;The Joomla! CMS is a Content Management System. The Unified Content Model is a concept that involves the organization of content and content related features in the CMS. Jooml...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Joomla! CMS is a Content Management System. The Unified Content Model is a concept that involves the organization of content and content related features in the CMS. Joomla 1.x, 1.5 and 3.0 do not used a unified content model.  That is, each kind of content (articles, weblinks, contacts, newsfeeds, and others) is considered completely separate from the others. However, a closer look a the database structures and and code for each type of content reveals that there are many commonalities. The UCM concept seeks to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
==Why UCM==&lt;br /&gt;
&lt;br /&gt;
==Possible Strategies==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Unified_Content_Model_Working_Group</id>
		<title>Unified Content Model Working Group</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Unified_Content_Model_Working_Group"/>
				<updated>2013-05-20T05:04:55Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Unified Content Model Working Group is a Production Working Group.                  UCM is powerful new tool that is proposed for inclusion in the Platform. What use will the CMS make of it, what are the backward compatibility issues involved, what new coding would be needed to use it in the CMS, and what are the implications for third party extensions are all open questions. &lt;br /&gt;
&lt;br /&gt;
==Coordinators &amp;amp; PLT Contact==&lt;br /&gt;
&lt;br /&gt;
Elin Waring&lt;br /&gt;
==Announcements==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==External resources==&lt;br /&gt;
&lt;br /&gt;
Background Materials&lt;br /&gt;
&lt;br /&gt;
The original code from eBay&lt;br /&gt;
&lt;br /&gt;
The first extended discussion on the platform mailing list.&lt;br /&gt;
&lt;br /&gt;
Rob Schley talk at Joomla Day New York&lt;br /&gt;
&lt;br /&gt;
Elin Waring slides for PWG lightning talks at Joomla and Beyond 2012&lt;br /&gt;
&lt;br /&gt;
Video of PWG Meeting at JAB 2012&lt;br /&gt;
&lt;br /&gt;
Video of session on UCM at Joomla World Conference&lt;br /&gt;
&lt;br /&gt;
Slides from Elin's session on UCM at JWC&lt;br /&gt;
&lt;br /&gt;
Sam's example of a web services application&lt;br /&gt;
&lt;br /&gt;
Stefan's GSOC application using UCM&lt;br /&gt;
&lt;br /&gt;
==Deliverables==&lt;br /&gt;
&lt;br /&gt;
Long term, a new Joomla application for the management of content.&lt;br /&gt;
&lt;br /&gt;
==Technical Work produced by this group==&lt;br /&gt;
&lt;br /&gt;
==Communications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
This effort can be thought of as two coordinated efforts:&lt;br /&gt;
* Work on the CMS 3 series to implement UCM for the core and extensions that wish to opt into it.&lt;br /&gt;
* Work on a the CMS 4 series that would be built around this model as well as other architectural changes.&lt;br /&gt;
&lt;br /&gt;
Steps&lt;br /&gt;
*Initial infrastructure for use of a single core table: 3.1.&lt;br /&gt;
*Migration to a the single core content table for all or most core components for 3.2&lt;br /&gt;
&lt;br /&gt;
==Meetings==&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation Working Group]]&lt;br /&gt;
[[Category:Working Groups]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-05-18T16:55:36Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Add or modify a delete() method */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$result = parent::delete($pk);&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;deleteTagData($this, $pk);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
Note: It is our intent to make the storage field a property so that alternative fields can be used.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen '''MUST''' be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.&lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And modify your batch method by adding&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That’s it, now create some tags, tag some items and you are set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Content Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Fatal-error-in-registration</id>
		<title>Fatal-error-in-registration</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Fatal-error-in-registration"/>
				<updated>2013-05-14T09:48:06Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When registration is done with administrator activation, one may get a &lt;br /&gt;
&lt;br /&gt;
Fatal error: Call to a member function where() on a non-object in ROOT/components/com_users/models/registration.php on line 109 &lt;br /&gt;
&lt;br /&gt;
To solve this, change line 108 of ROOT/components/com_users/models/registration.php&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;from($db-&amp;gt;quoteName('#__users')&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;from($db-&amp;gt;quoteName('#__users'))&lt;br /&gt;
&lt;br /&gt;
(There should be an additional ) at the end of the line.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-05-04T00:23:31Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Batch processing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
Note: It is our intent to make the storage field a property so that alternative fields can be used.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And modify your batch method by adding&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That’s it, now create some tags, tag some items and you are set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-05-04T00:22:07Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Add tags to the getItem() method of the model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
Note: It is our intent to make the storage field a property so that alternative fields can be used.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And modify your batch method by adding&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That’s it, now create some tags, tag some items and you are set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-05-04T00:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Modify your store() method */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And modify your batch method by adding&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That’s it, now create some tags, tag some items and you are set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-05-04T00:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Modify your store() method */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And modify your batch method by adding&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That’s it, now create some tags, tag some items and you are set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]][[Category:Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Component_Development/Reading_list</id>
		<title>Component Development/Reading list</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Component_Development/Reading_list"/>
				<updated>2013-04-29T03:13:55Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Portal:Platform|Joomla Platform Portal]] {{JVer|platform}}&lt;br /&gt;
* [[File Structure and Naming Conventions]] {{JVer/multi|1.5,2.5,3.0}}&lt;br /&gt;
* [[Component Program Flow]]. UML sequence diagrams showing the control flow for a component. {{JVer/multi|1.5,2.5,3.0}}&lt;br /&gt;
* [[Developing a Model-View-Controller Component]] {{JVer/multi|1.5,2.5,3.0}}&lt;br /&gt;
* [[Components:xml installfile]].  An example component XML installation file. {{JVer|1.5}}&lt;br /&gt;
* [[Manifest files]] for the installation of extensions {{JVer/multi|1.6,1.7,2.5,3.0}}&lt;br /&gt;
* [[Adding sortable columns to a table in a component]]&lt;br /&gt;
* [[How to add custom filters to components]] {{JVer/multi|1.7,2.5}}&lt;br /&gt;
* [[Supporting SEF URLs in your component]]&lt;br /&gt;
* [[Supporting plugins in your component]] {{JVer|1.5}}&lt;br /&gt;
* [[Using JPagination in your component]] (Incomplete) {{JVer|1.5}}&lt;br /&gt;
* [[Using the JPane classes in a component]] {{JVer|1.5}}&lt;br /&gt;
* [[Using the JHtmlTabs class in a component]] {{JVer/multi|1.6,1.7,2.5,3.0}}&lt;br /&gt;
* [[Using the editor in a component]]&lt;br /&gt;
* [[Adding AJAX to your component]]&lt;br /&gt;
* [[Ajax using MooTools]] {{JVer|1.5}}&lt;br /&gt;
* [[How to add breadcrumbs]]&lt;br /&gt;
* [[Sending email from extensions]]&lt;br /&gt;
* [[Using the JToolBar class in the frontend]]&lt;br /&gt;
* [[Creating a toolbar for your component]]&lt;br /&gt;
* [[Creating a file uploader in your component]]&lt;br /&gt;
* [[Adding Javascript moo.fx to your component]]&lt;br /&gt;
* [[Creating Mootools accordion or simple slider/toggler]]&lt;br /&gt;
* [[Adding view layout configuration parameters]]&lt;br /&gt;
* [[Using a custom image in the menu bar title]]&lt;br /&gt;
* [[How to implement XML-RPC in a component]]&lt;br /&gt;
* [[Using multiple models in an MVC component]]&lt;br /&gt;
* [[Adding ACL rules to your component]] {{JVer/multi|1.6,1.7,2.5,3.0}}&lt;br /&gt;
* [[JController and its subclass usage overview]] {{JVer/multi|1.6,1.7,2.5}}&lt;br /&gt;
* [[Managing Component Updates with Joomla!2.5 - Part 1]] {{JVer/multi|1.6,1.7,2.5}}&lt;br /&gt;
* [[Xml-rpc changes in Joomla! 1.6]] {{JVer/multi|1.6,1.7,2.5,3.0}}&lt;br /&gt;
* [[Creating PDF views]] {{JVer|2.5}}&amp;lt;noinclude&amp;gt;[[Category:Landing subpages|{{PAGENAME}}]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
* [[Using_Tags_in_an_Extension]]{{JVer|3.1}}&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T03:12:35Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Developers]][[Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T03:10:42Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Development]][[Tags]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T03:07:49Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add tags to the getItem() method of the model ==&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
== Add a tag field to edit screens ==&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
== Prepare the view ==&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the display ==&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Developer]][[Tags]][[3.1]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T03:06:23Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
* #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
* #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add tags to the getItem() method of the model ===&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
=== Add a tag field to edit screens ===&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* '''AJAX mode.'''  Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add '''mode=&amp;quot;ajax&amp;quot;''' or '''mode=&amp;quot;nested&amp;quot;''' to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
=== Prepare the view ===&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set up the display ===&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method. ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Developer]][[Tags]][[3.1]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T02:10:40Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
#  #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
#  #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note''' : Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
 note:&lt;br /&gt;
 To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
'''Rules'''  is currently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
'''Important note'''  The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
'''Router''' is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
=== Modify your constructor ===&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modify your store() method === &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add or modify a delete() method ===&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add tags to the getItem() method of the model ===&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
=== Add a tag field to edit screens ===&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* '''Nested tags mode.''' Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* &lt;br /&gt;
=== AJAX mode. ===&lt;br /&gt;
 Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add **mode=&amp;quot;ajax&amp;quot;** or **mode=&amp;quot;nested&amp;quot;** to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
### 5. Prepare the view&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### 6. Set up the display&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch processing ==&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Developer]][[Tags]][[3.1]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension</id>
		<title>J3.1:Using Tags in an Extension</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension"/>
				<updated>2013-04-29T01:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns.   Us...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joomla's tagging system is used in all core content extensions and  is designed to be be easy to integrate into other extensions that use standard Joomla design patterns. &lt;br /&gt;
&lt;br /&gt;
Using tags in an extension is relatively straightforward but it requires small changes in a number of specific places.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a content type for each view ==&lt;br /&gt;
Note: Types can be added using either sql or postflight by creating a JTableContenttype instance and adding a row.&lt;br /&gt;
&lt;br /&gt;
First identify which tables contain data that will be tagged and what the name of the single item view displaying each of these tables. For example:&lt;br /&gt;
 * #__contact_details  is the table displayed in the view contact of component com_contact with table class ContactTableContact.&lt;br /&gt;
 *  #__weblinks is the table displayed in the view weblink of com_weblinks so WeblinksTableWeblink. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE TABLE IF NOT EXISTS `#__content_types` (&lt;br /&gt;
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `type_title` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `type_alias` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `table` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
  `rules` text NOT NULL,&lt;br /&gt;
   `field_mappings` text NOT NULL,&lt;br /&gt;
 `router` varchar(255) NOT NULL DEFAULT '',&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each table/option/view you will need to make an entry in #__content_types.  You can do this either using sql or postflight by creating an instance of JTableContenttype. Don't forget a category type if you use the Joomla categories API.&lt;br /&gt;
&lt;br /&gt;
A string giving component.view (that would be in the page request, typically matching the model name) goes in the **type_alias** field.&lt;br /&gt;
&lt;br /&gt;
'''table''' gives the complete table class information for the table class stored as a JSON object in which the first element represents your &amp;quot;special&amp;quot; table and the second an optional common table (otherwise it will default the JTableCorecontent. This includes the name of the database table, the name of the primary key, the prefix, the name, an option array as used in your constructor and getInstance() methods. This enables the tagging system (and other APIs) to access your table easily. &lt;br /&gt;
&lt;br /&gt;
If you are using Joomla categories make sure to create a category type so that they can be tagged. In Joomla 3.1 and 3.1.1 there is an error where the tag field will show even if there is not a type, but this will be corrected in 3.1.2.  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''Important note'''&lt;br /&gt;
&lt;br /&gt;
Please note that the table name for the common table is #__ucm_content. This is INCORRECT in 3.1 and 3.1.1 data but is not currently used.  The data will be updated in 3.1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;special&amp;quot;:{&amp;quot;dbtable&amp;quot;:&amp;quot;#__content&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;id&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Content&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;}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The '''type_title''' field would potentially be used for display although this is not implemented currently except in the contentttype field.  Usually it should begin with an upper case letter if it is in English. See note about how to make this translatable. &lt;br /&gt;
&lt;br /&gt;
note: To make your type names translatable add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
COM_TAGS_CONTENT_TYPE_ + the type_title&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;in both the ini and sys.ini files. &lt;br /&gt;
&lt;br /&gt;
Rules  iscurrently not used. It will likely be removed in favor of an asset_id for each type, but currently you can ignore this field which will be managed by JTable. &lt;br /&gt;
&lt;br /&gt;
'''field_mappings''' maps the names of specific fields in your table to a set of standard names. This mapping is stored as a JSON array with the first element mapping to the common fields and the second one mapping the other fields from the table.&lt;br /&gt;
&lt;br /&gt;
==== Important note ====&lt;br /&gt;
&lt;br /&gt;
 The JHelperTags and JUcm APIS currently (at 3.1.1) support arrays for this field, but our intention is to change this to support either arrays or objects with a default of objects.  This is planned for implementation for 3.1.2.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'{&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;}]}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the field mapping for the Article type. Note that article uses the name attribs for the core field called params.  If your table does not contain a field, put “null” instead.  Leaving it blank may cause SQL issues. The special fields are optional.  At a minimum for common fields you need to map: content_item_id, alias and title in order to successfully create urls in the tagged items list.  You also will probably want: access, status, and language.&lt;br /&gt;
&lt;br /&gt;
**Router** is an optional name of a static helper router method for this type found in its front end helpers folder. &lt;br /&gt;
If you only store data in #__ucm_content you will eventually be able to leave the router field blank although this option is not currently implemented. If you do not have a custom router tags falls back to the rules found in JHelperRoute.&lt;br /&gt;
&lt;br /&gt;
== Modify your component's table class (or classes if you have multiple tables) ==&lt;br /&gt;
&lt;br /&gt;
This has several parts.&lt;br /&gt;
&lt;br /&gt;
=== Add a property&lt;br /&gt;
 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Indicator that the tags have been changed&lt;br /&gt;
	 *&lt;br /&gt;
	 * @var    JHelperTags&lt;br /&gt;
	 * @since  3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected $tagsHelper = null;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This property helps to manage change in tags.&lt;br /&gt;
&lt;br /&gt;
#### Modify your constructor&lt;br /&gt;
&lt;br /&gt;
Follow this example to modify your consructor which provides substantial reduction in duplicate code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper = new JHelperTags();&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;typeAlias = 'com_contact.contact';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#### Modify your store() method &lt;br /&gt;
Management of tagging and associated data is largely handled through the store() method. This provides maximum flexibility for the handling of tags across many extensions. &lt;br /&gt;
&lt;br /&gt;
 If you don't have a store() method you will need to add one.  The assumption is that tables will inherit from JTable. &lt;br /&gt;
&lt;br /&gt;
The handling involves preStoreProcess(), a call to the parent store() method, and then a postStoreProcess(). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		$this-&amp;gt;tagsHelper-&amp;gt;preStoreProcess($this);&lt;br /&gt;
		$result = parent::store($updateNulls);&lt;br /&gt;
&lt;br /&gt;
		return $result &amp;amp;&amp;amp; $this-&amp;gt;tagsHelper-&amp;gt;postStoreProcess($this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important that this be in the correct order since completion of tag processing depends on having primary key data from the parent store() method.&lt;br /&gt;
&lt;br /&gt;
 Note that much of this code is designed to prevent storage in in #__ucm_content when items are not tagged. If you want to always store in #__ucm_content you should modify the handling appropriately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Add or modify a delete() method&lt;br /&gt;
&lt;br /&gt;
The basic structure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Method to delete a row from the database table by primary key value.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $pk  Primary key to delete.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  boolean  True on success.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 * @throws  UnexpectedValueException&lt;br /&gt;
	 */&lt;br /&gt;
	public function delete($pk = null)&lt;br /&gt;
	{&lt;br /&gt;
		$return = parent::delete($pk, $children);&lt;br /&gt;
		if ($return)&lt;br /&gt;
		{&lt;br /&gt;
			$helper = new JHelperTags;&lt;br /&gt;
			$helper-&amp;gt;tagDeleteInstances($pk);&lt;br /&gt;
		}&lt;br /&gt;
		return $return;	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This manages the deletion of all related data if a content item is deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### 3.Add tags to the getItem() method of the model&lt;br /&gt;
&lt;br /&gt;
In the getItem() (or similar) method of your model add &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		// Load item tags&lt;br /&gt;
		if (!empty($item-&amp;gt;id))&lt;br /&gt;
		{&lt;br /&gt;
			$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
			$item-&amp;gt;tags-&amp;gt;getTagIds($item-&amp;gt;id, 'com_contact.contact');&lt;br /&gt;
			$item-&amp;gt;metadata['tags'] = $item-&amp;gt;tags;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
changing to your component and alias name, matching what is in the type table.and changing the name of id property to the name of your primary key.&lt;br /&gt;
&lt;br /&gt;
### 4. Add a tag field to edit screens&lt;br /&gt;
In any edit layouts where you want to allow tagging, you need to add the field to the xml and the appropriate layouts if necessary.&lt;br /&gt;
&lt;br /&gt;
Update: Note that there is new handling of this in the core.  Tags in the edit screen should be part of a metadata &amp;lt;fields&amp;gt;&amp;lt;/fields&amp;gt; group.  The core provides two JLayouts to help you manage standard layouts, one (details) for the metadata and one for the sidebar that includes the tabs. &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field loads all the Javascript libraries required. You don't need to worry about that.&lt;br /&gt;
&lt;br /&gt;
The field supports two modes:  &lt;br /&gt;
* **Nested tags mode.** Hierarchical tag list. Doesn't support on the fly tag creation.&lt;br /&gt;
* **AJAX mode.** Tags are searched while user types (3 min. chars required to launch the AJAX search). Custom tags are added by pressing ENTER or COMMA keys. Tags show the global route/path. Example: &amp;lt;code&amp;gt;grandpa/parent/tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The field mode can be forced or use the com_tags setting &amp;lt;code&amp;gt;Tag field mode&amp;lt;/code&amp;gt; to determine its mode. To set/force the field mode we have to add **mode=&amp;quot;ajax&amp;quot;** or **mode=&amp;quot;nested&amp;quot;** to the tag field definition.  &lt;br /&gt;
&lt;br /&gt;
Example of forced AJAX mode:  &lt;br /&gt;
&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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The field also includes an attribute to allow/deny the user to enter custom values. Currently this only works in AJAX mode. The attribute has to be added to the field definition like **custom=&amp;quot;allow&amp;quot;** or **custom=&amp;quot;deny&amp;quot;**  &lt;br /&gt;
&lt;br /&gt;
Example field definition with custom tags denied:  &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;tags&amp;quot; type=&amp;quot;tag&amp;quot; mode=&amp;quot;ajax&amp;quot; custom=&amp;quot;denied&amp;quot;&lt;br /&gt;
			label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot;&lt;br /&gt;
			class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot;&lt;br /&gt;
		&amp;gt;&lt;br /&gt;
		&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
if it is not already there. Usually multiple should be true unless you have a specific reason for it not to be.&lt;br /&gt;
In the core components in administrator, the field is in the group shown on the right, below the language field.  &lt;br /&gt;
&lt;br /&gt;
### 5. Prepare the view&lt;br /&gt;
Add an appropriate version of this to your view.html.php file before loading the layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$item-&amp;gt;tags = new JHelperTags;&lt;br /&gt;
$item-&amp;gt;tags-&amp;gt;getItemTags('com_newsfeeds.newsfeed.' , $this-&amp;gt;item-&amp;gt;id); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should match a type in the types table. The second parameter is the primary key under which this record is stored in your table. This would be used in any display in any view where you want the tags associated with the item to display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### 6. Set up the display&lt;br /&gt;
&lt;br /&gt;
In any layout where you want to display the tags associated with an item add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Changing the object and property names as appropriate.&lt;br /&gt;
&lt;br /&gt;
You will most likely want to add the show_tags parameter to the item parameters, the menu item parameters and component configuration as appropriate for your use case.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php if ($this-&amp;gt;params-&amp;gt;get('show_tags', 1) &amp;amp;&amp;amp; !empty($this-&amp;gt;item-&amp;gt;tags)) : ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php $this-&amp;gt;item-&amp;gt;tagLayout = new JLayoutFile('joomla.content.tags'); ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php echo $this-&amp;gt;item-&amp;gt;tagLayout-&amp;gt;render($this-&amp;gt;item-&amp;gt;tags-&amp;gt;itemTags); ?&amp;gt;&lt;br /&gt;
	&amp;lt;?php endif; ?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### 7. Batch processing&lt;br /&gt;
If you want to add the ability to do batch tagging to a backend list view do the following.&lt;br /&gt;
&lt;br /&gt;
 Add tag to the default_batch layout&lt;br /&gt;
&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;controls&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo JHtml::_('batch.tag');?&amp;gt;&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add tag to the button class in the modal footer (Not totally necessary at this point, but good for potential future changes e.g. if unTag is added.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; onclick=&amp;quot;document.id('batch-category-id').value='';document.id('batch-access').value='';document.id('batch-language-id').value='';document.id('batch-user-id').value='';document.id('batch-tag-id)').value=''&amp;quot; data-dismiss=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###Add a batch method to your model if you are not extending JModelAdmin or overriding the batch method._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Batch tag a list of item.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   integer  $value     The value of the new tag.&lt;br /&gt;
	 * @param   array    $pks       An array of row IDs.&lt;br /&gt;
	 * @param   array    $contexts  An array of item contexts.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   3.1&lt;br /&gt;
	 */&lt;br /&gt;
	protected function batchTag($value, $pks, $contexts)&lt;br /&gt;
	{&lt;br /&gt;
		$tagsHelper = new JHelperTags();&lt;br /&gt;
		$tagsHelper-&amp;gt;tagItems($value, $pks, $contexts);&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
_And modify your batch method by adding_&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		if (!empty($commands['tag']))&lt;br /&gt;
		{&lt;br /&gt;
			if (!$this-&amp;gt;batchTag($commands['tag'], $pks, $contexts))&lt;br /&gt;
			{&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$done = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pay attention to any JSON encoded strings that you need special handling for in batch processing -- remember that you are saving a copy of the core fields and you need save to work as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_That’s it, now create some tags, tag some items and you are set._&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Developer]][[Tags]][[3.1]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Article_Management/Reading_list</id>
		<title>Article Management/Reading list</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Article_Management/Reading_list"/>
				<updated>2013-04-29T00:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Managing Content===&lt;br /&gt;
* [[understanding sections, categories and articles]]{{JVer|1.5}}&lt;br /&gt;
* [[creating a section and category hierarchy]]{{JVer|1.5}}&lt;br /&gt;
* [[adding a new article]]&lt;br /&gt;
* [[adding a menu item which points to an Article]]&lt;br /&gt;
* [[managing the front page]]&lt;br /&gt;
* [[scheduling an Article to be available only between certain dates]]&lt;br /&gt;
* [[restricting access to an Article]]&lt;br /&gt;
* [[restricting access to &amp;quot;read more&amp;quot;]]&lt;br /&gt;
* [[restricting access to a Section]]{{JVer|1.5}}&lt;br /&gt;
* [[restricting access to a Category]]{{JVer|1.5}}&lt;br /&gt;
* [[removing email, print or PDF icons from all Articles]]&lt;br /&gt;
* [[removing author name, creation date or update date from all Articles]]&lt;br /&gt;
* [[moving an Article to the archive]]&lt;br /&gt;
* [[deleting an Article]]&lt;br /&gt;
&lt;br /&gt;
===Editing an Article===&lt;br /&gt;
* [[adding an image to an article]]&lt;br /&gt;
* [[inserting a heading into an Article]]&lt;br /&gt;
* [[inserting a list into an Article]]&lt;br /&gt;
* [[inserting a table into an Article]]&lt;br /&gt;
* [[modifying a table in an Article]]&lt;br /&gt;
* [[inserting a link to another Article or content page into an Article]]&lt;br /&gt;
* [[inserting a link to another website into an Article]]&lt;br /&gt;
* [[removing a link from an Article]]&lt;br /&gt;
* [[splitting an Article into an introduction with a link to read more]]&lt;br /&gt;
* [[removing email, print or PDF icons from an Article]]&lt;br /&gt;
* [[removing author name, creation date or update date from an Article]]&lt;br /&gt;
* [[previewing an Article]]&lt;br /&gt;
* [[splitting a long Article into multiple linked pages]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Content Management]]&lt;br /&gt;
[[Category:Article Management]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Article_Management/Reading_list</id>
		<title>Article Management/Reading list</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Article_Management/Reading_list"/>
				<updated>2013-04-29T00:53:47Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Managing Content===&lt;br /&gt;
* [[understanding sections, categories and articles]]{{JVer|1.5}}&lt;br /&gt;
* [[creating a section and category hierarchy]]{{JVer|1.5}}&lt;br /&gt;
* [[adding a new article]]&lt;br /&gt;
* [[adding a menu item which points to an Article]]&lt;br /&gt;
* [[managing the front page]]&lt;br /&gt;
* [[scheduling an Article to be available only between certain dates]]&lt;br /&gt;
* [[restricting access to an Article]]&lt;br /&gt;
* [[restricting access to &amp;quot;read more&amp;quot;]]&lt;br /&gt;
* [[restricting access to a Section]]{{JVer|1.5}}&lt;br /&gt;
* [[restricting access to a Category]]{{JVer|1.5,2.5,3}}&lt;br /&gt;
* [[removing email, print or PDF icons from all Articles]]&lt;br /&gt;
* [[removing author name, creation date or update date from all Articles]]&lt;br /&gt;
* [[moving an Article to the archive]]&lt;br /&gt;
* [[deleting an Article]]&lt;br /&gt;
&lt;br /&gt;
===Editing an Article===&lt;br /&gt;
* [[adding an image to an article]]&lt;br /&gt;
* [[inserting a heading into an Article]]&lt;br /&gt;
* [[inserting a list into an Article]]&lt;br /&gt;
* [[inserting a table into an Article]]&lt;br /&gt;
* [[modifying a table in an Article]]&lt;br /&gt;
* [[inserting a link to another Article or content page into an Article]]&lt;br /&gt;
* [[inserting a link to another website into an Article]]&lt;br /&gt;
* [[removing a link from an Article]]&lt;br /&gt;
* [[splitting an Article into an introduction with a link to read more]]&lt;br /&gt;
* [[removing email, print or PDF icons from an Article]]&lt;br /&gt;
* [[removing author name, creation date or update date from an Article]]&lt;br /&gt;
* [[previewing an Article]]&lt;br /&gt;
* [[splitting a long Article into multiple linked pages]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Content Management]]&lt;br /&gt;
[[Category:Article Management]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Article_Management/Reading_list</id>
		<title>Article Management/Reading list</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Article_Management/Reading_list"/>
				<updated>2013-04-29T00:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Managing Content===&lt;br /&gt;
* [[understanding sections, categories and articles]]{{JVer|1.5}}&lt;br /&gt;
* [[creating a section and category hierarchy]]{{JVer|1.5}}&lt;br /&gt;
* [[adding a new article]]&lt;br /&gt;
* [[adding a menu item which points to an Article]]&lt;br /&gt;
* [[managing the front page]]&lt;br /&gt;
* [[scheduling an Article to be available only between certain dates]]&lt;br /&gt;
* [[restricting access to an Article]]&lt;br /&gt;
* [[restricting access to &amp;quot;read more&amp;quot;]]&lt;br /&gt;
* [[restricting access to a Section]]{{JVer|1.6}}&lt;br /&gt;
* [[restricting access to a Category]]{{JVer|1.6}}&lt;br /&gt;
* [[removing email, print or PDF icons from all Articles]]&lt;br /&gt;
* [[removing author name, creation date or update date from all Articles]]&lt;br /&gt;
* [[moving an Article to the archive]]&lt;br /&gt;
* [[deleting an Article]]&lt;br /&gt;
&lt;br /&gt;
===Editing an Article===&lt;br /&gt;
* [[adding an image to an article]]&lt;br /&gt;
* [[inserting a heading into an Article]]&lt;br /&gt;
* [[inserting a list into an Article]]&lt;br /&gt;
* [[inserting a table into an Article]]&lt;br /&gt;
* [[modifying a table in an Article]]&lt;br /&gt;
* [[inserting a link to another Article or content page into an Article]]&lt;br /&gt;
* [[inserting a link to another website into an Article]]&lt;br /&gt;
* [[removing a link from an Article]]&lt;br /&gt;
* [[splitting an Article into an introduction with a link to read more]]&lt;br /&gt;
* [[removing email, print or PDF icons from an Article]]&lt;br /&gt;
* [[removing author name, creation date or update date from an Article]]&lt;br /&gt;
* [[previewing an Article]]&lt;br /&gt;
* [[splitting a long Article into multiple linked pages]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Content Management]]&lt;br /&gt;
[[Category:Article Management]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/How_to_use_the_filesystem_package</id>
		<title>How to use the filesystem package</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/How_to_use_the_filesystem_package"/>
				<updated>2013-04-29T00:42:48Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version|1.5,2.5,3}}&lt;br /&gt;
=Using the JFILE:: class=&lt;br /&gt;
&lt;br /&gt;
There are 4 classes in the J15 filesystem library.&lt;br /&gt;
&lt;br /&gt;
* JFile:: (file.php)&lt;br /&gt;
* JFolder:: (folder.php)&lt;br /&gt;
* JPath:: (path.php)&lt;br /&gt;
* JArchive:: (archive.php)[/i]&lt;br /&gt;
&lt;br /&gt;
For this first tutorial, I will focus on the JFile:: class.&lt;br /&gt;
&lt;br /&gt;
The base for filehandling is the JFile class, found in libraries/joomla/filesystem/file.php&lt;br /&gt;
Below I will discuss the most common options from this library file. At the end of this post, I put it together in a very simple script for file upload.&lt;br /&gt;
&lt;br /&gt;
==Get file extension==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
$ext =  JFile::getExt($filename);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pretty clear, just feed the function with a filename and it will return the extension of the file you selected.&lt;br /&gt;
&lt;br /&gt;
==Strip file extension==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
$name = JFile::stripExt($filename);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This will return the filename without the extension.&lt;br /&gt;
&lt;br /&gt;
==Clean filename==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
$safefilename = JFile::makeSafe($filename);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It cleans out all odd characters from a filename and returns a safe filename.&lt;br /&gt;
&lt;br /&gt;
==Copy a file==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFile::copy($src, $dest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It is basically a wrapper for the PHP copy() function, but also checks if the file you want to copy exists and the destination really is available. Great thing is that this function also makes use of the FTP-layer in J15 if necessary.&lt;br /&gt;
&lt;br /&gt;
==Delete a file==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFile::delete($path.$file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It tries to delete the file, making sure it is actually existing, but also checks permissions. If permissions are not set up properly, it tries to change them and delete the file. It also uses the FTP-layer when necessary.&lt;br /&gt;
&lt;br /&gt;
==Upload a file==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFile::upload($src, $dest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It is basically the wrapper for the PHP move_uploaded_file() function, but also does checks availability and permissions on both source and destination path.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
So how does that look in a script? I put up a small code snippet of an upload script. Some of the functions are used.&lt;br /&gt;
The script is fired from an upload form. That form has a file element, called file_upload (see below).&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;upload&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;file_upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
If you didn´t add the part: enctype=&amp;quot;multipart/form-data&amp;quot; then you are unable to upload a file!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Upload code looks like this:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
***********************&lt;br /&gt;
*                     *&lt;br /&gt;
* File upload example *&lt;br /&gt;
*                     *&lt;br /&gt;
***********************&lt;br /&gt;
//Retrieve file details from uploaded file, sent from upload form&lt;br /&gt;
$file = JRequest::getVar('file_upload', null, 'files', 'array');&lt;br /&gt;
&lt;br /&gt;
//Import filesystem libraries. Perhaps not necessary, but does not hurt&lt;br /&gt;
jimport('joomla.filesystem.file');&lt;br /&gt;
&lt;br /&gt;
//Clean up filename to get rid of strange characters like spaces etc&lt;br /&gt;
$filename = JFile::makeSafe($file['name']);&lt;br /&gt;
&lt;br /&gt;
//Set up the source and destination of the file&lt;br /&gt;
$src = $file['tmp_name'];&lt;br /&gt;
$dest = JPATH_COMPONENT . DS . &amp;quot;uploads&amp;quot; . DS . $filename;&lt;br /&gt;
&lt;br /&gt;
//First check if the file has the right extension, we need jpg only&lt;br /&gt;
if ( strtolower(JFile::getExt($filename) ) == 'jpg') {&lt;br /&gt;
   if ( JFile::upload($src, $dest) ) {&lt;br /&gt;
      //Redirect to a page of your choice&lt;br /&gt;
   } else {&lt;br /&gt;
      //Redirect and throw an error message&lt;br /&gt;
   }&lt;br /&gt;
} else {&lt;br /&gt;
   //Redirect and notify user file is not right extension&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Upload - Full Sample=&lt;br /&gt;
&lt;br /&gt;
Little sample where admin choose the file type or all, enter the users to access the form upload.&lt;br /&gt;
Folder to upload files in Joomla directory or with absolute path.&lt;br /&gt;
Only selected users access the form upload.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mod_simpleupload.xml&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;install type=&amp;quot;module&amp;quot; version=&amp;quot;1.5.0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;name&amp;gt;Simple Upload 1.3&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Ribamar FS&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;creationDate&amp;gt;fevereiro 2010&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
	&amp;lt;copyright&amp;gt;(C) 2005 Open Source Matters. All rights reserved.&amp;lt;/copyright&amp;gt;&lt;br /&gt;
	&amp;lt;license&amp;gt;http://www.gnu.org/copyleft/gpl.html GNU/GPL&amp;lt;/license&amp;gt;&lt;br /&gt;
	&amp;lt;authorEmail&amp;gt;ribafs@gmail.com&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
	&amp;lt;authorUrl&amp;gt;http://ribafs.org&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;description&amp;gt;Simple Upload 1.3 - Simple upload with Joomla Framework.&amp;lt;/description&amp;gt;&lt;br /&gt;
	&amp;lt;files&amp;gt;&lt;br /&gt;
		&amp;lt;filename module=&amp;quot;mod_simpleupload&amp;quot;&amp;gt;mod_simpleupload.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
	&amp;lt;/files&amp;gt;&lt;br /&gt;
	&amp;lt;params&amp;gt;&lt;br /&gt;
		&amp;lt;param name=&amp;quot;dir&amp;quot; type=&amp;quot;text&amp;quot; label=&amp;quot;Directory&amp;quot; description=&amp;quot;Directory Upload&amp;quot; default=&amp;quot;upload&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;type&amp;quot; type=&amp;quot;list&amp;quot; default=&amp;quot;*&amp;quot; label=&amp;quot;Select a file type&amp;quot; description=&amp;quot;File type&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;*&amp;quot;&amp;gt;Any File &amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;image/png&amp;quot;&amp;gt;PNG&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;image/gif&amp;quot;&amp;gt;GIF&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;image/jpeg&amp;quot;&amp;gt;JPEG&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;application/zip&amp;quot;&amp;gt;ZIP&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;application/x-gzip&amp;quot;&amp;gt;TAR.GZ&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;text/html&amp;quot;&amp;gt;HTML&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;text/plain&amp;quot;&amp;gt;TXT&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;application/pdf&amp;quot;&amp;gt;PDF&amp;lt;/option&amp;gt;&lt;br /&gt;
             &amp;lt;option value=&amp;quot;application/msword&amp;quot;&amp;gt;DOC&amp;lt;/option&amp;gt;&lt;br /&gt;
           &amp;lt;/param&amp;gt;          &lt;br /&gt;
		&amp;lt;param name=&amp;quot;user_names&amp;quot; type=&amp;quot;text&amp;quot; label=&amp;quot;User Names (optional)&amp;quot; description=&amp;quot;Names users (optionas)&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;    &lt;br /&gt;
	&amp;lt;/params&amp;gt;&lt;br /&gt;
&amp;lt;/install&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mod_simpleupload.php&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// no direct access&lt;br /&gt;
defined('_JEXEC') or die('Restricted access');&lt;br /&gt;
&lt;br /&gt;
//Import filesystem libraries. Perhaps not necessary, but does not hurt&lt;br /&gt;
jimport('joomla.filesystem.file');&lt;br /&gt;
&lt;br /&gt;
$max = ini_get('upload_max_filesize');&lt;br /&gt;
$module_dir = $params-&amp;gt;get( 'dir' );&lt;br /&gt;
$file_type = $params-&amp;gt;get( 'type' );&lt;br /&gt;
&lt;br /&gt;
$user_names = $params-&amp;gt;get( 'user_names' );&lt;br /&gt;
$msg = '';&lt;br /&gt;
&lt;br /&gt;
function fileUpload($max, $module_dir, $file_type, $msg){&lt;br /&gt;
	//Retrieve file details from uploaded file, sent from upload form&lt;br /&gt;
	$file = JRequest::getVar('file_upload', null, 'files', 'array'); &lt;br /&gt;
	// Retorna: Array ( [name] =&amp;gt; mod_simpleupload_1.2.1.zip [type] =&amp;gt; application/zip &lt;br /&gt;
	// [tmp_name] =&amp;gt; /tmp/phpo3VG9F [error] =&amp;gt; 0 [size] =&amp;gt; 4463 ) &lt;br /&gt;
&lt;br /&gt;
	if(isset($file)){ &lt;br /&gt;
		//Clean up filename to get rid of strange characters like spaces etc&lt;br /&gt;
		$filename = JFile::makeSafe($file['name']);&lt;br /&gt;
&lt;br /&gt;
		if($file['size'] &amp;gt; $max) $msg = JText::_('ONLY_FILES_UNDER').' '.$max;&lt;br /&gt;
		//Set up the source and destination of the file&lt;br /&gt;
&lt;br /&gt;
		$src = $file['tmp_name'];&lt;br /&gt;
		$dest = $module_dir . DS . $filename;&lt;br /&gt;
&lt;br /&gt;
		//First check if the file has the right extension, we need jpg only&lt;br /&gt;
		if ($file['type'] == $file_type || $file_type == '*') { &lt;br /&gt;
		   if ( JFile::upload($src, $dest) ) {&lt;br /&gt;
&lt;br /&gt;
  		       //Redirect to a page of your choice&lt;br /&gt;
			$msg = JText::_('FILE_SAVE_AS').' '.$dest;&lt;br /&gt;
		   } else {&lt;br /&gt;
			  //Redirect and throw an error message&lt;br /&gt;
			$msg = JText::_('ERROR_IN_UPLOAD');&lt;br /&gt;
		   }&lt;br /&gt;
		} else {&lt;br /&gt;
		   //Redirect and notify user file is not right extension&lt;br /&gt;
			$msg = JText::_('FILE_TYPE_INVALID');&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$msg = &amp;quot;&amp;lt;script&amp;gt;alert('&amp;quot;. $msg .&amp;quot;');&amp;lt;/script&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	return $msg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$user =&amp;amp; JFactory::getUser();&lt;br /&gt;
$username = $user-&amp;gt;get('username');&lt;br /&gt;
&lt;br /&gt;
$acc = 0;&lt;br /&gt;
$session =&amp;amp; JFactory::getSession(); &lt;br /&gt;
&lt;br /&gt;
if(isset($user_names)) {&lt;br /&gt;
	$more = strpos($user_names, ',',0);&lt;br /&gt;
	if($more &amp;gt;0){&lt;br /&gt;
		$user_names = explode(',',$user_names);&lt;br /&gt;
		foreach($user_names as $un){&lt;br /&gt;
			if($un == $username) {&lt;br /&gt;
				$session-&amp;gt;set($acc, 1); &lt;br /&gt;
			}else{&lt;br /&gt;
				$session-&amp;gt;set($acc, 0); &lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}else{&lt;br /&gt;
		if ($user_names == $username) $session-&amp;gt;set($acc, 1); &lt;br /&gt;
	}&lt;br /&gt;
}else{&lt;br /&gt;
	if(isset($username)) $session-&amp;gt;set($acc, 1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if($session-&amp;gt;get($acc) == 1){&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form name=&amp;quot;imgform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; onSubmit=&amp;quot;if(file_upload.value=='') {alert('Choose a file!');return false;}&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?php echo JText::_('CHOOSE_FILE'); ?&amp;gt; &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;file_upload&amp;quot; size=&amp;quot;10&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;input name=&amp;quot;submit&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	print fileUpload($max, $module_dir, $file_type, $msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Adapted from http://docs.joomla.org/How_to_use_the_filesystem_package&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Using the JFolder:: class=&lt;br /&gt;
The base for folder handling is the JFolder class, found in libraries/joomla/filesystem/folder.php&lt;br /&gt;
Below I will discuss the most common options from this library file. At the end of this post, I put it together in a very simple script as an exmaple&lt;br /&gt;
&lt;br /&gt;
==Copy folder==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::copy($src, $dest, $path, $force);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This will copy a complete folder and all of it’s contents to another location on the server. It does permission and availability checking on both source and destination. By using $path you can enter a basepath to prefix to the filename and by setting the $force parameter to true, you can force the overwriting of already existing files. If set in the configuration, the FTP-layer will be used.&lt;br /&gt;
&lt;br /&gt;
==Create folder==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::create($path, $mode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This is basically a wrapper for the php mkdir() function, but with error permissions and availability checking. This one also uses the FTP-layer when set in the configuration. $mode will set the default permission, once copied and defaults to 0755.&lt;br /&gt;
&lt;br /&gt;
==Move folder==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::move($src, $dest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Basically a wrapper for the php rename() function, but with permissions and availability checking. This one also uses the FTP-layer when set in the configuration.&lt;br /&gt;
&lt;br /&gt;
==Check if folder exists==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::exists($path);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wrapper for the php is_dir() function. Pretty straightforward, returns true if folder exists.&lt;br /&gt;
&lt;br /&gt;
==Read files from folder==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::files($path, $filter = '.', $recurse, $fullpath , $exclude);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Function to read files from a folder. When setting $recurse to true, also subfolders will be searched. $fullpath set to true returns the full path in the array. With $exclude, you can offer an array of extensions, not to include in the search for files. It returns an array with all filenames.&lt;br /&gt;
&lt;br /&gt;
==Read folders from filesystem==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::folders($path, $filter = '.', $recurse, $fullpath , $exclude);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exactly the same as JFolder::files(), except this does only return an array with foldernames.&lt;br /&gt;
&lt;br /&gt;
==Make a tree like list from a folder structure==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::listFolderTree($path, $filter, $maxLevel = 3, $level = 0, $parent = 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It will read a folder, specified in $path and will return all folders in an array, suitable for tree display. You can specify the number of levels. The folder array looks like this:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
Array&lt;br /&gt;
(&lt;br /&gt;
    [0] =&amp;gt; Array&lt;br /&gt;
        (&lt;br /&gt;
            [id] =&amp;gt; 1&lt;br /&gt;
            [parent] =&amp;gt; 0&lt;br /&gt;
            [name] =&amp;gt; administrator&lt;br /&gt;
            [fullname] =&amp;gt; g:/joomla_1012/administrator&lt;br /&gt;
            [relname] =&amp;gt; g:/joomla_1012/administrator&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    [1] =&amp;gt; Array&lt;br /&gt;
        (&lt;br /&gt;
            [id] =&amp;gt; 2&lt;br /&gt;
            [parent] =&amp;gt; 1&lt;br /&gt;
            [name] =&amp;gt; backups&lt;br /&gt;
            [fullname] =&amp;gt; g:/joomla_1012/administrator/backups&lt;br /&gt;
            [relname] =&amp;gt; g:/joomla_1012/administrator/backups&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    [2] =&amp;gt; Array&lt;br /&gt;
        (&lt;br /&gt;
            [id] =&amp;gt; 3&lt;br /&gt;
            [parent] =&amp;gt; 1&lt;br /&gt;
            [name] =&amp;gt; components&lt;br /&gt;
            [fullname] =&amp;gt; g:/joomla_1012/administrator/components&lt;br /&gt;
            [relname] =&amp;gt; g:/joomla_1012/administrator/components&lt;br /&gt;
        )&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Clean a path string==&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
JFolder::makeSafe($path);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Identically to the JFile::makeSafe() function. It cleans all odd characters out of the string and returns a clean path.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Ok, and how does this look in actual code. We are going to read the contents of a folder called images. In it, al large number of files are placed. We want to create a subfolder, called jpg and filter all jpg files out and move them to the jpg subfolder. After that, we will move the complete subfolder to another place on the server.&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
//First we set up parameters&lt;br /&gt;
$searchpath = JPATH_COMPONENT . DS . &amp;quot;images&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Then we create the subfolder called jpg&lt;br /&gt;
if ( !JFolder::create($searchpath . DS . &amp;quot;jpg&amp;quot;) ) {&lt;br /&gt;
   //Throw error message and stop script&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Now we read all jpg files and put them in an array.&lt;br /&gt;
$jpg_files = JFolder::files($searchpath, '.jpg');&lt;br /&gt;
&lt;br /&gt;
//Now we need some stuff from the JFile:: class to move all files into the new folder&lt;br /&gt;
foreach ($jpg_files as $file) {&lt;br /&gt;
   JFile::move($searchpath. DS . $file, $searchpath . DS. &amp;quot;jpg&amp;quot; . $file);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Lastly, we are moving the complete subdir to the root of the component.&lt;br /&gt;
if (JFolder::move($searchpath . DS. &amp;quot;jpg&amp;quot;, $JPATH_COMPONENT) ) {&lt;br /&gt;
   //Redirect with perhaps a happy message&lt;br /&gt;
} else {&lt;br /&gt;
   //Throw an error&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is example script only, but gives a general idea of the possibilities. I did not touch other stuff like JError to keep it clean and simple.&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Development]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-28T15:50:23Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An official fix is not yet announced.  However there were two changes that may be causing this issue and users may want to try fixing these. Try each fix in order and test to see if it resolves the problem.&lt;br /&gt;
&lt;br /&gt;
First, if you have contact data you must ensure that every contact has a language (if it says &amp;quot;Undefined&amp;quot; in the contact manager, that tells you no language is assigned) and every contact that has a linked user should either have a version set to language ALL  or else have one version set to  each content language used on your site. That is if you have 3 languages you must either have 3 separate contacts or you must have one set to all. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Second, open the language filter plugin, make sure the cookie lifetime is set to year and save.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-28T15:46:10Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An official fix is not yet announced.  However there were two changes that may be causing this issue and users may want to try fixing these. Try each fix in order and test to see if it resolves the problem.&lt;br /&gt;
&lt;br /&gt;
First, open the language filter plugin, make sure the cookie lifetime is set to year and save.  &lt;br /&gt;
&lt;br /&gt;
Second, if you have contact data you must ensure that every contact has a language (if it says &amp;quot;Undefined&amp;quot; in the contact manager, that tells you no language is assigned) and every contact that has a linked user should either have a version with language ALL  or else have a version in each content language used on your site. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-28T15:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An official fix is not yet announced.  However there were two changes that may be causing this issue and users may want to try fixing these. Try each fix in order and test to see if it resolves the problem.&lt;br /&gt;
&lt;br /&gt;
First, open the language filter plugin, make sure the cookie lifetime is set to year and save.  &lt;br /&gt;
&lt;br /&gt;
Second, if you have contact data you must ensure that every contact has a language (if it says &amp;quot;undefined&amp;quot; in the contact manager, that tells you no language is assigned) and every contact that has a linked user should either have a version with language ALL  or else have a version in each content language used on your site. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-28T15:41:23Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An official fix is not yet announced.  However there were two changes that may be causing this issue and users may want to try fixing these. Try each fix in order and test to see if it resolves the problem.&lt;br /&gt;
&lt;br /&gt;
First, open the language filter plugin, make sure the cookie lifetime is set to year and save.  &lt;br /&gt;
&lt;br /&gt;
Second, if you have contact data you must ensure that every contact has a language (if it says &amp;quot;undefined&amp;quot; in the contact manager, that tells you no language is assigned) and every contact that has a linked user should have a version with language ALL as well as any specific language versions. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Ftp-update-not-working</id>
		<title>Ftp-update-not-working</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Ftp-update-not-working"/>
				<updated>2013-04-28T01:04:03Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;There have been reports that updates with the FTP layer enabled are not working.  Currently there is not a fix for this, but it is suggested that rather than use the updater y...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There have been reports that updates with the FTP layer enabled are not working.  Currently there is not a fix for this, but it is suggested that rather than use the updater you install the new Joomla version using the standard extension manager install. If that does not work, you can ftp the update zip filed to your host and unzip the new files, replacing the old ones. You will need to manually run the database changes using the appropriate version scrip found in administrator/components/com_admin/sql.&lt;br /&gt;
&lt;br /&gt;
You will also need to manually delete the Flash uploader files from the media folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-28T00:56:27Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work.  Although an official fix is not yet announced, this is related to the change to language cookie handling that was introduced.  As a first step  try opening the language filter plugin and set the cookie lifetime to year and see if that solves the problem.  If it does not as a '''temporary''' solution you may want to revert the change to the plugin. To do so take the code from the code below and change the plugin. Delete the lines with + at the beginning and add the lines with - at the beginning in the file plugins/system/languagefilter/languagefilter.php.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 @@ -82,7 +84,7 @@&lt;br /&gt;
 					$conf = JFactory::getConfig();&lt;br /&gt;
 					$cookie_domain 	= $conf-&amp;gt;get('config.cookie_domain', '');&lt;br /&gt;
 					$cookie_path 	= $conf-&amp;gt;get('config.cookie_path', '/');&lt;br /&gt;
 -					setcookie(JApplication::getHash('language'), $lang_code, time() + 365 * 86400, $cookie_path, $cookie_domain);&lt;br /&gt;
 +					setcookie(JApplication::getHash('language'), $lang_code, $this-&amp;gt;getLangCookieTime(), $cookie_path, $cookie_domain);&lt;br /&gt;
 					// set the request var&lt;br /&gt;
 					JRequest::setVar('language', $lang_code);&lt;br /&gt;
 				}&lt;br /&gt;
 @@ -355,7 +357,7 @@&lt;br /&gt;
 					$conf = JFactory::getConfig();&lt;br /&gt;
 					$cookie_domain 	= $conf-&amp;gt;get('config.cookie_domain', '');&lt;br /&gt;
 					$cookie_path 	= $conf-&amp;gt;get('config.cookie_path', '/');&lt;br /&gt;
 -					setcookie(JApplication::getHash('language'), $lang_code, time() + 365 * 86400, $cookie_path, $cookie_domain);&lt;br /&gt;
 +					setcookie(JApplication::getHash('language'), $lang_code, $this-&amp;gt;getLangCookieTime(), $cookie_path, $cookie_domain);&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</id>
		<title>Multilingual-problems-after-updating-to-2.5.11-or-3.1.1</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Multilingual-problems-after-updating-to-2.5.11-or-3.1.1"/>
				<updated>2013-04-27T23:00:54Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some (but not all) multilingual sites experience a problem where all content not in the default language is not displayed and the language filter module does not seem to work.  Although an official fix is not yet announced, this is related to the change to language cookie handling that was introduced.  As a first step  try opening the language filter plugin and set the cookie lifetime to year and see if that solves the problem.  If it does not as a '''temporary''' solution you may want to revert the change to the plugin. To do so take the code from the code below and change the plugin. Delete the lines with + at the beginning and add the lines with - at the beginning in the file plugins/system/languagefilter/languagefilter.php.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source: php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 @@ -82,7 +84,7 @@&lt;br /&gt;
 					$conf = JFactory::getConfig();&lt;br /&gt;
 					$cookie_domain 	= $conf-&amp;gt;get('config.cookie_domain', '');&lt;br /&gt;
 					$cookie_path 	= $conf-&amp;gt;get('config.cookie_path', '/');&lt;br /&gt;
 -					setcookie(JApplication::getHash('language'), $lang_code, time() + 365 * 86400, $cookie_path, $cookie_domain);&lt;br /&gt;
 +					setcookie(JApplication::getHash('language'), $lang_code, $this-&amp;gt;getLangCookieTime(), $cookie_path, $cookie_domain);&lt;br /&gt;
 					// set the request var&lt;br /&gt;
 					JRequest::setVar('language', $lang_code);&lt;br /&gt;
 				}&lt;br /&gt;
 @@ -355,7 +357,7 @@&lt;br /&gt;
 					$conf = JFactory::getConfig();&lt;br /&gt;
 					$cookie_domain 	= $conf-&amp;gt;get('config.cookie_domain', '');&lt;br /&gt;
 					$cookie_path 	= $conf-&amp;gt;get('config.cookie_path', '/');&lt;br /&gt;
 -					setcookie(JApplication::getHash('language'), $lang_code, time() + 365 * 86400, $cookie_path, $cookie_domain);&lt;br /&gt;
 +					setcookie(JApplication::getHash('language'), $lang_code, $this-&amp;gt;getLangCookieTime(), $cookie_path, $cookie_domain);&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:How_To_Use_Content_Tags_in_Joomla!</id>
		<title>J3.1:How To Use Content Tags in Joomla!</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:How_To_Use_Content_Tags_in_Joomla!"/>
				<updated>2013-04-27T19:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags in Joomla! provide a flexible way of organizing content. The same tag can be applied to many different content items across content types (articles, weblinks, newsfeeds, contacts, and catgories). Any item can have as many tags as desired.&lt;br /&gt;
&lt;br /&gt;
Once an item is tagged with a specific tag, browsing to the link for that tag will give a list of all items that have been tagged with that tag. &lt;br /&gt;
&lt;br /&gt;
Tags can be created in two ways.&lt;br /&gt;
&lt;br /&gt;
# You can browse to the Tags manager (link on the Components menu). There you can create detailed tags in a way similar to creating an article. Besides a name, tags can include a description, images, meta data and other items similar to all other Joomla content types.  In the Tags Manager you can also choose a parent for a tag to create nested tagging.&lt;br /&gt;
# You can create tags on the fly in any content editing screen that has a tags field. Start typing the name of a possible tag. Once you get to three letters you will start to see suggested tags that alread exist. If you are creating a brand new tag finish typing the name and hit enter and the tag will be created for you when you save.&lt;br /&gt;
&lt;br /&gt;
Once you have tags and some tagged items you can display them in the front end in several ways.&lt;br /&gt;
&lt;br /&gt;
# By default Joomla! will display tags embedded in each item that has been tagged. You can turn this display off by changing the parameters. You can control positioning of this display with layout overrides and alternate layouts and you can style it with your css.&lt;br /&gt;
# You can create a menu link that displays a list of tags, with links to the tagged items for each tag.&lt;br /&gt;
# You can create a menu link that displays a list of tagged items for a given tag and display either as a list or blog style.&lt;br /&gt;
# You can use one of the tags modules.  Popular tags will display a linked list of the tags that have the most tagged items. Similar Tags will display a list of items that have a similar set of tags to the currently displayed item (note that this module does not display on pages that are not showing content items).&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/J3.1:How_To_Use_Content_Tags_in_Joomla!</id>
		<title>J3.1:How To Use Content Tags in Joomla!</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/J3.1:How_To_Use_Content_Tags_in_Joomla!"/>
				<updated>2013-04-27T19:42:52Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Tags in Joomla! provide a flexible way of organizing content. The same tag can be applied to many different content items across content types (articles, weblinks, newsfeeds, ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags in Joomla! provide a flexible way of organizing content. The same tag can be applied to many different content items across content types (articles, weblinks, newsfeeds, contacts, and catgories). Any item can have as many tags as desired.&lt;br /&gt;
&lt;br /&gt;
Once an item is tagged with a specific tag, browsing to the link for that tag will give a list of all items that have been tagged with that tag. &lt;br /&gt;
&lt;br /&gt;
Tags can be created in two ways.&lt;br /&gt;
&lt;br /&gt;
# You can browse to the Tags manager (link on the Components menu). There you can create detailed tags in a way similar to creating an article. Besides a name, tags can include a description, images, meta data and other items similar to all other Joomla content types.  In the Tags Manager you can also choose a parent for a tag to create nested tagging.&lt;br /&gt;
&lt;br /&gt;
# You can create tags on the fly in any content editing screen that has a tags field. Start typing the name of a possible tag. Once you get to three letters you will start to see suggested tags that alread exist. If you are creating a brand new tag finish typing the name and hit enter and the tag will be created for you when you save.&lt;br /&gt;
&lt;br /&gt;
Once you have tags and some tagged items you can display them in the front end in several ways.&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Tag_form_field_type</id>
		<title>Tag form field type</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Tag_form_field_type"/>
				<updated>2013-04-27T17:59:12Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''Tag''' field type provides a point where you can enter tags - this is either AJAX or nested.&lt;br /&gt;
&lt;br /&gt;
* '''type''' (mandatory) must be ''tag''.&lt;br /&gt;
* '''name''' (mandatory) is the unique name of the parameter.&lt;br /&gt;
* '''mode''' (optional) (translatable) is the description of the field.&lt;br /&gt;
* '''label''' (mandatory) (translatable) is the descriptive title of the field.&lt;br /&gt;
* '''description''' (optional) (translatable) is the description of the field.&lt;br /&gt;
* '''id''' (optional) is the id to add to the field. Note if none is set this will be the name of the field.&lt;br /&gt;
* '''class''' (optional) is the class to add to the field.&lt;br /&gt;
* '''published''' (optional) determines if non published tags should be allowed.&lt;br /&gt;
* '''language''' (optional) is language to filter the existing tags by.&lt;br /&gt;
* '''multiple''' (optional) is the ability to add more than 1 tag to the form field.&lt;br /&gt;
* '''custom''' (optional) if the ajax mode is chosen setting this to ''deny'' will prevent users from adding in new tags.&lt;br /&gt;
&lt;br /&gt;
Example XML Definition for an AJAX Tag&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;field name=&amp;quot;tags&amp;quot; type=&amp;quot;tag&amp;quot; label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot; mode=&amp;quot;ajax&amp;quot; class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example XML Definition for an Nested Tag&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;field name=&amp;quot;tags&amp;quot; type=&amp;quot;tag&amp;quot; label=&amp;quot;JTAG&amp;quot; description=&amp;quot;JTAG_DESC&amp;quot; mode=&amp;quot;nested&amp;quot; class=&amp;quot;inputbox span12 small&amp;quot; multiple=&amp;quot;true&amp;quot; /&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
[http://magazine.joomla.org/issues/issue-apr-2103/item/1225-joomla-tag-field Joomla! Community Magazine April 2013 Issue]&lt;br /&gt;
[[Category:Standard form field types]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/No-updates-shown-in-current-version</id>
		<title>No-updates-shown-in-current-version</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/No-updates-shown-in-current-version"/>
				<updated>2013-04-27T13:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;There are some reports that updates that have been released are not shown in the current (older) version.  If this occurs, go to the Updates tab of the Extensions Manager.  Cl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are some reports that updates that have been released are not shown in the current (older) version.  If this occurs, go to the Updates tab of the Extensions Manager.  Click the clear cache icon. Then click the check for updates icon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 2.5 FAQ]]&lt;br /&gt;
[[Category:Version 2.5.11 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3</id>
		<title>Warnings-upgrading-from-2.5-to-3</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3"/>
				<updated>2013-04-27T10:59:12Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When updating from the 2.5 series to the 3 series you may see a large number of warnings and notices on the update page.  These do not interfere with the update process and may simply be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ]][[Category:Version 2.5.11 FAQ]][[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3</id>
		<title>Warnings-upgrading-from-2.5-to-3</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3"/>
				<updated>2013-04-27T10:56:15Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When updating from the 2.5 series to the 3 series you may see a large number of warnings and notices on the update page.  These do not interfere with the update process and may simply be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ][Category:Version 2.5.11 FAQ][Category:Version 3.1.0 FAQ][Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3</id>
		<title>Warnings-upgrading-from-2.5-to-3</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Warnings-upgrading-from-2.5-to-3"/>
				<updated>2013-04-27T10:52:01Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;When updating from the 2.5 series to the 3 series you may see a large number of warnings and notices on the update page.  These do not interfere with the update process and ma...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When updating from the 2.5 series to the 3 series you may see a large number of warnings and notices on the update page.  These do not interfere with the update process and may simply be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 2.5 FAQ][Category:Version 2.5.11 FAQ][Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Talk:Tags-not-installed-in-3.1.0</id>
		<title>Talk:Tags-not-installed-in-3.1.0</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Talk:Tags-not-installed-in-3.1.0"/>
				<updated>2013-04-27T10:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Can we change the name to say in-3.1.0-or-3.1.1?&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Can we change the name to say in-3.1.0-or-3.1.1?&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Problems-with-added-fields-in-3.1.0</id>
		<title>Problems-with-added-fields-in-3.1.0</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Problems-with-added-fields-in-3.1.0"/>
				<updated>2013-04-27T09:45:22Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;If you have a plugin that adds extra fields to the article editor it may break in 3.1.0. To fix this you must update to 3.1.1.  &amp;lt;noinclude&amp;gt;Category:Version 3.0 FAQ [[Categ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you have a plugin that adds extra fields to the article editor it may break in 3.1.0. To fix this you must update to 3.1.1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 3.0 FAQ]]&lt;br /&gt;
[[Category:Version 3.1.0 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Empty-$path-issue-in-2.5.10</id>
		<title>Empty-$path-issue-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Empty-$path-issue-in-2.5.10"/>
				<updated>2013-04-27T08:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 2.5.10 some extensions show an empty $path error. The best solution for this is to update to 2.5.11.&lt;br /&gt;
&lt;br /&gt;
If for some reason you cannot update to 2.5.11 you can apply the following hot fix.&lt;br /&gt;
&lt;br /&gt;
Navigate to libraries/joomla/filesystem/path.php.&lt;br /&gt;
&lt;br /&gt;
At about line 202 change &lt;br /&gt;
 if (!is_string($path)) &lt;br /&gt;
 to&lt;br /&gt;
 if (!is_string($path) &amp;amp;&amp;amp; !empty($path))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 diff --git a/libraries/joomla/filesystem/path.php b/libraries/joomla/filesystem/path.php&lt;br /&gt;
 index d4c8bb9..d5116c8 100644&lt;br /&gt;
 --- a/libraries/joomla/filesystem/path.php&lt;br /&gt;
 +++ b/libraries/joomla/filesystem/path.php&lt;br /&gt;
 @@ -199,7 +199,7 @@ class JPath&lt;br /&gt;
 	 */&lt;br /&gt;
 	public static function clean($path, $ds = DIRECTORY_SEPARATOR)&lt;br /&gt;
 	{&lt;br /&gt;
 -		if (!is_string($path))&lt;br /&gt;
 +		if (!is_string($path) &amp;amp;&amp;amp; !empty($path))&lt;br /&gt;
 		{&lt;br /&gt;
 			throw new UnexpectedValueException('JPath::clean: $path is not a string.');&lt;br /&gt;
 		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 2.5 FAQ]]&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Empty-$path-issue-in-2.5.10</id>
		<title>Empty-$path-issue-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Empty-$path-issue-in-2.5.10"/>
				<updated>2013-04-27T08:54:51Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;In version 2.5.10 some extensions show an empty $path error. The best solution for this is to update to 2.5.11.  If for some reason you cannot update to 2.5.11 you can apply t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 2.5.10 some extensions show an empty $path error. The best solution for this is to update to 2.5.11.&lt;br /&gt;
&lt;br /&gt;
If for some reason you cannot update to 2.5.11 you can apply the following hot fix.&lt;br /&gt;
&lt;br /&gt;
Navigate to libraries/joomla/filesystem/path.php.&lt;br /&gt;
&lt;br /&gt;
At about line 202 change &lt;br /&gt;
 if (!is_string($path)) &lt;br /&gt;
 to&lt;br /&gt;
 if (!is_string($path) &amp;amp;&amp;amp; !empty($path))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 diff --git a/libraries/joomla/filesystem/path.php b/libraries/joomla/filesystem/path.php&lt;br /&gt;
 index d4c8bb9..d5116c8 100644&lt;br /&gt;
 --- a/libraries/joomla/filesystem/path.php&lt;br /&gt;
 +++ b/libraries/joomla/filesystem/path.php&lt;br /&gt;
 @@ -199,7 +199,7 @@ class JPath&lt;br /&gt;
 	 */&lt;br /&gt;
 	public static function clean($path, $ds = DIRECTORY_SEPARATOR)&lt;br /&gt;
 	{&lt;br /&gt;
 -		if (!is_string($path))&lt;br /&gt;
 +		if (!is_string($path) &amp;amp;&amp;amp; !empty($path))&lt;br /&gt;
 		{&lt;br /&gt;
 			throw new UnexpectedValueException('JPath::clean: $path is not a string.');&lt;br /&gt;
 		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Broken-configuration-screen-in-2.5.10</id>
		<title>Broken-configuration-screen-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Broken-configuration-screen-in-2.5.10"/>
				<updated>2013-04-27T08:43:43Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;If you use memcached you may have a broken configuration screen.  The best solution to this is to update to 2.5.11. If for some reason you cannot update to 2.5.11 you may appl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you use memcached you may have a broken configuration screen.  The best solution to this is to update to 2.5.11.&lt;br /&gt;
If for some reason you cannot update to 2.5.11 you may apply the following hotfix.&lt;br /&gt;
&lt;br /&gt;
Find the file libraries/joomla/cache/storage/memcached.php&lt;br /&gt;
&lt;br /&gt;
At line 317 change Memcache to Memcached.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 -    $memcached = new Memcache;&lt;br /&gt;
 +    $memcached = new Memcached;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;noinclude&amp;gt;[[Category:Version 2.5 FAQ]]&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Cannot-upload-file-in-2.5.10</id>
		<title>Cannot-upload-file-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Cannot-upload-file-in-2.5.10"/>
				<updated>2013-04-27T08:34:09Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;If you get a message saying you cannot upload in 2.5.10 the best solution is to upgrade to 2.5.11.  If it is not possible to upgrade to 2.5.11 you can click the options button...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you get a message saying you cannot upload in 2.5.10 the best solution is to upgrade to 2.5.11.&lt;br /&gt;
&lt;br /&gt;
If it is not possible to upgrade to 2.5.11 you can click the options button in the media manager and save, and the error will be gone.&lt;br /&gt;
&lt;br /&gt;
Please note that the Flash uploader has been removed completely for security reasons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 2.5 FAQ]]&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Missing-intro-text-and-images-in_2.5.10</id>
		<title>Missing-intro-text-and-images-in 2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Missing-intro-text-and-images-in_2.5.10"/>
				<updated>2013-04-27T08:24:36Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Updating to 2.5.10 may lead to the &amp;quot;disappearance&amp;quot; of intro text and images from featured or blog article views.   To fix please update to 2.5.11.  If for some reason updating...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Updating to 2.5.10 may lead to the &amp;quot;disappearance&amp;quot; of intro text and images from featured or blog article views.  &lt;br /&gt;
To fix please update to 2.5.11.&lt;br /&gt;
&lt;br /&gt;
If for some reason updating to 2.5.11 is not possible, change &amp;quot;Show Intro Text&amp;quot; to Show.  &lt;br /&gt;
This may temporarily cause your full article to display the intro text when you don't want that.  In that case you should change the Show Intro Text for each impacted article to Hide.  A more complete solution can also be implemented by creating a template override.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 2.5 FAQ]]&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Database-tab-error-in-2.5.10</id>
		<title>Database-tab-error-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Database-tab-error-in-2.5.10"/>
				<updated>2013-04-27T08:21:43Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In 2.5.10 you may see an error in the database tab saying you are not on the latest version.  This is most easily fixed by updating to 2.5.11.  &lt;br /&gt;
&lt;br /&gt;
If for some reason you cannot update to 2.5.11 you can apply the following hot fix that was added in that update.&lt;br /&gt;
To apply open the two referenced files (libraries/cms/schema/changeset.php and libraries/joomla/filesystem/folder.php) and delete all of the lines that start with a minus sign and add all the lines that start with a plus sign.  It is strongly preferable that you do the update to 3.1.1 rather than apply the hot fix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 diff --git a/libraries/cms/schema/changeset.php b/libraries/cms/schema/changeset.php&lt;br /&gt;
 index 95b1a47..8e0ba28 100644&lt;br /&gt;
 --- a/libraries/cms/schema/changeset.php&lt;br /&gt;
 +++ b/libraries/cms/schema/changeset.php&lt;br /&gt;
 @@ -196,7 +196,8 @@&lt;br /&gt;
 		{&lt;br /&gt;
 			$this-&amp;gt;folder = JPATH_ADMINISTRATOR . '/components/com_admin/sql/updates/';&lt;br /&gt;
 		}&lt;br /&gt;
 -		return JFolder::files($this-&amp;gt;folder . '/' . $sqlFolder, '\.sql$', 1, true);&lt;br /&gt;
 +		return JFolder::files($this-&amp;gt;folder . '/' . $sqlFolder, '\.sql$', 1, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX'),&lt;br /&gt;
 +		array('^\..*', '.*~'), true);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/**&lt;br /&gt;
 diff --git a/libraries/joomla/filesystem/folder.php b/libraries/joomla/filesystem/folder.php&lt;br /&gt;
 index edf39d6..ecabc52 100644&lt;br /&gt;
 --- a/libraries/joomla/filesystem/folder.php&lt;br /&gt;
 +++ b/libraries/joomla/filesystem/folder.php&lt;br /&gt;
 @@ -467,13 +467,14 @@&lt;br /&gt;
 	 * @param   boolean  $full           True to return the full path to the file.&lt;br /&gt;
 	 * @param   array    $exclude        Array with names of files which should not be shown in the result.&lt;br /&gt;
 	 * @param   array    $excludefilter  Array of filter to exclude&lt;br /&gt;
 +	 * @param   boolean  $naturalSort    False for asort, true for natsort&lt;br /&gt;
 	 *&lt;br /&gt;
 	 * @return  array  Files in the given folder.&lt;br /&gt;
 	 *&lt;br /&gt;
 	 * @since   11.1&lt;br /&gt;
 	 */&lt;br /&gt;
 	public static function files($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'),&lt;br /&gt;
  -		$excludefilter = array('^\..*', '.*~'))&lt;br /&gt;
 +		$excludefilter = array('^\..*', '.*~'), $naturalSort = false)&lt;br /&gt;
 	{&lt;br /&gt;
 		// Check to make sure the path valid and clean&lt;br /&gt;
 		$path = JPath::clean($path);&lt;br /&gt;
 @@ -498,8 +499,15 @@&lt;br /&gt;
 		// Get the files&lt;br /&gt;
 		$arr = self::_items($path, $filter, $recurse, $full, $exclude, $excludefilter_string, true);&lt;br /&gt;
 &lt;br /&gt;
 -		// Sort the files&lt;br /&gt;
 -		asort($arr);&lt;br /&gt;
 +		// Sort the files based on either natural or alpha method&lt;br /&gt;
 +		if ($naturalSort)&lt;br /&gt;
 +		{&lt;br /&gt;
 +			natsort($arr);&lt;br /&gt;
 +		}&lt;br /&gt;
 +		else&lt;br /&gt;
 +		{&lt;br /&gt;
 +			asort($arr);&lt;br /&gt;
 +		}&lt;br /&gt;
 		return array_values($arr);&lt;br /&gt;
 	}&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Database-tab-error-in-2.5.10</id>
		<title>Database-tab-error-in-2.5.10</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Database-tab-error-in-2.5.10"/>
				<updated>2013-04-27T08:19:28Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot; In 2.5.10 you may see an error in the database tab saying you are not on the latest version.  This is most easily fixed by updating to 2.5.11.     If for some reason you cann...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; In 2.5.10 you may see an error in the database tab saying you are not on the latest version.  This is most easily fixed by updating to 2.5.11.  &lt;br /&gt;
&lt;br /&gt;
 If for some reason you cannot update to 2.5.11 you can apply the following hot fix that was added in that update.&lt;br /&gt;
To apply open the two referenced files (libraries/cms/schema/changeset.php and libraries/joomla/filesystem/folder.php) and delete all of the lines that start with a minus sign and add all the lines that start with a plus sign.  It is strongly preferable that you do the update to 3.1.1 rather than apply the hot fix.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
diff --git a/libraries/cms/schema/changeset.php b/libraries/cms/schema/changeset.php&lt;br /&gt;
index 95b1a47..8e0ba28 100644&lt;br /&gt;
--- a/libraries/cms/schema/changeset.php&lt;br /&gt;
+++ b/libraries/cms/schema/changeset.php&lt;br /&gt;
@@ -196,7 +196,8 @@&lt;br /&gt;
 		{&lt;br /&gt;
 			$this-&amp;gt;folder = JPATH_ADMINISTRATOR . '/components/com_admin/sql/updates/';&lt;br /&gt;
 		}&lt;br /&gt;
 -		return JFolder::files($this-&amp;gt;folder . '/' . $sqlFolder, '\.sql$', 1, true);&lt;br /&gt;
 +		return JFolder::files($this-&amp;gt;folder . '/' . $sqlFolder, '\.sql$', 1, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX'),&lt;br /&gt;
 +		array('^\..*', '.*~'), true);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/**&lt;br /&gt;
diff --git a/libraries/joomla/filesystem/folder.php b/libraries/joomla/filesystem/folder.php&lt;br /&gt;
index edf39d6..ecabc52 100644&lt;br /&gt;
--- a/libraries/joomla/filesystem/folder.php&lt;br /&gt;
+++ b/libraries/joomla/filesystem/folder.php&lt;br /&gt;
@@ -467,13 +467,14 @@&lt;br /&gt;
 	 * @param   boolean  $full           True to return the full path to the file.&lt;br /&gt;
 	 * @param   array    $exclude        Array with names of files which should not be shown in the result.&lt;br /&gt;
 	 * @param   array    $excludefilter  Array of filter to exclude&lt;br /&gt;
 +	 * @param   boolean  $naturalSort    False for asort, true for natsort&lt;br /&gt;
 	 *&lt;br /&gt;
 	 * @return  array  Files in the given folder.&lt;br /&gt;
 	 *&lt;br /&gt;
 	 * @since   11.1&lt;br /&gt;
 	 */&lt;br /&gt;
 	public static function files($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'),&lt;br /&gt;
 -		$excludefilter = array('^\..*', '.*~'))&lt;br /&gt;
 +		$excludefilter = array('^\..*', '.*~'), $naturalSort = false)&lt;br /&gt;
 	{&lt;br /&gt;
 		// Check to make sure the path valid and clean&lt;br /&gt;
 		$path = JPath::clean($path);&lt;br /&gt;
@@ -498,8 +499,15 @@&lt;br /&gt;
 		// Get the files&lt;br /&gt;
 		$arr = self::_items($path, $filter, $recurse, $full, $exclude, $excludefilter_string, true);&lt;br /&gt;
 &lt;br /&gt;
 -		// Sort the files&lt;br /&gt;
 -		asort($arr);&lt;br /&gt;
 +		// Sort the files based on either natural or alpha method&lt;br /&gt;
 +		if ($naturalSort)&lt;br /&gt;
 +		{&lt;br /&gt;
 +			natsort($arr);&lt;br /&gt;
 +		}&lt;br /&gt;
 +		else&lt;br /&gt;
 +		{&lt;br /&gt;
 +			asort($arr);&lt;br /&gt;
 +		}&lt;br /&gt;
 		return array_values($arr);&lt;br /&gt;
 	}&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2.5.10 FAQ]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Tags-not-installed-in-3.1.0</id>
		<title>Tags-not-installed-in-3.1.0</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Tags-not-installed-in-3.1.0"/>
				<updated>2013-04-27T08:03:18Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;If you have a message saying tags have not installed, it means that the full update sql did not run.  Updating to 3.1.1 may solve this issue.  If it does not or for some reaso...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you have a message saying tags have not installed, it means that the full update sql did not run.&lt;br /&gt;
&lt;br /&gt;
Updating to 3.1.1 may solve this issue.&lt;br /&gt;
&lt;br /&gt;
If it does not or for some reason you cannot update to 3.1.1 the following steps will resolve it.&lt;br /&gt;
&lt;br /&gt;
# In your file system go to /administration/components/com_admin/sql  and find the file 3.1.0.sql.  Open it in a plain text editor.&lt;br /&gt;
&lt;br /&gt;
# Determine your database prefix by looking at the server tab in global configuration or by looking at your database table names in phpmyadmin or whatever system your host provides for managing your database.  For example you may see xyz123_assets ... in this case xyz123 is your prefix.&lt;br /&gt;
&lt;br /&gt;
# In the text editor search and replace #_ with your prefix.  Note that the replace should only replace the first underscore ... so now you should have for example xyz123_content_types.&lt;br /&gt;
&lt;br /&gt;
# In phpmyadmin go to the SQL tab and paste the full file from the editor (or do similar in another system).&lt;br /&gt;
&lt;br /&gt;
# click Go (or do similar in another system)&lt;br /&gt;
&lt;br /&gt;
At this point tags will be fully installed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Version 3.1.0 FAQ]][[Category:Version 3.1.1 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Missing-intro-text-and-images-in_3.1.0</id>
		<title>Missing-intro-text-and-images-in 3.1.0</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Missing-intro-text-and-images-in_3.1.0"/>
				<updated>2013-04-27T07:52:14Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;Updating to 3.1.0 may lead to the &amp;quot;disappearance&amp;quot; of intro text and images from featured or blog article views.   To fix please update to 3.1.1.  If for some reason updating t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Updating to 3.1.0 may lead to the &amp;quot;disappearance&amp;quot; of intro text and images from featured or blog article views.  &lt;br /&gt;
To fix please update to 3.1.1.&lt;br /&gt;
&lt;br /&gt;
If for some reason updating to 3.1.1 is not possible, change &amp;quot;Show Intro Text&amp;quot; to Show.  &lt;br /&gt;
This may temporarily cause your full article to display the intro text when you don't want that.  In that case you should change the Show Intro Text for each impacted article to Hide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Version 3.0 FAQ]]&lt;br /&gt;
[[Category:Version 3.1.0 FAQ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/GNOME_Outreach_Program_for_Women</id>
		<title>GNOME Outreach Program for Women</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/GNOME_Outreach_Program_for_Women"/>
				<updated>2013-04-04T22:08:12Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: Created page with &amp;quot;here it is&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;here it is&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/GSOC_2013_Project_Ideas</id>
		<title>GSOC 2013 Project Ideas</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/GSOC_2013_Project_Ideas"/>
				<updated>2013-04-04T05:26:19Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Project: Add fieldtype 'oclock' in fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right; margin-left:1em; width:40%;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;[[Image:GSOC_2013.png|150px‎]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Welcome!==&lt;br /&gt;
Welcome to the Joomla! Google Summer of Code (GSoC) 2013 project ideas page. As we move forward with the 2013 version of the Joomla! GSoC, we will use this page to develop possible project ideas. Please note that anyone who is interested can participate in this process. You do not have to be a GSoC student or mentor to suggest possible project ideas. Please keep in mind that projects need to be realistically something that is able to be functionally completed by a student working full time for about eight weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
Discussion of ideas and other GSoC related items is welcome on our Google Group: https://groups.google.com/forum/?fromgroups#!forum/joomla-gsoc-2013&lt;br /&gt;
&lt;br /&gt;
If you are interested in participating as a student please review the materials on applying that are available at [http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2013/help_page Google].  We strongly encourage you to ask questions about process and ideas on the mailing list.&lt;br /&gt;
&lt;br /&gt;
If you are interested in serving as a mentor, please fill out the [https://docs.google.com/a/community.joomla.org/spreadsheet/viewform?formkey=dHA2V1lJbThYQXpwMERiRG1FOTZlV3c6MA Mentor Application Form 2013].&lt;br /&gt;
&lt;br /&gt;
==Ideas==&lt;br /&gt;
&lt;br /&gt;
Opportunities exist for students to work with projects from either the Joomla CMS, the Joomla Platform or in some cases a combination of both.&lt;br /&gt;
&lt;br /&gt;
In addition to this ideas list, the Joomla! Community is able to voice their opinion on features they would like to see via the [http://ideas.joomla.org/ Joomla! Idea Pool].  Those wishing to add ideas to this listing are encouraged to review the Idea Pool and base their idea on the input received there. You can also view the past lists for [http://docs.joomla.org/GSOC_2012_Project_Ideas 2012] [http://docs.joomla.org/Summer_of_Code_2010_Project_Ideas 2010] and [http://docs.joomla.org/Summer_of_Code_2009_Project_Ideas 2009], which may be useful for reference. We ask that you keep ideas realistic for the time frame that students will have to complete their projects.&lt;br /&gt;
&lt;br /&gt;
Unless a mentor has proposed a specific project, mentors from the mentor pool will be matched with student projects. However members of the mentor pool are available to answer questions on the Joomla GSoC mailing list.&lt;br /&gt;
&lt;br /&gt;
===Joomla CMS===&lt;br /&gt;
&lt;br /&gt;
* [http://github.com/joomla/joomla-cms Source Code]&lt;br /&gt;
* [http://groups.google.com/d/forum/joomla-dev-cms Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
====Project: Build New Media Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief Explanation:''' The current media manager is outdated and limited. Build a new media manager to include a better user interface, more robust functionality, and seamless integration for extensions to use. The improvements could include: &lt;br /&gt;
* Storage of media information in the database (including standard file property information, created by user and date, rights and other meta data and tracking of media as assets).&lt;br /&gt;
* Allow renaming of files&lt;br /&gt;
* Automated creation of thumbnails to dimensions that the webmaster can configure&lt;br /&gt;
* Support for a variety of media types that addresses security concerns &lt;br /&gt;
* Creation of a number of controllers for media manipulation such as cropping, resizing and filtering and implementation of their use.&lt;br /&gt;
* Use of nesting for management and display of media options&lt;br /&gt;
* Management of both local and remote media&lt;br /&gt;
* Support for creation of collections of media for example for display in a carousel as a separate content type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A new Media Manager component to improve the usability, functionality, and reusability of the extension.  Work should be fully documented and include system tests as well as unit tests for all new classes.&lt;br /&gt;
&lt;br /&gt;
: The work will likely include creation of a new media management package in the CMS library as well as reusable controllers for media related tasks. &lt;br /&gt;
&lt;br /&gt;
: The work should align with other work in the content model and the student should expect to interact extensively with the team working on the Joomla 3.2 release. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:'''  PHP, MySQL, Javascript, Joomla CMS, Joomla Platform, HTML5, Usability&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Convert JavaScript from MooTools to jQuery====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Version 3 of the CMS introduced [http://twitter.github.com/bootstrap Twitter Bootstrap] and [http://jquery.com jQuery] to the core code base.  Previous versions of the CMS had been using MooTools as the preferred JavaScript library.  Currently, both JavaScript libraries are shipped and used within the CMS, which occasionally causes conflicts with a user's JavaScript functionality.  The CMS would like to reduce the dependency on MooTools by converting its core JavaScript behaviors from MooTools to jQuery or providing custom solutions.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Dependency on MooTools is reduced within the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla CMS, PHP, JavaScript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: html contenteditable Ajax based front-end editor for articles, categories, tags and other content====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit all content (content, weblinks, contacts, newsfeeds and categories as well as any new types that are added in the future) from the front-end. Administrators should be able to configure front end editing for appropriate users to have access to the full set of fields available in the back end in the front end (rather than the limited set of fields now available).  All this should be done using Ajax.  This project should focus on editing data from the core_content table and will involve work with the team implementing the migration to core_content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: front-end editor for modules and menus====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content and allowing to insert new modules.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit modules (titles and content/settings, and inserting new modules including menus the front-end. There are a number of possible approaches this could take. For example, they could possibly use the administration interface in the front-end, otherwise with links to the corresponding administration page. This would at least allow to remove the guesswork of which module outputs what result. Using an open-source html-contenteditable javascript editor would help here in the formatting.  Another possibility would be to use a services model.&lt;br /&gt;
&lt;br /&gt;
Note: There will be some overlap here with the potential com_services project so project could be incorporated into that project or there could be coordination of the two projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Update and add new editor plugins====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla has a system of editor_xtd plugins that allow users to safely insert correct html for common items such as images, page breaks, and links to articles independent of the editor used.  This project will involve updating and adding new plugins and improving usabilty.  For example in terms of new plugins might include:&lt;br /&gt;
* A plugin that adds modal behaviour (JHTML::_('behavior.modal');). The plugin can be deactivated by a {}tag (like {modal state=0}). &lt;br /&gt;
* A plugin that allows safe embedding of external web services such as video or maps.&lt;br /&gt;
&lt;br /&gt;
Updating plugins would include generalizing the article plugin to work across all content types using the core_content table.&lt;br /&gt;
&lt;br /&gt;
Here is an example of how a plan for a modal plugin would look:&lt;br /&gt;
&lt;br /&gt;
*Background: A link with the attribute 'class=&amp;quot;modal&amp;quot;' is opened in a kind of lightbox. Thus easily galleries can be generated. Additionally prepare editor(s) (e. g. via editor.css in template folder) to offer the modal class in their link edit display.&lt;br /&gt;
&lt;br /&gt;
*Expected Results: The modal behaviour is always available - if plugin is published and it is not forbidden by a tag. And a link with class 'modal' can easily be generated - via button and/or via editor.&lt;br /&gt;
Note that this may not be the ideal way to provide this functionality, it could be that the existing articles plugin is modified to allow a link type of modal for example. Thus this project would involve a careful review of existing plugins.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' New plugins for a number of useful items, updates to older plugins and improved user interface for the buttons.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy/Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Add plugin 'mvc override'====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Generate a plugin that enables the developer to overwrite models and controllers. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Any model and controller can be overridden.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Hathor is beautiful====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Make the admin template 'Hathor' more beautiful. Hathor is Isis' little sister. While Isis is breathtaking, Hathor still lacks a little css: She's edgy, and pale, and boring. Yet she always does what she is told. She deserves being tended a little. No additional functionality needed, no html changes, just css beauty.&lt;br /&gt;
&lt;br /&gt;
: Note that for Google Summer of Code here must be substantial coding involved in the project. In the case of Hathor this would likely involve work on making Bootstrap Javascript meet accessibility standards and work on the core administrator layouts.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Hathor is beautiful.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy&lt;br /&gt;
&lt;br /&gt;
====Project: Accesssible Backend Template====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' For most people, the internet has become the norm. Information from around the world is freely available.  But not all people are benefitting from it, especially those with  disabilities. For those who find it difficult to participate fully in social life, much can be gained from communication technology.  But they often face barriers which make it difficult to access information and applications. Take &amp;quot;looking for a job&amp;quot; as an example. The computer gives people with disabilities excellent prospects in overcoming limitations to find employment. Wouldn't it be nice if they  had full access to the Joomla backend?  New career opportunties would be opened up. If the requirements of accessibility are carefully met, it would make the system easier to understand and easier to use for all users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: We already, have an accessible backend Joomla template, but it is not very attractive and it is not using all the new technical possibilities.&lt;br /&gt;
: For this reason we are looking for someone who will use Bootstrap to build (with our support):&lt;br /&gt;
&lt;br /&gt;
: - an attractive, accessible design with good user guidance (layout &amp;amp; colors, contrast)&lt;br /&gt;
&lt;br /&gt;
: - a meaningful semantic structure based on web standards&lt;br /&gt;
&lt;br /&gt;
: Some preliminary steps have been made to get you started, but this remains a very complex endeavor.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Accessible admin template&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' WAI-ARIA, Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium-Hard&lt;br /&gt;
&lt;br /&gt;
: Posible mentors: Angie Radtke&lt;br /&gt;
&lt;br /&gt;
====Project: Refactor document model containers====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' When I say document model containers, what I'm really talking about is all those arrays in the document model that store things like metas, scripts, css, etc. Those can be rendered collectively in the template using the jdoc head tag. The project would refactor the document model to allow more robust methods of working with document containers. One solution would be to use PHP ArrayObjects instead of simple arrays.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A robust solution should allow methods for appending and prepending items, method chaining, and the ability to create custom containers from within extensions and templates.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP, some html, some css, and some javascript.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* Joomla! Forums topic: [[jtopic:793482|The ArrayObject - a different approach to document containers]]&lt;br /&gt;
:: (the editor would not allow me to post the link)&lt;br /&gt;
&lt;br /&gt;
====Project: Add new &amp;quot;fancy&amp;quot;  fieldtypes such as an 'oclock'  field====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla!'s form generation offers a fix group of field types, such as text, textarea, radio, calendar etc. Write a group of new, javascript/AJAX fields that will provide fancier field types for the cms. For example write another field that enables the developer to create a time field, call it 'oclock' or something else sensible. The display of the time should be configurable via a format attribute. It should have the look'n'feel of the calendar field ([[Calendar form field type|Calendar form field type]])  Another project would be to create a built in way to use AJAX to create new fields  such as  a field type that lets you enter multiple items, creating a new field each time an old one is submitted.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Generation of a new set of advanced fields&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript, web standards, Bootstrap&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Task scheduler and manager====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Manage ,schedule and create tasks, from CMS administrator side, such as backup, virus scan, billing, reports, emailing and so on&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''': The student will be expected to build an hosting agnostic solution that act as a framework to manage task, allowing to manage tasks from third party extensions too, and some ready to run common task&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Batch_processing&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Scheduling_(computing)&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Cron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Webcron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Daemon_(computing)&lt;br /&gt;
:* https://github.com/joomla/joomla-platform-examples/blob/master/cli/cron-plugins/run.php&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''': PHP, Joomla CMS, Joomla Platform, Mysql, Operating Systems.&lt;br /&gt;
:'''Difficulty:''' Hard&lt;br /&gt;
:'''Possible Mentors:''' Nicola Galgano&lt;br /&gt;
&lt;br /&gt;
====Project: Improvements to Template Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Templates are one of the most important elements of the Joomla CMS but except for the addition of template styles and template copy the functionality of the template manager has not changed dramatically since 1.5.  Currently users must go outside of the template manager to add CSS, to add or modify override files or to manage their LESS. This project will make working with templates easier and more user friendly.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' By the end of the summer the student will produce fully documented and system tested code to do at least the following tasks in the template manager user interface:&lt;br /&gt;
:* See a list of overrides for a template&lt;br /&gt;
:* Edit the overrides for a template&lt;br /&gt;
:* Create a new override for a template (ideally with option to copy the core layout as a starting point)&lt;br /&gt;
:* Add a new CSS file to a template&lt;br /&gt;
:* Edit LESS file&lt;br /&gt;
:* Compile LESS&lt;br /&gt;
:* Upload images to a template's image&lt;br /&gt;
:* Provide a method of simple interaction with web based font and other providers.&lt;br /&gt;
Exact details to be developed in discussion with mentors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Familiarity with the Joomla CMS and templates, PHP, file management, usability, javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
==== Project: Remote web services management system for CMS 3====&lt;br /&gt;
:'''Brief explanation:'''  Integration with remote services is a central feature of the modern web. This Joomla CMS should provide ways for webmasters to seamlessly and easily manage their interactions withe external service providers.  &lt;br /&gt;
:'''Expected Results:''' A system for managing interactions with external services.  This would include but not be limited to:&lt;br /&gt;
:* Secure management of public and private keys using Keychain&lt;br /&gt;
:* Storage of relevant urls&lt;br /&gt;
:* Methods to safely manage embedding by front end users&lt;br /&gt;
:* Plugins for Google, Twitter and Facebook authentication&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, Joomla CMS, Web Servics&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Redesign Users Profiles as a Form of Content for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Build a new way to manage and display user profiles as a content type stored in the core content table with a combination of systems including both he current profile plugin system and new ways of approaching this including the use of the core fields for body, images, urls and xreference. At the same time improve integration with contact data providing the ability to easily search and sort and send email as well as to have complex layouts and integration of web services. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A front end user profile system that provides a flexible way to create and manage use profiles. This system will follow Joomla design patterns and be fully documented, have unit tests for any classes, and have system tests.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, usability, familiarity with the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Create com_services for front end website administration for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The user experience for beginning site administrators in particular but also all site administrators will be improved if they can carry out basic administrative tasks such as updating the site title, meta data and email address, clearing cache, setting component defaults and doing basic user management in the front end. In this project you will provide a RESTful service and front end interface to that service to allow this. Specific tasks to be implemented will be decided in discussion with the mentors. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A basic services based system for managing certain administrative tasks from the front end of the Joomla CMS. This will be fully documented, have automated tests, and follow Joomla development best practices. It will also be extensible so that additional tasks can be added over time.  This project will not involve content, only administrative tasks.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, web services, security practices, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Webdriver system tests for CMS ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Automated system tests allow us to test the CMS by automatically running Joomla from a browser, selecting menu options, and evaluating results. At present, most of the system tests are written using the now-outdated Selenium RC program. A small number of tests are currently completed using the newer Selenium Webdriver technology and using the [https://code.google.com/p/selenium/wiki/PageObjects Page Objects] pattern to separate the page objects from the test objects. This project will build on the current base of Webdriver tests and expand the test coverage to include more of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will complete the following tasks. &lt;br /&gt;
:# Create a strategy &amp;amp; roadmap for Joomla system tests. This will include things like:&lt;br /&gt;
:## How to organize the tests.&lt;br /&gt;
:## How to cover the critical back-end and front-end functionality of Joomla.&lt;br /&gt;
:# Write the reusable foundation classes for the expanded test coverage. These classes will be used to create the page object classes and test classes for the various portions of the CMS.&lt;br /&gt;
:# Begin the implementation of the roadmap.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, object-oriented programming, Joomla CMS (from a user point of view), HTML&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Mark Dexter&lt;br /&gt;
&lt;br /&gt;
====Project: Create a '''translating tool''' extension for Joomla ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Projects like Facebook (see [http://www.insidefacebook.com/2008/04/02/now-you-can-help-translate-facebook-into-any-language/ insidefacebook.com/...]), RememberTheMilk ([http://www.rememberthemilk.com/services/translate/ http://www.rememberthemilk.com/...]) or other projects using [https://www.transifex.com] are taking advantage of their communities in order to  localize their software. Joomla is being translated by its community into 64 languages but there is plenty of space for more languages and more community participation.&lt;br /&gt;
At the same time many Joomla 3rd party developers are searching for a solution on how their communities can contribute in the translation of their extensions. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' It is a Goal for this GSoC 2013 project to create an improved tool based in [http://extensions.joomla.org/extensions/languages/language-edition/17755 com_localise] that allows to translators to easily translate and upload their translations to a GitHub repository using [http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Github.html JGithub package]. The tool also should allow frontend community members to suggest translated strings just like Facebook or Rememerthemilk does.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Git/Github, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Medium-Hard&lt;br /&gt;
&lt;br /&gt;
:'''Posible mentors:'''  Javier Gómez, Jean Marie Simonet, Edvard Ananyan&lt;br /&gt;
&lt;br /&gt;
====Project: Module Modernization====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Modules are an important part of the CMS but many of the modules have not been updated in many years and do not take advantage of new features like JImage or JQuery, JLayouts, or PHP 5. In addition aspects of module handling such as loadposition/loadmodule and the handling of modules in templates are due for refactoring and improvement as is the user interface of com_modules. This project will work on bringing modules up to date with the rest of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Updated modules and module handling. Although subject to discussion with mentors, some likely areas are:&lt;br /&gt;
*Review all modules and bring up to PHP 5.4 standards.&lt;br /&gt;
*Incorporate JImage into modules as appropriate for example embedding the introtext image in articles modules.&lt;br /&gt;
*Incorporate or add new modules incorporating JQuery features such as image carousels.&lt;br /&gt;
*Add new modules for obviously missing features such as display of contact information.&lt;br /&gt;
*Develop the use of JLayouts in modules for standardization.&lt;br /&gt;
*Update the handling of loadposition.&lt;br /&gt;
*Work on handling modules as content and treating them as assets (i.e. providing module level access control).&lt;br /&gt;
*Work on a way to create basic configurable module default settings for items such as show title or class suffix.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, Joomla CMS&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy to Medium &lt;br /&gt;
&lt;br /&gt;
:'''Possible mentors:''' Elin Waring&lt;br /&gt;
&lt;br /&gt;
====Project: Smart Search Improvements====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Smart Search is an advanced search system for the Joomla CMS. While extremely powerful, it does has some limitations that we would like to address.  First, it does always not properly handle some multibyte character sets and languages that do not use spaces between words. While partial solutions have been implemented, we would like to have more generic solutions. Also we would like to have a smart search interface in the Joomla Administrator and with the move to the core content model, to have better ties between smart search and other parts of the code base as well as extensions (how about an automated way to create a smart search plugin?). Finally, we would like to see some ongoing issues addressed including time out problems in the CLI application and modernization of queries and code to take advantage of newer databases and PHP versions as well as more parts of the Joomla API.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A much improved Smart Search shipped as part of Joomla CMS 3.2. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, search principles, Joomla platform, Smart Search.  &lt;br /&gt;
 &lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
===Joomla Framework===&lt;br /&gt;
&lt;br /&gt;
The Joomla Platform allows for ideas that can work within the Joomla CMS, or could be completely separate applications that have no connection at all. The Joomla Platform allows for applications to be built for the command line, process daemons and the web. The follow list outlines some ideas that will be immediately useful for the Joomla Platform project that a student may consider taking on. In addition to PHP libraries, the Joomla Platform also ships with MooTools and project ideas can be related to client-side operations as well as server-side. One emphasis on this year's list is on the incorporation of packages for accessing web services, however other ideas for libraries and packages are welcome. In some instances multiple students may work on different aspects of the project.  Two examples of this are unit testing and JStemmer.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
*[http://github.com/joomla/joomla-platform github Source Code]&lt;br /&gt;
*[http://developer.joomla.org/strategy.html Development Strategy]&lt;br /&gt;
*[http://groups.google.com/d/forum/joomla-dev-platform Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
All code contributions must follow Joomla coding standards and include full unit test coverage.&lt;br /&gt;
&lt;br /&gt;
====Project: Platform Unit Testing====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The Joomla Platform has a good suite of automated Unit Tests, but code coverage is lacking in some areas. The goal of this project is to improve the code coverage by writing unit tests for the Joomla Platform.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will be expected to review the current [http://developer.joomla.org/coverage/ code coverage report] for the Joomla Platform and write and agreed-upon number of unit tests with particular attention to packages that are below 50% coverage. Preference should be given to non-deprecated classes but the student may choose from either the core tree (/libraries/joomla) or the legacy tree (/libraries/legacy).&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, PHPUnit&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Object Relational Mapping (ORM) in Joomla====&lt;br /&gt;
&lt;br /&gt;
:'''Explanation:''' Implementation of Object Relational Mapping to provide an exiting new basis for building (complex) applications on or within Joomla.&lt;br /&gt;
&lt;br /&gt;
:Joomla uses an Active Record implementation. Via JTable and JTableNested data are CRUDded in models to and from database tables. Tables for different content types share the same kind of data and therefore code is duplicated. There are plans to solve this with a Unified Content Model (UCM), which will use a shared table for all content and a specialised table per content type. In order to implement that a JData class was made to store data in and a JDataMapper to map the database tables to the data. In terms of Martin Fowler's Patterns of Enterprise Architecture Patterns: Class Table Inheritance. This UCM would be a replacement for the current JTable classes and components. &lt;br /&gt;
&lt;br /&gt;
:Object Relational Mapping, especially when one-to-many and many-to-many relations are in play, has already been worked out in the PHP-world with ORM-frameworks like Propel and Doctrine. No need to reinvent a complete new wheel. Some work has been done to use Doctrine ORM in Joomla extensions, but it could be made more generally usable and easily available to open a lot of possibilities. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' &lt;br /&gt;
:The focus for such a GSOC-project could be one of the following:&lt;br /&gt;
:* a more general ORM interface in which specific ORM packages could fit; be it a &amp;quot;native&amp;quot; JDataMapper or other 3rd party ORM packages.&lt;br /&gt;
:* or a specific implementation (like Doctrine) with which core CMS extensions could be refactored. This would be a UCM-implementation using an existing ORM package.&lt;br /&gt;
:Both the Joomla Platform/Framework and the CMS would benefit from such projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Object Relational Mapping theory.&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://martinfowler.com/eaaCatalog/ and http://www.martinfowler.com/books/eaa.html&lt;br /&gt;
:* http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html&lt;br /&gt;
:* https://github.com/eBaySF/joomla-platform/blob/data-package/docs/manual/en-US/chapters/packages/data.md#jdatamapper&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Herman Peeren&lt;br /&gt;
&lt;br /&gt;
====Project: Expand Google API coverage====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The JGoogle package provides a basic structure for using Google APIs in Joomla based code. However it only includes classes for a limited set of APIs.  Your task is to dramatically expand the coverage of Google data. Specific APIs to be agreed upon with mentors, with some preference for those of immediate usefulness to the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A set of well coded, fully unit tested and documented implementations for a range of Google data.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Github, PHPUnit, familiarity with web services and the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/GSOC_2013_Project_Ideas</id>
		<title>GSOC 2013 Project Ideas</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/GSOC_2013_Project_Ideas"/>
				<updated>2013-04-04T04:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Project: front-end editor for modules and menus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right; margin-left:1em; width:40%;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;[[Image:GSOC_2013.png|150px‎]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Welcome!==&lt;br /&gt;
Welcome to the Joomla! Google Summer of Code (GSoC) 2013 project ideas page. As we move forward with the 2013 version of the Joomla! GSoC, we will use this page to develop possible project ideas. Please note that anyone who is interested can participate in this process. You do not have to be a GSoC student or mentor to suggest possible project ideas. Please keep in mind that projects need to be realistically something that is able to be functionally completed by a student working full time for about eight weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
Discussion of ideas and other GSoC related items is welcome on our Google Group: https://groups.google.com/forum/?fromgroups#!forum/joomla-gsoc-2013&lt;br /&gt;
&lt;br /&gt;
If you are interested in participating as a student please review the materials on applying that are available at [http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2013/help_page Google].  We strongly encourage you to ask questions about process and ideas on the mailing list.&lt;br /&gt;
&lt;br /&gt;
If you are interested in serving as a mentor, please fill out the [https://docs.google.com/a/community.joomla.org/spreadsheet/viewform?formkey=dHA2V1lJbThYQXpwMERiRG1FOTZlV3c6MA Mentor Application Form 2013].&lt;br /&gt;
&lt;br /&gt;
==Ideas==&lt;br /&gt;
&lt;br /&gt;
Opportunities exist for students to work with projects from either the Joomla CMS, the Joomla Platform or in some cases a combination of both.&lt;br /&gt;
&lt;br /&gt;
In addition to this ideas list, the Joomla! Community is able to voice their opinion on features they would like to see via the [http://ideas.joomla.org/ Joomla! Idea Pool].  Those wishing to add ideas to this listing are encouraged to review the Idea Pool and base their idea on the input received there. You can also view the past lists for [http://docs.joomla.org/GSOC_2012_Project_Ideas 2012] [http://docs.joomla.org/Summer_of_Code_2010_Project_Ideas 2010] and [http://docs.joomla.org/Summer_of_Code_2009_Project_Ideas 2009], which may be useful for reference. We ask that you keep ideas realistic for the time frame that students will have to complete their projects.&lt;br /&gt;
&lt;br /&gt;
Unless a mentor has proposed a specific project, mentors from the mentor pool will be matched with student projects. However members of the mentor pool are available to answer questions on the Joomla GSoC mailing list.&lt;br /&gt;
&lt;br /&gt;
===Joomla CMS===&lt;br /&gt;
&lt;br /&gt;
* [http://github.com/joomla/joomla-cms Source Code]&lt;br /&gt;
* [http://groups.google.com/d/forum/joomla-dev-cms Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
====Project: Build New Media Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief Explanation:''' The current media manager is outdated and limited. Build a new media manager to include a better user interface, more robust functionality, and seamless integration for extensions to use. The improvements could include: &lt;br /&gt;
* Storage of media information in the database (including standard file property information, created by user and date, rights and other meta data and tracking of media as assets).&lt;br /&gt;
* Allow renaming of files&lt;br /&gt;
* Automated creation of thumbnails to dimensions that the webmaster can configure&lt;br /&gt;
* Support for a variety of media types that addresses security concerns &lt;br /&gt;
* Creation of a number of controllers for media manipulation such as cropping, resizing and filtering and implementation of their use.&lt;br /&gt;
* Use of nesting for management and display of media options&lt;br /&gt;
* Management of both local and remote media&lt;br /&gt;
* Support for creation of collections of media for example for display in a carousel as a separate content type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A new Media Manager component to improve the usability, functionality, and reusability of the extension.  Work should be fully documented and include system tests as well as unit tests for all new classes.&lt;br /&gt;
&lt;br /&gt;
: The work will likely include creation of a new media management package in the CMS library as well as reusable controllers for media related tasks. &lt;br /&gt;
&lt;br /&gt;
: The work should align with other work in the content model and the student should expect to interact extensively with the team working on the Joomla 3.2 release. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:'''  PHP, MySQL, Javascript, Joomla CMS, Joomla Platform, HTML5, Usability&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Convert JavaScript from MooTools to jQuery====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Version 3 of the CMS introduced [http://twitter.github.com/bootstrap Twitter Bootstrap] and [http://jquery.com jQuery] to the core code base.  Previous versions of the CMS had been using MooTools as the preferred JavaScript library.  Currently, both JavaScript libraries are shipped and used within the CMS, which occasionally causes conflicts with a user's JavaScript functionality.  The CMS would like to reduce the dependency on MooTools by converting its core JavaScript behaviors from MooTools to jQuery or providing custom solutions.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Dependency on MooTools is reduced within the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla CMS, PHP, JavaScript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: html contenteditable Ajax based front-end editor for articles, categories, tags and other content====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit all content (content, weblinks, contacts, newsfeeds and categories as well as any new types that are added in the future) from the front-end. Administrators should be able to configure front end editing for appropriate users to have access to the full set of fields available in the back end in the front end (rather than the limited set of fields now available).  All this should be done using Ajax.  This project should focus on editing data from the core_content table and will involve work with the team implementing the migration to core_content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: front-end editor for modules and menus====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content and allowing to insert new modules.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit modules (titles and content/settings, and inserting new modules including menus the front-end. There are a number of possible approaches this could take. For example, they could possibly use the administration interface in the front-end, otherwise with links to the corresponding administration page. This would at least allow to remove the guesswork of which module outputs what result. Using an open-source html-contenteditable javascript editor would help here in the formatting.  Another possibility would be to use a services model.&lt;br /&gt;
&lt;br /&gt;
Note: There will be some overlap here with the potential com_services project so project could be incorporated into that project or there could be coordination of the two projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Update and add new editor plugins====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla has a system of editor_xtd plugins that allow users to safely insert correct html for common items such as images, page breaks, and links to articles independent of the editor used.  This project will involve updating and adding new plugins and improving usabilty.  For example in terms of new plugins might include:&lt;br /&gt;
* A plugin that adds modal behaviour (JHTML::_('behavior.modal');). The plugin can be deactivated by a {}tag (like {modal state=0}). &lt;br /&gt;
* A plugin that allows safe embedding of external web services such as video or maps.&lt;br /&gt;
&lt;br /&gt;
Updating plugins would include generalizing the article plugin to work across all content types using the core_content table.&lt;br /&gt;
&lt;br /&gt;
Here is an example of how a plan for a modal plugin would look:&lt;br /&gt;
&lt;br /&gt;
*Background: A link with the attribute 'class=&amp;quot;modal&amp;quot;' is opened in a kind of lightbox. Thus easily galleries can be generated. Additionally prepare editor(s) (e. g. via editor.css in template folder) to offer the modal class in their link edit display.&lt;br /&gt;
&lt;br /&gt;
*Expected Results: The modal behaviour is always available - if plugin is published and it is not forbidden by a tag. And a link with class 'modal' can easily be generated - via button and/or via editor.&lt;br /&gt;
Note that this may not be the ideal way to provide this functionality, it could be that the existing articles plugin is modified to allow a link type of modal for example. Thus this project would involve a careful review of existing plugins.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' New plugins for a number of useful items, updates to older plugins and improved user interface for the buttons.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy/Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Add plugin 'mvc override'====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Generate a plugin that enables the developer to overwrite models and controllers. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Any model and controller can be overridden.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Hathor is beautiful====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Make the admin template 'Hathor' more beautiful. Hathor is Isis' little sister. While Isis is breathtaking, Hathor still lacks a little css: She's edgy, and pale, and boring. Yet she always does what she is told. She deserves being tended a little. No additional functionality needed, no html changes, just css beauty.&lt;br /&gt;
&lt;br /&gt;
: Note that for Google Summer of Code here must be substantial coding involved in the project. In the case of Hathor this would likely involve work on making Bootstrap Javascript meet accessibility standards and work on the core administrator layouts.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Hathor is beautiful.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy&lt;br /&gt;
&lt;br /&gt;
====Project: Accesssible Backend Template====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' For most people, the internet has become the norm. Information from around the world is freely available.  But not all people are benefitting from it, especially those with  disabilities. For those who find it difficult to participate fully in social life, much can be gained from communication technology.  But they often face barriers which make it difficult to access information and applications. Take &amp;quot;looking for a job&amp;quot; as an example. The computer gives people with disabilities excellent prospects in overcoming limitations to find employment. Wouldn't it be nice if they  had full access to the Joomla backend?  New career opportunties would be opened up. If the requirements of accessibility are carefully met, it would make the system easier to understand and easier to use for all users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: We already, have an accessible backend Joomla template, but it is not very attractive and it is not using all the new technical possibilities.&lt;br /&gt;
: For this reason we are looking for someone who will use Bootstrap to build (with our support):&lt;br /&gt;
&lt;br /&gt;
: - an attractive, accessible design with good user guidance (layout &amp;amp; colors, contrast)&lt;br /&gt;
&lt;br /&gt;
: - a meaningful semantic structure based on web standards&lt;br /&gt;
&lt;br /&gt;
: Some preliminary steps have been made to get you started, but this remains a very complex endeavor.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Accessible admin template&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' WAI-ARIA, Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium-Hard&lt;br /&gt;
&lt;br /&gt;
: Posible mentors: Angie Radtke&lt;br /&gt;
&lt;br /&gt;
====Project: Refactor document model containers====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' When I say document model containers, what I'm really talking about is all those arrays in the document model that store things like metas, scripts, css, etc. Those can be rendered collectively in the template using the jdoc head tag. The project would refactor the document model to allow more robust methods of working with document containers. One solution would be to use PHP ArrayObjects instead of simple arrays.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A robust solution should allow methods for appending and prepending items, method chaining, and the ability to create custom containers from within extensions and templates.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP, some html, some css, and some javascript.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* Joomla! Forums topic: [[jtopic:793482|The ArrayObject - a different approach to document containers]]&lt;br /&gt;
:: (the editor would not allow me to post the link)&lt;br /&gt;
&lt;br /&gt;
====Project: Add fieldtype 'oclock' in fields====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla!'s form generation offers a fix group of field types, such as text, textarea, radio, calendar etc. Write another field that enables the developer to create a time field, call it 'oclock' or something else sensible. The display of the time should be configurable via a format attribute. It should have the look'n'feel of the calendar field ([[Calendar form field type|Calendar form field type]])&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Generation of a time field called in xml via &amp;lt;field type=&amp;quot;oclock&amp;quot; .../&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Task scheduler and manager====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Manage ,schedule and create tasks, from CMS administrator side, such as backup, virus scan, billing, reports, emailing and so on&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''': The student will be expected to build an hosting agnostic solution that act as a framework to manage task, allowing to manage tasks from third party extensions too, and some ready to run common task&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Batch_processing&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Scheduling_(computing)&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Cron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Webcron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Daemon_(computing)&lt;br /&gt;
:* https://github.com/joomla/joomla-platform-examples/blob/master/cli/cron-plugins/run.php&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''': PHP, Joomla CMS, Joomla Platform, Mysql, Operating Systems.&lt;br /&gt;
:'''Difficulty:''' Hard&lt;br /&gt;
:'''Possible Mentors:''' Nicola Galgano&lt;br /&gt;
&lt;br /&gt;
====Project: Improvements to Template Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Templates are one of the most important elements of the Joomla CMS but except for the addition of template styles and template copy the functionality of the template manager has not changed dramatically since 1.5.  Currently users must go outside of the template manager to add CSS, to add or modify override files or to manage their LESS. This project will make working with templates easier and more user friendly.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' By the end of the summer the student will produce fully documented and system tested code to do at least the following tasks in the template manager user interface:&lt;br /&gt;
:* See a list of overrides for a template&lt;br /&gt;
:* Edit the overrides for a template&lt;br /&gt;
:* Create a new override for a template (ideally with option to copy the core layout as a starting point)&lt;br /&gt;
:* Add a new CSS file to a template&lt;br /&gt;
:* Edit LESS file&lt;br /&gt;
:* Compile LESS&lt;br /&gt;
:* Upload images to a template's image&lt;br /&gt;
:* Provide a method of simple interaction with web based font and other providers.&lt;br /&gt;
Exact details to be developed in discussion with mentors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Familiarity with the Joomla CMS and templates, PHP, file management, usability, javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
==== Project: Remote web services management system for CMS 3====&lt;br /&gt;
:'''Brief explanation:'''  Integration with remote services is a central feature of the modern web. This Joomla CMS should provide ways for webmasters to seamlessly and easily manage their interactions withe external service providers.  &lt;br /&gt;
:'''Expected Results:''' A system for managing interactions with external services.  This would include but not be limited to:&lt;br /&gt;
:* Secure management of public and private keys using Keychain&lt;br /&gt;
:* Storage of relevant urls&lt;br /&gt;
:* Methods to safely manage embedding by front end users&lt;br /&gt;
:* Plugins for Google, Twitter and Facebook authentication&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, Joomla CMS, Web Servics&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Redesign Users Profiles as a Form of Content for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Build a new way to manage and display user profiles as a content type stored in the core content table with a combination of systems including both he current profile plugin system and new ways of approaching this including the use of the core fields for body, images, urls and xreference. At the same time improve integration with contact data providing the ability to easily search and sort and send email as well as to have complex layouts and integration of web services. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A front end user profile system that provides a flexible way to create and manage use profiles. This system will follow Joomla design patterns and be fully documented, have unit tests for any classes, and have system tests.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, usability, familiarity with the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Create com_services for front end website administration for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The user experience for beginning site administrators in particular but also all site administrators will be improved if they can carry out basic administrative tasks such as updating the site title, meta data and email address, clearing cache, setting component defaults and doing basic user management in the front end. In this project you will provide a RESTful service and front end interface to that service to allow this. Specific tasks to be implemented will be decided in discussion with the mentors. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A basic services based system for managing certain administrative tasks from the front end of the Joomla CMS. This will be fully documented, have automated tests, and follow Joomla development best practices. It will also be extensible so that additional tasks can be added over time.  This project will not involve content, only administrative tasks.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, web services, security practices, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Webdriver system tests for CMS ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Automated system tests allow us to test the CMS by automatically running Joomla from a browser, selecting menu options, and evaluating results. At present, most of the system tests are written using the now-outdated Selenium RC program. A small number of tests are currently completed using the newer Selenium Webdriver technology and using the [https://code.google.com/p/selenium/wiki/PageObjects Page Objects] pattern to separate the page objects from the test objects. This project will build on the current base of Webdriver tests and expand the test coverage to include more of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will complete the following tasks. &lt;br /&gt;
:# Create a strategy &amp;amp; roadmap for Joomla system tests. This will include things like:&lt;br /&gt;
:## How to organize the tests.&lt;br /&gt;
:## How to cover the critical back-end and front-end functionality of Joomla.&lt;br /&gt;
:# Write the reusable foundation classes for the expanded test coverage. These classes will be used to create the page object classes and test classes for the various portions of the CMS.&lt;br /&gt;
:# Begin the implementation of the roadmap.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, object-oriented programming, Joomla CMS (from a user point of view), HTML&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Mark Dexter&lt;br /&gt;
&lt;br /&gt;
====Project: Create a '''translating tool''' extension for Joomla ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Projects like Facebook (see [http://www.insidefacebook.com/2008/04/02/now-you-can-help-translate-facebook-into-any-language/ insidefacebook.com/...]), RememberTheMilk ([http://www.rememberthemilk.com/services/translate/ http://www.rememberthemilk.com/...]) or other projects using [https://www.transifex.com] are taking advantage of their communities in order to  localize their software. Joomla is being translated by its community into 64 languages but there is plenty of space for more languages and more community participation.&lt;br /&gt;
At the same time many Joomla 3rd party developers are searching for a solution on how their communities can contribute in the translation of their extensions. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' It is a Goal for this GSoC 2013 project to create an improved tool based in [http://extensions.joomla.org/extensions/languages/language-edition/17755 com_localise] that allows to translators to easily translate and upload their translations to a GitHub repository using [http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Github.html JGithub package]. The tool also should allow frontend community members to suggest translated strings just like Facebook or Rememerthemilk does.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Git/Github, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Medium-Hard&lt;br /&gt;
&lt;br /&gt;
:'''Posible mentors:'''  Javier Gómez, Jean Marie Simonet, Edvard Ananyan&lt;br /&gt;
&lt;br /&gt;
====Project: Module Modernization====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Modules are an important part of the CMS but many of the modules have not been updated in many years and do not take advantage of new features like JImage or JQuery, JLayouts, or PHP 5. In addition aspects of module handling such as loadposition/loadmodule and the handling of modules in templates are due for refactoring and improvement as is the user interface of com_modules. This project will work on bringing modules up to date with the rest of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Updated modules and module handling. Although subject to discussion with mentors, some likely areas are:&lt;br /&gt;
*Review all modules and bring up to PHP 5.4 standards.&lt;br /&gt;
*Incorporate JImage into modules as appropriate for example embedding the introtext image in articles modules.&lt;br /&gt;
*Incorporate or add new modules incorporating JQuery features such as image carousels.&lt;br /&gt;
*Add new modules for obviously missing features such as display of contact information.&lt;br /&gt;
*Develop the use of JLayouts in modules for standardization.&lt;br /&gt;
*Update the handling of loadposition.&lt;br /&gt;
*Work on handling modules as content and treating them as assets (i.e. providing module level access control).&lt;br /&gt;
*Work on a way to create basic configurable module default settings for items such as show title or class suffix.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, Joomla CMS&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy to Medium &lt;br /&gt;
&lt;br /&gt;
:'''Possible mentors:''' Elin Waring&lt;br /&gt;
&lt;br /&gt;
====Project: Smart Search Improvements====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Smart Search is an advanced search system for the Joomla CMS. While extremely powerful, it does has some limitations that we would like to address.  First, it does always not properly handle some multibyte character sets and languages that do not use spaces between words. While partial solutions have been implemented, we would like to have more generic solutions. Also we would like to have a smart search interface in the Joomla Administrator and with the move to the core content model, to have better ties between smart search and other parts of the code base as well as extensions (how about an automated way to create a smart search plugin?). Finally, we would like to see some ongoing issues addressed including time out problems in the CLI application and modernization of queries and code to take advantage of newer databases and PHP versions as well as more parts of the Joomla API.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A much improved Smart Search shipped as part of Joomla CMS 3.2. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, search principles, Joomla platform, Smart Search.  &lt;br /&gt;
 &lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
===Joomla Framework===&lt;br /&gt;
&lt;br /&gt;
The Joomla Platform allows for ideas that can work within the Joomla CMS, or could be completely separate applications that have no connection at all. The Joomla Platform allows for applications to be built for the command line, process daemons and the web. The follow list outlines some ideas that will be immediately useful for the Joomla Platform project that a student may consider taking on. In addition to PHP libraries, the Joomla Platform also ships with MooTools and project ideas can be related to client-side operations as well as server-side. One emphasis on this year's list is on the incorporation of packages for accessing web services, however other ideas for libraries and packages are welcome. In some instances multiple students may work on different aspects of the project.  Two examples of this are unit testing and JStemmer.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
*[http://github.com/joomla/joomla-platform github Source Code]&lt;br /&gt;
*[http://developer.joomla.org/strategy.html Development Strategy]&lt;br /&gt;
*[http://groups.google.com/d/forum/joomla-dev-platform Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
All code contributions must follow Joomla coding standards and include full unit test coverage.&lt;br /&gt;
&lt;br /&gt;
====Project: Platform Unit Testing====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The Joomla Platform has a good suite of automated Unit Tests, but code coverage is lacking in some areas. The goal of this project is to improve the code coverage by writing unit tests for the Joomla Platform.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will be expected to review the current [http://developer.joomla.org/coverage/ code coverage report] for the Joomla Platform and write and agreed-upon number of unit tests with particular attention to packages that are below 50% coverage. Preference should be given to non-deprecated classes but the student may choose from either the core tree (/libraries/joomla) or the legacy tree (/libraries/legacy).&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, PHPUnit&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Object Relational Mapping (ORM) in Joomla====&lt;br /&gt;
&lt;br /&gt;
:'''Explanation:''' Implementation of Object Relational Mapping to provide an exiting new basis for building (complex) applications on or within Joomla.&lt;br /&gt;
&lt;br /&gt;
:Joomla uses an Active Record implementation. Via JTable and JTableNested data are CRUDded in models to and from database tables. Tables for different content types share the same kind of data and therefore code is duplicated. There are plans to solve this with a Unified Content Model (UCM), which will use a shared table for all content and a specialised table per content type. In order to implement that a JData class was made to store data in and a JDataMapper to map the database tables to the data. In terms of Martin Fowler's Patterns of Enterprise Architecture Patterns: Class Table Inheritance. This UCM would be a replacement for the current JTable classes and components. &lt;br /&gt;
&lt;br /&gt;
:Object Relational Mapping, especially when one-to-many and many-to-many relations are in play, has already been worked out in the PHP-world with ORM-frameworks like Propel and Doctrine. No need to reinvent a complete new wheel. Some work has been done to use Doctrine ORM in Joomla extensions, but it could be made more generally usable and easily available to open a lot of possibilities. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' &lt;br /&gt;
:The focus for such a GSOC-project could be one of the following:&lt;br /&gt;
:* a more general ORM interface in which specific ORM packages could fit; be it a &amp;quot;native&amp;quot; JDataMapper or other 3rd party ORM packages.&lt;br /&gt;
:* or a specific implementation (like Doctrine) with which core CMS extensions could be refactored. This would be a UCM-implementation using an existing ORM package.&lt;br /&gt;
:Both the Joomla Platform/Framework and the CMS would benefit from such projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Object Relational Mapping theory.&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://martinfowler.com/eaaCatalog/ and http://www.martinfowler.com/books/eaa.html&lt;br /&gt;
:* http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html&lt;br /&gt;
:* https://github.com/eBaySF/joomla-platform/blob/data-package/docs/manual/en-US/chapters/packages/data.md#jdatamapper&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Herman Peeren&lt;br /&gt;
&lt;br /&gt;
====Project: Expand Google API coverage====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The JGoogle package provides a basic structure for using Google APIs in Joomla based code. However it only includes classes for a limited set of APIs.  Your task is to dramatically expand the coverage of Google data. Specific APIs to be agreed upon with mentors, with some preference for those of immediate usefulness to the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A set of well coded, fully unit tested and documented implementations for a range of Google data.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Github, PHPUnit, familiarity with web services and the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Unified_Content_Model_Working_Group</id>
		<title>Unified Content Model Working Group</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Unified_Content_Model_Working_Group"/>
				<updated>2013-03-30T02:16:17Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Unified Content Model Working Group is a Production Working Group.                  UCM is powerful new tool that is proposed for inclusion in the Platform. What use will the CMS make of it, what are the backward compatibility issues involved, what new coding would be needed to use it in the CMS, and what are the implications for third party extensions are all open questions. &lt;br /&gt;
&lt;br /&gt;
==Coordinators &amp;amp; PLT Contact==&lt;br /&gt;
&lt;br /&gt;
Elin Waring&lt;br /&gt;
==Announcements==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==External resources==&lt;br /&gt;
&lt;br /&gt;
Background Materials&lt;br /&gt;
&lt;br /&gt;
The original code from eBay&lt;br /&gt;
&lt;br /&gt;
The first extended discussion on the platform mailing list.&lt;br /&gt;
&lt;br /&gt;
Rob Schley talk at Joomla Day New York&lt;br /&gt;
&lt;br /&gt;
Elin Waring slides for PWG lightning talks at Joomla and Beyond 2012&lt;br /&gt;
&lt;br /&gt;
Video of PWG Meeting at JAB 2012&lt;br /&gt;
&lt;br /&gt;
Video of session on UCM at Joomla World Conference&lt;br /&gt;
&lt;br /&gt;
Slides from Elin's session on UCM at JWC&lt;br /&gt;
&lt;br /&gt;
Sam's example of a web services application&lt;br /&gt;
&lt;br /&gt;
Stefan's GSOC application using UCM&lt;br /&gt;
&lt;br /&gt;
==Deliverables==&lt;br /&gt;
&lt;br /&gt;
Long term, a new Joomla application for the management of content.&lt;br /&gt;
&lt;br /&gt;
==Technical Work produced by this group==&lt;br /&gt;
&lt;br /&gt;
==Communications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
This effort can be thought of as two coordinated efforts:&lt;br /&gt;
* Work on the CMS 3 series to implement UCM for the core and extensions that wish to opt into it.&lt;br /&gt;
* Work on a the CMS 4 series that would be built around this model as well as other architectural changes.&lt;br /&gt;
&lt;br /&gt;
Steps&lt;br /&gt;
*Initial infrastructure for use of a single core table: 3.1.&lt;br /&gt;
*Migration to a he single core content table for all core components for 3.2&lt;br /&gt;
&lt;br /&gt;
==Meetings==&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation Working Group]]&lt;br /&gt;
[[Category:Working Groups]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/Unified_Content_Model_Working_Group</id>
		<title>Unified Content Model Working Group</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/Unified_Content_Model_Working_Group"/>
				<updated>2013-03-30T02:10:35Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Unified Content Model Working Group is a Production Working Group.                  UCM is powerful new tool that is proposed for inclusion in the Platform. What use will the CMS make of it, what are the backward compatibility issues involved, what new coding would be needed to use it in the CMS, and what are the implications for third party extensions are all open questions. &lt;br /&gt;
&lt;br /&gt;
==Coordinators &amp;amp; PLT Contact==&lt;br /&gt;
&lt;br /&gt;
Elin Waring&lt;br /&gt;
==Announcements==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==External resources==&lt;br /&gt;
&lt;br /&gt;
Background Materials&lt;br /&gt;
&lt;br /&gt;
The original code from eBay&lt;br /&gt;
&lt;br /&gt;
The first extended discussion on the platform mailing list.&lt;br /&gt;
&lt;br /&gt;
Rob Schley talk at Joomla Day New York&lt;br /&gt;
&lt;br /&gt;
Elin Waring slides for PWG lightning talks at Joomla and Beyond 2012&lt;br /&gt;
&lt;br /&gt;
Video of PWG Meeting at JAB 2012&lt;br /&gt;
&lt;br /&gt;
Video of session on UCM at Joomla World Conference&lt;br /&gt;
&lt;br /&gt;
Slides from Elin's session on UCM at JWC&lt;br /&gt;
&lt;br /&gt;
Sam's example of a web services application&lt;br /&gt;
&lt;br /&gt;
Stefan's GSOC application using UCM&lt;br /&gt;
&lt;br /&gt;
==Deliverables==&lt;br /&gt;
&lt;br /&gt;
Long term, a new Joomla application for the management of content.&lt;br /&gt;
&lt;br /&gt;
==Technical Work produced by this group==&lt;br /&gt;
&lt;br /&gt;
==Communications==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
Initial infrastructure for use of a single core table: 3.1.&lt;br /&gt;
Migration to a single core content table for all core components for 3.2&lt;br /&gt;
&lt;br /&gt;
==Meetings==&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation Working Group]]&lt;br /&gt;
[[Category:Working Groups]]&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/GSOC_2013_Project_Ideas</id>
		<title>GSOC 2013 Project Ideas</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/GSOC_2013_Project_Ideas"/>
				<updated>2013-03-29T04:21:27Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: /* Project: Module Modernization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right; margin-left:1em; width:40%;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;[[Image:GSOC_2013.png|150px‎]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Welcome!==&lt;br /&gt;
Welcome to the Joomla! Google Summer of Code (GSoC) 2013 project ideas page. As we move forward with the 2013 version of the Joomla! GSoC, we will use this page to develop possible project ideas. Please note that anyone who is interested can participate in this process. You do not have to be a GSoC student or mentor to suggest possible project ideas. Please keep in mind that projects need to be realistically something that is able to be functionally completed by a student working full time for about eight weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
Discussion of ideas and other GSoC related items is welcome on our Google Group: https://groups.google.com/forum/?fromgroups#!forum/joomla-gsoc-2013&lt;br /&gt;
&lt;br /&gt;
If you are interested in participating as a student please review the materials on applying that are available at [http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2013/help_page Google].  We strongly encourage you to ask questions about process and ideas on the mailing list.&lt;br /&gt;
&lt;br /&gt;
If you are interested in serving as a mentor, please fill out the [https://docs.google.com/a/community.joomla.org/spreadsheet/viewform?formkey=dHA2V1lJbThYQXpwMERiRG1FOTZlV3c6MA Mentor Application Form 2013].&lt;br /&gt;
&lt;br /&gt;
==Ideas==&lt;br /&gt;
&lt;br /&gt;
Opportunities exist for students to work with projects from either the Joomla CMS, the Joomla Platform or in some cases a combination of both.&lt;br /&gt;
&lt;br /&gt;
In addition to this ideas list, the Joomla! Community is able to voice their opinion on features they would like to see via the [http://ideas.joomla.org/ Joomla! Idea Pool].  Those wishing to add ideas to this listing are encouraged to review the Idea Pool and base their idea on the input received there. You can also view the past lists for [http://docs.joomla.org/GSOC_2012_Project_Ideas 2012] [http://docs.joomla.org/Summer_of_Code_2010_Project_Ideas 2010] and [http://docs.joomla.org/Summer_of_Code_2009_Project_Ideas 2009], which may be useful for reference. We ask that you keep ideas realistic for the time frame that students will have to complete their projects.&lt;br /&gt;
&lt;br /&gt;
Unless a mentor has proposed a specific project, mentors from the mentor pool will be matched with student projects. However members of the mentor pool are available to answer questions on the Joomla GSoC mailing list.&lt;br /&gt;
&lt;br /&gt;
===Joomla CMS===&lt;br /&gt;
&lt;br /&gt;
* [http://github.com/joomla/joomla-cms Source Code]&lt;br /&gt;
* [http://groups.google.com/d/forum/joomla-dev-cms Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
====Project: Build New Media Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief Explanation:''' The current media manager is outdated and limited. Build a new media manager to include a better user interface, more robust functionality, and seamless integration for extensions to use. The improvements could include: &lt;br /&gt;
* Storage of media information in the database (including standard file property information, created by user and date, rights and other meta data and tracking of media as assets).&lt;br /&gt;
* Allow renaming of files&lt;br /&gt;
* Automated creation of thumbnails to dimensions that the webmaster can configure&lt;br /&gt;
* Support for a variety of media types that addresses security concerns &lt;br /&gt;
* Creation of a number of controllers for media manipulation such as cropping, resizing and filtering and implementation of their use.&lt;br /&gt;
* Use of nesting for management and display of media options&lt;br /&gt;
* Management of both local and remote media&lt;br /&gt;
* Support for creation of collections of media for example for display in a carousel as a separate content type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A new Media Manager component to improve the usability, functionality, and reusability of the extension.  Work should be fully documented and include system tests as well as unit tests for all new classes.&lt;br /&gt;
&lt;br /&gt;
: The work will likely include creation of a new media management package in the CMS library as well as reusable controllers for media related tasks. &lt;br /&gt;
&lt;br /&gt;
: The work should align with other work in the content model and the student should expect to interact extensively with the team working on the Joomla 3.2 release. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:'''  PHP, MySQL, Javascript, Joomla CMS, Joomla Platform, HTML5, Usability&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Convert JavaScript from MooTools to jQuery====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Version 3 of the CMS introduced [http://twitter.github.com/bootstrap Twitter Bootstrap] and [http://jquery.com jQuery] to the core code base.  Previous versions of the CMS had been using MooTools as the preferred JavaScript library.  Currently, both JavaScript libraries are shipped and used within the CMS, which occasionally causes conflicts with a user's JavaScript functionality.  The CMS would like to reduce the dependency on MooTools by converting its core JavaScript behaviors from MooTools to jQuery or providing custom solutions.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Dependency on MooTools is reduced within the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla CMS, PHP, JavaScript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: html contenteditable Ajax based front-end editor for articles, categories, tags and other content====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit all content (content, weblinks, contacts, newsfeeds and categories as well as any new types that are added in the future) from the front-end. Administrators should be able to configure front end editing for appropriate users to have access to the full set of fields available in the back end in the front end (rather than the limited set of fields now available).  All this should be done using Ajax.  This project should focus on editing data from the core_content table and will involve work with the team implementing the migration to core_content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: front-end editor for modules and menus====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content and allowing to insert new modules.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit modules (titles and content/settings, and inserting new modules including menus the front-end. The modules and content parameters editing should not be re-invented but just use the administration interface, if possible in front-end, otherwise with links to the corresponding administration page. This would at least allow to remove the guesswork of which module outputs what result. Using an open-source html-contenteditable javascript editor would help here in the formatting.&lt;br /&gt;
&lt;br /&gt;
Note: There will be some overlap here with the potential com_services project so project could be incorporated into that project or there could be coordination of the two projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Update and add new editor plugins====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla has a system of editor_xtd plugins that allow users to safely insert correct html for common items such as images, page breaks, and links to articles independent of the editor used.  This project will involve updating and adding new plugins and improving usabilty.  For example in terms of new plugins might include:&lt;br /&gt;
* A plugin that adds modal behaviour (JHTML::_('behavior.modal');). The plugin can be deactivated by a {}tag (like {modal state=0}). &lt;br /&gt;
* A plugin that allows safe embedding of external web services such as video or maps.&lt;br /&gt;
&lt;br /&gt;
Updating plugins would include generalizing the article plugin to work across all content types using the core_content table.&lt;br /&gt;
&lt;br /&gt;
Here is an example of how a plan for a modal plugin would look:&lt;br /&gt;
&lt;br /&gt;
*Background: A link with the attribute 'class=&amp;quot;modal&amp;quot;' is opened in a kind of lightbox. Thus easily galleries can be generated. Additionally prepare editor(s) (e. g. via editor.css in template folder) to offer the modal class in their link edit display.&lt;br /&gt;
&lt;br /&gt;
*Expected Results: The modal behaviour is always available - if plugin is published and it is not forbidden by a tag. And a link with class 'modal' can easily be generated - via button and/or via editor.&lt;br /&gt;
Note that this may not be the ideal way to provide this functionality, it could be that the existing articles plugin is modified to allow a link type of modal for example. Thus this project would involve a careful review of existing plugins.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' New plugins for a number of useful items, updates to older plugins and improved user interface for the buttons.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy/Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Add plugin 'mvc override'====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Generate a plugin that enables the developer to overwrite models and controllers. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Any model and controller can be overridden.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Hathor is beautiful====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Make the admin template 'Hathor' more beautiful. Hathor is Isis' little sister. While Isis is breathtaking, Hathor still lacks a little css: She's edgy, and pale, and boring. Yet she always does what she is told. She deserves being tended a little. No additional functionality needed, no html changes, just css beauty.&lt;br /&gt;
&lt;br /&gt;
: Note that for Google Summer of Code here must be substantial coding involved in the project. In the case of Hathor this would likely involve work on making Bootstrap Javascript meet accessibility standards and work on the core administrator layouts.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Hathor is beautiful.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy&lt;br /&gt;
&lt;br /&gt;
====Project: Accesssible Backend Template====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' For most people, the internet has become the norm. Information from around the world is freely available.  But not all people are benefitting from it, especially those with  disabilities. For those who find it difficult to participate fully in social life, much can be gained from communication technology.  But they often face barriers which make it difficult to access information and applications. Take &amp;quot;looking for a job&amp;quot; as an example. The computer gives people with disabilities excellent prospects in overcoming limitations to find employment. Wouldn't it be nice if they  had full access to the Joomla backend?  New career opportunties would be opened up. If the requirements of accessibility are carefully met, it would make the system easier to understand and easier to use for all users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: We already, have an accessible backend Joomla template, but it is not very attractive and it is not using all the new technical possibilities.&lt;br /&gt;
: For this reason we are looking for someone who will use Bootstrap to build (with our support):&lt;br /&gt;
&lt;br /&gt;
: - an attractive, accessible design with good user guidance (layout &amp;amp; colors, contrast)&lt;br /&gt;
&lt;br /&gt;
: - a meaningful semantic structure based on web standards&lt;br /&gt;
&lt;br /&gt;
: Some preliminary steps have been made to get you started, but this remains a very complex endeavor.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Accessible admin template&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' WAI-ARIA, Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium-Hard&lt;br /&gt;
&lt;br /&gt;
: Posible mentors: Angie Radtke&lt;br /&gt;
&lt;br /&gt;
====Project: Refactor document model containers====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' When I say document model containers, what I'm really talking about is all those arrays in the document model that store things like metas, scripts, css, etc. Those can be rendered collectively in the template using the jdoc head tag. The project would refactor the document model to allow more robust methods of working with document containers. One solution would be to use PHP ArrayObjects instead of simple arrays.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A robust solution should allow methods for appending and prepending items, method chaining, and the ability to create custom containers from within extensions and templates.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP, some html, some css, and some javascript.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* Joomla! Forums topic: [[jtopic:793482|The ArrayObject - a different approach to document containers]]&lt;br /&gt;
:: (the editor would not allow me to post the link)&lt;br /&gt;
&lt;br /&gt;
====Project: Add fieldtype 'oclock' in fields====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla!'s form generation offers a fix group of field types, such as text, textarea, radio, calendar etc. Write another field that enables the developer to create a time field, call it 'oclock' or something else sensible. The display of the time should be configurable via a format attribute. It should have the look'n'feel of the calendar field ([[Calendar form field type|Calendar form field type]])&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Generation of a time field called in xml via &amp;lt;field type=&amp;quot;oclock&amp;quot; .../&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Task scheduler and manager====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Manage ,schedule and create tasks, from CMS administrator side, such as backup, virus scan, billing, reports, emailing and so on&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''': The student will be expected to build an hosting agnostic solution that act as a framework to manage task, allowing to manage tasks from third party extensions too, and some ready to run common task&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Batch_processing&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Scheduling_(computing)&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Cron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Webcron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Daemon_(computing)&lt;br /&gt;
:* https://github.com/joomla/joomla-platform-examples/blob/master/cli/cron-plugins/run.php&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''': PHP, Joomla CMS, Joomla Platform, Mysql, Operating Systems.&lt;br /&gt;
:'''Difficulty:''' Hard&lt;br /&gt;
:'''Possible Mentors:''' Nicola Galgano&lt;br /&gt;
&lt;br /&gt;
====Project: Improvements to Template Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Templates are one of the most important elements of the Joomla CMS but except for the addition of template styles and template copy the functionality of the template manager has not changed dramatically since 1.5.  Currently users must go outside of the template manager to add CSS, to add or modify override files or to manage their LESS. This project will make working with templates easier and more user friendly.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' By the end of the summer the student will produce fully documented and system tested code to do at least the following tasks in the template manager user interface:&lt;br /&gt;
:* See a list of overrides for a template&lt;br /&gt;
:* Edit the overrides for a template&lt;br /&gt;
:* Create a new override for a template (ideally with option to copy the core layout as a starting point)&lt;br /&gt;
:* Add a new CSS file to a template&lt;br /&gt;
:* Edit LESS file&lt;br /&gt;
:* Compile LESS&lt;br /&gt;
:* Upload images to a template's image&lt;br /&gt;
:* Provide a method of simple interaction with web based font and other providers.&lt;br /&gt;
Exact details to be developed in discussion with mentors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Familiarity with the Joomla CMS and templates, PHP, file management, usability, javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
==== Project: Remote web services management system for CMS 3====&lt;br /&gt;
:'''Brief explanation:'''  Integration with remote services is a central feature of the modern web. This Joomla CMS should provide ways for webmasters to seamlessly and easily manage their interactions withe external service providers.  &lt;br /&gt;
:'''Expected Results:''' A system for managing interactions with external services.  This would include but not be limited to:&lt;br /&gt;
:* Secure management of public and private keys using Keychain&lt;br /&gt;
:* Storage of relevant urls&lt;br /&gt;
:* Methods to safely manage embedding by front end users&lt;br /&gt;
:* Plugins for Google, Twitter and Facebook authentication&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, Joomla CMS, Web Servics&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Redesign Users Profiles as a Form of Content for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Build a new way to manage and display user profiles as a content type stored in the core content table with a combination of systems including both he current profile plugin system and new ways of approaching this including the use of the core fields for body, images, urls and xreference. At the same time improve integration with contact data providing the ability to easily search and sort and send email as well as to have complex layouts and integration of web services. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A front end user profile system that provides a flexible way to create and manage use profiles. This system will follow Joomla design patterns and be fully documented, have unit tests for any classes, and have system tests.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, usability, familiarity with the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Create com_services for front end website administration for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The user experience for beginning site administrators in particular but also all site administrators will be improved if they can carry out basic administrative tasks such as updating the site title, meta data and email address, clearing cache, setting component defaults and doing basic user management in the front end. In this project you will provide a RESTful service and front end interface to that service to allow this. Specific tasks to be implemented will be decided in discussion with the mentors. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A basic services based system for managing certain administrative tasks from the front end of the Joomla CMS. This will be fully documented, have automated tests, and follow Joomla development best practices. It will also be extensible so that additional tasks can be added over time.  This project will not involve content, only administrative tasks.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, web services, security practices, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Webdriver system tests for CMS ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Automated system tests allow us to test the CMS by automatically running Joomla from a browser, selecting menu options, and evaluating results. At present, most of the system tests are written using the now-outdated Selenium RC program. A small number of tests are currently completed using the newer Selenium Webdriver technology and using the [https://code.google.com/p/selenium/wiki/PageObjects Page Objects] pattern to separate the page objects from the test objects. This project will build on the current base of Webdriver tests and expand the test coverage to include more of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will complete the following tasks. &lt;br /&gt;
:# Create a strategy &amp;amp; roadmap for Joomla system tests. This will include things like:&lt;br /&gt;
:## How to organize the tests.&lt;br /&gt;
:## How to cover the critical back-end and front-end functionality of Joomla.&lt;br /&gt;
:# Write the reusable foundation classes for the expanded test coverage. These classes will be used to create the page object classes and test classes for the various portions of the CMS.&lt;br /&gt;
:# Begin the implementation of the roadmap.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, object-oriented programming, Joomla CMS (from a user point of view), HTML&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Mark Dexter&lt;br /&gt;
&lt;br /&gt;
====Project: Create a '''translating tool''' extension for Joomla ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Projects like Facebook (see [http://www.insidefacebook.com/2008/04/02/now-you-can-help-translate-facebook-into-any-language/ insidefacebook.com/...]), RememberTheMilk ([http://www.rememberthemilk.com/services/translate/ http://www.rememberthemilk.com/...]) or other projects using [https://www.transifex.com] are taking advantage of their communities in order to  localize their software. Joomla is being translated by its community into 64 languages but there is plenty of space for more languages and more community participation.&lt;br /&gt;
At the same time many Joomla 3rd party developers are searching for a solution on how their communities can contribute in the translation of their extensions. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' It is a Goal for this GSoC 2013 project to create an improved tool based in [http://extensions.joomla.org/extensions/languages/language-edition/17755 com_localise] that allows to translators to easily translate and upload their translations to a GitHub repository using [http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Github.html JGithub package]. The tool also should allow frontend community members to suggest translated strings just like Facebook or Rememerthemilk does.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Git/Github, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Medium-Hard&lt;br /&gt;
&lt;br /&gt;
:'''Posible mentors:'''  Javier Gómez, Jean Marie Simonet&lt;br /&gt;
&lt;br /&gt;
====Project: Module Modernization====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Modules are an important part of the CMS but many of the modules have not been updated in many years and do not take advantage of new features like JImage or JQuery, JLayouts, or PHP 5. In addition aspects of module handling such as loadposition/loadmodule and the handling of modules in templates are due for refactoring and improvement as is the user interface of com_modules. This project will work on bringing modules up to date with the rest of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Updated modules and module handling. Although subject to discussion with mentors, some likely areas are:&lt;br /&gt;
*Review all modules and bring up to PHP 5.4 standards.&lt;br /&gt;
*Incorporate JImage into modules as appropriate for example embedding the introtext image in articles modules.&lt;br /&gt;
*Incorporate or add new modules incorporating JQuery features such as image carousels.&lt;br /&gt;
*Add new modules for obviously missing features such as display of contact information.&lt;br /&gt;
*Develop the use of JLayouts in modules for standardization.&lt;br /&gt;
*Update the handling of loadposition.&lt;br /&gt;
*Work on handling modules as content and treating them as assets (i.e. providing module level access control).&lt;br /&gt;
*Work on a way to create basic configurable module default settings for items such as show title or class suffix.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, Joomla CMS&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy to Medium &lt;br /&gt;
&lt;br /&gt;
:'''Possible mentors:''' Elin Waring&lt;br /&gt;
&lt;br /&gt;
====Project: Smart Search Improvements====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Smart Search is an advanced search system for the Joomla CMS. While extremely powerful, it does has some limitations that we would like to address.  First, it does always not properly handle some multibyte character sets and languages that do not use spaces between words. While partial solutions have been implemented, we would like to have more generic solutions. Also we would like to have a smart search interface in the Joomla Administrator and with the move to the core content model, to have better ties between smart search and other parts of the code base as well as extensions (how about an automated way to create a smart search plugin?). Finally, we would like to see some ongoing issues addressed including time out problems in the CLI application and modernization of queries and code to take advantage of newer databases and PHP versions as well as more parts of the Joomla API.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A much improved Smart Search shipped as part of Joomla CMS 3.2. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, search principles, Joomla platform, Smart Search.  &lt;br /&gt;
 &lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
===Joomla Framework===&lt;br /&gt;
&lt;br /&gt;
The Joomla Platform allows for ideas that can work within the Joomla CMS, or could be completely separate applications that have no connection at all. The Joomla Platform allows for applications to be built for the command line, process daemons and the web. The follow list outlines some ideas that will be immediately useful for the Joomla Platform project that a student may consider taking on. In addition to PHP libraries, the Joomla Platform also ships with MooTools and project ideas can be related to client-side operations as well as server-side. One emphasis on this year's list is on the incorporation of packages for accessing web services, however other ideas for libraries and packages are welcome. In some instances multiple students may work on different aspects of the project.  Two examples of this are unit testing and JStemmer.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
*[http://github.com/joomla/joomla-platform github Source Code]&lt;br /&gt;
*[http://developer.joomla.org/strategy.html Development Strategy]&lt;br /&gt;
*[http://groups.google.com/d/forum/joomla-dev-platform Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
All code contributions must follow Joomla coding standards and include full unit test coverage.&lt;br /&gt;
&lt;br /&gt;
====Project: Platform Unit Testing====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The Joomla Platform has a good suite of automated Unit Tests, but code coverage is lacking in some areas. The goal of this project is to improve the code coverage by writing unit tests for the Joomla Platform.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will be expected to review the current [http://developer.joomla.org/coverage/ code coverage report] for the Joomla Platform and write and agreed-upon number of unit tests with particular attention to packages that are below 50% coverage. Preference should be given to non-deprecated classes but the student may choose from either the core tree (/libraries/joomla) or the legacy tree (/libraries/legacy).&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, PHPUnit&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Object Relational Mapping (ORM) in Joomla====&lt;br /&gt;
&lt;br /&gt;
:'''Explanation:''' Implementation of Object Relational Mapping to provide an exiting new basis for building (complex) applications on or within Joomla.&lt;br /&gt;
&lt;br /&gt;
:Joomla uses an Active Record implementation. Via JTable and JTableNested data are CRUDded in models to and from database tables. Tables for different content types share the same kind of data and therefore code is duplicated. There are plans to solve this with a Unified Content Model (UCM), which will use a shared table for all content and a specialised table per content type. In order to implement that a JData class was made to store data in and a JDataMapper to map the database tables to the data. In terms of Martin Fowler's Patterns of Enterprise Architecture Patterns: Class Table Inheritance. This UCM would be a replacement for the current JTable classes and components. &lt;br /&gt;
&lt;br /&gt;
:Object Relational Mapping, especially when one-to-many and many-to-many relations are in play, has already been worked out in the PHP-world with ORM-frameworks like Propel and Doctrine. No need to reinvent a complete new wheel. Some work has been done to use Doctrine ORM in Joomla extensions, but it could be made more generally usable and easily available to open a lot of possibilities. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' &lt;br /&gt;
:The focus for such a GSOC-project could be one of the following:&lt;br /&gt;
:* a more general ORM interface in which specific ORM packages could fit; be it a &amp;quot;native&amp;quot; JDataMapper or other 3rd party ORM packages.&lt;br /&gt;
:* or a specific implementation (like Doctrine) with which core CMS extensions could be refactored. This would be a UCM-implementation using an existing ORM package.&lt;br /&gt;
:Both the Joomla Platform/Framework and the CMS would benefit from such projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Object Relational Mapping theory.&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://martinfowler.com/eaaCatalog/ and http://www.martinfowler.com/books/eaa.html&lt;br /&gt;
:* http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html&lt;br /&gt;
:* https://github.com/eBaySF/joomla-platform/blob/data-package/docs/manual/en-US/chapters/packages/data.md#jdatamapper&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Herman Peeren&lt;br /&gt;
&lt;br /&gt;
====Project: Expand Google API coverage====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The JGoogle package provides a basic structure for using Google APIs in Joomla based code. However it only includes classes for a limited set of APIs.  Your task is to dramatically expand the coverage of Google data. Specific APIs to be agreed upon with mentors, with some preference for those of immediate usefulness to the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A set of well coded, fully unit tested and documented implementations for a range of Google data.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Github, PHPUnit, familiarity with web services and the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	<entry>
		<id>http://docs.joomla.org/GSOC_2013_Project_Ideas</id>
		<title>GSOC 2013 Project Ideas</title>
		<link rel="alternate" type="text/html" href="http://docs.joomla.org/GSOC_2013_Project_Ideas"/>
				<updated>2013-03-25T06:56:44Z</updated>
		
		<summary type="html">&lt;p&gt;Elin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right; margin-left:1em; width:40%;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;[[Image:GSOC_2013.png|150px‎]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Welcome!==&lt;br /&gt;
Welcome to the Joomla! Google Summer of Code (GSoC) 2013 project ideas page. As we move forward with the 2013 version of the Joomla! GSoC, we will use this page to develop possible project ideas. Please note that anyone who is interested can participate in this process. You do not have to be a GSoC student or mentor to suggest possible project ideas. Please keep in mind that projects need to be realistically something that is able to be functionally completed by a student working full time for about eight weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
Discussion of ideas and other GSoC related items is welcome on our Google Group: https://groups.google.com/forum/?fromgroups#!forum/joomla-gsoc-2013&lt;br /&gt;
&lt;br /&gt;
If you are interested in participating as a student please review the materials on applying that are available at [http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2013/help_page Google].  We strongly encourage you to ask questions about process and ideas on the mailing list.&lt;br /&gt;
&lt;br /&gt;
If you are interested in serving as a mentor, please fill out the [https://docs.google.com/a/community.joomla.org/spreadsheet/viewform?formkey=dHA2V1lJbThYQXpwMERiRG1FOTZlV3c6MA Mentor Application Form 2013].&lt;br /&gt;
&lt;br /&gt;
==Ideas==&lt;br /&gt;
&lt;br /&gt;
Opportunities exist for students to work with projects from either the Joomla CMS, the Joomla Platform or in some cases a combination of both.&lt;br /&gt;
&lt;br /&gt;
In addition to this ideas list, the Joomla! Community is able to voice their opinion on features they would like to see via the [http://ideas.joomla.org/ Joomla! Idea Pool].  Those wishing to add ideas to this listing are encouraged to review the Idea Pool and base their idea on the input received there. You can also view the past lists for [http://docs.joomla.org/GSOC_2012_Project_Ideas 2012] [http://docs.joomla.org/Summer_of_Code_2010_Project_Ideas 2010] and [http://docs.joomla.org/Summer_of_Code_2009_Project_Ideas 2009], which may be useful for reference. We ask that you keep ideas realistic for the time frame that students will have to complete their projects.&lt;br /&gt;
&lt;br /&gt;
Unless a mentor has proposed a specific project, mentors from the mentor pool will be matched with student projects. However members of the mentor pool are available to answer questions on the Joomla GSoC mailing list.&lt;br /&gt;
&lt;br /&gt;
===Joomla CMS===&lt;br /&gt;
&lt;br /&gt;
* [http://github.com/joomla/joomla-cms Source Code]&lt;br /&gt;
* [http://groups.google.com/d/forum/joomla-dev-cms Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
====Project: Build New Media Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief Explanation:''' The current media manager is outdated and limited. Build a new media manager to include a better user interface, more robust functionality, and seamless integration for extensions to use. The improvements could include: &lt;br /&gt;
* Storage of media information in the database (including standard file property information, created by user and date, rights and other meta data and tracking of media as assets).&lt;br /&gt;
* Allow renaming of files&lt;br /&gt;
* Automated creation of thumbnails to dimensions that the webmaster can configure&lt;br /&gt;
* Support for a variety of media types that addresses security concerns &lt;br /&gt;
* Creation of a number of controllers for media manipulation such as cropping, resizing and filtering and implementation of their use.&lt;br /&gt;
* Use of nesting for management and display of media options&lt;br /&gt;
* Management of both local and remote media&lt;br /&gt;
* Support for creation of collections of media for example for display in a carousel as a separate content type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A new Media Manager component to improve the usability, functionality, and reusability of the extension.  Work should be fully documented and include system tests as well as unit tests for all new classes.&lt;br /&gt;
&lt;br /&gt;
: The work will likely include creation of a new media management package in the CMS library as well as reusable controllers for media related tasks. &lt;br /&gt;
&lt;br /&gt;
: The work should align with other work in the content model and the student should expect to interact extensively with the team working on the Joomla 3.2 release. &lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:'''  PHP, MySQL, Javascript, Joomla CMS, Joomla Platform, HTML5, Usability&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Convert JavaScript from MooTools to jQuery====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Version 3 of the CMS introduced [http://twitter.github.com/bootstrap Twitter Bootstrap] and [http://jquery.com jQuery] to the core code base.  Previous versions of the CMS had been using MooTools as the preferred JavaScript library.  Currently, both JavaScript libraries are shipped and used within the CMS, which occasionally causes conflicts with a user's JavaScript functionality.  The CMS would like to reduce the dependency on MooTools by converting its core JavaScript behaviors from MooTools to jQuery or providing custom solutions.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Dependency on MooTools is reduced within the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla CMS, PHP, JavaScript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: html contenteditable Ajax based front-end editor for articles, categories, tags and other content====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit all content (content, weblinks, contacts, newsfeeds and categories as well as any new types that are added in the future) from the front-end. Administrators should be able to configure front end editing for appropriate users to have access to the full set of fields available in the back end in the front end (rather than the limited set of fields now available).  All this should be done using Ajax.  This project should focus on editing data from the core_content table and will involve work with the team implementing the migration to core_content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: front-end editor for modules and menus====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Allow seamless ajax-driven content-editing in the fronted of existing content and allowing to insert new modules.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Authors with ACL permissions should be able to directly edit modules (titles and content/settings, and inserting new modules including menus the front-end. The modules and content parameters editing should not be re-invented but just use the administration interface, if possible in front-end, otherwise with links to the corresponding administration page. This would at least allow to remove the guesswork of which module outputs what result. Using an open-source html-contenteditable javascript editor would help here in the formatting.&lt;br /&gt;
&lt;br /&gt;
Note: There will be some overlap here with the potential com_services project so project could be incorporated into that project or there could be coordination of the two projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' A good knowledge of Joomla, of jQuery and Ajax techniques would help a lot here.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Update and add new editor plugins====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla has a system of editor_xtd plugins that allow users to safely insert correct html for common items such as images, page breaks, and links to articles independent of the editor used.  This project will involve updating and adding new plugins and improving usabilty.  For example in terms of new plugins might include:&lt;br /&gt;
* A plugin that adds modal behaviour (JHTML::_('behavior.modal');). The plugin can be deactivated by a {}tag (like {modal state=0}). &lt;br /&gt;
* A plugin that allows safe embedding of external web services such as video or maps.&lt;br /&gt;
&lt;br /&gt;
Updating plugins would include generalizing the article plugin to work across all content types using the core_content table.&lt;br /&gt;
&lt;br /&gt;
Here is an example of how a plan for a modal plugin would look:&lt;br /&gt;
&lt;br /&gt;
*Background: A link with the attribute 'class=&amp;quot;modal&amp;quot;' is opened in a kind of lightbox. Thus easily galleries can be generated. Additionally prepare editor(s) (e. g. via editor.css in template folder) to offer the modal class in their link edit display.&lt;br /&gt;
&lt;br /&gt;
*Expected Results: The modal behaviour is always available - if plugin is published and it is not forbidden by a tag. And a link with class 'modal' can easily be generated - via button and/or via editor.&lt;br /&gt;
Note that this may not be the ideal way to provide this functionality, it could be that the existing articles plugin is modified to allow a link type of modal for example. Thus this project would involve a careful review of existing plugins.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' New plugins for a number of useful items, updates to older plugins and improved user interface for the buttons.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy/Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Add plugin 'mvc override'====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Generate a plugin that enables the developer to overwrite models and controllers. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Any model and controller can be overridden.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Hathor is beautiful====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Make the admin template 'Hathor' more beautiful. Hathor is Isis' little sister. While Isis is breathtaking, Hathor still lacks a little css: She's edgy, and pale, and boring. Yet she always does what she is told. She deserves being tended a little. No additional functionality needed, no html changes, just css beauty.&lt;br /&gt;
&lt;br /&gt;
: Note that for Google Summer of Code here must be substantial coding involved in the project. In the case of Hathor this would likely involve work on making Bootstrap Javascript meet accessibility standards and work on the core administrator layouts.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Hathor is beautiful.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy&lt;br /&gt;
&lt;br /&gt;
====Project: Accesssible Backend Template====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' For most people, the internet has become the norm. Information from around the world is freely available.  But not all people are benefitting from it, especially those with  disabilities. For those who find it difficult to participate fully in social life, much can be gained from communication technology.  But they often face barriers which make it difficult to access information and applications. Take &amp;quot;looking for a job&amp;quot; as an example. The computer gives people with disabilities excellent prospects in overcoming limitations to find employment. Wouldn't it be nice if they  had full access to the Joomla backend?  New career opportunties would be opened up. If the requirements of accessibility are carefully met, it would make the system easier to understand and easier to use for all users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: We already, have an accessible backend Joomla template, but it is not very attractive and it is not using all the new technical possibilities.&lt;br /&gt;
: For this reason we are looking for someone who will use Bootstrap to build (with our support):&lt;br /&gt;
&lt;br /&gt;
: - an attractive, accessible design with good user guidance (layout &amp;amp; colors, contrast)&lt;br /&gt;
&lt;br /&gt;
: - a meaningful semantic structure based on web standards&lt;br /&gt;
&lt;br /&gt;
: Some preliminary steps have been made to get you started, but this remains a very complex endeavor.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Accessible admin template&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' WAI-ARIA, Javascript, CSS, HTML, PHP&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium-Hard&lt;br /&gt;
&lt;br /&gt;
: Posible mentors: Angie Radtke&lt;br /&gt;
&lt;br /&gt;
====Project: Refactor document model containers====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' When I say document model containers, what I'm really talking about is all those arrays in the document model that store things like metas, scripts, css, etc. Those can be rendered collectively in the template using the jdoc head tag. The project would refactor the document model to allow more robust methods of working with document containers. One solution would be to use PHP ArrayObjects instead of simple arrays.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A robust solution should allow methods for appending and prepending items, method chaining, and the ability to create custom containers from within extensions and templates.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Joomla! CMS, PHP, some html, some css, and some javascript.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* Joomla! Forums topic: [[jtopic:793482|The ArrayObject - a different approach to document containers]]&lt;br /&gt;
:: (the editor would not allow me to post the link)&lt;br /&gt;
&lt;br /&gt;
====Project: Add fieldtype 'oclock' in fields====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Joomla!'s form generation offers a fix group of field types, such as text, textarea, radio, calendar etc. Write another field that enables the developer to create a time field, call it 'oclock' or something else sensible. The display of the time should be configurable via a format attribute. It should have the look'n'feel of the calendar field ([[Calendar form field type|Calendar form field type]])&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Generation of a time field called in xml via &amp;lt;field type=&amp;quot;oclock&amp;quot; .../&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, HTML, Javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
====Project: Task scheduler and manager====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Manage ,schedule and create tasks, from CMS administrator side, such as backup, virus scan, billing, reports, emailing and so on&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''': The student will be expected to build an hosting agnostic solution that act as a framework to manage task, allowing to manage tasks from third party extensions too, and some ready to run common task&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Batch_processing&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Scheduling_(computing)&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Cron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Webcron&lt;br /&gt;
:* http://en.wikipedia.org/wiki/Daemon_(computing)&lt;br /&gt;
:* https://github.com/joomla/joomla-platform-examples/blob/master/cli/cron-plugins/run.php&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''': PHP, Joomla CMS, Joomla Platform, Mysql, Operating Systems.&lt;br /&gt;
:'''Difficulty:''' Hard&lt;br /&gt;
:'''Possible Mentors:''' Nicola Galgano&lt;br /&gt;
&lt;br /&gt;
====Project: Improvements to Template Manager for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Templates are one of the most important elements of the Joomla CMS but except for the addition of template styles and template copy the functionality of the template manager has not changed dramatically since 1.5.  Currently users must go outside of the template manager to add CSS, to add or modify override files or to manage their LESS. This project will make working with templates easier and more user friendly.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' By the end of the summer the student will produce fully documented and system tested code to do at least the following tasks in the template manager user interface:&lt;br /&gt;
:* See a list of overrides for a template&lt;br /&gt;
:* Edit the overrides for a template&lt;br /&gt;
:* Create a new override for a template (ideally with option to copy the core layout as a starting point)&lt;br /&gt;
:* Add a new CSS file to a template&lt;br /&gt;
:* Edit LESS file&lt;br /&gt;
:* Compile LESS&lt;br /&gt;
:* Upload images to a template's image&lt;br /&gt;
:* Provide a method of simple interaction with web based font and other providers.&lt;br /&gt;
Exact details to be developed in discussion with mentors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Familiarity with the Joomla CMS and templates, PHP, file management, usability, javascript&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
==== Project: Remote web services management system for CMS 3====&lt;br /&gt;
:'''Brief explanation:'''  Integration with remote services is a central feature of the modern web. This Joomla CMS should provide ways for webmasters to seamlessly and easily manage their interactions withe external service providers.  &lt;br /&gt;
:'''Expected Results:''' A system for managing interactions with external services.  This would include but not be limited to:&lt;br /&gt;
:* Secure management of public and private keys using Keychain&lt;br /&gt;
:* Storage of relevant urls&lt;br /&gt;
:* Methods to safely manage embedding by front end users&lt;br /&gt;
:* Plugins for Google, Twitter and Facebook authentication&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, Joomla CMS, Web Servics&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Redesign Users Profiles as a Form of Content for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Build a new way to manage and display user profiles as a content type stored in the core content table with a combination of systems including both he current profile plugin system and new ways of approaching this including the use of the core fields for body, images, urls and xreference. At the same time improve integration with contact data providing the ability to easily search and sort and send email as well as to have complex layouts and integration of web services. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A front end user profile system that provides a flexible way to create and manage use profiles. This system will follow Joomla design patterns and be fully documented, have unit tests for any classes, and have system tests.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, usability, familiarity with the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Create com_services for front end website administration for CMS 3====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The user experience for beginning site administrators in particular but also all site administrators will be improved if they can carry out basic administrative tasks such as updating the site title, meta data and email address, clearing cache, setting component defaults and doing basic user management in the front end. In this project you will provide a RESTful service and front end interface to that service to allow this. Specific tasks to be implemented will be decided in discussion with the mentors. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A basic services based system for managing certain administrative tasks from the front end of the Joomla CMS. This will be fully documented, have automated tests, and follow Joomla development best practices. It will also be extensible so that additional tasks can be added over time.  This project will not involve content, only administrative tasks.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Javascript, web services, security practices, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Hard&lt;br /&gt;
&lt;br /&gt;
====Project: Webdriver system tests for CMS ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Automated system tests allow us to test the CMS by automatically running Joomla from a browser, selecting menu options, and evaluating results. At present, most of the system tests are written using the now-outdated Selenium RC program. A small number of tests are currently completed using the newer Selenium Webdriver technology and using the [https://code.google.com/p/selenium/wiki/PageObjects Page Objects] pattern to separate the page objects from the test objects. This project will build on the current base of Webdriver tests and expand the test coverage to include more of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will complete the following tasks. &lt;br /&gt;
:# Create a strategy &amp;amp; roadmap for Joomla system tests. This will include things like:&lt;br /&gt;
:## How to organize the tests.&lt;br /&gt;
:## How to cover the critical back-end and front-end functionality of Joomla.&lt;br /&gt;
:# Write the reusable foundation classes for the expanded test coverage. These classes will be used to create the page object classes and test classes for the various portions of the CMS.&lt;br /&gt;
:# Begin the implementation of the roadmap.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, object-oriented programming, Joomla CMS (from a user point of view), HTML&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Mark Dexter&lt;br /&gt;
&lt;br /&gt;
====Project: Create a '''translating tool''' extension for Joomla ====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Projects like Facebook (see [http://www.insidefacebook.com/2008/04/02/now-you-can-help-translate-facebook-into-any-language/ insidefacebook.com/...]), RememberTheMilk ([http://www.rememberthemilk.com/services/translate/ http://www.rememberthemilk.com/...]) or other projects using [https://www.transifex.com] are taking advantage of their communities in order to  localize their software. Joomla is being translated by its community into 64 languages but there is plenty of space for more languages and more community participation.&lt;br /&gt;
At the same time many Joomla 3rd party developers are searching for a solution on how their communities can contribute in the translation of their extensions. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' It is a Goal for this GSoC 2013 project to create an improved tool based in [http://extensions.joomla.org/extensions/languages/language-edition/17755 com_localise] that allows to translators to easily translate and upload their translations to a GitHub repository using [http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Github.html JGithub package]. The tool also should allow frontend community members to suggest translated strings just like Facebook or Rememerthemilk does.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, Git/Github, Joomla CMS and framework.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:'''  Medium-Hard&lt;br /&gt;
&lt;br /&gt;
:'''Posible mentors:'''  Javier Gómez, Jean Marie Simonet&lt;br /&gt;
&lt;br /&gt;
====Project: Module Modernization====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' Modules are an important part of the CMS but many of the modules have not been updated in many years and do not take advantage of new features like JImage or JQuery, JLayouts, or PHP 5. In addition aspects of module handling such as loadposition/loadmodule and the handling of modules in templates are due for refactoring and improvement as is the user interface of com_modules. This project will work on bringing modules up to date with the rest of the CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' Updated modules and module handling. Although subject to discussion with mentors, some likely areas are:&lt;br /&gt;
*Review all modules and bring up to PHP 5.4 standards.&lt;br /&gt;
*Incorporate JImage into modules as appropriate for example embedding the introtext image in articles modules.&lt;br /&gt;
*Incorporate or add new modules incorporating JQuery features such as image carousels.&lt;br /&gt;
*Add new modules for obviously missing features such as display of contact information.&lt;br /&gt;
*Develop the use of JLayouts in modules for standardization.&lt;br /&gt;
*Update the handling of loadposition.&lt;br /&gt;
*Work on handling modules as content and treating them as assets (i.e. providing module level access control).&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, SQL, Joomla CMS&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Easy to Medium &lt;br /&gt;
&lt;br /&gt;
:'''Posible mentors:''' Elin Waring&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
===Joomla Framework===&lt;br /&gt;
&lt;br /&gt;
The Joomla Platform allows for ideas that can work within the Joomla CMS, or could be completely separate applications that have no connection at all. The Joomla Platform allows for applications to be built for the command line, process daemons and the web. The follow list outlines some ideas that will be immediately useful for the Joomla Platform project that a student may consider taking on. In addition to PHP libraries, the Joomla Platform also ships with MooTools and project ideas can be related to client-side operations as well as server-side. One emphasis on this year's list is on the incorporation of packages for accessing web services, however other ideas for libraries and packages are welcome. In some instances multiple students may work on different aspects of the project.  Two examples of this are unit testing and JStemmer.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
*[http://github.com/joomla/joomla-platform github Source Code]&lt;br /&gt;
*[http://developer.joomla.org/strategy.html Development Strategy]&lt;br /&gt;
*[http://groups.google.com/d/forum/joomla-dev-platform Developer Mailing List]&lt;br /&gt;
&lt;br /&gt;
All code contributions must follow Joomla coding standards and include full unit test coverage.&lt;br /&gt;
&lt;br /&gt;
====Project: Platform Unit Testing====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The Joomla Platform has a good suite of automated Unit Tests, but code coverage is lacking in some areas. The goal of this project is to improve the code coverage by writing unit tests for the Joomla Platform.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' The student will be expected to review the current [http://developer.joomla.org/coverage/ code coverage report] for the Joomla Platform and write and agreed-upon number of unit tests with particular attention to packages that are below 50% coverage. Preference should be given to non-deprecated classes but the student may choose from either the core tree (/libraries/joomla) or the legacy tree (/libraries/legacy).&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' PHP, PHPUnit&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Project: Object Relational Mapping (ORM) in Joomla====&lt;br /&gt;
&lt;br /&gt;
:'''Explanation:''' Implementation of Object Relational Mapping to provide an exiting new basis for building (complex) applications on or within Joomla.&lt;br /&gt;
&lt;br /&gt;
:Joomla uses an Active Record implementation. Via JTable and JTableNested data are CRUDded in models to and from database tables. Tables for different content types share the same kind of data and therefore code is duplicated. There are plans to solve this with a Unified Content Model (UCM), which will use a shared table for all content and a specialised table per content type. In order to implement that a JData class was made to store data in and a JDataMapper to map the database tables to the data. In terms of Martin Fowler's Patterns of Enterprise Architecture Patterns: Class Table Inheritance. This UCM would be a replacement for the current JTable classes and components. &lt;br /&gt;
&lt;br /&gt;
:Object Relational Mapping, especially when one-to-many and many-to-many relations are in play, has already been worked out in the PHP-world with ORM-frameworks like Propel and Doctrine. No need to reinvent a complete new wheel. Some work has been done to use Doctrine ORM in Joomla extensions, but it could be made more generally usable and easily available to open a lot of possibilities. &lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' &lt;br /&gt;
:The focus for such a GSOC-project could be one of the following:&lt;br /&gt;
:* a more general ORM interface in which specific ORM packages could fit; be it a &amp;quot;native&amp;quot; JDataMapper or other 3rd party ORM packages.&lt;br /&gt;
:* or a specific implementation (like Doctrine) with which core CMS extensions could be refactored. This would be a UCM-implementation using an existing ORM package.&lt;br /&gt;
:Both the Joomla Platform/Framework and the CMS would benefit from such projects.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Object Relational Mapping theory.&lt;br /&gt;
&lt;br /&gt;
:'''References:'''&lt;br /&gt;
:* http://martinfowler.com/eaaCatalog/ and http://www.martinfowler.com/books/eaa.html&lt;br /&gt;
:* http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/index.html&lt;br /&gt;
:* https://github.com/eBaySF/joomla-platform/blob/data-package/docs/manual/en-US/chapters/packages/data.md#jdatamapper&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium to Hard&lt;br /&gt;
&lt;br /&gt;
:'''Possible Mentors:''' Herman Peeren&lt;br /&gt;
&lt;br /&gt;
====Project: Expand Google API coverage====&lt;br /&gt;
&lt;br /&gt;
:'''Brief explanation:''' The JGoogle package provides a basic structure for using Google APIs in Joomla based code. However it only includes classes for a limited set of APIs.  Your task is to dramatically expand the coverage of Google data. Specific APIs to be agreed upon with mentors, with some preference for those of immediate usefulness to the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Expected Results:''' A set of well coded, fully unit tested and documented implementations for a range of Google data.&lt;br /&gt;
&lt;br /&gt;
:'''Knowledge Prerequisite:''' Github, PHPUnit, familiarity with web services and the Joomla CMS.&lt;br /&gt;
&lt;br /&gt;
:'''Difficulty:''' Medium&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{dablink|Please add your project ideas here, you can use this '''[[GSOC 2013 Project template]]'''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Google Summer of Code 2013]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elin</name></author>	</entry>

	</feed>