Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 02/05/2014 18:48:40

imen Akili
Guest
Registered: 29/04/2014
Posts: 5

Création d'un nouveau service

Bonjour,

Je souhaite savoir comment créer un service qui me permet d'ajouter un contenu externe à une page du site. Mon besoin ce traduit dans le CMS par la création d'un service qui apparait dans le menu comme les services prédéfinis de type External contents (Google Calendar, Youtube Playlist, twitter stream...) et que le contributeur pourra ainsi insérer dans l'une des zones de la pages selon un paramétrage donné.

La documentation explique un peu la notion de service et comment s'en servir mais ne donne pas trop de détails sur la méthode qui permet de créer un nouveau.

Pourriez vous, s'il vous plait, me dire si c'est faisable? Si oui, m'expliquer comment dois-je procédé pour le mettre en place?

D'avance merci,
Imen.

Offline

#2 05/05/2014 10:31:30

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: Création d'un nouveau service

Bonjour,

Vous pouvez tout à fait ajouter un nouveau service avec vos propre paramètres.
Vous trouverez quelques explications dans le wiki ici : https://wiki.ametys.org/pages/viewpage. … d=16580767
Nous n'avons pas encore écrit ce chapitre en français. A noter que cette page est valable pour les version 3.4 et 3.5 d'Ametys.

La création d'un nouveau service fait appel à plusieurs notions dans Ametys. Vous serez sans doute amener à créer un nouveau plugin, si vous ne l'avez pas déjà fait. Rendez-vous sur cette page wiki dans ce cas : https://wiki.ametys.org/display/AMETYSF … in+Ametys.

Un service est un point d'extension multiple. Il doit être déclaré dans le fichier plugin.xml d'un plugin de la manière suivante :

<extension point="org.ametys.web.service.ServiceExtensionPoint"
                  class="org.ametys.web.service.StaticService"
                  id="org.ametys.web.service.SitemapService">
           <url>service/sitemap.html</url>
           <cacheable>true</cacheable>
           <labeli18n="true">PLUGINS_WEB_SERVICE_SITEMAP_LABEL</label>
           <descriptioni18n="true">PLUGINS_WEB_SERVICE_SITEMAP_DESCRIPTION</description>
           <thumbnail>
                   <small>img/service/sitemap_16.png</small>
                   <medium>img/service/sitemap_32.png</medium>
                   <large>img/service/sitemap_48.png</large>
           </thumbnail>
           <parameters>
                 <parametername="header"type="string">
                         <labeli18n="true">PLUGINS_WEB_SERVICE_SITEMAP_TITLE</label>
                         <descriptioni18n="true">PLUGINS_WEB_SERVICE_SITEMAP_TITLE_DESC</description>
                 </parameter>
                 <parameter name="depth" type="long">
            <label i18n="true">PLUGINS_WEB_SERVICE_SITEMAP_DEPTH</label>
            <description i18n="true">PLUGINS_WEB_SERVICE_SITEMAP_DEPTH_DESC</description>
            <default-value></default-value>
          </parameter>
            </parameters>
            <indexation>
                  <parameter>header</parameter>
            </indexation>
</extension>

Ceci est un extrait de la déclaration du service "Plan du site". Il possède 2 paramètres: le titre (header) et la profondeur des pages (depth).

L'url correspond à une url d'un pipeline dans le fichier sitemap.xmap du même plugin. Par exemple:

<map:match pattern="service/sitemap.html">
    <map:generate type="service-sitemap">
        <map:parameter name="depth" value="{parent-context-attr:depth}"/>
    </map:generate>
    <map:transform type="xslt" src="pages/services/sitemap.xsl"/>
    <map:transform type="i18n">
            <map:parameter name="locale" value="{request-attr:sitemapLanguage}"/>
             <map:parameter name="plugin" value="{request-attr:pluginName}"/>
        </map:transform>
    <map:serialize type="xml"/>
</map:match>

Dans le pipeline, la valeur d'un paramètre se récupère par {parent-context-attr:nom_parameter}.

Que souhaitez-vous faire exactement avec votre service ? Deux services en standard existent pour afficher du contenu externe:

Peut-être que l'un de ses service peut répondre à votre besoin ?
Le 2e service nécessite l'installation du plugin "proxied-content": http://releases.ametys.org/releases/org … .1.0/jars/

Laurence.


Laurence Aumeunier
Ametys Expert

Offline

#3 05/05/2014 19:08:58

imen Akili
Guest
Registered: 29/04/2014
Posts: 5

Re: Création d'un nouveau service

Bonjour,

Merci pour votre réponse.
En fait ce que je souhaite exactement faire est d'ajouter un nouveau service qui permet d'insérer dans une zone de la page une fonctionnalité bien precise d'une application externe donnée(Guichet, formulaires, recherche...). et qui soit plus riche que le service "Page externe"
J'ai essayé le service "Page externe" et j'ai eu un bon résultat, c'est vrai que l'histoire de style géne un peu mais j'ai trouvé que c'est personnalisable donc pas de problème la dessus.
Maintenant je souhaite ajouter un nouveau service qui grâce à un paramétrage plus avancée(non pas url uniquement) permet d'insérer le contenu souhaité.

J'ai fait comme vous m'avez indiqué et le nouveau plugin que j'ai ajouté a été chargé dans Ametys mais le service que j'ai ajouté dans plugin.xml grace au mécanisme d'extension n'apparait pas dans le menu d'ajout des services.

Selon vous y a t-il d'autre étapes que je dois mettre en place.


Bien cordialement

Offline

#4 06/05/2014 10:13:39

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: Création d'un nouveau service

Bonjour,

Avez-vous des erreurs dans les logs de l'application (WEB-INF/logs) ? Peut-être y a-t-il une erreur de syntaxe dans le fichier plugin.xml

Pour savoir si votre plugin et le service sont bien chargés vous pouvez vous rendre sur l'interface d'administration (http://<url_serveur_cms>/_admin), puis dans l'espace "Plugins et Workspaces"
https://wiki.ametys.org/display/AMETYSF … es+plugins

Dans la liste des "plugins par fichiers", vérifiez que le nom de votre plugin apparait bien, puis déroulez l'arbre. L'identifiant de votre service devrait être affiché sous un noeud "org.ametys.web.service.ServiceExtensionPoint".

Autre moyen de vérifier, rendez vous sur la liste des "plugins par points d'extension", déroulez le noeud "org.ametys.web.service.ServiceExtensionPoint" et vérifiez que l'identifiant de votre service apparait.


Laurence Aumeunier
Ametys Expert

Offline

#5 08/05/2014 18:00:41

imen Akili
Guest
Registered: 29/04/2014
Posts: 5

Re: Création d'un nouveau service

Bonjour,

J'ai fait les vérifications nécessaires et effectivement j'avais certaines erreurs dans le fichier plugin.xml que j'ai pu corrigé et mon nouveau service s'affiche bien dans la liste et en cliquant dessus la fenêtre de paramétrage s'affiche avec tous les paramétres que j'ai mis dans le fichier de configuration.

Mais j'ai des problèmes avec le rendu graphique de mon service, je n'arrive pas à le charger. en fait dés que je valide l'ajout du service j'ai le message suivant :
"Cette zone contient un élément (contenu ou service) dont le rendu graphique a échoué."
et les logs affichent l'erreur suivante :

2014-05-08 16:53:05,907 ERROR [org.ametys.web.repository.PageGenerator] (33169212@qtp-19263049-11;/cms/www/fr/service-apa-service.html) Unable to display zone item
org.apache.cocoon.ResourceNotFoundException: No pipeline matched request: _plugins/apa/service/apa.html
    at <map:mount> - resource://org/ametys/runtime/kernel/sitemap.xmap:144:82
    at org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:149)
    at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:69)
    at org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:93)
    at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:236)
    at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.buildPipeline(ConcreteTreeProcessor.java:194)
    at org.apache.cocoon.components.treeprocessor.TreeProcessor.buildPipeline(TreeProcessor.java:267)
    at org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:111)
    at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:47)
    at org.apache.cocoon.components.treeprocessor.sitemap.MatchNode.invoke(MatchNode.java:108)
    at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:69)
    at org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:143)
    at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:69)
    at org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:93)
    at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:236)
    at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.buildPipeline(ConcreteTreeProcessor.java:194)
    at org.apache.cocoon.components.treeprocessor.TreeProcessor.buildPipeline(TreeProcessor.java:267)
    at org.apache.cocoon.components.source.impl.SitemapSource.init(SitemapSource.java:333)
    at org.apache.cocoon.components.source.impl.SitemapSource.<init>(SitemapSource.java:215)
    at org.apache.cocoon.components.source.impl.SitemapSourceFactory.getSource(SitemapSourceFactory.java:65)
    at org.apache.excalibur.source.impl.SourceResolverImpl.resolveURI(SourceResolverImpl.java:208)
    at org.apache.cocoon.components.CocoonComponentManager.resolveURI(CocoonComponentManager.java:558)
    at org.apache.cocoon.components.CocoonComponentManager.resolveURI(CocoonComponentManager.java:558)
    at org.apache.cocoon.environment.AbstractEnvironment.resolveURI(AbstractEnvironment.java:554)
    at org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade.resolveURI(MutableEnvironmentFacade.java:307)
    at org.ametys.web.repository.PageGenerator._saxZoneItem(PageGenerator.java:530)
    at org.ametys.web.repository.PageGenerator._saxZoneItems(PageGenerator.java:378)
    at org.ametys.web.repository.PageGenerator._saxZone(PageGenerator.java:309)
...

Apparement il manque quelque chose dans mon sitemap.xmap :

<?xml version="1.0" encoding="UTF-8"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
    <map:pipelines>
        <map:pipeline>
            <map:match pattern="service/apa/apa.html">
                <map:transform type="i18n">
                    <map:parameter name="locale" value="{locale:locale}"/>
                    <map:parameter name="plugin" value="{request-attr:pluginName}"/>
                </map:transform>
                <map:transform type="xslt" src="service://pages/services/apa/apa.xsl"/>
                <map:serialize type="xml"/>
            </map:match>        
        </map:pipeline>
    </map:pipelines>
</map:sitemap>

Selon moi cette définition permettra de transformer le fichier xsl pour avoir le rendu graphique en html.
J'ai pas utilisé les "<map:action>" et "<map:genarate>" dans le sitemap.xmap parceque j'ai pas encore compris le principe et qu'est ce que je dois mettre dans les classes java à associées. Est ce que je dois d'abord les intégrés? Si oui pourriez vous m'indiquer comment pourrais-je le faire?

D'avance merci pour votre aide.

Bien cordialement.

Offline

#6 12/05/2014 10:28:31

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: Création d'un nouveau service

Bonjour,

Oui, il vous faut nécessairement un generateur. Chaque pipeline cocoon, doit être constitué:

  • d'un seul générateur (flux xml d'entrée)

  • de 0 à n transformer (transformations successives du flux xml)

  • d'un seul serializer (transforme le flux xml dans un format donné: html, pdf, xml, ..)

Un generateur peut par exemple lire un fichier XML sur le disque, lire un fichier XML sur un protocole HTTP (exemple : flux RSS) ou produire son propre XML.

Si dans votre cas vous n'avez pas besoin de flux XML d'entrée, vous pouvez utiliser le générateur "action-result" fournit dans Ametys. Ce dernier produira le flux XML suivant:

<ActionResult/>

Votre pipeline s'écrit donc:

<map:match pattern="service/apa/apa.html">
         <map:generate type="action-result">
         <map:transform type="xslt" src="service://pages/services/apa/apa.xsl"/>
         <map:transform type="i18n">
                    <map:parameter name="locale" value="{request-attr:sitemapLanguage}"/>
                    <map:parameter name="plugin" value="{request-attr:pluginName}"/>
         </map:transform>       
         <map:serialize type="xhtml"/>
</map:match>       

Laurence Aumeunier
Ametys Expert

Offline

#7 28/01/2015 17:43:38

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 44
Website

Re: Création d'un nouveau service

Bonjour Laurence,

une question concernant la création d'un nouveau service basé, dans mon cas, sur le service iframe existant.

lorsque vous dites

vous pouvez tout à fait ajouter un nouveau service avec vos propre paramètres.

. Doit-on uniquement rajouter nos paramètres, où faut-il également reprendre tous les paramètres existant même si on ne les modifie pas ?

Last edited by jbabadie (28/01/2015 17:44:50)

Offline

#8 28/01/2015 18:07:50

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: Création d'un nouveau service

Bonjour,

Non il n'existe pas de mécanisme d'héritage entre service. Il vous faut donc redéfinir tous les paramètres nécessaires dans la déclaration de votre service.

Cdt.


Laurence Aumeunier
Ametys Expert

Offline

#9 02/02/2015 12:50:26

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 44
Website

Re: Création d'un nouveau service

Bonjour,

tout marche nickel, j'ai un peu galéré sur le pipeline mais j'ai survécu merci.

Dernier écueil. J'ai un des paramètres de mon service que je souhaite ajouter à l'URL de ma page (?param=XXXX).
Ex : http://www.monsiteametys.fr/fr/marubriq … ?param=184

Je n'arrive pas à trouver comment gérer ça dans la xsl lors de la génération de la page, avez-vous une solution ?
Sinon ça peut se traiter en javascript mais au choix...

Offline

#10 02/02/2015 13:03:17

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,091

Re: Création d'un nouveau service

Bonjour

si vous utilisez un paramètre de requête dans votre service, celui-ci ne peut plus être cachable.

Si il l'était, je vous conseille de faire en JS.
Si il ne l'était pas, vous pouvez faire "ametys:requestParameter("param")" https://wiki.ametys.org/display/AMETYSD … tParameter


Raphael Franchet
Expert Ametys

Offline

#11 02/02/2015 14:09:33

jbabadie
Guest
From: Pau
Registered: 14/10/2013
Posts: 44
Website

Re: Création d'un nouveau service

Bonjour Raphaël,
Sauf incompréhension de ma part, requestParameter permet de récupérer un paramètre. J'aurais besoin de faire l'inverse, c'est a dire faire apparaitre le paramètre à la suite de l'url de la page.
(Le paramètre est saisi par l'utilistateur lors de la création du service).
J'aurais donc besoin "simplement" de réécrire/compléter l'url de la page généré.

Est-ce que <xsl:result-document format="html" encoding="UTF-8" href="..." > peut-être une piste ?

Offline

#12 02/02/2015 16:18:09

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,091

Re: Création d'un nouveau service

Oui d'accord.
Vous souhaitez que lorsque le visiteur tape "a.html" il soit rediriger vers "a.html?param=XXXX" où XXXX est une valeur du paramètre du service ?
Quel est l'intérêt de la chose ?

Non <xsl:result-document-format> ne fait pas ça.

Ca va être un tout petit peu (trop) complexe à faire coté serveur...


Raphael Franchet
Expert Ametys

Offline

#13 09/01/2018 13:31:20

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,091

Re: Création d'un nouveau service

Hi srini_r,
could you post a new thread in the english section of the forum
thank you


Raphael Franchet
Expert Ametys

Offline

Board footer

Powered by FluxBB