J3.x

Eigene Felder hinzufügen/Implementieren in der eigenen Komponente

From Joomla! Documentation

< 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 100% complete.
Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎Nederlands • ‎français • ‎中文(中国大陆)‎ • ‎中文(台灣)‎


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.
Sollen zusätzliche Eigenschaften zu den Einträgen hingefügt werden? Mit den Feldern hat man die Möglichkeit, solche nahtlos in Backend und Frontend zu integrieren.
Eigene Felder bieten 15 verschiedene Feldtypen an. Falls man mehr benötigt, kann man dafür 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 für das Backend erweitert werden müssen.
Achtung! Im Beispielcode verwenden wir für die 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 zur HelperKlasse ein.
Der verwendete Kontext muss dem Kontext entsprechen, in dem die Felder verwendet werden sollen. Ein Beispiel dafür wäre com_content.article oder com_weblinks.weblink. Wir verwenden hier 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 den Benutzern, die Zugriffsrechte in der 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" />

Dieser Eintrag sollte unter den normalen Einstellungen in der Komponente (und auch in der Zugriffs-XML-Datei) vorgenommen werden, da es den Benutzern in der Gruppe ermöglicht, jeden Wert von definierten Feldern in der Komponente zu bearbeiten.

Auflösung

Wenn diese Schritte abgeschlossen wurden, ist der Backend-Teil für die Implementierung der Felder abgeschlossen. Die Benutzer können nun Felder anlegen und einem Element zuordnen.

Das Frontend

Nun zum Frontend-Teil. Es ist einfach, da die Felder gerendert werden, durch die Plugin/Events/Content Ereignisse im Frontend. Um Felder im Frontend auszugeben müssen die Content Plugin Events in der verwendeten Komponente implementiert sein.
Wichtig Hier wird der gleiche Kontext, der im Backend verwendet wurde, an die jeweiligen Ereignisse übergeben.

Siehe:

Nachdem das onContentPrepare-Ereignis mit dem Kontext ausgelöst wurde, findet man die angehängten Felder im $item->jcfields Ausdruck, wenn man die Felder im eigenen Layout / View rendern will.

Tipps, Tricks & versteckte Features

Hier findet man ein paar Tips und Ticks dazu, was bei der Impementierung schief gehen kann und noch einige versteckte Funktionen von com_fields.

In meiner Bearbeitungs-Ansicht wird der das Tab Feld nicht angezeigt

In manchen Komponente ist das Bearbeitungsformular fix codiert und kann nicht über Plugins manipuliert werden. Da die Felder Plugins verwenden um in die Komponente eingeschleust zu werden muss die Verwendung dieser Plugins unterstützt werden. Wenn das folgende Layout für das Bearbeitungsformular verwendet wird, ist sichergestellt, dass die Felder in diesem Fall funktionieren.

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

Die erste Zeile stellt sicher, dass die (eventuell hartkodierten) Feldsets ignoriert werden und dann die dynamischen Felder mit dem joomla.edit.params layout rendern.

Öffentliche Helfer Klassen und API

Die Klasse FieldsHelper hat einige öffentliche API Funktionen um mit Feldern zu arbeiten.

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

Das Feld Model selbst erlaubt es, den Wert eines Feldes zu erhalten und zu speichern.

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

ACL Unterstützung

  • Jedes Feld hat eine Zugriffsebene
  • Jedes Feld hat eine neue Berechtigung edit.value

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

Weitere Informationen