Eigene Felder mit einem Plugin den Core-Komponenten hinzufügen

From Joomla! Documentation

This page is a translated version of the page Adding custom fields to core components using a plugin and the translation is 100% complete.

Other languages:
বাংলা • ‎català • ‎Deutsch • ‎English • ‎español • ‎فارسی • ‎français • ‎हिन्दी • ‎Nederlands • ‎português do Brasil • ‎русский

Soll es ein extra Telefonnummern-Feld in com_contact oder ein Extrafeld für Artikel in com-content geben? Joomla! bietet einen einfachen Weg, neue Felder in solchen Komponenten zu integrieren. Alles was nötig ist, ist ein einfaches Content-Plugin und ein Layout-Override für das Template.

Dieser Artikel erklärt anhand des Beispiels einer zusätzlichen E-Mail Adresse innerhalb der Komponente com_contact für die Kontakte, wie du ein zusätzliches Feld zur Core-Komponente hinzufügen kannst. Benötigst du stattdessen ein zusätzliches benutzerdefiniertes Feld in der Komponente com_content für deine Joomla Artikel, ändere einfach im nachfolgenden Code jede vorkommende Referenz von "contact" zu "content". Bitte beachte in diesem Fall für deinen Override außerdem, dass die Komponente com_content "attribs" statt "params" für die Feldinhalte nutzt.

Hinzufügen eines benutzerdefinierten Felds

Für ein besseres Verständnis zum Erstellen und Installieren von Joomla Plugins wird empfohlen zuerst den Artikel Erstellung eines Plugin für Joomla! zu lesen, da die Grundlagen für diesen Artikel vorausgesetzt und hier nicht mehr behandelt werden.

Um ein benutzerdefiniertes Feld zu einer System-Komponente hinzufügen zu können, musst du zuerst ein Inhalts-Plugin erstellen, welches das Event onContentPrepareForm abfängt und die benutzerdefinierten Felder in das bestehende Joomla Formular (JForm) einfügt. Der nachfolgende Code ist für Joomla 3.1 und spätere Versionen.

<?php
// no direct access
defined ('_JEXEC') or die;
class plgContentExample extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 * Note this is only available in Joomla 3.1 and higher.
	 * If you want to support 3.0 series you must override the constructor
	 *
	 * @var boolean
	 * @since <your version>
	 */
	protected $autoloadLanguage = true;

	/**
	 * Prepare form and add my field.
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   <your version>
	 */
	function onContentPrepareForm($form, $data)
	{
		$app    = JFactory::getApplication();
		$option = $app->input->get('option');

		switch($option)
		{
			case 'com_contact' :
				if ($app->isClient('administrator'))
				{
					JForm::addFormPath(__DIR__ . '/forms');
					$form->loadFile('contact', false);
				}

				return true;
		}

		return true;
	}
}
?>

Aktivierung der Front-End Bearbeitung von benutzerdefinierten Feldern

Das Aktivieren der Front-End Bearbeitung für deine neuen benutzerdefinierten Felder ist wirklich einfach. Um die Felder in das Front-End Bearbeitungsformular hinzuzufügen, übernimm einfach diesen Code-Block:

case 'com_contact':
	if ($app->isClient('site'))
	{
		JForm::addFormPath(__DIR__ . '/forms');
		$form->loadFile('contact', false);
	}
	return true;

Füge es direkt nach der bereits existierenden Instanz hinzu.

Wenn das erledigt ist, wird ein Template-Override für die Datei content form edit.php erstellt. Wenn du eine Reihe benutzerdefinierter Felder für com_contact erstellen willst, dann kopiere /components/com_contact/views/form/tmpl/edit.php nach /templates/dein-template-name/html/com_contact/form/edit.php

Füge in deinem Layout-Override neue Felder in das Formular ein, in dem sie angezeigt werden sollen (z.B. unter dem Titel, unter der Beschreibung), und stelle sicher, dass die Feldnamen mit der XML-Datei deines Plugins übereinstimmen (erstelle das als nächsten Schritt).

<?php // Checking if this is an existing item or not ?>
<?php if ($this->item->id) : ?>
  <?php // If it is an existing item, get the attribs part of the existing record ?>
  <?php $attribs = json_decode($this->item->attribs); ?>
  <?php // Set the value of the custom field to what is already saved. ?>
  <?php // Duplicate for the number of fields you need, changing the field_name as needed. ?>
  <?php echo $this->form->setValue('field_name', 'attribs', $attribs->field_name); ?>
<?php endif; ?>
<?php // This line needs added to the file right where you want to display it. So, if you want it to show right after the description field, find the description field and place this right after it. Duplicate for the number of fields you need, changing the field_name as needed. ?>
<?php // Now we display the field. If we are editing an existing item, the previously saved data will be populated already ?>
<?php echo $this->form->renderField('field_name', 'attribs'); ?>

Danach erscheinen deine Felder und werden über die Frontend-Bearbeitung gesichert.

Die zusätzlichen Felder werden aus der Datei forms/contact.xml in das Plugin-Verzeichnis geladen. Es ist wichtig, dass sich diese Felder in einem fields-Element befinden, dessen name-Eigenschaft auf „params” festgelegt ist. Wenn Du diesen Eigenschaftsnamen nicht festlegst, werden die Felder auf der Admin-Site angezeigt – die Werte jedoch nicht gespeichert. Hinweis: In com_content muss das Feld "<fields name="attribs">" heißen, andernfalls werden die Felder auf der Admin-Site angezeigt, aber die Werte werden nicht gespeichert.

In diesem Beispiel fügen wir ein Feld für eine Bezeichnung zur Beschreibung des E-Mail-Felds auf der öffentlichen Website und ein zweites Feld für den Wert der E-Mail-Adresse hinzu.

<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="params">
		<fieldset name="params" label="PLG_CONTENT_EXAMPLE_FIELDSET_LABEL">
			<field
				name="contact_emaillabel2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2"
			/>
			<field
				name="contact_email2"
				type="text"
				label="PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2"
				filter="email"
			/>
		</fieldset>
	</fields>
</form>

Schließlich benötigen wir eine Sprachdatei, damit die Parameter auf der Administrations-Site gut dargestellt und in verschiedene Sprachen übersetzt werden können. Diese Datei muss so etwas wie en-GB.plg_content_example.ini heißen.

PLG_CONTENT_EXAMPLE_FIELDSET_LABEL="Additional Information"
PLG_CONTENT_EXAMPLE_CONTACT_EMAIL2="Additional email address"
PLG_CONTENT_EXAMPLE_CONTACT_EMAILLABEL2="Additional email label"

Das wars um das Feld in com_contact einzufügen. Wenn Du dieses Plugin installierst, hast Du im Kontakt-Bearbeitungsformular eine zusätzliche Registerkarte namens "Additional Information" mit den neuen Feldern. Wenn Du die neuen Felder für Bezeichnung und E-Mail-Adresse eines Kontakts ausfüllst, wird angezeigt, dass com_contact die Informationen speichert und abruft.

Das gleiche Plugin kann verwendet werden, um in verschiedenen Komponenten zusätzliche Felder einzufügen. Platziere einfach den entsprechenden Code in der Funktion onContentPrepareForm und erstelle die entsprechenden XML-Formulardateien.

Anzeigen des Custom Fields

Um das benutzerdefinierte Feld anzuzeigen, musst Du ein Layout-Override für die entsprechende Komponente in deinem Template erstellen. Weitere Informationen zum Erstellen von Templates findet sich unter Creating a basic Joomla! template. Ausführliche Informationen zu Layout-Overrides findet sich unter Understanding Output Overrides.

Kopiere die Datei <Joomla>/components/com_contact/views/contact/tmpl/default.php nach <template>/html/com_contact/contact/default.php, und erstelle bei Bedarf die Ordner in deiner Vorlage. Wir werden diese Datei bearbeiten, um die zusätzlichen Informationen aufzunehmen. Die com_contact-Komponente lädt automatisch die zusätzlichen Felder für uns und lädt sie in eine Variable namens $this->params. Alles, was wir tun müssen, ist zu überprüfen, ob die Daten eingestellt sind und, falls ja, sie angezeigt werden.

Suche in <template>/html/com_contact/contact/default.php den Ort, an dem die zusätzliche E-Mail-Adresse angezeigt werden soll, und füge den folgenden Code hinzu, um das Feld anzuzeigen:

<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
	<div>
		<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2'); ?>:&emsp;<a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
	</div>
<?php endif; ?>

Wenn Du diesen Code hinzufügst und dein Template installierst, wird das benutzerdefinierte Feld auf der öffentlichen Website angezeigt.