Documentation Infoglue : Développement de composants pour le CMS Infoglue Menéndez Julián CRI (Centre de Ressources Informatiques) Université de Rennes I - 10/08/06 Avant-propos Cette documentation succincte s adresse aux utilisateurs désireux de se mettre rapidement à développer des composants pour le CMS Infoglue. Cette documentation, en français, s appuie sur la documentation Template Reference disponible en ligne (en Anglais) dont une limite est le manque criant d exemples permettant une rapide prise en main de l'outil. En effet, le seul exemple donné n est pas commenté, ne fait appel qu a des tags d Infoglue et non aux méthodes java de l API (i.e. l interface de programmation) et est écrit en Velocity. Tout en me basant sur la documentation précédente, je me propose ici d agrémenter le propos d exemples pertinents en favorisant l utilisation de l API Java d Infoglue et l écriture en JSP. La combinaison JSP API Java me semble, en effet, mieux exploiter la richesse d Infoglue, la combinaison Velocity Tags cherchant à simplifier le code des composants et leur présentation. De plus le passage JSP API Java vers Velocity et l utilisation de tags est très aisé. «L esprit» Infoglue. Infoglue est un système de gestion de contenus (ou CMS pour Content Management System) open source (bien que certaines documentations soient payantes). En tant que CMS, Infoglue cherche à séparer le fond de la forme lors de la construction d'un site Internet. Pour une présentation plus approfondie de l interface du CMS vous pourrez vous reporter avec profit à la documentation ou au tutoriel vidéo établis par Mattias Bogeblad, principal développeur de l'outil Infoglue. La construction des pages du site se fait grâce à des composants (que l'on nommera indifféremment templates par la suite) réutilisables correspondants à des tâches logiques de base (on pourra avoir un composant chargé de l'affichage du menu du site, un autre qui affiche un flux RSS paramétrable, etc.). Les classes BasicTemplateController et ComponentLogic sont les deux classes les plus utiles pour la réalisation de composants et offrent de nombreuses méthodes intéressantes. Le langage utilisé dans les templates peut aussi bien être du Velocity d Apache que du JSP. Infoglue offre une série de points de connexion et de fonctionnalités qui permettent d extraire du contenu du CMS. Plan «L ESPRIT» INFOGLUE....1 GENERALITES...2 SYNTAXE :...3 CONTENUS...4 DIGITAL ASSETS...5 STRUCTURE / NAVIGATION...6 REUTILISATION DE TEMPLATES...8 INTEGRATION D APPLICATIONS...9 DIVERS...9 LIENS :...9
Généralités Il y a certaines notions qui doivent être comprises avant de pouvoir construire des templates. La plus importante est celle de contexte de page. Quand un utilisateur demande une page dans le site toutes les requêtes passent par un distributeur central. Si on prend, par exemple, une requête courante cela doit ressembler à cela : http://localhost/site/viewpage.action?sitenodeid=34&languageid=1&contentid=null Le ViewPage.action est le distributeur central et possède de nombreuses fonctionnalités mais nous nous focaliserons sur le traitement courant des pages. La page demandée par l utilisateur est identifiée par son sitenodeid=34 dans l URL précédente. Le sitenodeid identifie un unique sitenode, c'est-à-dire un nœud donné, vu comme un dossier, dans la structure hiérarchisée du site (Figure 1). Ces sitenodes sont construits dans l outil Structure du CMS Infoglue. Lorsque le sitenode est localisé ViewPage.action vérifie d abord la langue dans laquelle il doit rendre la page. L URL contient également cette information dans le paramètre languageid=1 qui identifie de façon unique la langue Française par exemple. SiteNodes Figure 1 - Nœuds du site (SiteNodes) dans l'onglet Structure du CMS L étape suivante consiste à associer un (ou plusieurs) template à cette page. L onglet structure permet d associer des template de contenu (template-content) au template conteneur (ou de liaison : template-binding) associé à chaque page (Figure 2). Figure 2 - Permet d associer un template au nœud courant parmi les templates disponibles (crées dans l onglet contenu) au travers d'une fenêtre "pop-up" Développement de Composants pour le CMS Infoglue 2
Syntaxe : En JSP Les pages JSP (Java Server Pages) permettent de générer des pages HTML dynamiques à partir de scriptlets (morceaux de code Java). L utilisation de JSP dans le CMS Infoglue est bien éloignée de leur utilisation dans une application Web quelconque où il est recommandé de concentrer la partie présentation dans les JSP et la partie applicative dans des servlets. Dans Infoglue les JSP contiennent à la fois la présentation (le code HTML généré) et la partie applicative (souvent limitée malgré tout). Il faut tout d abord récupérer le contexte du template principal lié à une sitenode (page du site) à l aide de l instance de la classe BasicTemplateController qui est la principale classe de l API. Pour cela on fait appel à la méthode suivante : (BasicTemplateController) request.getattribute("org.infoglue.cms.deliver.templatelogic") On peut ensuite appliquer la méthode désirée à notre instance de classe. ({méthode} fait référence à une méthode quelconque de l API). templatelogic.{méthode} Exemple L exemple ci-dessous se contente d importer l objet BasicTemplateController dont on récupère l instance de la page dans la variable templatelogic. On affiche ensuite le titre de la page : <%@page import="org.infoglue.deliver.controllers.kernel.impl.simple.basictemplatecontroller" <% (BasicTemplateController) request.getattribute("org.infoglue.cms.deliver.templatelogic") ; <%= templatelogic.getpagetitle() En Velocity En Velocity, on récupère très facilement le contexte grâce à la référence : $templatelogic Ensuite Infoglue met à disposition 4 librairies propres qui, bien que non exhaustives, donnent accès aux fonctionnalités les plus utilisées du CMS. Page Tags : Librairie de méthodes concernant la manipulation de pages Content Tags : Librairie de tags concernant la manipulation de contenu Structure Tag : Librairie de tags concernant la manipulation de la structure du site Management Tags : Librairie de tags concernant la partie management Exemple L exemple ci-dessous est l équivalent de l exemple précédent mais rédigé en Velocity et faisant appel aux taglibs propres à Infoglue : $templatelogic.getpagetitle() CRI Université de Rennes I Julián Menéndez -10/08/2006 3
Contenus Les contenus sont les briques de base d un site. Ce peut être du texte, des images, des pdfs, des templates ou tout autre type d information. Un contenu n est disponible à partir d un sitenode qu après qu il y ait été attaché d une façon ou d un autre par l intermédiaire de l outil structure. L idée de l établissement de liens (binding) est basée sur celle de réutilisation de contenus dans diverses pages, ce qui constitue une pierre angulaire de la gestion de contenu (content management). En effet, la plupart du temps, les personnes saisissant le texte et celles décidant de leur utilisation dans le site ne sont pas les mêmes. Le concept sépare très nettement le contenu de l architecture du site. De même que le CMS Infoglue offre de multiples façons de lier les contenus il existe également de multiples façons de les récupérer dans les templates. Ci-dessous vous trouverez les méthodes concernant les contenus de type texte ordinaire. Reportez-vous à la javadoc pour une liste complète. getcontentattribute(string contentbindningname, String attributename) This method delivers a String with the content-attribute asked for. As the sitenode can have multiple bindings as well as content as a parameter this parameter requires a bindingname which refers to the AvailableServiceBinding.name-attribute. getcontentattribute(string attributename) This method delivers a String with the content-attribute asked for if it exists in the content defined in the url-parameter contentid. getcontentattribute(integer contentid, String attributename) This method delivers a String with the content-attribute asked for on the content specified. getboundcontent(string structurebindningname) The method returns a single ContentVO-object that is the bound content of named binding. It's used for getting one content. getboundcontents(string structurebindningname) The method returns a list of ContentVO-objects that is the bound content of named binding. The method is great for collection-pages on any site. getboundfoldercontents(string structurebindningname, boolean searchrecursive, String sortattribute, String sortorder) The method returns a list of ContentVO-objects that is children to the bound content of named binding. The method is great for collection-pages on any site where you want to bind to a folder containing all contents to list. You can also state if the method should recurs into subfolders and how the contents should be sorted. The recursion only deals with three levels at the moment for performance-reasons. Exemple L exemple ci-dessous récupère les Méta Informations de la page courante grâce à la méthode getmetainformationcontentid() et en affiche l'attribut Title : <%@page import="org.infoglue.deliver.controllers.kernel.impl.simple.basictemplatecontroller" <% (BasicTemplateController) request.getattribute("org.infoglue.cms.deliver.templatelogic") ; <%= templatelogic.getcontentattribute(templatelogic.getmetainformationcontentid(),"title") Développement de Composants pour le CMS Infoglue 4
Digital Assets La section précédente concernait les contenus basés sur du texte tel qu un article ou un simple champ contenant une phrase ou une URL. La plupart des sites font également appel a des contenus de type image ou documents binaires (PDF, Word, Excel etc.) entre autres. La plateforme Infoglue supporte cette dernière catégorie de façon générique sous l'appellation "Digital Assets" dont il existe plusieurs façons de les manipuler. De même que les autres contenus, les assets sont également stockés dans la base de données. Cependant, lors de la requête, les assets sont convertis (et mis en cache) en fichiers atteignables au travers d une URL. getasseturl(string contentbindningname) This method delivers a String with the URL to the digital asset asked for. As the sitenode can have multiple bindings as well as content as a parameter this parameter requires a bindingname which refers to the AvailableServiceBinding.name-attribute. getasseturl(integer contentid) This method delivers a String with the URL to the digital asset asked for. getasseturl(integer contentid, String assetkey) This method delivers a String with the URL to the digital asset asked for. getasseturl(string contentbindningname, int index) This method delivers a String with the URL to the digital asset asked for. As the sitenode can have multiple bindings as well as content as a parameter this parameter requires a bindingname which refers to the AvailableServiceBinding.name-attribute. getasseturl(string contentbindningname, String assetkey) This method delivers a String with the URL to the digital asset asked for. As the sitenode can have multiple bindings as well as content as a parameter this parameter requires a bindingname which refers to the AvailableServiceBinding.name-attribute. getarchivebaseurl(string contentbindningname, String assetkey) This method delivers a String with the URL to the base path of the directory resulting from an unpacking of a uploaded zip-digitalasset. getarchivebaseurl(integer contentid, String assetkey) This method delivers a String with the URL to the base path of the directory resulting from an unpacking of a uploaded zip-digitalasset. getarchivebaseurl(string contentbindningname, int index, String assetkey) This method delivers a String with the URL to the base path of the directory resulting from an unpacking of a uploaded zip-digitalasset. getcontentattributeasimageurl(string contentbindningname, String attributename, int canvaswidth, int canvasheight, int textstartposx, int textstartposy, int textwidth, int textheight) This method delivers a String with the content-attribute asked for generated as a gif-file. That is - the text is printed as an image. getcontentattributeasimageurl(string contentbindningname, String attributename, int canvaswidth, int canvasheight) This method delivers a String with the content-attribute asked for generated as a gif-file. That is - the text is printed as an image. CRI Université de Rennes I Julián Menéndez -10/08/2006 5
Exemple Cet exemple récupère dans une Collection Java les images attachées au template par l'intermédiaire d'une propriété ajoutée au template (Figure 3). Cette Collection est ensuite transformée en tableau afin d y accéder plus aisément et on affiche ensuite la dernière Image de la collection (Remarque : la méthode getcomponentlogic() permet de récupérer le contexte de l'objet ComponentLogic associé) : <%@page import="org.infoglue.deliver.controllers.kernel.impl.simple.basictemplatecontroller, java.util.collection" <% (BasicTemplateController) request.getattribute ("org.infoglue.cms.deliver.templatelogic") ; //Récupération dans une Collection de toutes les Images contenues dans la propriété Image Collection assetkeyscollection = templatelogic.getassetkeys(templatelogic.getcomponentlogic().getboundcontentid("images")); //Conversion de la collection en tableau pour un accès séquentiel des éléments Object[] assetkeysarray = assetkeyscollection.toarray() ; //Récupération du nombre d'images contenues dans le contenu Images int nbimages = assetkeyscollection.size(); <img src=" <%= templatelogic.getcomponentlogic().getasseturl("images",assetkeysarray[nbimages-1].tostring()) " /> Figure 3 - Définition d'une propriété "Images" dont le type devra correspondre à du Contenu Image et qui contenant des "Digital Assets" image. Structure / Navigation La structure d'un site, à l'instar du contenu, est un élément central. C est à ce niveau qu'est définie l'ossature générale du site et qui influera de façon décisive sur la navigation future au sein du site. Les relations entre les pages et les nœuds du site (SiteNodes) sont définies grâce à de liens (bindings) établis à l aide de l outil structure (Structure Tool). Le CMS Infoglue met à disposition un ensemble de méthodes permettant de définir de quelle manière les pages et les nœuds sont mis en relation ainsi qu un ensemble de méthodes permettant des récupérer des références aux nœuds dans les templates. getpageurl(string structurebindningname) This method delivers a String with the URL to the page asked for. As the sitenode can have multiple bindings the method requires a bindingname which refers to the AvailableServiceBinding.name-attribute. Développement de Composants pour le CMS Infoglue 6
getpageurl(webpage webpage, Integer contentid) This method just gets a new URL but with the given contentid in it. getpagebaseurl(string structurebindningname) This method delivers a String with the URL to the page asked for. As the sitenode can have multiple bindings the method requires a bindingname which refers to the AvailableServiceBinding.name-attribute. getsitenodeid(string structurebindningname) Getter for the sitenodeid on a specific bound page getpageurl(string structurebindningname, Integer contentid) This method delivers a String with the URL to the page asked for. As the sitenode can have multiple bindings the method requires a bindingname which refers to the AvailableServiceBinding.name-attribute. This method also allows the user to specify that the content is important. This method is mostly used for master/detail-pages. getpageurl(string structurebindningname, int position, Integer contentid) This method delivers a String with the URL to the page asked for. As the sitenode can have multiple bindings the method requires a bindingname and also allows the user to specify a special sitenode in an ordered collection which refers to the AvailableServiceBinding.nameattribute. This method also allows the user to specify that the content is important. This method is mostly used for master/detail-pages. getcurrentpageurl() This method delivers a new url pointing to the same address as now but in the language corresponding to the code sent in. getpageurlafterlanguagechange(java.lang.string languagecode) This method delivers a new url pointing to the same address as now but in the language corresponding to the code sent in. getpagetitle() The navigation-title is fetched from the meta-info-content bound to the site node. getpagenavtitle(string structurebindningname) This method delivers a String with the Navigation title the page asked for has. As the sitenode can have multiple bindings the method requires a bindingname which refers to the AvailableServiceBinding.name-attribute. The navigation-title is fetched from the meta-info-content bound to the site node. getchildpages() The method returns a list of WebPage-objects that is the children of the current sitenode. The method is great for navigation-purposes on a structured site. getboundpages(string structurebindningname) getboundpages(integer sitenodeid, String structurebindningname) This methods get a list of bound pages with the structurebindningname sent in which resides on the sitenodeid sent in. CRI Université de Rennes I Julián Menéndez -10/08/2006 7
getlocalizedboundpages(string structurebindningname) The method returns a list of WebPage-objects that is the bound sitenodes of named binding. The method is great for navigation-purposes on any site. We also filter out all pages that don't have a localized version of the page meta-content. getboundpage(string structurebindningname, int position) The method returns a list of WebPage-objects that is the bound sitenodes of named binding. The method is great for navigation-purposes on any site. getisparenttocurrent(integer sitenodeid) This method helps us find out if the current site node is the same or a child to the sent in one. So if the current page is a child (in the entire hierarchy below) below the sitenode sent in the method returns true. Useful for navigational purposes. Exemple L exemple ci-dessous récupère les pages du site, liées au composant par l'intermédiaire d'une propriété "Pages" (Figure 4), sous forme d'objets WebPage contenus dans une liste et affiche des hyperliens y conduisant : <%@page import="org.infoglue.deliver.controllers.kernel.impl.simple.basictemplatecontroller, org.infoglue.deliver.applications.databeans.webpage, java.util.list, java.util.iterator" <% (BasicTemplateController) request.getattribute("org.infoglue.cms.deliver.templatelogic") ; // Récupération d'une liste contenant les Pages associées au template grâce à la propriété Page List listpages = templatelogic.getcomponentlogic().getboundpages("pages") ; // Itération sur chaque page contenue dans la Liste pour construire le menu for (Iterator itc = listpages.iterator() ; itc.hasnext() ; ) { WebPage unepage = (WebPage) itc.next(); <a href=" <%= unepage.geturl() " > <%= unepage.getnavigationtitle() </a> <% } Figure 4 - Propriété "Pages" contenant les pages du site dont on veut récupérer des références dans le template Réutilisation de Templates Lors de la construction du site Internet ou toute autre représentation visuelle de l information il y a souvent de nombreuses parties réutilisables dans la page. Par exemple, on pourra vouloir réutiliser un entête dans d autres templates. Cette fonctionnalité est supportée par Infoglue. Ce que l on souhaite c est identifier les parties réutilisables et les mettre dans leur propre contenu de type template. Les templates auront alors le même contexte que les template appelants ce qui implique qu un template offre exactement les mêmes fonctionnalités que le template principal. On peut en particulier inclure des templates dans un template lui-même inclus dans un autre template ce qui permet de développer de très petits composants réutilisables si tel est le but recherché. Développement de Composants pour le CMS Infoglue 8
include(string contentbindningname, String attributename) This method allows the current template to include another template which is also rendered in the current context as if it were a part. Intégration d applications Les sites web proposent en général de nombreuses fonctionnalités. Cette section présente quelques façons d intégrer des applications dans un site web sans avoir à réécrire l application ou en ayant juste à intégrer une logique applicative dans le site tout en la paramétrant à votre gré. Il est aussi possible de construire des logiques applicatives directement dans la plateforme dans une optique de réutilisabilité et d extensibilité. geturlcontent(string url) This method fetches a given URL contents. This means that we can include an external url's contents in our application. Divers Ici sont regroupées quelques fonctionnalités utiles supplémentaires. Assurez-vous de consulter la javadoc pour une liste exhaustive. getsitenodeid() Getter for the sitenodeid getlanguageid() Getter for the languageid getcontentid() Getter for the contentid getrequestparameter(string parametername) Getter for request-parameters getcontenttypedefinitionvo(integer contentid) The method returns the ContentTypeVO-objects of the given contentid. Liens : Template Reference : http://www.infoglue.org/infogluedeliverlive/projects/infoglue_cms/template_reference API / javadoc : http://www.infoglue.org/javadocs/infoglue235/ Velocity : http://jakarta.apache.org/velocity/ Documentation : http://www.infoglue.org/infogluedeliverlive/projects/infoglue_cms/documentation Tutoriel vidéo : http://www.infoglue.org/downloads/igtutorialpart1.zip Mathias Bogeblad : mailto:mattias.bogeblad@modul1.se BasicTemplateController : http://www.infoglue.org/javadocs/infoglue235/org/infoglue/deliver/controllers/kernel/impl/simple/basictemplatecontroller.html ComponentLogic : http://www.infoglue.org/javadocs/infoglue235/org/infoglue/deliver/controllers/kernel/impl/simple/componentlogic.html JSP : http://www.infini-fr.com/sciences/informatique/langages/imperatifs/java/servletsjsp/jsp.html WebPage : http://www.infoglue.org/javadocs/infoglue235/org/infoglue/deliver/applications/databeans/webpage.html CRI Université de Rennes I Julián Menéndez -10/08/2006 9