Blog Stats
  • Posts - 171
  • Articles - 1
  • Comments - 197
  • Trackbacks - 5

 

MOSS 2007 CQWP: an XSLT function to split tags into url

Per un sito di Publishing realizzato con MOSS 2007 ho implementato una soluzione di tagging dei contenuti e per questo mi sono avvalso della soluzione fornita da Code Plex tramite il progetto CKS.

Di questa soluzione mi sono servito della sola web part TagCloud, in quanto per la lista risultante dal click su un tag ho dovuto utilizzare una Content Query Web Part personalizzata., dal momento che il tagging viene gestito a livello di pagina tramite un apposito Content Type di tipo Page che contiene il field Tags occorrente.

Nella lista realizzata con CQWP ho voluto visualizzare, per ogni item, la lista dei tags associati all'item, con anche la possibilità di cliccare sul tag singolo:

image

Per fare questo, avendo a disposizione il solo field Tags contenente la lista dei tags per l'item nel formato tag1,tag2,tag3..., ho dovuto mettere mano all' XSLT realizzando una funzione che mi formattasse la stringa nel seguente modo:

tag1, tag2, tag3,...   -->   <a href="url">tag1</a>, <a href="url">tag2</a>, <a href="url">tag3</a>, ...

La funzione XSLT l'ho inserita all'interno dell' ItemStyle.xsl utilizzato dalla CQWP:

   1:  <xsl:template name="splitIntoUrl">
   2:          <xsl:param name="string" />
   3:          <xsl:param name="url" />
   4:          <xsl:choose>
   5:          <xsl:when test="contains($string, ',')">
   6:              <xsl:variable name="nextString">
   7:                  &lt;/a&gt;
   8:                  <xsl:call-template name="splitIntoUrl">                                     
   9:                  <xsl:with-param name="string" select="substring-after($string, ',')" />
  10:                  <xsl:with-param name="url" select="$url" />
  11:                  </xsl:call-template>                              
  12:              </xsl:variable>        
  13:              &lt;a href="<xsl:value-of select="$url"></xsl:value-of><xsl:value-of select="substring-before($string, ',')" />"&gt;
  14:              <xsl:value-of select="concat(substring-before($string, ','), $nextString)" />
  15:          </xsl:when>
  16:          <xsl:otherwise>
  17:              &lt;a href="<xsl:value-of select="$url"></xsl:value-of><xsl:value-of select="$string" />"&gt;
  18:              <xsl:value-of select='$string' />
  19:              &lt;/a&gt;
  20:          </xsl:otherwise> 
  21:          </xsl:choose>                
  22:      </xsl:template>

dove il parametro "string" è il field Tags, mentre il parametro "url" è l'url che deve contenere il redirect del click sul tag.

Come dicevo, la CQWP utilizza un suo stile per renderizzarsi, ed è dove ho inserito la chiamata alla funzione per visualizzare i links:

   1:  <xsl:template name="MyCustomList" match="Row[@Style='MyCustomList']" mode="itemstyle">
   2:  ...
   3:  ...
   4:  <xsl:variable name="UrlTags">
   5:      <xsl:call-template name="splitIntoUrl">
   6:                     <xsl:with-param name="string" select="@Tags"/>  
   7:          <xsl:with-param name="url" select="string('Tags.aspx?tags=')"></xsl:with-param>
   8:      </xsl:call-template>
   9:  </xsl:variable>
  10:  ...
  11:  ...
  12:  <td>
  13:      <xsl:value-of select="$UrlTags" disable-output-escaping="yes"></xsl:value-of>
  14:  </td>
  15:  ...
  16:  ...
  17:  </xsl:template>


La funzione la posso riutilizzare ovunque dato che accetta l' url come parametro e quindi può essere associata ad altri template relativi ad altre CQWP per altri contenuti taggati.

Spero possa tornare utile.

del.icio.us Tags: ,

Comments have been closed on this topic.
 

 

Copyright © Luca Mauri