Eigene Felder hinzufügen/Implementieren in der eigenen Komponente
From Joomla! Documentation
< J3.x:Adding custom fields
Implementierung in der eigenen Komponente
Artikel in dieser Serie
- Einführung
- Parameter für alle Eigenen Felder
- Kalender-Feld
- Kontrollkästchen-Feld
- Farbe Feld
- Editor Feld
- Zahlen Feld
- Listen Feld
- Bilder-Listen Feld
- Medien Feld
- Optionsfeld (radio)
- Wiederholbares Feld
- Sql Feld
- Textfeld
- Textbereich Feld
- URL Feld
- Benutzer Feld
- Benutzergruppe Feld
- Wie man die Eigenen Felder gruppiert
- Welche Komponenten unterstützen die Eigenen Felder
- Implementierung in der eigenen Komponente
- Eigene Felder in Overrides anwenden
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
- https://www.youtube.com/watch?v=7ikOaOKyo6s | JAB16 - Felder in Joomla! für Entwickler (auf Englisch)
- https://www.youtube.com/watch?v=F_Ni15icn1U | JD16AT - Felder seit Joomla! 3.7 (in Englisch)
- https://joomla.digital-peak.com/images/blog/JDD16%20Custom%20fields%20in%20Joomla%20for%20developers.pdf