9 nov. 2021 15:48:01 Thomas Dumont avatar

Créer un nouveau LinkService

Arborescence des InsertService

Un plugin qui propose un service d’insertion de code HTML ou un service d’insertion de lien va devoir implémenter une interface HtmlService ou LinkService .

L’arborescence des InsertService est constituée comme suit :

  • une interface ancêtre généralisant la notion de InsertService et fournissant une méthode abstraite getSelectorUI( ) donnant accès à une IHM de sélection de l’objet à insérer
  • une interface LinkService modélisant les services d’insertion de liens et fournissant une méthode retournant une classe de sélection implémentant LinkServiceSelectionBean
  • une interface HtmlService modélisant les services d’insertion de code HTML et fournissant une méthode retournant une classe de sélection implémentant HtmlServiceSelectionBean
  • des classes abstraites, DefaultLinkService et DefaultHtmlService, facilitant l’implémentation des 2 interfaces ci-dessus.

Un plugin peut proposer à la fois un LinkService et un HtmlService.

Service d’enregistrement

Le service concernant deux fonctionnalités très similaires, nous avons donc décidé de ne créer qu’un seul service d’enregistrement InsertServiceManager.

Des méthodes sont fournies pour récupérer séparément les HtmlService ou les LinkService ou tous les InsertService.

Interface de sélection d’un lien

Comme dans la version 1.0 de Lutece, la sélection de liens ou d’objet à insérer dans un éditeur HTML se fait via une fenêtre de type popup.

Cela permet d’une part de ne pas perdre l’utilisateur et d’autre part de ne pas avoir à gérer la persistance des données saisies dans l’appelant (sauvegarde des données non enregistrées dans l’éditeur HTML avant l’appel de la fonction d’insertion).

Insertion du code retour

L’implémentation est conditionnée par le choix précédent et la volonté de ne pas se soucier de la mémorisation des données saisies dans l’appelant.

L’insertion du code HTML correspondant à l’objet sélectionné se fait directement via une fonction JavaScript que doit proposer l’appelant : insert_html( String ChaineAInsérer ).

Enregistrement des services

L’enregistrement des implémentations de InsertService est effectué au lancement de l’application lors du chargement des plugins.

Il s’agit d’ajouter une section <insert-service> dans le fichier de configuration du plugin :

<!-- Insert Services -->
<insert-services>
    <insert-service>
        <insert-service-id>my_insert_service</insert-service-id>
        <insert-service-name>myplugin.insertService.name</insert-service-name>
        <insert-service-label>myplugin.insertService.label</insert-service-label>
        <insert-service-bean-class>fr.paris.lutece.plugins.myplugin.web.MyInsertServiceJspBean</insert-service-bean-class>
    </insert-service>
    ...
</insert-services>

Dérivation de DefaultHTMLService (ou DefaultLinkService)

Dériver DefaultHTMLService (resp. DefaultLinkService) en implémentant la méthode getPluginName( ) :

public class MyHtmlService extends DefaultHtmlService 
{
    private static final String PLUGIN_NAME = "myhtmlservice";

    public String getPluginName( ) 
    {
        return PLUGIN_NAME;
    }
}

Implémentation de HtmlServiceSelectionBean (ou LinkServiceSelectionBean)

Il s’agit de fournir un JSPBean qui implémente l’interface HtmlServiceSelectionBean en proposant une méthode getHtmlSelectorUI( ), retournant une IHM permettant de sélectionner l’objet à insérer (exemple avec ImageLibraryJspBean pour le plugin ImageLibrary).

Insertion du code HTML

L'insertion du code HTML se fera en JavaScript en appelant la méthode opener.insert_html( strCodeHtmlToInsert ) .

Exemple issu de l’imageLibrary :

...
_buffer = _buffer + _hspace + _vspace + _width + _height + _align + ">";

if (opener != null)
{
    // The caller must provide an insert_html method
    opener.insert_html(_buffer);
    window.close();
} 
else 
{
    alert("Editeur HTML indisponible !" );
}

Utilisation d’un service

Un exemple d’utilisation des InsertService est donné par le plugin HTML, par l’intermédiaire du template editor_portlet_html.html .

Proposer un lien vers le service d’insertion

Il s’agit d’appeler la JSP GetAvailableServices.jsp, en utilisant par exemple le code suivant :

function create_insert_window()
{
    var url="GetAvailableServices.jsp";
    var nom = "Lien ou code HTML";
    child = window.open(url,'','toolbar=no, scrollbars=yes, status=no, location=no, directories=no, menubar=no, width=450, height=350');
    child.focus();  
}

<a href="#" onClick="create_insert_window();">Insérer Lien ou HTML</a>

Fournir une méthode javascript insert_html()

Il s’agit de fournir, dans la page appelant le service d’insertion, une fonction javascript insert_html réalisant l’ajout du code HTML retourné par le service d’insertion.

Exemple issu de HTML portlet :

function insert_html(strHTMLToInsert)
{
    // TEXT
    document.Form.html_content.value = document.Form.html_content.value + strHTMLToInsert;

    // HTML
    theDoc.innerHTML = theDoc.innerHTML + strHTMLToInsert;
}