Mars 2017... Bientot la version de Joomla 3.7 et son lot de nouveautés. Idem pour AllEvents et l'arrivée de la 3.4.5.

Une nouveauté Joomla m'a particulièrement interpelée : les champs personnalisés (custom fields). Quand je repense aux nombres d'heures qu'il m'a fallu pour les développer dans AllEvents il y a un an et la seule heure (oui vosu avez bien lu : moins de 60 minutes) pour intégrer cette nouveauté dans AllEvents hier. Amis développeurs je vais vous dire comment j'ai fait juste après. 

Coté nouveautés de AllEvents 3.4.5, c'est principalement la découverte de plugins pour que tout le monde puisse développer ses propres affichages événement, formulaire événement, liste d'événements. Fini les surcharges tout se passe par plugin : vous dévelopez votre plugin pour AllEvents, vous l'installez et c'est vous qui maintenez l'affichage. On peut y ajouter aussi des corrections de bugs, le nouveau champ de saisie des vignettes et affiche en frontend, la correction de l'editeur de description en front, un nouvel affichage d'événements à la "webinar like"...

Revenons à cette grande nouveaut Joomla 3.7

Les champs personnalisés

Les champs personnalisés sont un des nouveautés de Joomla 3.7. Nativement, vous pourrez ajouter des champs personnalisés à des articles, des profils utilisateurs et des formulaires de contact. Avec son intégration dans AllEvents vous pourrez faire la même chose pour vos événements.

Si vous êtes utilisateur de AllEvents, c'est fini pour votre lecture. Si par contre vous êtes développeur la suite devrait vous interesser.

Rappels

Comme tout composant, AllEvents est basé sur un modèle MVC donc je prends comme base que votre composant suit ce modèle. 

En théorie, vous devriez avoir une colonne attribs ou params dans votre table. C'est ce qui permet de stocker par exemple les metadata... Je pars du principe que vous avez cela.

 

Acte 1 : Il faut déjà définir l'affichage dans votre menu à gauche. Votre composant va devenir un contexte (dans notre cas com_allevents.event) du composant com_fields de Joomla.

Cà se passe dans /administrator/helpers/allevents.php

On ajoute ces quelques lignes

if (JComponentHelper::isEnabled('com_fields'))
{
    JHtmlSidebar::addEntry(
        JText::_('JGLOBAL_FIELDS'),
        'index.php?option=com_fields&context=com_allevents.event',
        $vName == 'fields.fields'
    );
    JHtmlSidebar::addEntry(
        JText::_('JGLOBAL_FIELD_GROUPS'),
        'index.php?option=com_fields&view=groups&context=com_allevents.event',
        $vName == 'fields.groups'
);
}

fields

J'ai donc défini deux entrées : une pour les champs, une pour les groupes. Vous pouvez tout de suite constater le résultat en déposant ce fichier au bon endroit.

 

Acte 2 : modifier le fichier manifest event.xml pour afficher les champs personnalisé dans l'écran de saisie d'un événement

Cà se passe dans /administrator/models/forms/event.xml

<fieldset name="display" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS" addfieldpath="/administrator/components/com_fields/models/fields">
    <field name="show_user_custom_fields" type="fieldgroups" multiple="true" context="com_allevents.event" label="COM_ALLEVENTS_FIELD_USER_CUSTOM_FIELDS_SHOW_LABEL" description="COM_ALLEVENTS_FIELD_USER_CUSTOM_FIELDS_SHOW_DESC">
        <option value="-1">JALL</option>
    </field>
</fieldset>

 

Acte 3 : en front récupérer les valeurs saisies pour votre élément

Cà se passe dans /models/event.php. les champs seront repris dans fields. Dans le cas de AllEvents la colonne utilisée est params.

if (!isset($this->_item->fields)){ $this->_item->fields = [] ; }
if (class_exists('FieldsHelper'))
{
    // Convert parameter fields to objects.
    $this->_item->params = new Registry($this->_item->params);
    $this->_item->params = $this->_item->params->toArray();
    $this->_item->fields = FieldsHelper::getFields('com_allevents.event', $this->_item, true, $this->_item->params) ;
}

 

Acte 4 : en front récupérer les valeurs saisies pour votre élément

Cà se passe dans /views/event/tmpl/event.php. Petit bout de code récupéré dans l'affichage contact :)

<?php
$eventFieldGroups = array();

foreach ($item->fields as $field) :
    if ((!$field->group_id )) :
        continue;
    endif;
    if (!key_exists($field->group_title, $eventFieldGroups)) :
        $eventFieldGroups[$field->group_title] = array();
    endif;
    $eventFieldGroups[$field->group_title][] = $field;
endforeach;
?>
<?php foreach ($eventFieldGroups as $groupTitle => $fields) : ?>
<?php $id = JApplicationHelper::stringURLSafe($groupTitle); ?>
<?php echo '<h3>' . ($groupTitle ?: JText::_('COM_ALLEVENTS_EVENT_FIELDS')) . '</h3>'; ?>

<div class="contact-profile" id="user-custom-fields-<?php echo $id; ?>">
<dl class="dl-horizontal">
<?php foreach ($fields as $field) : ?>

<?php if (!$field->value) : ?>
<?php continue; ?>
<?php endif; ?>

<?php echo '<dt>' . $field->label . '</dt>'; ?>
<?php echo '<dd>' . $field->value . '</dd>'; ?>
<?php endforeach; ?>
</dl>
</div>
<?php endforeach; ?>

Acte 5 : ben, il n'y en a pas... c'est fini Pour AllEvents

Vous l'avez vu, en modifiant 4 fichiers de AllEvents, nous sommes capable de proposer les champs personnalisés à nos utilisateurs.

Il me reste des choses bien sur comme :

  • La distinction des groupes de champs : distinguer les champs pour les événements et les champs pour les inscriptions
  • Les traductions éventuelles de l'onglet en backend

Si vous avez des questions ou des retour sur cet article, je suis joignable facilement.

Emmanuel