Het toevoegen van extra velden aan core componenten met behulp van een plugin

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 • ‎русский

Heeft u ooit gewenst dat er een extra telefoonnummer veld zat in com_contact of had u een extra veld nodig voor een artikel in com_content? Joomla! biedt een eenvoudige manier om nieuwe velden in core-componenten zoals deze te integreren. Alles wat nodig is om dit te bereiken is een eenvoudige content plugin en een layout override in uw template.

Dit artikel toont hoe een extra veld toe te voegen aan een core component met behulp van het voorbeeld van het toevoegen van een extra e-mailadres aan contactpersonen in com_contact. Verander, als u eigen velden aan com_content voor uw Joomla artikelen wilt toevoegen, eenvoudig alle verwijzingen naar "contact" in "content" in onderstaande code. En let op dat com_content "attribs" en niet "params" gebruikt voor zowel de veldwaarde als voor de override.

Toevoegen van een extra veld

Het is aan te bevelen eerst Het maken van een plugin voor Joomla! te lezen voor meer details over het maken en installeren van een plugin, wat hier niet wordt behandeld.

Om een veld toe te voegen aan een systeemcomponent moet u een content plugin maken die de onContentPrepareForm event oppakt en zijn eigen velden aan het gegeven JForm toevoegt. De volgende code is voor Joomla 3.1 en hoger.

<?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;
	}
}
?>

Inschakelen van het bewerken vanaf de website van extra velden

Het inschakelen van het bewerken vanaf de website van uw nieuwe extra velden is erg makkelijk. Voeg, om de velden aan het website bewerkformulier toe te voegen, dit blok code toe:

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

Voeg dit direct onder het bestaande instance toe.

Maak, zodra u dit gedaan heeft, een template override aan voor de het content formulier edit.php bestand. Als u een set van extra velden voor com_contact aanmaakt, zou u /components/com_contact/views/form/tmpl/edit.php moeten kopiëren naar /templates/uw-template-naam/html/com_contact/form/edit.php

Voeg, binnen uw lay-out override, uw nieuwe velden op het formulier toe waar u ze wilt hebben (bijvoorbeeld, onder de titel, onder de beschrijving), waarbij u ervoor zorgt dat de namen overeenkomen met het XML bestand van uw plugin (u maakt deze hierna aan).

<?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'); ?>

Hierna zullen uw velden verschijnen en worden ze opgeslagen bij het bewerken vanaf de website.

De extra velden worden geladen vanuit het bestand forms/contact.xml in de plugin map. Het is belangrijk dat deze velden in het 'fields' element staan met het 'name' eigenschap op "params". Als u de eigenschap 'name' niet instelt, verschijnen de velden in het beheergedeelte, maar de waarden worden niet opgeslagen. Let op: In com_content moet uw veld de naam "<fields name="attribs">" hebben, anders verschijnt het veld in de beheer site maar worden de waarden niet opgeslagen.

In dit geval voegen we een veld voor een label toe om het e-mail veld te beschrijven op de website en een tweede veld voor de waarde van het e-mailadres.

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

Uiteindelijk hebben we een taalbestand nodig zodat de parameters netjes in het beheergedeelte worden getoond en te vertalen zijn in andere talen. Dit bestand moet ongeveer deze naam krijgen en-GB.plg_content_example.ini.

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

Dit is voldoende voor het toevoegen van het veld aan com_contact. Als u deze plugin installeert, heeft u een extra tabblad bij het contactpersoon bewerk formulier genaamd "Additional Information" met de nieuwe velden daarin opgenomen. Als u de nieuwe velden 'Label' en 'E-mailadres' voor een contactpersoon invult dan ziet u dat com_contact de informatie voor u opslaat en ophaalt.

Dezelfde plugin kan gebruikt worden om meer velden aan verschillende componenten toe te voegen; Voeg de relevante code aan de onContentPrepareForm functie toe en maak de juiste XML form bestanden aan.

Het tonen van de extra velden

Om de extra velden te tonen moet een layout override voor de relevante component in uw template worden aangemaakt. Kijk voor meer details over het aanmaken van templates bij Aanmaken van een basis Joomla! template. Kijk, voor details over layout overrides bij Het begrijpen van Output overrides.

Kopieer het bestand <Joomla>/components/com_contact/views/contact/tmpl/default.php naar <template>/html/com_contact/contact/default.php, waarbij eventueel de mappen in uw template worden aangemaakt. We gaan dit bestand bewerken om de extra informatie op te nemen. De com_contact component zal de extra velden automatisch voor ons laden en in een variabele genaamd $this->params plaatsen. Alles wat we moeten doen is controleren dat de gegevens er zijn en ze tonen.

Vind, om het veld te tonen, de plaats binnen <template>/html/com_contact/contact/default.php die overeenkomt met waar u het extra e-mailadres getoond wil hebben en voeg de volgende code toe:

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

Indien u deze code toevoegt en uw template installeert, dan wordt het extra veld zichtbaar op uw website.