none
[ XSLT ] une histoire d'url RRS feed

  • Question

  • Bonjour,

     

    j'ai une liste d'url qui est utilisée pour alimenter une content querry web part qui est intégrée et customisée dans ma master page. Ce sont des liens rapides. Cependant  j'aimerai rajouter la possibilité d'ouvrir ces liens dans une nouvelle fenêtre ou pas (target=_blank).

     

    J'ai donc été voir le style XSL de l'item dans les options de la web part.

    C'est le "LinkList" qui lui était appliqué :

     

    Code Snippet
    <xsl:template name="LinkList" match="Row[@Style='LinkList']" mode="itemstyle">
     <xsl:variable name="DisplayTitle">
            <xsl:call-template name="OuterTemplate.GetTitle">
                <xsl:with-param name="Title" select="@URL"/>
                <xsl:with-param name="UrlColumnName" select="'URL'"/>
            </xsl:call-template>
        </xsl:variable>
     <xsl:variable name="LinkTarget">
            <xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
        </xsl:variable>
     <div id="linkitem" class="item" >
      <div>
       <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
       <a>
        <xsl:attribute name="href">
         <xsl:value-of select="substring-before($DisplayTitle,', ')">
         </xsl:value-of>
        </xsl:attribute>
        <xsl:attribute name="title">
         <xsl:value-of select="@Description">
         </xsl:value-of>
        </xsl:attribute>
        <xsl:value-of select="substring-after($DisplayTitle,', ')">
        </xsl:value-of>
       </a>
      </div>
     </div>
    </xsl:template>

     

     

     

    Première remarque, je ne comprend pas trop quand le "LinkTarget" rentre en jeu Tongue Tied Il n'est pas "remit" dans la construction de la balise en dessous

    J'ai donc tenté de modifier cela pour rajouter l'option que je voulais :

     

    <xsl:template name="LiensRapide" match="Row[@Style='LiensRapide']" mode="itemstyle">
     <xsl:variable name="DisplayTitle">
            <xsl:call-template name="OuterTemplate.GetTitle">
                <xsl:with-param name="Title" select="@URL"/>
                <xsl:with-param name="UrlColumnName" select="'URL'"/>
            </xsl:call-template>
        </xsl:variable>
     <xsl:variable name="LinkTarget">
            <xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
        </xsl:variable>

     <div id="contentlien" >
     
       <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
      
       <a href="{$URL}" target="{$LinkTarget}" title="{@URL}">
        <xsl:value-of select="$DisplayTitle"/>
       </a>
      </div>
     
    </xsl:template>

     

    Mais bon ça ne fonctionne pas.

     

    Dans ma liste de liens j'ai donc comme champs :

    URL (web adress + description)

    Notes

    OpenInNewWindow (Yes/No) -> rajouté pour le xsl if (mais peut être une erreur de ma part).

     

    Voila si qqun sait m'éclairer la dessus Smile

    jeudi 7 août 2008 08:22

Toutes les réponses

  • Bonjour,

     

    si vous voulez que le lien s'ouvre dans une nouvelle fenêtre quoi qu'il arrive, modifiez la ligne

     

    <a href="{$URL}" target="{$LinkTarget}" title="{@URL}"> comme suit :

     

    <a href="{$URL}" target="_blank" title="{@URL}">

     

    La variable LinkTarget est utilisée pour des éléments de liste disposant d'un contrôle CheckBox permettant d'indiquer l'ouverture dans une nouvelle fenêtre. Votre liste de liens n'en disposant pas, ignorez simplement cette variable.
    jeudi 7 août 2008 10:14
    Modérateur
  • Bonjour et merci,

     

    c'est bien ce que je pensais, je n'ai pas cette option, mais j'ai tenter de la recréer en ajoutant dans ma liste la colonne "OpenInNewWindow" (Yes/No).

     

    Mais le xsl if ne semble pas concluant (arrive-t-il à lire la valeur de la colonne ?)

     

    J'aimerai donc pouvoir avoir le choix pour mes liens.

     

    Merci d'avance Smile

     

    jeudi 7 août 2008 10:28
  • Pour utiliser votre propre colonne vous serez contraint de la redéfinir dand la propriété CommonViewFields de votre .webpart.

     

    Vous trouverez un exemple correspondant à ce que vous souhaitez faire ici : http://www.sharepoint-tips.com/2007/01/teach-content-query-web-part-how-to.html.

     

    jeudi 7 août 2008 10:41
    Modérateur
  • Merci bien je viens d'essayer:

     

    donc j'ai dans le code de la webpart :

     

    <property name="CommonViewFields" type="string">URL,text,OpenInNewWindow</property>

     

    J'ai rajouté cette web part dans ma master page, tout va bien, puis j'essaie de modifier le LinkList :

     

     

     <xsl:template name="LiensUtilesLinkList" match="Row[@Style='LiensUtilesLinkList']" mode="itemstyle">
     <xsl:variable name="DisplayTitle">
            <xsl:call-template name="OuterTemplate.GetTitle">
                <xsl:with-param name="Title" select="@URL"/>
                <xsl:with-param name="UrlColumnName" select="'URL'"/>
            </xsl:call-template>
        </xsl:variable>
     <xsl:variable name="LinkTarget">
            <xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
        </xsl:variable>
     <div id="contentlien">
      <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
       <a href="{$URL}" target="_blank" title="{@URL}">
        <xsl:value-of select="$DisplayTitle" />
       </a>
     </div>
    </xsl:template>

    Et là de nouveau il y a une erreur qui fait tout planter.

    Je n'ai même pas essayer de mettre le if.

    Difficile pour moi de voir d'ou viens l'erreur, je suppose que c'est une bêtise...

    jeudi 7 août 2008 11:32
  • Sans pour autant être sûr que ce soit la seule erreur, il y a une erreur sur le CommonViewField. La propriété doit prendre deux valeurs séparées par une virgule : le nom et le type de données. Vous en avez trois : il vous faudrait remplacer

     

    Code Snippet
    URL,text,OpenInNewWindow

     

    par

     

    Code Snippet
    OpenInNewWindow,text

     

    Une autre propriété pourrait également vous être utile : DataColumnRenames vous permet d'associer une colonne définie dans le CommonViewField à une colonne déjà gérée... comme par exemple préciser que votre colonne myNewWindowValue remplace OpenInNewWindow.

     

    Vous trouverez un exemple d'utilisation de DataColumnRenames ici : http://www.microsoft.com/belux/msdn/nl/community/columns/stevenvandecraen/contentquerywebpart.mspx

    jeudi 7 août 2008 11:48
    Modérateur
  • En effet ça semble intéressant, d'ailleur j'ai essayé :

     

     

    <property name="CommonViewFields" type="string">URL,text;MyOpenInNewWindow,text</property>
        <property name="DataColumnRenames" type="string">MyOpenInNewWindow,OpenInNewWindow;</property>

     

    Mais lors de l'import, il ne veut pas l'importer, surement parce qu'elle n'est pas valide.

    Après test, c'est la propriété DataColumnRenames qui est en cause, dommage Sad

     

     

    jeudi 7 août 2008 12:08
  •  Sebastien PICAMELOT A écrit:

     

    Code Snippet
    URL,text,OpenInNewWindow

     

    par

     

    Code Snippet
    OpenInNewWindow,text

     

     

    Dans la doc je vois que c'est plutot :

     

    Code Snippet

    URL,text ; OpenInNewWindow,text

     

     

    En supposant que l'on puisse mettre autant de champs que l'on veut (vu que le nom de la propriété CommonViewFields est au pluriel Smile
    jeudi 7 août 2008 12:11
  • Bon ben rien n'y fait, c'est ma colonne qu'il n'arrive pas à tester et ce malgrès le rajout de celle-ci dans le CommonViewFields.

     

    Par contre ce qui faisait planter mon xsl, c'était le fait je faisais référence à "@LinkTarget" alors que je n'étais pas dans le bloc de cette variable (et quand on est hors du bloc, il faut utiliser "$LinkTarget"). Quand j'ai corrigé cela, ça ne plantait plus.

     

    Code Snippet

     <xsl:template name="LiensUtilesLinkList" match="Row[@Style='LiensUtilesLinkList']" mode="itemstyle">
     <xsl:variable name="DisplayTitle">
            <xsl:call-template name="OuterTemplate.GetTitle">
                <xsl:with-param name="Title" select="@URL"/>
                <xsl:with-param name="UrlColumnName"  select="'URL'"/>
            </xsl:call-template>
        </xsl:variable>
     <xsl:variable name="LinkTarget">
            <!--<xsl:if test="@MyOpenInNewWindow = 'Yes'" >_blank</xsl:if>-->
            <xsl:choose>
             <xsl:when test="@MyOpenInNewWindow='Yes'">_blank</xsl:when>
            
             <xsl:when test="@MyOpenInNewWindow='No'">none</xsl:when>       
            
                <xsl:otherwise>_blank</xsl:otherwise>
          </xsl:choose>
     </xsl:variable>

     <div id="linkitem" class="item">
     <div>
     <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
      <a>
      
       <xsl:attribute name="href">
           <xsl:value-of select="substring-before($DisplayTitle,', ')"/>
          </xsl:attribute>
     
       <xsl:attribute name="target">
           <xsl:value-of select="$LinkTarget"/>
           <!--_blank-->
          </xsl:attribute>
       
       <xsl:attribute name="title">
            <xsl:value-of select="@Description" />
            <!-- @URL = url, description -->      
          </xsl:attribute>

        <xsl:value-of select="substring-after($DisplayTitle,', ')"/>   
      </a>
     </div>
     </div>
    </xsl:template>

     

     

     

    J'ai le _blank à chaque fois alors que je n'ai qu'une seule URL ou le champ MyOpenInNewUrl est à Yes.

    C'est donc l'otherwise qui prime, parce que le test n'arrive pas a tester la valeur de ma colonne.

     

     

    jeudi 7 août 2008 13:18
  • Pour le CommonViewFields, l'important est de garder des couples "nom_de_la_propriété" / "type_de_données". Vous pouvez très bien en avoir plusieurs, séparés par des ';'.

     

    Pour votre XSL, retirez les comparaison à 'Yes' et à 'No' :

    Code Snippet

            <xsl:choose>
               <xsl:when test="@MyOpenInNewWindow>_blank</xsl:when>
               <xsl:otherwise>none</xsl:otherwise>

            </xsl:choose>

     

     

    jeudi 7 août 2008 13:26
    Modérateur
  • Merci,

     

    toujours le même effet avec votre proposition.

    maintenant je me demande si le type "text" est valide pour ma colone MyOpenInNewWindow car c'est une checkbox et le type est donc boolean.

     

    Je vais tester cela.

     

    EDIT: même avec le type "boolean" ça ne fonctionne pas.

     

    Là je ne vois vraiment pas ou est le problème Tongue Tied de toute évidence, il ne trouve pas l'instance de ma variable !

    jeudi 7 août 2008 13:35
  • Ce n'était évidemment pas le type text, désolé de ne pas avoir relevé l'erreur. Autre erreur de ma part, vous n'êtes pas obligé de répéter le type de données pour chaque propriété si elles utilisent le même type de données.

     

    Les types de données censés être gérés sont définis ici : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldtype.aspx

     

    Dans le doute, le type de données est peut être case sensitive. Essayez d'écrire boolean avec un "B" majuscule.

     

    Pourquoi ne pas ajouter un <xsl:value-of select="@OpenInNewWindow "/> pour réaliser quelques tests et voir ce qui s'affiche ?

     

    jeudi 7 août 2008 13:51
    Modérateur
  • Ce n'est pas grave je ne l'avais pas vu non plus Smile

     

    En effet ça ne mange pas de pain, donc :

     

    OpenInNewWindow=<xsl:value-of select="@OpenInNewWindow "/>
      MyOpenInNewWindow=<xsl:value-of select="@MyOpenInNewWindow "/>

     

    ce qui me donne pour chaque item :

     

    OpenInNewWindow=

    MyOpenInNewWindow=False

     

    Je ne sais pas trop quoi penser de ce False, mon premier lien est à Yes dans la liste, et les autres à No.

    jeudi 7 août 2008 14:02