Best Practices : Utilisation des APIs de Lotus Web Content Management
Agenda Scénarios IBM Lotus Web Content Management Java Server Page (JSP) Introduction Balises JSP Composants JSP Exemples JSP Page de démarrage personalisée IBM Lotus Web Content Management Application Programming Interface (API) Introduction Obtenir un Workspace RenderingContext Gérer les contenus Rechercher des contenus Améliorer des pages de démarrage personnalisées Customiser les éléments utilisant des JSP 2 Résumé Best Practices
Scénarios Portlet personnalisée avec du contenu WCM Des fonctionnalités du Portail à l intérieur de WCM Mise en page impossible au travers des composants standards Mise en place de site multilingue Importer du contenu web / ressources existants Publication automatique au travers de WCM Intégration avec des workflows externes Modification en masse de contenus Création d actions spécifiques de workflows etc A utiliser seulement si cela n est pas possible Out-of-the-box 3
IBM Lotus Web Content Management JSP Introduction aux JSP WCM Balises JSP Composants JSP Exemples JSP Page de démarrage personalisée 4
Introduction aux JSP WCM 5
Balises JSP Utilisée pour un accès simplifié aux composants et contenus WCM Utilisation possible à partir d un composant JSP ou d une page JSP indépendante Utiliser la taglib suivante pour l inclure dans votre page JSP <%@ taglib uri="/web-inf/tld/wcm.tld" prefix="wcm" %> 6
Balise JSP: Initialisation InitWorkspace Tag: définition du workspace initial <wcm:initworkspace username=" " password=" " > [Error Message] </wcm:initworkspace> Explicit Context Tag: définition du chemin au serveur WCM <wcm:setexplicitcontext wcmwebapppath=" " wcmservletpath=" " path=" " > [Error Message] </wcm:setexplicitcontext> 7 Context Retrieval Tag: définition du contexte en fonction de l'emplacement d'une chaîne de chemin <wcm:setcontext location=" " wcmwebapppath="" wcmservletpath="" param=" " > [Error Message] </wcm:setcontext>
Balise JSP: balises d affichage librarycomponent Tag: affichage d un composant à partir de la bibliothèque de composants <wcm:librarycomponent name=" " > [Error Message] </wcm:librarycomponent> content Tag: affichage du contenu basé sur le contexte actuel d une page <wcm:content pagedesign=" " > [Error Message] </wcm:content> contentcomponent Tag: affichage d un composant à partir du site, de la zone de site ou du contenu actuel <wcm:contentcomponent type=" " key=" " > [Error Message] </wcm:setcontext> 8 Best Practices: Si vous avez besoin d une gestion multilingue des erreurs, envisager d'utiliser Java en utilisant des Resource Bundles API
Balise JSP : Exemple <%@ taglib uri="/web-inf/tld/wcm.tld" prefix="wcm" %> <html><head><title>ibm Lotus Web Content Management JSP Testing</title></head><body> <wcm:initworkspace username= wpsadmin" password="password" > Set initworkspace Failed<br> </wcm:initworkspace> <wcm:setexplicitcontext path="showcase/showcase+internal+site/news/" > Setting Explicit Context Failed<br> </wcm:setexplicitcontext> <wcm:librarycomponent name= SC Menu News"> Component Rendering Failed<br> </wcm:librarycomponent> <wcm:content> Content Rendering Failed<br> </wcm:content> <wcm:contentcomponent type="content" key= SC Body" > Content Element Rendering Failed<br> </wcm:contentcomponent> </body></html> 9
Composant JSP Vue Générale Référence une page JSP existante et stockée sur le serveur Cette JSP peut contenir ou non des références aux JSP WCM ou API Peut être intégrée dans n importe quel modèle de présentation comme un composant Peut être vue parmi d autres contenus WCM ou indépendamment 10
Utilisation des composants JSP Stockage des pages JSP Pour une utilisation à partir des portlets de rendu local et distant, les pages JSP doivent être stockées dans le répertoire war des portlets 6.1:<was_profile_root>/installedApps/<node>/PA_WCMLocalRendering.ear\ilwwcmlocalrende.war/jsp/html 6.0: <portal_server_root>/installedapps/wcm_local_ng_portlet_pa_xxxxxxx.ear\pa_xxxxxx.war\js p\html, where xxxxxxx is unique to your installation Pour une utilisation à partir de la portlet de contribution (comme page de démarrage personalisée, intégration d un editeur riche texte tiers ou JSP spécifique dédiée à un modèle de création) 6.1: <was_profile_root>/installedapps/<node>/pa_wcm_authoring_ui.ear/ilwwcmauthoring.war/jsp/html 6.0: <portal_server_root>/installedapps/wcm_authoring_ui_pa_xxxxxxx.ear/pa_xxxxxxx.war/jsp/h tml, where xxxxxxx is unique to your installation Pour une utilisation indépendante, utilisez la servlet et stockez la page JSP dans le répertoire WebApp du serveur WCM <was_profile_root>/installedapps/<node>/wcm.ear/ilwwcm.war/jsp/html 11
Utilisation des composants JSP Best Practices: La Syndication ne déplace pas les pages JSP référencées dans les composants JSP. Seul les composants JSP sont déplacés. Les pages JSP doivent être disponibles sur les serveurs Syndicateur et Abonné. L installation de certains fixes supprime les fichiers JSP spécifiques. Il faudra donc toujours sauvegarder ces fichiers dans un premier temps et les restorer si nécessaire. TIP! Consulter l article sur la gestion multilocal pour sa description comment inclure dans le fichier WAR des portlets. 12
Page de démarrage personalisée Solution rapide pour créer une interface utilisateur simple et créer des contenus spécifiques - Introduction Remplace le plus souvent la nécessité d exemple de «Custom Template Portlet» pour V5.1 Utilisation des Remote Actions : <a href="?wcmauthoringaction=<action>">text</a> Actions possibles : approve, reject, delete, edit, read, openmainview, new Nouveau en 6.1: move, viewversions, viewhistoric et add comments 13
Page de démarrage personalisée Approve, decline, delete, edit, read: Actions distantes Ceci est utilisé pour réaliser des actions sur les articles, exemple:?wcmauthoringaction=approve&docid=id?wcmauthoringaction=decline&docid=id1&docid=id2 L ID est un objet document (API WCM) converti en string (en utilisant le méthode.tostring() ), exemple: docid=com.ibm.workplace.wcm.api.wcm_content/id Openmainview Ceci est utilisé pour ouvrir une vue de la portlet de contribution, exemple:?wcmauthoringaction=openmainview&view=contentbysiteare a Liste des vues paramétrables: contentbysitearea, contentbytitle, myrecent, mydraft, mypendingapproval, mypublished, myexpired, mydeleted, alldraftitems, allexpireditems, allpublisheditems, alldeleteditems, componentsbytype 14
Page de démarrage personalisée New Ceci est utilisé pour ouvrir un nouveau formulaire de contenu, exemple: Actions distantes?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_content Les paramètres sont com.ibm.workplace.wcm.api.<nom>, avec Nom : WCM_AuthoringTemplate, WCM_Category, WCM_Content, WCM_FileComponent, WCM_HTMLComponent, WCM_ImageComponent, WCM_PresentationTemplate, WCM_RichTextComponent, WCM_Site, WCM_SiteArea, WCM_Taxonomy, WCM_TextComponent, WCM_Workflow, WCM_WorkflowStage Nouveau en 6.1: WCM_DateComponent, WCM_NumericComponent, WCM_PresentationTemplate, WCM_ShortTextComponent Renommé en 6.1 ('Library' a été enlevé, compatible) WCM_LibraryFileComponent, WCM_LibraryImageComponent, WCM_LibraryHTMLComponent, WCM_LibraryDateComponent, WCM_LibraryNumericComponent Déprécié en 6.1: WCM_LibraryDocumentManagerComponent 15
Page de démarrage personalisée New Actions (suite) distantes Pour un nouveau contenu, vous pouvez spécifier un modèle de création par défaut en ajoutant son ID atid :?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_content?atid=id Pour une nouvelle zone de site, contenus et catégories, vous pouvez ajouter le pid du parent sous lequel doit être créé le nouvel article:?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_content?pid=id?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_sitearea?pid=id?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_category?pid=id Nouveau en 6.1:spécifier le positionnement d une zone de site en utilisant &position (options: start et end )?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_sitearea&positio n=start 16
Page de démarrage personalisée Move Actions (nouveau en 6.1) distantes Ceci est utilisé pour déplacer une zone de site ou un contenu Exemple pour ouvrir le dialogue pour déplacer la zone de site ou contenu:?wcmauthoringaction=move&docid=com.ibm.workplace.wcm.api.wcm_content/id1 Un déplacement de niveau est spécifié par "1" pour monter et "-1" pour descendre. Exemple pour deplacer un contenu d une position:?wcmauthoringaction=move&docid=com.ibm.workplace.wcm.api.wcm_content/id1&pid=com. ibm.workplace.wcm.api.wcm_sitearea/id1&movedirection=1 Viewversions (nouveau en 6.1) Ceci est utilisé pour accéder à la liste des versions d un élément. Spécifier le docid de l article.?wcmauthoringaction=viewversions&docid=com.ibm.workplace.wcm.api.wcm_content/id 1 Viewhistory (nouveau en 6.1) Ceci est utilisé pour accéder à l historique d un article. Spécifier le docid de l article. Ex.:?wcmAuthoringAction=viewhistory&docid=com.ibm.workplace.wcm.api.WCM_Content/ID1 17
Page de démarrage personalisée Actions Remplir des champs pendant distantes la création de contenu (nouveau en 6.1) Lorsque vous utilisez les paramètres new et edit avec un contenu, vous pouvez aussi ajouter des données aux différents champs du contenu en utilisant une URL. Exemple:?wcmAuthoringAction=new&type=com.ibm.workplace.wcm.api.WCM_Content &wcmfield.content.name=newcontent Liste des parametres wcmfield.content.<nom>, avec Nom: name, title, description, authors, owners, publishdate, expirydate, generaldateone, generaldatetwo, workflow, categories and keywords Liste des type d éléments &wcmfield.element.[nom d élément] avec [nom d élément] le nom de l élément que vous allez remplir: texte, HTML, Rich Text Editor, sélection d option, séléction d utilisateur, date et heure, nombre, JSP, lien, référence de composant Vous pouvez définir de multiples éléments en même temps et définir des éléments multivalués comme les champs Auteurs, Responsables, Catégories, mots-clés. Exemple:?wcmAuthoringAction=new&type=com.ibm.workplace.wcm.api.WCM_Content &wcmfield.content.keywords=keyword1&wcmfield.content.keywords=keyword2 18
Page de démarrage personalisée Actions Save (nouveau en 6.1) distantes AutoSave: Ceci est utilisé pour sauvegarder l article. Cette action est réalisée en arrière-plan et n est pas visible pour les utilisateurs. Exemple: &wcmfield.autosave=true savevalidate Ce paramètre détermine si un avertissement ou une erreur resultant de l enregistrement automatique (AutoSave) sera présenté à l utilisateur. Par défaut, la valeur est true. Exemple pour désactiver l action : &wcmfield.savevalidate=false Ajouter des commentaires à l historique d un élément (nouveau en 6.1) Ajouter un commentaire à l historique d un élément avec &comment=commentaire dans l URL. Exemple: http://<host>/wps/myportal/wcmauthoring?wcmauthoringaction=edit&docid=com.ibm.w orkplace.wcm.api.wcm_content/id1&createdraft=true&comment=commentaire 19
Page de démarrage personalisée Exemple - JSP <table> <tr><td> <a href="?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_content"> Create new Content</a> </td></tr> <tr><td> <a href="?wcmauthoringaction=openmainview&view=contentbytitle"> Open content by title</a> </td></tr> <tr><td> <a href="?wcmauthoringaction=openmainview&view=contentbysitearea"> Open content by site area</a> </td></tr> </table> 20
Page de démarrage personalisée Configurer la portlet de Utiliser configurer ou personnaliser afin de définir les paramètres de la portlet (si nécessaire faire une contribution copie de la portlet) Selectionner Page de démarrage Entrer le positionnement du fichier JSP à prendre en compte Masquer si besoin la barre des taches 21
Page de démarrage personalisée Exemple 22
IBM Lotus Web Content Management API Introduction Obtenir un espace de travail RenderingContext Gérer les contenus Rechercher des contenus Améliorer les pages de démarrage personnalisées Customiser les éléments en utilisant des JSP 23
Introduction API est axé sur la transformation contenu (creation, mise à jour, déplacer dans un flux de travail) Bibliothèques de contenu Web: Déplacement ou copie d éléments au sein d une bibliothèque ou entre bibliothèques Itérateurs de recherche d'id d'objets : Recherche d article d un type donné à partir du nom ou type Recherche de composant de bibliothèque à partir du nom Recherche de contenu à partir du modèle de création, de la catégorie, du chemin d accès ou de l étape de flux de travaux Recherche de contenu modifiés à partir d une date ou parmi des dates La recherche de contenu (identique aux critères de recherche du composant Menu, mais utilisation de paramètres d'objets tels que les identifiants) L'extraction à partir des ID articles La possibilité de créer, supprimer et sauvegarder les éléments suivants : Contenu, Site, Zones de Site, Composant de ressources de fichier, Composant HTML, Composant image, Composant date et heure, (Le composant Document Manager n est plus disponible en 6.1), Composant lien, Composant numérique, Composant de feuille de Style ou Composant de sélection utilisateur et nouveau en 6.1: Composant Texte Court et composant Text La capacité à extraire les objets suivants : Contenus, Sites, Zone de Site, Taxinomies et categories, Workflows, Composants La capacité à extraire les objets suivants à partir des recherches (mais PAS en tant qu'objet) : ID Modèle de création (Auth. Tmpl.) ID Modèle de présentation (Presentation Templ.) et ID étape de workflow La capacité d'approuver et de rejeter les articles de contenu inclus dans une étape d'un flux de travaux. Les autres types d'élément ne prennent pas cette fonction en charge. 24
Introduction Nouveau en 6.1 Création d actions personnalisées de flux de travaux Permet d invoquer du code spécifique dans un processus de workflow WCM. Pour créer des actions de workflow personnalisées comme Archiver, promouvoir la publication de bibliothèque, envoi d e-mail configurable, etc Workflow : gestion dynamique des Approbateurs Quelques nouvelles méthodes ont été ajoutées à com.ibm.workplace.wcm.api.content pour permettre de changer les approbateurs Les approbateurs peuvent maintenant être ajoutés et supprimés durant le process de workflow Les accès approbateur peuvent être testés Service de bibliothèque Le service de bibliothèque expose des APIs pour créer, sauvegarder, copier, exporter et importer des bibliothèques WCM Liste des documents d une bibliothèque Exporte une liste d information contenant tous les objets de contenu web dans une bibliothèque Gérer la syndication Nouvelles APIs pour permettre le contrôle dynamique de la syndication 25
Obtenir un espace de travail in 6 <%@ page import="com.ibm.workplace.wcm.api.*" %> <% Décrit dans l Info Center //Obtenir le répertoire Repository repository = WCM_API.getRepository(); //Déclarer de l instance de l espace de travail Workspace workspace = null; //Vérifier si l instance utilisateur existe et s il est authentifié if(request.getuserprincipal()!= null) { //A utiliser seulement dans une portlet workspace = repository.getworkspace( (Principal) portletrequest.getuser() ); //A utiliser hors contexte portlet workspace = repository.getworkspace((principal) request.getuserprincipal() ); } else { workspace = repository.getanonymousworkspace(); } //Travailler avec l espace de travail //Autre option, définir un espace de travail authentifié en utilisant nom_utilisateur / mot_de_passe Workspace workspace = repository.getworkspace( user", password"); //Best Practice: fermer un espace de travail avec end doit se faire seulement dans une page JSP hors contexte portlet WCM (JSP non utilisé au travers du composant JSP) WCM_API.getRepository().endWorkspace(); 26
Obtenir un espace de travail en 6.1 Info Center 6.1 Utiliser WebContentService au lieu des WCM_API... //Obtenir le WebContentService try { // Initialisation du contexte InitialContext ctx = new InitialContext(); // Obtenir le WebContentService en utilisant le nom JNDI WebContentService webcontentservice = (WebContentService) ctx.lookup("portal:service/wcm/webcontentservice"); } catch (NamingException ne) { System.out.print("Naming Exception: " + ne); } Repository repository = webcontentservice.getrepository(); //Continuer avec le repositoire pour déclarer l instance de l espace de travail, etc... 27
Obtenir un espace de travail Utiliser le cache Best Practice: Obtenir un espace de travail WCM est une opération coûteuse. Par conséquent, vous devriez mettre en cache l espace de travail de l utilisateur courant afin d'augmenter les performances. Le plus simple est l'utilisation de la mise en cache automatique avec le code utilisant les wcm: initworkspace JSP tag: <%@ page import="com.ibm.workplace.wcm.api.*" %> <% // Créer l espace de travail WCM (mise en cache automatique dans la session) %> <wcm:initworkspace user="<%= request.getuserprincipal() %>" > <% // Obtenir la référence pour créer ou définir l espace de travail Workspace usersworkspace = (Workspace) pagecontext.getattribute(workspace.wcm_workspace_key); //Travailler avec l espace de travail... 28
Obtenir un Workspace Utiliser le cache Best Practice Vous pouvez aussi gérer le cache vous-même comme dans l extrait de code provenant de la Custom launch Page, chapitre 3.4.1.2 des Best Practices sur developerworks et dans le wiki WCM Workspace theworkspace = getcurrentusersworkspace(request, response, request.getuserprincipal() ); // Travailler avec l espace de travail... Workspace getcurrentusersworkspace(httpservletrequest request, HttpServletResponse response, Principal currentuser) throws IOException { String workspacesessionkey = currentuser.getname() + Workspace.WCM_WORKSPACE_KEY; Workspace theworkspace = (Workspace) request.getsession().getattribute(workspacesessionkey); if (theworkspace == null) { // theworkspace n était pas en session, création d un nouvel espace de travail et monté en session try { // Obtenir l espace de travail pour l utilisateur courant theworkspace = WCM_API.getRepository().getWorkspace(currentUser); // Stockage de l espace de travail dans la session afin d améliorer les futurs accès request.getsession().setattribute(workspacesessionkey, theworkspace); } } } // Gestion des erreurs à retrouver dans l exemple complet, volontairement omis ici afin de simplifier le code 29
RenderingContext Introduction Un rendering context contient toutes les informations requises pour afficher un objet. Cela inclut les informations comme le chemin de l objet à afficher et tous les autres paramètres Valable pour les objets requêtés Cela est créé en se basant sur l utilisateur courant Peut être créé via l espace de travail Ceci est très souvent utilisé lorsque l on souhaite accéder à WCM à partir d une portlet développée spécifiquement Il est nécessaire avant tout d accéder au contenu WCM à afficher 30
RenderingContext Travailler avec le contexte... 31 //Obtenir le contexte courant. RenderingContext renderingcontext = (RenderingContext)request.getAttribute(workspace.WCM_RENDERINGCONTEXT_KEY); //Obtenir le contenu courant. Content thecontent = renderingcontext.getcontent(); //Obtenir le chemin de la zone de site. SiteArea[] allsiteareas = renderingcontext.getsiteareas(); //Obtenir l ID de la zone de site courante utilisée pour le context de l utilisateur (renderingcontext). SiteArea contextsitearea = allsiteareas[allsiteareas.length-1]; //Obtenir les zones de site enfant de la zone de site courante. DocumentIdIterator directchildren = contextsitearea.getdirectchildren(); //Itérer sur les zones de site enfant. while(directchildren.hasnext()) { DocumentId child = directchildren.nextid();... }...
RenderingContext Créer un nouveau contexte... <%@ page import="com.ibm.workplace.wcm.api.*" %> // Créer un espace de travail WCM (mis en cache dans la session automatique) <wcm:initworkspace user="<%= request.getuserprincipal() %>" /> <% // Obtenir la référence de l espace de travail créé ou récupéré Workspace usersworkspace = (Workspace) pagecontext.getattribute(workspace.wcm_workspace_key); //Créer le contexte d affichage RenderingContext context = workspace.createrenderingcontext(request, response, new HashMap(), "http://localhost:10038/wcm", "connect"); //Définir le chemin du contenu à afficher context.setrenderedcontent("/sitea/sitearea1/sitearea1-1/thecontent");... 32
RenderingContext Afficher des contenus... //Création du StringBuffer qui contient le code HTML à utiliser StringBuffer html = new StringBuffer(); html.append( <div><p> );... // Obtenir la référence de l espace de travail créé ou récupéré Workspace usersworkspace = (Workspace) pagecontext.getattribute(workspace.wcm_workspace_key); // Créer le contexte d affichage RenderingContext context = workspace.createrenderingcontext(request, response, new HashMap(), "http://localhost:10038/wcm", "connect"); // Définir le chemin du contenu à afficher context.setrenderedcontent("/sitea/sitearea1/sitearea1-1/thecontent"); // Obtenir le rendu HTML String renderedcontent = workspace.render(context); //Ajouter le rendu HTML au buffer HTML html.append(renderedcontent);... 33
Gestion des contenus méthode workspace.createcontent API createcontent public com.ibm.workplace.wcm.api.content createcontent( com.ibm.workplace.wcm.api.documentid authoringtemplateid, com.ibm.workplace.wcm.api.documentid parentsiteareaid *, com.ibm.workplace.wcm.api.documentid siblingid *, int position *) * Optionel Créer un nouveau contenu basé sur un modèle de création dans la zone de site parent Le modèle ID qui est indiquée doit être un modèle qui existe déjà dans le système WCM Exemple: 34
Gestion Lotus des Tech Days contenus 2008 Trouver une zone de site ou un modèle de création Best Practice: Définir la bibliothèque courante seulement si différente de celle par défaut (6.0.1 et précédente) ou courante (6.0.1.1+)... //Obtenir la bibliothèque pour travailler avec en utilisant son nom si ce n est la bibliothèque par défaut DocumentLibrary documentlibrary = workspace.getdocumentlibrary("content"); //Définir la bibliothèque pour travailler avec lors de cette session (vous devez stocker la bibliothèque courante en session pour pouvoir la définir de nouveau plus tard) workspace.setcurrentdocumentlibrary(documentlibrary); //Trouver la zone de site parent DocumentIdIterator parentiter = workspace.findbyname(documenttypes.sitearea, Travel"); DocumentId parentsitearea = null; if(parentiter.hasnext()) { parentsitearea = parentiter.nextid(); } //Trouver le modèle de création DocumentIdIterator authoringiter = workspace.findbyname(documenttypes.authoringtemplate, "Article"); DocumentId authoringtemplate = null; if(authoringiter.hasnext()) { authoringtemplate = authoringiter.nextid(); }... 35
Gestion des contenus Créer et sauvegarder un contenu... //Créer un contenu vide en spécifiant un modèle de création, une zone de site parent, un contenu apparenté, une position Content newcontent = workspace.createcontent(authoringtemplate, parentsitearea, null, ChildPosition.END); //Définir le nom du contenu newcontent.setname("travel - Be the first tourist on the moon"); //Sauvegarder le contenu workspace.save(newcontent);... 36
Gestion des contenus Déplacer un... workflow dans un workflow //Obtenir l ID du contenu en utilisant findbyname DocumentIdIterator contentiter = workspace.findbyname(documenttypes.content, "Travel - Be the first tourist on the moon"); DocumentId contentid = null; if(contentiter.hasnext()) { contentid = contentiter.nextid(); } //obtenir le contenu en utilisant getbyid Content content = (Content)workspace.getById(contentId); //Déplacer le contenu à l étape suivante du workflow content.nextworkflowstage(); //Sauvegarder le contenu workspace.save(content);... 37
Rechercher des contenus méthode workspace.contentsearch API contentsearch public com.ibm.workplace.wcm.api.documentiditerator contentsearch ( ) com.ibm.workplace.wcm.api.documentid templateid, com.ibm.workplace.wcm.api.documentid[] siteareaids, com.ibm.workplace.wcm.api.documentid[] categoryids, java.lang.string[] keywords, boolean matchallkeys * * change selon 'ou' et et' Tous les contenus qui correpondent aux critères de recherche seront retournés, en regard de leur statut (inclut également les contenus non publiés) Le composant de recherche se comporte de la même manière que le composant Menu Si des zones de site ont été spécifiées, tous les parents et descendants seront inclus dans la recherche L ordre d affichage des résultats n est pas garanti. Tous les paramètres excepté matchallkeys sont optionels 38
Rechercher des contenus Best Practice: Autres Utiliser les API de méthodes recherche seulement si ce n est API pas possible au travers des composants WCM workspace.findcontentbyauthoringtemplate ** workspace.findcontentbycategory ** workspace.findcontentbyworkflowstage Workspace.findByType ** Workspace.findContentByPath Workspace.findContentModifiedBetween ** Workspace.findContentModifiedSince ** Workspace.findByPath * Workspace.findContentByWorkflowStage * Workspace.findByName ** * Nouveau en 6.0.1.2 ** Paramètre additionnel d étape de flux de travaux en 6.1 permettant de meilleures performances 39
Rechercher des contenus Configurer le Menu via les API Un exemple pour combiner les API et le composant Menu Utiliser les paramètres Query String pour gérer dynamiquement le composant Menu, exemple pour sélectionner les catégories <wcm:initworkspace user="<%= request.getuserprincipal() %>" /> <% //Obtenir le contexte de rendu courant RenderingContext context = (RenderingContext)request.getAttribute(Workspace.WCM_RENDERINGCONTEXT_KEY); //Obtenir le chemin du contexte courant String currentpath = context.getpath(); //Par exemple, rechercher sur des catégories spécifiques Map myparams = new HashMap(); myparams.put("cat", Cat1,Cat2"); %> //Définir le contexte pour le contexte courant et les paramètres Query String <wcm:setexplicitcontext path="<%=currentpath%> requestparameters="<%=myparams%>"/> //Afficher le Menu <wcm:librarycomponent name="themenu"/> 40
Rechercher des contenus Utiliser le composant Menu avec les API Comme les composants Menu sont la façon la plus rapide de réaliser une recherche et sont plus facilement configurables, vous pouvez utiliser un composant Menu pour construire votre liste de contenus pour ensuite travailler avec les API Mettre un lien vers l article dans Conception de composant pour chaque contenu correspondant (en utilisant <PlaceHolder tag=«sitepath»>) et un separateur unique (comme «~#») et utiliser ce séparateur dans votre code pour obtenir la liste de vos contenus Remarque: si vous souhaitez contrôler le mappage des modèles de présentation avec votre contenu, vous devez utiliser un menu qui met en œuvre des iframes avec le contenu affiché dans chaque iframe 41
Rechercher des contenus Utiliser le composant Menu avec les API 42 Obtenir une liste de contexte de rendu (chemin de site) pour chaque contenu trouvé séparé par un séparateur unique (ici ~# )
... //Définir le nom du composant Menu à utiliser String MENU_NAME = "MenuFeatureArticle"; //Trouver le composant Menu DocumentIdIterator menuiter = workspace.findcomponentbyname(menu_name); LibraryComponent menu = null; if (menuiter.hasnext()) { //Obtenir l ID du document pour le Menu DocumentId menuid = (DocumentId) menuiter.nextid(); //Obtenir le composant Menu depuis l espace de travail de l admin menu = (LibraryComponent) workspace.getbyid(menuid); }... Rechercher des contenus Utiliser le composant Menu avec les API 43
... Rechercher des contenus Utiliser le composant Menu avec les API //Si vous avez trouvé le composant menu alors parcourez la liste et travaillez sur chaque élément if(menu!= null) { //Afficher le Menu et capturer la sortie String menuoutput = workspace.render(renderingcontext, menu); //Tokenizer la sortie StringTokenizer st = new StringTokenizer(menuOutput, "~#"); //Parcourir au travers des tokens, don t chacun représente une partie des contenus while(st.hasmoreelements()) { String tokenpath = st.nexttoken(); //Définir le chemin pour le contenu courant renderingcontext.setrenderedcontent(tokenpath); //Réaliser vos actions avec les API, comme obtenir le contenu à partir du contexte courant workspace.render(renderingcontext); 44 }... }...
Rechercher des contenus Utiliser le composant Menu avec les API Nouveau en 6.1: Obtenir RenderingContext en JSP depuis le composant Menu (et Navigateur, Recherche, Contenu ou Composant Taxinomie) /** * Retourne la valeur du DocumentID du résultat courant. Cette méthode retournera seulement * une valeur le composant JSP est invoqué à partir d un composant Menu, Navigateur, * recherche, contenu ou composant Taxinomie et donc lorsque le tag initworkspace est utilisé * dans la page. Dans les autres cas, le résultat null est retourné. * * Retourne le DocumentID du résultat courant ou null si aucun résultat existe. */ public DocumentId getcurrentresultid(); 45
Additionel 6.1 performance APIs Build better performing solutions by batching requests to the JCR, backported to 6.0.1.3 /** * Retourne l objet pour l ID donné * * Cette méthode permet d optimiser les performances afin d obtenir un élément pour les opérations de rendu et de lecture. * Obtenir l ID avec l option asreference égale à true est plus rapide et l objet n est pas modifié par le code client * Si le code client nécessite d éditer le <code>document</code> alors asreference doit à false. */ public Document getbyid(documentid id, boolean asreference ); /** * Retourne la liste des objets <CODE>Document</CODE> comme <CODE>DocumentId</CODE> comme un * <CODE>DocumentIterator</CODE>. Les IDs sont passés comme un <CODE>DocumentIdIterator</CODE>. * Cette méthode permet d optimiser les performances lors des opérations de rendu et de lecture. */ public DocumentIterator getbyids(documentiditerator documentiditerator, boolean asreference); /** * Créer un nouveau <CODE>DocumentIdIterator</CODE> d un tableau de données <CODE>DocumentId<CODE>. */ public DocumentIdIterator createdocumentiditerator(documentid[] documentids); 46
Améliorer des pages de démarrage personalisées Spécifier un modèle de création pour créer un nouveau contenu, Exemple... //Trouver le modèle de création pour un article. DocumentIdIterator authoringiter = workspace.findbyname(documenttypes.authoringtemplate, "Article"); DocumentId authoringtemplate = null; if(authoringiter.hasnext()) { authoringtemplate = authoringiter.nextid(); } %> <br/> <a href="?wcmauthoringaction=new&type=com.ibm.workplace.wcm.api.wcm_content&atid=<%=""+authoringt emplate%>"> Create new Article</a> <br/> <a href="?wcmauthoringaction=openmainview&view=contentbytitle"> Open content by title</a> <br/> <a href="?wcmauthoringaction=openmainview&view=contentbysitearea"> Open content by site area</a>... 47
Améliorer des pages de démarrage personalisées Exemple de l URL généré pour Create new Article : http://<host_name>/.../?wcmauthoringaction= new&type=com.ibm.workplace.wcm.api.wcm_c ontent&atid=com.ibm.workplace.wcm.api.wcm_ AuthoringTemplate/Article/3db2eb004203716d92 d9fe233ec2ac0d/false 48
Améliorer des pages de démarrage personalisées Plus d exemples disponibles dans les Best Practices sur developerworks et dans le Wiki Page de démarrage personalisées à partir desquelles sont créés des contenus en utilisant des modèles de création disponibles (ch 3.4.2.1) Page de démarrage personalisée qui fournit une interface d approbation spécifique (ch 3.4.2.2) 49
Customiser des éléments en utilisant les JSP Consulter l Info Center pour plus d informations sur Customizing elements using JSP dans un modèle de création Utiliser seulement lorsque ce n est pas possible Out-of-the-box, comme fournir une liste dynamique provenant de sources externes 50
Résumé des Best Practices Déjà mentionné Si vous avez besoin une gestion multilingue des erreurs via JSP, utiliser Java Resource Bundles en utilisant les API Les fichiers JSP doivent être sauvegardés, les fixes sont succeptibles de les supprimer Les fichiers JSP ne sont pas syndiqués et doivent être inclus dans le processus de transfert Terminer un espace de travail avec la balise End dans les JSPs utilisées hors contexte WCM (pas pour les composants JSP) Mettre en cache l objet espace de travail pour chaque utilisateur dans la session Définir la bibliothèque seulement si différente de celle par défaut (6.0.1 et précédente) ou courante (6.0.1.1+) Évitez les API pour construire des menus personnalisés préférer l utilisation de composant Menu à la place (combiné avec les API si besoin) 51
Résumé des Best Practices Davantage de Best Practices Utiliser Workspace.login et Workspace.logout autour de toutes les appels via les méthodes API WCM qui seront exécutés dans la requête actuelle (pas pour les composants JSP) Nécessite PK50703 pour 6.0.1.1 (voir ifix readme pour un usage correct) Pour les applications Multi-Thread, vous devrez faire un appel login/logout par thread Pour les applications longue durée, il sera nécessaire de se relogguer périodiquement afin de maximiser les performances (par exemple, avant qu un timeout de session apparaisse) Regrouper les fonctionnalités réutilisable dans une JSP de référence ; utiliser jsp:include pour l intégrer Utiliser getcomponentbyreference à la place getcomponent lorsqu il n est pas nécessaire d éditer ou d ajouter à un autre conteneur (meilleures performances) Utiliser le cache pour les résultats d une JSP en utilisant le servlet-caching ou WCM caching Comme les DocumentID s des API Web Content Management contiennent des informations sur le statut du flux de travaux, si vous redémarrez le flux de travaux OU rejetez un document, alors souvenez vous d obtenir le nouveau DocumentID de l objet et de ne pas utiliser l ancien DocumentID. Utiliser tout d abord les fonctionnalités Out-of-the-box, puis les tags JSP et seulement après les API 52
Résumé Scénarios IBM Lotus Web Content Management Java Server Page (JSP) Introduction Balises JSP Composants JSP Exemples JSP Page de démarrage personalisée IBM Lotus Web Content Management Application Programming Interface (API) Introduction Obtenir un Workspace RenderingContext Gérer les contenus Rechercher des contenus Améliorer des pages de démarrage personnalisées Customiser les éléments utilisant des JSP Résumé Best Practices 53
Information et Ressources IBM Lotus Web Content Management Home Page http://www.ibm.com/software/lotus/products/webcontentmanagement/ IBM WebSphere Portal Information Center documentation http://www.ibm.com/developerworks/websphere/zones/portal/proddoc.html Java doc pour IBM Lotus Web Content Management API http://<host>/wps/wcm/webinterface/api-javadoc/index.html Stocké dans <was_profile_root>\appserver\profiles\wp_profile\installedapps\<node name>\wcm.ear\ilwwcm.war\webinterface\ developerworks articles + Forum: Best Practices pour IBM Workplace Web Content Management V6 http://www.ibm.com/developerworks/websphere/library/techarticles/0701_devos/0701_devos.html Multi-locale site management avec IBM Workplace Web Content Management http://www-128.ibm.com/developerworks/lotus/documentation/webcontentmanagement/d-lsmultilocalesites/ IBM WebSphere Portal / Lotus Web Content Management Best Practices Wiki http://www-10.lotus.com/ldd/portalwiki.nsf (section spéciale pour les API) 54
Questions? 55