Añadir campos personalizados a los componentes principales utilizando un plugin

From Joomla! Documentation

Revision as of 10:19, 18 November 2019 by Pdavila2709 (talk | contribs)
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎català • ‎español • ‎français • ‎italiano • ‎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.

En este artículo te muestra cómo agregar un campo adicional a un componente del núcleo, utilizando como ejemplo agregar una dirección de correo electrónico adicional a los contactos en com_contact. Si necesitas agregar campos personalizados a com_content para tus artículos en Joomla, solo tienes que cambiar todas las referencias desde "contacto" a "contenido" en el siguiente código. Y observa que com_content usa "attribs" y no "params" para el valor de los campos, así como para la anulación.

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

				return true;
		}

		return true;
	}
}
?>

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

Habilitar la edición de interfaz para tus nuevos campos personalizados es bastante fácil. Para agregar los campos para el formulario de edición de contenido de la interfaz, sólo tienes que añadir este bloque de código:

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

Duplica esto inmediatamente debajo de la instancia existente y cambia 'isAdmin' a 'isSite'.

Una vez que se ha hecho, crear una plantilla para reemplazar el contenido del archivo del formulario edit.php. Si estás creando un conjunto de campos personalizados para com_contact, copia /components/com_contact/views/form/tmpl/edit.php a /templates/tu-plantilla-nombre/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, tus campos aparecerán ahora y serán almacenados a través de un interfaz de edición.

Los campos adicionales se cargan desde el archivo forms/contact.xml en el directorio de plugins. Es importante que estos campos se encuentren en un campo con la propiedad con el nombre establecido de "params". Si no se establece este nombre de propiedad, aparecerán los campos en el sitio de administración, pero no se guardarán los valores. Nota: En com_content, tu campo debe llamarse "<fields name =" attribs ">", de lo contrario los campos aparecerán en el sitio de administración pero los valores no se guardarán.

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 has de hacer para añadir un campo para com_contact. Si instalas este plugin, tendrás 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ás que com_contact guardará y recuperarás 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 necesitas crear un override de disposición para el componente relevante en su plantilla. Para más detalles sobre la creación de plantillas ver 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.