J3.x

Eigene Felder hinzufügen/Implementieren in der eigenen Komponente

< J3.x:Adding custom fields
This page is a translated version of the page J3.x:Adding custom fields/Implement into your component and the translation is 51% complete.

Other languages:
Deutsch • ‎English • ‎français • ‎Bahasa Indonesia • ‎Nederlands

Implementierung in der eigenen Komponente


Implementiere Eigene Felder in die eigene Komponente

Dieser Artikel beschreibt, wie man grundlegend die Eigene Felder Funktionen in einer eigenen Komponente implementiert.
Wolltest du schon einmal zusätzliche Eigenschaften zu deinen Items hinzufügen? Mit den Eigenen Feldern hast du die Möglichkeit, solche nahtlos in Backend und Frontend zu integrieren.
Eigene Felder bieten 15 verschiedene Feldtypen an. Falls du mehr brauchst kannst du ein eigenes Plugin erstellen.
Die Komponente customfields ist Bestandteil des core und kann auf ähnliche Art wie die Komponente categories verwendet werden. Grundsätzlich gibt es 2 Dateien, die du für das Backend erweitern musst.
Achtung! Im Beispielcode verwenden wir für deine Komponente den Namen com_example.

Das Backend

So fügst du den Listen im Backend Felder hinzu

Wie bei com_categories sind nur wenige Zeilen nötig, um Felder zu integrieren. Trage einfach die folgenden Zeilen in die Methode addSubmenu deiner HelperKlasse ein.
Der verwendete Kontext muss dem Kontext entsprechen, in dem du die Felder verwenden willst. Ein Beispiel dafür wäre com_content.article oder com_weblinks.weblink. Wir verwenden com_example.item als Beispiel. Mit Ausnahme des Kontext muss nichts weiter angepasst werden.

if (JComponentHelper::isEnabled('com_fields'))
{
	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'
	);
}

ACL implementieren

Nun kommt der ACL Teil. Füge die folgenden Zeilen in die Datei access.xml ein, direkt vor dem schließenden </access>. Hier sind sie definiert und ermöglichen es deinen Benutzern, die Zugriffsrechte in deiner Implementierung der com_fields zu setzen.

	<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>

Es gibt noch einen weiteren Eintrag in diese Datei:

    <action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />

This entry should be made under the normal settings in your component (and 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 these steps, your backend part for fields implementation is done. The users can now create fields and assign them to an item.

The Frontend Part

Now let's go to the frontend part. It is easy as the fields are rendered, through the Plugin/Events/Content events on the frontend. Um Felder im Frontend auuszugeben müssen die Content Plugin Events in deiner Komponente implementiert sein.
Important here is where you pass the same context that you used in the backend to the events.

Siehe:

After the onContentPrepare event is fired with the context you can find the attached fields in $item->jcfields property if you want to render the fields using in your layouts / views.

Tips, Tricks & Hidden Features

Hier findest du ein paar Tips und Ticks dazu, was bei der Impementierung schief gehen kan und dazu einige versteckte Funktionen von com_fields.

In meinem Edit View wird der Das Tab Felder nicht angezeigt

In manchen Komponente ist das Bearbeitungsformular hard coded und kann nicht über Plugins manipuliert werden. Da die Fields Plugins verwenden, um in die Komponente eingeschleust zu werden musst du die Verwendung dieser Plugins unterstützen. Wenn du das folgende Layout für deine Bearbeitungsformular verwendest kannst du sicherstellen dass die Felder funktionieren.

    <?php $this->ignore_fieldsets = array('general', 'info', 'detail', 'jmetadata', 'item_associations'); ?>
    <?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

The first line makes sure we ignore the (eventually hardcoded fieldsets) and than render the dynamic fields tab using the joomla.edit.params layout.

Public helper classes and API

The class FieldsHelper has some public API functions to work with fields.

    JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
    $fields = FieldsHelper::getFields('com_example.item', $item, true);

The field model itself allows to get and store the value of a field.

    JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel');
    $fieldModel = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
    $fieldModel->setValue($fieldId, 'com_example.item', $item->id, ‘demo value’);

ACL support

  • Every field has an access level
  • Every field has a new permission edit.value

JFactory::getUser()->authorise('edit.value', ‘com_example.item.field.' . (int) $field->id);

More Information

Advertisement