Création d'une intégration d'éditeur HTML personnalisée

Vous pouvez utiliser des éditeurs HTML personnalisés dans toutes les zones HTML de l'interface de création ou dans des éléments HTML spécifiques définis dans un modèle de création. Les zones HTML personnalisées sont utilisées pour intégrer des éditeurs tiers dans l'interface de création.

Une zone HTML personnalisée est un élément JSP qui est affiché à la place de la zone HTML standard de l'interface de création. La zone personnalisée est composée d'un certain nombre de pièces qui fonctionnent conjointement pour permettre à l'utilisateur d'identifier la zone modifiée, d'enregistrer la personnalisation avec l'interface de création, d'accéder aux boîtes de dialogue de zone HTML standard et de mettre à jour des valeurs lorsque des modifications doivent être validées. L'élément com.ibm.workplace.wcm.api.authoring.HTMLEditorBean, disponible dans l'élément JSP, fournit des métadonnées de zone de base, telles que le nom et une indication sur le caractère éditable de la zone. La bibliothèque JavaScript ibm.wcm.ui.html.HTMLEditor définit la structure côté client qui intègre la zone personnalisée sur l'interface de création. Chaque intégration doit implémenter son propre HTMLEditor.

Storing JSP files : Les fichiers JSP sont stockées au sein d'une application Web qui s'exécute sur le portail. Pour faire référence à un fichier JSP qui se trouve dans une autre application Web, utilisez le chemin d'accès suivant : contextPath;jspPath. Par exemple: /wps/customapplication;/jsp/jspFilename.jsp.

Une valeur de chemin de contexte dynamique peut être définie en ajoutant un jeton au chemin de contexte qui correspond à une paire clé/valeur au fournisseur d'environnement du service de configuration Web Content Manager. Lorsque cette clé est utilisée comme jeton dans la zone de valeur JSP , elle est remplacée de manière dynamique au moment de l'affichage. Par exemple: [my.custom.key];myfile where my.custom.key is a constant within the Web Content Manager configuration service.

Reloading JSP files :

Les fichiers JSP qui sont stockés dans l'application PA_WCM_Authoring_UI ne sont pas rechargés, même lorsqu'ils sont mis à jour. Vous devez redémarrer le serveur ou placer le fichier JSP dans une application Web distincte configurée en vue du rechargement des fichiers JSP pour que les modifications que vous apportez au fichier JSP soient affichées.

Exemple d'intégration

Voici un exemple simple d'une intégration de base montrant toutes les étapes nécessaires au rendu et à l'enregistrement d'une zone personnalisée avec l'interface de création. Dans cet exemple, la zone de texte utilisée pour modifier le code HTML est étendue à l'aide du dijit de zone de texte Dojo.

Le JSP est divisé en trois parties distinctes. La première est un simple fragment de code permettant d'extraire le nom de la zone d'éditeur. La deuxième partie définit l'implémentation de l'objet ibm.wcm.ui.html.HTMLEditor personnalisé. L'élément ibm.sample.Editor définit un constructeur permettant de capturer le dijit en vue de gérer et d'implémenter les méthodes nécessaires à l'intégration avec l'interface de création.
Remarque : Il permet également de choisir d'afficher la barre d'outils de zone HTML en appelant l'élément this.showToolbar(true) qui démarre la méthode sur l'objet ibm.wcm.ui.html.HTMLEditor qui contrôle la visibilité de la barre d'outils.
Enfin, le dijit est défini et une instance de ibm.sample.Editor est créée.
Remarque : Cet exemple définit ibm.sample.Editor dans l'élément JSP, mais il est plus efficace de le charger à l'aide de la bibliothèque JavaScript statique. Cela est important car si vous disposez de plusieurs éditeurs sur la page, la définition JavaScript de ibm.sample.Editor est chargée à chaque fois, mais seule la dernière est chargée et utilisée.
<%--
/* Sample HTML Editor */
--%>
 
<%@ taglib uri="/WEB-INF/tld/portlet.tld" prefix="portletAPI" %>
<%@ page import="com.ibm.workplace.wcm.api.authoring.HTMLEditorBean" %><portletAPI:init /><%
    HTMLEditorBean editor = (HTMLEditorBean) request.getAttribute("EditorBean");    

    // The name of the editor corresponds to the ID of the text area field that will be rendered within the authoring form
    String docId = editor.getName();   
%>

<script>
   dojo.declare("ibm.sample.Editor", [ibm.wcm.ui.html.HTMLEditor], {

      /** Hold a reference to the text area we enriched. */
      theTextArea: null,

      /** Simple overloaded constructor that will dynamically enrich the target text area with a dojo dijit text area. */
      constructor: function(editorId, textArea) {
         this.inherited(arguments);                
         this.theTextArea = textArea;

         textArea.startup();         

         this.showToolbar(true);
      },

      /** This method is called by the HTML/RTF field dialogs. For example when the user has selected a tag to insert into the field. */
      insertMarkupAtCursor: function(markup){ 
         // Do cross browser text insertion
         if (document.selection && (!this.theTextArea.textbox.selectionStart || this.theTextArea.textbox.selectionStart === null))
         {
            // Handle IE, which defines document.selection
            this.theTextArea.focus();
            var textRange = document.selection.createRange();
            textRange.text = markup;
         }
         else if (this.theTextArea.textbox.selectionStart || this.theTextArea.textbox.selectionStart == '0')
         {
            // Handle Mozilla, Opera, which define document.selectionStart
            // Create the new text for the text field. createRange() isn't supported by these browsers
            var startPos = this.theTextArea.textbox.selectionStart;
            var endPos = this.theTextArea.textbox.selectionEnd;
            var scrollTop = this.theTextArea.textbox.scrollTop;
            this.setMarkup(this.theTextArea.value.substring(0, startPos) + markup + this.theTextArea.value.substring(endPos, this.theTextArea.value.length));
            
            // Restore the cursor and scroll position which were lost by replacing the text field's text
            this.theTextArea.focus();
         }
      },

      /** This method is called when a user triggers the import markup action of the field. */
      setMarkup: function(markup){ 
         this.theTextArea.set("value", markup);
      },

      /** This method is called whenever the authoring interface requires the current value of the field such as when the export markup button is clicked in edit mode. */
      getMarkup: function(){ 
         return this.theTextArea.value;
      },
      
      /** This method will be called when the user submits the form to the server. This gives the integration an opportunity to update the text area field with the value that should be committed on the server. */
      notifySubmit: function() {         
         // As we are enriching the text area being submitted, the value
         // is already up to date and we do not need to do anything
      }
   });

   require(["dijit/form/Textarea", "dojo/domReady!"], function(Textarea){
      var textArea = new Textarea({name: '<%= docId %>', style: "width:100%;max-width:910px;min-height:200px;_height:200px;"}, '<%= docId %>');    
      new ibm.sample.Editor('<%= docId %>', textArea);   
   });

</script>

Méthodes d'auxiliaire

L'élément ibm.wcm.ui.html.HTMLEditor comprend un certain nombre de méthodes d'auxiliaire qui permettent de démarrer l'ensemble de boîtes de dialogue de zone HTML standard à l'aide d'un programme. Cela signifie qu'il est possible de masquer la barre d'outils de l'éditeur HTML et d'obtenir tout de même toutes les fonctionnalités exposées.

Les méthodes disponibles sont les suivantes :
  • launchInsertImageDialog()
  • launchInsertLinkDialog(/* String */ linkText, /* String */ linkHref, /* String */ linkTarget, /* String */ linkDescription, /* String */ linkAttributes)
  • launchInsertTagDialog(/* boolean */ includeConsumableTags){