User:Zero24
From Joomla! Documentation
I'm a specialist for system integration in Germany. I'm involved with Joomla! since 2011, JBS member since 04.2013. Team member of Joomla Bugs DE. Since May 2015 I'm the Co-Coordinator of the JBS and a CMS Maintainer
- tobias.zulauf[at]community.joomla.org
- http://www.jah-tz.de
- http://github.com/zero-24
- http://volunteers.joomla.org/joomlers/tobias-zulauf
Implement fields into your component
This is an article on how to do a basic implemention of the custom fields feature into your custom component.
Ever wanted to show additional attributes on an your items, through custom fields, you have a seamlessly integrated way to show them on the backend and front end.
Custom fields offer 14 different types, if you need more you can create your own plugin (different tutorial).
The custom fields extension is placed in core and can be used similiar tot he categories extension.
Basicly there are just 3 files you need to extend with the following code.
Note In the example code i will use for your componente name com_example.
The Backend Part
How to add fields to the backend lists
Similiar too com_categories the are are just a few lines involved to add the fields backend view.
Just add the following lines too the method addSubmenu in your component helper class.
Note We are checking here for a option we going to add in the next step.
The used context needs to match the context you want to implement fields in. An example context could be com_content.article or com_weblinks.weblink I’m using com_example.item here as example. Everything expected the context option and the first if don’t need to be changed.
if (JComponentHelper::isEnabled('com_fields') && JComponentHelper::getParams('com_example')->get('custom_fields_enable', '1'))
{
JHtmlSidebar::addEntry(
JText::_('JGLOBAL_FIELDS'),
'index.php?option=com_fields&context=com_example.item',
$vName == 'fields.fields'
);
JHtmlSidebar::addEntry(
JText::_('JGLOBAL_FIELD_GROUPS'),
'index.php?option=com_fields&view=groups&context=com_example.item',
$vName == 'fields.groups'
);
}
Implement a option to switch fields on and off
As you may don’t want fields enabled on any site or it should be allowed to disable it lets add a option to enable or disable this feature. Just adding the following line to your configuration xml file.
<field
name="custom_fields_enable"
type="radio"
label="JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL"
description="JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
Implement the needed ACL
Now the last part needs to be done and it is ACL. Just adding the following lines to your access xml file just before the closing </access> in that file. They are defiing and let your users choose the ACL settings for your implemention of com_fields.
<section name="fieldgroup">
<action name="core.create" title="JACTION_CREATE" description="COM_FIELDS_GROUP_PERMISSION_CREATE_DESC" />
<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_GROUP_PERMISSION_DELETE_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_GROUP_PERMISSION_EDIT_DESC" />
<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC" />
<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC" />
<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC" />
</section>
<section name="field">
<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_FIELD_PERMISSION_DELETE_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_FIELD_PERMISSION_EDIT_DESC" />
<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC" />
<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC" />
</section>
But there is on more setting entry in that file:
<action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />
This entry should be made under the normal settings for your component (also in the access xml file) as it Allows users in the group to edit any value of custom fields submitted in your component.
Result
If you completed this three steps you are done and have the backend part for fields implemented. The users can now create fields and assign them to your item.
The Frontend Part
Now we come to the frontend part. To display fields to the frontend you need to implement the following plugin events with your component.
See:
TBC (to be completed)