You are not logged in.
Bonjour,
Est-il possible de récupérer la date de mise en ligne d'un fichier joint à une page ?
Je souhaite afficher cette date à coté de la taille de la pj.
Merci
Offline
Bonjour,
en attendant la nouvelle documentation qui j'espère sera complète sur ce point de vue d'ici sa sortie, voici une vieille technique indienne pour savoir ce que vous avez en entrée d'une xsl.
Dans le body, vous placez une instruction du type :
<marker><xsl:copy-of select="/"/></marker>
Et ensuite vous analysez le html de sortie dans lequel vous retrouverez votre balise <marker> contenant le XML que vous avez à disposition en entrée. En l'occurence quelque chose comme :
<marker>
<attachments id="resources-collection://1e234e4d-926e-4968-86d5-3891d2150f2f">
<page lang="fr" title="Plan du site" site="www" path="plan-du-site"></page>
<file id="resource://f44a964d-ec05-4a31-aa0b-e6877967dcc8" keywords="" author="Administrator User"
lastmodified="2013-03-28T10:18:56.345+01:00" mimetype="image/jpeg"
name="nath.JPG" path="/nath.JPG">
<size>2 Mo</size>
<icon>plugins/explorer/icon-medium/JPG.png</icon>
</file>
</attachments>
</marker>
Pour convertir une date à ce format, vous pouvez utiliser les intructions i18n.
<i18n:date src-pattern="yyyy-MM-dd'T'hh:mm:ss" pattern="long" value="{@lastmodified}"/>
<i18n:time src-pattern="yyyy-MM-dd'T'hh:mm:ss" pattern="long" value="{@lastmodified}"/>
<i18n:date-time src-pattern="yyyy-MM-dd'T'hh:mm:ss" pattern="long" value="{@lastmodified}"/>
Raphael Franchet
Expert Ametys
Offline
Bonjour Raphaël,
Je ne comprends pas comment vous obtenez votre second cadre. Comment puis analyser le
xml d'entrée ?
Passez vous par le code source de la pge ou par cocoonview ? Ni l'un ni l'autre ne me donne d'information de date.
Last edited by Francis Feytout (04/04/2013 12:07:24)
Offline
En effet en analysant le code source de la page. Il faut mettre ce marqueur dans le body mais sous une balise plus "classique" comme un <p> par exemple.
Ensuite, regardez bien le source de la page et n'utilisez pas d'analyseur de code (comme firebug) car certains font sauter les balises inconnues.
Mais finalement, dans votre cas, je pense que c'est plutôt le cache qui est en cause . Faites toujours vos tests en "preview" mais après avoir désactivé le cache des éléments de page (_admin -> Configuration -> Systeme)
Raphael Franchet
Expert Ametys
Offline
Hmm toujours pas et je suis bien en mode dev sans cache et en preview de page.
Voici le source que j'obtiens :
Est-il consistent ?
Je travaille sous la version de démo 3.4.1 du 17/11/2012, est-ce un problème de version d'Amétys ?
Offline
Dans votre source, on trouve bien un <marker> mais pas de la bonne chose .
Je pense que vous n'avez pas mis le bout de code dans la bonne XSL.
La XSL de service possède son propre générateur, c'est dans celle-ci qu'il faut intervenir.... si on parle bien du service "Pièces jointes d'une page"
Raphael Franchet
Expert Ametys
Offline
ça explique ! Oui j'ai inséré le marqueur dans la xsl du gabarit. Il s'agit bien du service "pièce jointe d'une page".
Je suppose qu'il s'agit de {skin}/services/web/pages/services/attach/attachments-tree_3.3.xsl mais quel est le nom du template dans lequel l'utiliser ?
J'espère que la future doc inclura les noms des templates noyau.
Offline
Tout à fait. Depuis la 3.3 du noyau (d'où le _3.3 dans certains noms de fichiers) nous avons uniformisés les rendus des services et des contenus.
Il y a donc une xsl commune qui appelle certains templates, mais rien ne vous empêche de sortir de ce carcan et de faire
<xsl:template match="/">
<html>
<body>
<p><marker><xsl:copy-of select="/"/></marker></p>
</body>
</html>
</xsl:template>
Et du coup, vous n'avez aucun rendu et seulement le <marker>
Raphael Franchet
Expert Ametys
Offline
Excellent, ça va m'être utile !
Mais comme je souhaite surcharger l'affichage des pièces jointes pour ajouter la date {@lastmodified}, j'ai quand même besoin du nom du template d'affichage pour ça, non ?
Last edited by Francis Feytout (04/04/2013 16:21:29)
Offline
En effet, aujourd'hui (et même à l'avenir) je vous invite à regarder le template apporté par le noyau
qui importe cette xsl
qui importe cette xsl
et vous trouvez alors
<xsl:template match="File">
<li>
<span class="file">
<a href="{resolver:resolve('attachment-page', @id, true())}" title="{@name} ({size})">
<xsl:call-template name="Icons"/>
<xsl:value-of select="@name"/>
</a>
<span class="size"><xsl:value-of select="size"/></span>
</span>
</li>
</xsl:template>
Raphael Franchet
Expert Ametys
Offline
Merci,
Je n'ai pas la même version des fichiers, les miens s'importent eux-mêmes... Par exemple pour attachments-tree_3.3.xsl :
<xsl:import href="plugin:web://pages/services/attach/attachments-tree_3.3.xsl"/>
C'est forcément plus facile quand la chaîne d'import donne de l'information !
Offline
Alors...
Je souhaite surcharger toutes les vues du services d'attachment, donc je crée le fichier {skin}/services/web/pages/services/attach/attachments_3.3.xsl :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
exclude-result-prefixes="ametys">
<xsl:import href="plugin:web://pages/services/attach/common/attachments_3.3.xsl"/>
<xsl:template match="File">
<li>
<span class="file">
<a href="{resolver:resolve('attachment-page', @id, true())}" title="{@name} ({size})">
<xsl:call-template name="Icons"/>
<xsl:value-of select="@name"/>
</a>
<span class="size"><xsl:value-of select="size"/></span><br/>
<span class="size"><xsl:value-of select="size"/></span> <!-- test -->
</span>
</li>
</xsl:template>
</xsl:stylesheet>
Mais le rendu n'est pas modifié et j'ai une erreur 500 quand je rentre dans les paramètres du service :
Can't find a stylesheet for: service:web://pages/services/attach/attachments_3.3.xml
...
Je pensais avoir compris le système de surcharge d'un service mais apparemment j'ai raté un truc. Voyez vous mon erreur ?
Offline
A chaque fois que l'on place une XSL pour faire une vue, on peut l'accompagner d'un fichier XML de même nom dont le contenu permet :
1) de donner un libellé à la vue
2) d'inclure ou d'exclude la vue (ainsi vous pouvez exclude des vues apportées par le noyau)
Par exemple :
<service exclude="false">
<label i18n="true">ATTACHMENTS_SERVICE_LIST_XSLT_ATTACHMENT33_TREE_LABEL</label>
</service>
En théorie, ce fichier est facultatif : le libellé utilisée est à ce moment là le nom du fichier XSL et il est inclus par défaut.
D'autre part, le protocole service:// permet de chercher dans la skin et si il ne trouve pas de se rabattre sur le plugin : ainsi quand on surcharge une XSL pas la peine de surcharger le XML (sauf si on veut changer le libellé par exemple)
Cette erreur signifie que vous demandez un fichier qui n'existe pas... en l'occurence ce fichier n'a pas l'air si facultatif... si l'erreur vient bien de là il faudrait ouvrir un ticket dans le jira
En l'occurence sur une 3.5 le fichier <xsl:import href="plugin:web://pages/services/attach/common/attachments_3.3.xsl"/> n'existe pas... quelle version utilisez-vous ?
Raphael Franchet
Expert Ametys
Offline
Bonjour Raphael,
J'utilise la version 3.4.1-20121117-0511-SNAPSHOT sur mon poste local et la 3.4.0-20120615-0401-SNAPSHOT sur nos serveur.
Si je crée attachments_3.3.xml avec la xsl ci-dessus j'obtiens :
Exception when creating Transformer from file:/home/francis/Ametys/webapp/cms/skins/etudiantBx3/services/web/pages/services/attach/attachments_3.3.xsl
org.apache.excalibur.xml.xslt.XSLTProcessorException: Exception when creating Transformer from file:/home/francis/Ametys/webapp/cms/skins/etudiantBx3/services/web/pages/services/attach/attachments_3.3.xsl at org.ametys.runtime.cocoon.ThreadSafeTraxProcessor.getTransformerHandlerAndValidity(ThreadSafeTraxProcessor.java:233) at org.apache.cocoon.transformation.TraxTransformer.setup(TraxTransformer.java:331) at org.ametys.runtime.cocoon.TraxTransformer.setup(TraxTransformer.java:50) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.setupPipeline(AbstractProcessingPipeline.java:398) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.setupPipeline(AbstractCachingProcessingPipeline.java:718) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.preparePipeline(AbstractProcessingPipeline.java:501) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.prepareInternal(AbstractProcessingPipeline.java:515) at org.apache.cocoon.components.source.impl.SitemapSource.init(SitemapSource.java:343) 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._saxZoneItems(PageGenerator.java:437) at org.ametys.web.repository.PageGenerator._saxZone(PageGenerator.java:262) at org.ametys.web.repository.PageGenerator.generate(PageGenerator.java:192) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.processXMLPipeline(AbstractProcessingPipeline.java:579) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.processXMLPipeline(AbstractCachingProcessingPipeline.java:280) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.process(AbstractProcessingPipeline.java:780) at org.apache.cocoon.components.source.impl.SitemapSource.toSAX(SitemapSource.java:414) at org.apache.cocoon.components.source.SourceUtil.toSAX(SourceUtil.java:101) at org.apache.cocoon.components.source.SourceUtil.parse(SourceUtil.java:321) at org.apache.cocoon.sitemap.ContentAggregator.generate(ContentAggregator.java:125) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.processXMLPipeline(AbstractProcessingPipeline.java:579) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.processXMLPipeline(AbstractCachingProcessingPipeline.java:280) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.process(AbstractProcessingPipeline.java:481) at org.apache.cocoon.components.treeprocessor.sitemap.SerializeNode.invoke(SerializeNode.java:144) 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.process(ConcreteTreeProcessor.java:178) at org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:254) at org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:118) 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.process(ConcreteTreeProcessor.java:178) at org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:254) at org.apache.cocoon.Cocoon.process(Cocoon.java:699) at org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:1159) at org.ametys.runtime.servlet.RuntimeServlet._doService(RuntimeServlet.java:135) at org.ametys.runtime.servlet.RuntimeServlet.service(RuntimeServlet.java:92) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:536) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:915) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) Caused by: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Le préfixe doit se convertir en espace de noms : resolver at org.apache.xpath.compiler.XPathParser.errorForDOM3(XPathParser.java:655) at org.apache.xpath.compiler.Lexer.mapNSTokens(Lexer.java:647) at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:274) at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:98) at org.apache.xpath.compiler.XPathParser.initXPath(XPathParser.java:112) at org.apache.xpath.XPath.<init>(XPath.java:227) at org.apache.xalan.processor.StylesheetHandler.createXPath(StylesheetHandler.java:155) at org.apache.xalan.templates.AVT.<init>(AVT.java:308) at org.apache.xalan.processor.XSLTAttributeDef.processAVT(XSLTAttributeDef.java:520) at org.apache.xalan.processor.XSLTAttributeDef.processValue(XSLTAttributeDef.java:1393) at org.apache.xalan.processor.XSLTAttributeDef.setAttrValue(XSLTAttributeDef.java:1601) at org.apache.xalan.processor.XSLTElementProcessor.setPropertiesFromAttributes(XSLTElementProcessor.java:343) at org.apache.xalan.processor.XSLTElementProcessor.setPropertiesFromAttributes(XSLTElementProcessor.java:268) at org.apache.xalan.processor.ProcessorLRE.startElement(ProcessorLRE.java:283) at org.apache.xalan.processor.StylesheetHandler.startElement(StylesheetHandler.java:626) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.excalibur.xml.impl.JaxpParser.parse(JaxpParser.java:315) at org.apache.excalibur.xmlizer.DefaultXMLizer.toSAX(DefaultXMLizer.java:128) at org.ametys.runtime.cocoon.ThreadSafeTraxProcessor._sourceToSAX(ThreadSafeTraxProcessor.java:248) at org.ametys.runtime.cocoon.ThreadSafeTraxProcessor.getTransformerHandlerAndValidity(ThreadSafeTraxProcessor.java:185) ...
69 more
Mais cette fois je n'ai pas de rendu pour le service.
Offline
Oui cela correspond à ce que je disais : la xsl n'existe pas dans le noyau même en 3.4 ( ).
Alors certes, vous pouvez créer une vue attachments_3.3.xsl mais dans ce cas n'importez pas ce fichier dans le noyau car vous avez cette erreur.
Je pense que vous souhaitez surcharger une vue existante plutot. Mais laquelle ? attachment_small_3.3 ? attachment_medium_3.3 ? attachment_tree_3.3 ?
Raphael Franchet
Expert Ametys
Offline
Comment faire pour surcharger uniquement attachments-tree_3.3.xsl avec le template "File" qui se trouve dans attachment.xsl ?
J'ai un erreur de rendu quand j'essaie.
Offline
au temps pour moi, j'ai fait une erreur, j'avais raté le 'common' dans votre chemin.
si vous souhaitez surcharger File tout le temps, votre fichier est au bon endroit je pense
si vous ne souhaitez surcharger File que dans le cas du tree, il faut surcharger _tree et y mettre l'import du _tree noyau et le template en question.
mais bon à part, ça vous ne devriez pas avoir d'erreur dans les autres cas.
si vous analyser finement votre stacktrace vous trouverez l'erreur suivante : Le préfixe doit se convertir en espace de noms : resolver
vous avez utilisé "resolver:" sans la déclaration en entête de fichier xmlns:resolver="..." que je vous laisse copier du fichier d'orginie.
Raphael Franchet
Expert Ametys
Offline
En effet ça fonctionne avec le "resolver:" en en-têre, j'étais trop concentré sur la balise import.
Pour référence voici ma surcharge :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
xmlns:resolver="org.ametys.cms.transformation.xslt.ResolveURIComponent"
xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
exclude-result-prefixes="ametys">
<xsl:import href="plugin:web://pages/services/attach/attachments-tree_3.3.xsl"/>
...
<xsl:template match="File">
<xsl:variable name="Date">
<i18n:text i18n:key="SKIN_DOWNLOAD_DATE" i18n:catalogue="skin.{$skin}"/>
<i18n:date src-pattern="yyyy-MM-dd'T'hh:mm:ss" pattern="dd-MM-yyyy" value="{@lastModified}"/>
</xsl:variable>
<li>
<span class="file">
<a href="{resolver:resolve('attachment-page', @id, true())}" title="{@name} ({size})">
<xsl:call-template name="Icons"/>
<xsl:value-of select="@name"/>
</a>
<span class="size"><xsl:value-of select="size"/></span>
<span class="size"><xsl:copy-of select="$Date"/></span>
</span>
</li>
</xsl:template>
</xsl:stylesheet>
Merci pour le coup de main Raphël.
Offline
Avec plaisir
Raphael Franchet
Expert Ametys
Offline