May 18, 2014 11:17:00 PM lutece lutece avatar   453    

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émentations des 2 interfaces ci dessus.

Note : 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[1].

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 <html-service> (link-service) dans le fichier de configuration du plugin :

<!-- Links Service -->
<link-service>
   <link-service-id>mylinkservice</link-service-id>
   <link-service-class>fr.paris.lutece.plugins.mylinkservice.service.MyLinkService</link-service-class>
   <link-service-bean-class>fr.paris.lutece.plugins.mylinkservice.web.MyLinkServiceJspBean</link-service-bean-class>
   <link-service-label>Link to my URIs</link-service-label>
</link-service>

Dérivation de DefaultHTMLService (ou DefaultLinkService)

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

public class MyHtmlService extends DefaultHtmlService 
{
/** The plugin name. */
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 de ImageLibraryJspBean pour le plugin ImageLibrary.

Insertion du code HTML

le copier collage du code HTML à insérer se fera en javascript en appelant la méthode opener.insert_html(strCodeHTMLAInserer) .

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 pour le HTML portlet :

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

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