Añadir campos personalizados a los componentes principales utilizando un plugin
From Joomla! Documentation
¿Alguna vez has deseado que hubiera un campo adicional para el número de teléfono, en el com_contact? o ¿has 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 necesitas para lograrlo es un simple plugin de contenido y un override para la disposición en la plantilla.
En este artículo te mostramos 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 Front-End
Habilitar la edición desde el Front-End 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 después 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'); ?>
Una vez hecho esto, tus campos aparecerán ahora y serán almacenados a través de la edición desde el frontend.
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, encuentra la ubicación en <template>/html/com_contact/contact/default.php que corresponde al lugar donde quieres mostrar la dirección de correo electrónico adicional y agrega el siguiente código:
<?php if ($this->params->get('contact_emaillabel2', false)) : ?>
<div>
<span class="contact-additionalemail"><?php echo $this->params->get('contact_emaillabel2'); ?>: <a href="mailto:<?php echo $this->params->get('contact_email2'); ?>"><?php echo $this->params->get('contact_email2'); ?></a><br/></span>
</div>
<?php endif; ?>
Si agregas este código en la plantilla, tendrá el campo personalizado visible en el sitio web público.