Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 21/02/2014 17:17:02

frigoku
Guest
Registered: 21/02/2014
Posts: 18

Problème formulaire et XSL

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

#2 24/02/2014 12:33:33

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

Re: Problème formulaire et XSL

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

#3 24/02/2014 15:45:41

frigoku
Guest
Registered: 21/02/2014
Posts: 18

Re: Problème formulaire et XSL

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

#4 24/02/2014 18:07:46

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

Re: Problème formulaire et XSL

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

#5 24/02/2014 18:10:28

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

Re: Problème formulaire et XSL

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

#6 25/02/2014 10:42:32

frigoku
Guest
Registered: 21/02/2014
Posts: 18

Re: Problème formulaire et XSL

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

Board footer

Powered by FluxBB