Añadir campos personalizados a los componentes principales utilizando un 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 • ‎русский

¿Alguna vez ha deseado que hubiera un campo adicional para el número de teléfono, en el com_contact? o ¿ha necesitado un campo adicional para los artículos en el com_content? Joomla! proporciona una forma sencilla para la integración de campos nuevos en componentes del núcleo. Todo lo que necesita para lograrlo es un simple plugin de contenido y un override para la disposición en la plantilla.

This article shows how to add an extra field to a core component using the example of adding an additional email address to contacts in com_contact. If you need to add custom fields to com_content for your Joomla articles, simply change any references to "contact" to "content" in the code below. And notice that com_content use "attribs" and not "params" for the fields value as well as for the override.

Añadir un Campo Personalizado

Se recomienda leer primero Crear un Plugin para Joomla! para más detalles sobre cómo crear e instalar un plugin, que no se verá aquí.

Para agregar un campo a un componente del sistema, necesitas crear un plugin de contenido que recoja el evento onContentPrepareForm e insertar los campos que consideres en JForm. El siguiente código es para Joomla 3.1 y versiones posteriores.

<?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->isAdmin())
				{
					JForm::addFormPath(__DIR__ . '/forms');
					$form->loadFile('contact', false);
				}

				return true;
		}

		return true;
	}
}
?>

Habilitar la Edición de los Campos Personalizados desde el Lado Cliente

Enabling Frontend editing for your new custom fields is pretty easy. To add the fields to the frontend content edit form, simply add this block of code:

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

Add that immediately below the existing instance of it.

Once you've got that done, create a template override for the content form edit.php file. If you're creating a set of custom fields for com_contact, you would copy /components/com_contact/views/form/tmpl/edit.php to /templates/your-template-name/html/com_contact/form/edit.php

Dentro de tu diseño sobreescrito, agregar los nuevos campos en el formulario donde se desea que aparezcan (por ejemplo, debajo del título, debajo de la descripción), asegurándote que los nombres de campo coincide con el archivo XML de tu plugin (que vamos a crear a continuación).

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

Con eso hecho, sus campos aparecerán ahora y serán almacenados a través de un interfaz de edición.

The additional fields are loaded from the file forms/contact.xml in the plugin directory. It's important that these fields are in a fields element with the name property set to "params". If you don't set this property name, the fields will appear in the admin site but the values will not be saved. Note: In com_content your field must be named "<fields name="attribs">" otherwise the fields will appear in the admin site but the values will not be saved.

En este caso estamos agregando un campo de una etiqueta para describir el campo de correo electrónico en el sitio web público y un segundo campo para el valor de la dirección de correo electrónico.

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

Por último, necesitamos un archivo de idioma para que los parámetros se vean bien en el sitio de administración y se puedan traducir a diferentes idiomas. Este archivo debe llamarse algo así como es-ES.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"

Eso es todo lo que ha de hacer para añadir un campo para com_contact. Si instala este plugin, tendrá una pestaña adicional en el formulario de edición de contactos con el nombre "Información adicional" con los nuevos campos incluidos. Si se rellenan estos campos de etiqueta y dirección de correo electrónico para el contacto, verá que com_contact guardará y recuperará la información correctamente.

El mismo plugin se puede utilizar para agregar más campos a diferentes componentes; sólo tiene que añadir el código correspondiente a la función onContentPrepareForm y crear los archivos apropiados al formulario XML.

Visualización del campo personalizado

Para mostrar el campo personalizado necesita crear un override de disposición para el componente relevante en su plantilla. Para más detalles sobre la creación de plantillas véase Creación de una plantilla básica para Joomla!. Para más detalles sobre los overrides de disposición, ver Entender los Overrides de salida.

Es necesario copiar el archivo <Joomla>/components/com_contact/views/contact/tmpl/default.php a <template>/html/com_contact/contact/default.php para crear las carpetas en la plantilla. Editaremos este archivo para incluir la información adicional. El componente com_contact cargará automáticamente los campos adicionales y lo hará con la variable llamada $this->params. Todo lo que necesitamos hacer es comprobar que los datos se han establecido y, si es así, los mostrará.

Para mostrar el campo, encuentre la ubicación en <template>/html/com_contact/contact/default.php que corresponde al lugar donde quiere mostrar la dirección de correo electrónico adicional y agregue el siguiente código:

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

Si agrega este código en la plantilla, tendrá el campo personalizado visible en el sitio web público.