You are not logged in.
Pages: 1
Bonjour,
Je suis en train de développer un moteur de recherche pour des annonces stockées en base de données.
J'ai donc fait un template pour mon formulaire :
<xsl:template name="filter-form">
<form method="GET">
...
</form>
</xsl:template>
J'ai fait un template pour afficher les résultats de la recherche :
<xsl:template match="offre">
<xsl:for-each select="/offres/offre">
...
</xsl:for-each>
</xsl:template>
Ensuite, j'appelle le tout via un 3eme template :
<xsl:template name="common-service-body-nonempty-content-content">
<xsl:call-template name="filter-form" />
<xsl:choose>
<xsl:when test="/offres/offre">
<div class="offres">
<xsl:apply-templates select="offre" />
</div>
</xsl:when>
<xsl:otherwise>
<p>
<b><i18n:text i18n:key="SERVICE_RECHERCHE_IMMO_NO_RESULT" /></b>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Quand j'arrive sur ma page pour la première fois, pas de soucis, j'ai mon formulaire de recherche. Le problème arrive quand je "submit" mon formulaire.
La page se recharge, et là, j'ai deux fois mon formulaire d'affiché ainsi que 2 fois mes lignes de résultats.
Dans l'ordre d'affichage, j'ai deux 2 fois mon formulaire suivi du doublement de mes résultats.
C'est comme si le template "common-service-body-nonempty-content-content" était appelé 2 fois.
Savez-vous comment cela peut se produire et comment je peux éviter ça?
N'hésitez pas si vous avez besoin de plus d'infos.
Merci d'avance.
Last edited by frigoku (21/02/2014 17:53:05)
Offline
Bonjour,
Ce qui se passe est assez bizarre en effet, et si vous remplacez le call-template du formulaire, par le formulaire lui-même, il apparait en double aussi ?
Quel XML avez-vous en entrée ? vous pouvez écrire par exemple <test><xsl:copy-of select="/"/></test> pour le voir dans la sortie.
Raphael Franchet
Expert Ametys
Offline
Bonjour,
Effectivement, si je remplace le call par le formulaire directement, il apparaît en double aussi. Si je vire completement le formulaire, le titre du service géré par :
<xsl:param name="header" select="ametys:serviceParameter('header')" />
<xsl:template name="common-service-body-nonempty-content-title">
<xsl:call-template name="common-service-body-nonempty-content-title-content">
<xsl:with-param name="title" select="$header" />
</xsl:call-template>
</xsl:template>
Apparaît aussi en double. C'est comme si ma xsl était appelé deux fois.
En entrée, je cronstruis un XML en via mon générator basé sur une requête SQL.
SI je teste le copy-of et que je pars de ma page vierge, je n'ai qu'un titre d'afficher mais je suis je passe un paramètre pour avoir des résultats, j'ai le titre et les résultats de doublés.
J'avoue que je ne comprends pas trop.
Dans le doute, je vous mets le code qui me semble pertinent :
sitemap.xmap :
<?xml version="1.0" encoding="UTF-8"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
<map:components>
<map:generators>
<map:generator name="offresGenerator" src="fr.cilgere.ametys.RechercheImmoGenerator" />
</map:generators>
</map:components>
<map:pipelines>
<map:pipeline>
<map:match pattern="service/rechercheImmo.html">
<map:generate type="offresGenerator">
<map:parameter name="max-results" value="{parent-context-attr:max-results}" />
<map:parameter name="typeRecherche" value="{request-param:typRech}" />
<map:parameter name="region" value="{request-param:reg}" />
<map:parameter name="departement" value="{request-param:dep}" />
<map:parameter name="ville" value="{request-param:ville}" />
<map:parameter name="type1" value="{request-param:typ1}" />
<map:parameter name="type2" value="{request-param:typ2}" />
<map:parameter name="typo1" value="{request-param:typo1}" />
<map:parameter name="typo2" value="{request-param:typo2}" />
<map:parameter name="typo3" value="{request-param:typo3}" />
<map:parameter name="typo4" value="{request-param:typo4}" />
<map:parameter name="typo5" value="{request-param:typo5}" />
<map:parameter name="bpp" value="{request-param:bpp}" />
<map:parameter name="oplc" value="{request-param:oplc}" />
<map:parameter name="llm" value="{request-param:llm}" />
<map:parameter name="surfaceMin" value="{request-param:sMin}" />
<map:parameter name="surfaceMax" value="{request-param:sMax}" />
<map:parameter name="budgetMin" value="{request-param:bMin}" />
<map:parameter name="budgetMax" value="{request-param:bMax}" />
<map:parameter name="mobRed" value="{request-param:mobRed}" />
</map:generate>
<map:transform type="xslt" src="service://@xslt" />
<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>
</map:pipeline>
</map:pipelines>
</map:sitemap>
rechercheImmo.xsl :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
<xsl:import href="service:web://pages/services/common.xsl"/>
<xsl:param name="header" select="ametys:serviceParameter('header')" />
<!-- <xsl:variable name="is-empty" select="not(./offresResult)"/> -->
<xsl:template name="common-service-body-nonempty-content-title">
<xsl:call-template name="common-service-body-nonempty-content-title-content">
<xsl:with-param name="title" select="$header" />
</xsl:call-template>
</xsl:template>
<xsl:template name="common-service-body-nonempty-content-content">
<xsl:call-template name="filter-form" />
<xsl:choose>
<xsl:when test="/offresResult/offre">
<div class="offres">
<xsl:apply-templates select="offre" />
</div>
</xsl:when>
<xsl:otherwise>
<p>
<b><i18n:text i18n:key="SERVICE_RECHERCHE_IMMO_NO_RESULT" /></b>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="filter-form">
<form method="GET">
...
</form>
</xsl:template>
<xsl:template match="offre">
<xsl:for-each select="/offresResult/offre">
...
</xsl:for-each>
<xsl:for-each select="/offresResult/pagination">
...
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Last edited by frigoku (24/02/2014 16:33:14)
Offline
Est-ce que votre générateur n'envoie pas 2 balises racines ? ça pourrait expliquer pourquoi la XSL travaille 2 fois...
Raphael Franchet
Expert Ametys
Offline
Dans common.xsl on trouve ça
<!-- The common template to call to build your service structure -->
<xsl:template match="/*">
<html>
<head>
<xsl:call-template name="common-service-head"/>
</head>
<body id="default">
<xsl:call-template name="common-service-body"/>
</body>
</html>
</xsl:template>
donc soit vous envoyez 2 balises racines, soit la balise racine de votre xml passe par un de vos "match".
Essayez de remplacer vos <xsl:template match=""/> par des <xsl:for-each> pour voir si ça vient de là.
Raphael Franchet
Expert Ametys
Offline
Bonjour,
Effectivement, j'avais 2 balises root Listes et Offres. J'étais persuadé qu'il ne fallait pas avoir deux balises root dans le même contexte. Comme Listes et Offres n'avait rien à voir, je n'ai pas fait attention à cet aspect.
Du coup, j'ai englobé le tout et tout est ok maintenant.
Merci de votre aide.
Offline
Pages: 1