viernes, 3 de octubre de 2008

Vistas agrupadas de entradas de blog con CKS

Hasta hoy había utilizado en alguna ocasión Community Kit for Sharepoint (CKS) especialmente los componentes para gestión de FBA y para blogs (Enhanced Blog Edition - EBE) en alguno de los portales en los que he trabajado pero, hasta ahora, no había necesitado mostrar vistas agrupadas de diferentes blogs dentro de la misma colección de sitios. En cualquier caso, la idea parecía simple: utilizar un ContentByQueryWebpart (CQWP) y extenderlo para poder admitir alguno de los campos propios de los posts.

Bien, como suele suceder, la simplicidad no existe y, por alguna extraña razón, ha costado un poco más de lo esperado. Por si alguien está pensando hacer lo mismo, voy a explicar brevemente los pasos que yo he seguido.

1. Añadir a la página un CQWP, seleccionando todas las entradas de blog existentes en la colección de sitios.

2. Utilizando Sharepoint Designer, buscar el fichero ItemStyle.xsl dentro de la carpeta Style Library/XSL Style Sheets de la colección de sitios.

3. En este fichero, crear un nuevo template para mostrar entradas de blog. En mi caso, algo similar a lo siguiente:

<xsl:template name="Blogs" match="Row[@Style='Blogs']" mode="itemstyle">
    <xsl:variable name="SafeLinkUrl">
        <xsl:call-template name="OuterTemplate.GetSafeLink">
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="SafeImageUrl">
        <xsl:call-template name="OuterTemplate.GetSafeStaticUrl">
            <xsl:with-param name="UrlColumnName" select="'ImageUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="DisplayTitle">
        <xsl:call-template name="OuterTemplate.GetTitle">
            <xsl:with-param name="Title" select="@Title"/>
            <xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="LinkTarget">
        <xsl:if test="@OpenInNewWindow = 'True'" >_blank</xsl:if>
    </xsl:variable>
      <xsl:variable name="publishedDate" select="ddwrt:FormatDateTime(string(@PublishedDate),3082
                            ,'dd/MM/yyyy')" />
    <xsl:variable name="pureText">
        <xsl:call-template name="removeHtmlTags">
            <xsl:with-param name="html" select="@Body" />
        </xsl:call-template>
    </xsl:variable>
    <div>
        <a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@LinkToolTip}">
            <p><xsl:value-of select="$publishedDate"/>  <xsl:value-of select="@Author"/></p>
            <p><strong><xsl:value-of select="$DisplayTitle"/></strong></p>
            <xsl:if test="string-length($SafeImageUrl) != 0">
                <img src="{$SafeImageUrl}" width="77" height="77" alt="{@ImageUrlAltText}"/>            
            </xsl:if>
            <p><xsl:value-of select="substring($pureText, 0, 250)" disable-output-escaping="yes" />...</p>
        </a>
    </div>
</xsl:template>

4. Editar el CQWP y establecer como estilo para los elementos el que acabamos de crear.

5. Exportar el CQWP y editar el fichero generado para buscar la siguiente línea:

<property name="CommonViewFields" type="string"/>

y cambiarla por lo siguiente:

<property name="CommonViewFields" type="string">PublishedDate,DateTime;Body,Memo;</property>

6. Eliminar el CQWP de la página e importar el fichero que acabamos de modificar.

Et voilà! La verdad: una vez hecho me doy cuenta de que he seguido los mismos pasos que he seguido siempre para añadir campos personalizados a los CQWP pero, no sé muy bien por qué, esta vez ha costado más de la cuenta.

6 comentarios:

aventurero dijo...

He intentado hacer eso mismo pero añadiendo a la lista blog una columna imagen a la que he llamado imagen. En el xsl la llamo
xsl:variable name="UrlImagen"
xsl:value-of select="@imagen"/
/xsl:variable

e intento que aparezca la imagen
img class="estilo1imagenoticias" src="{$UrlImagen}"

pero no sale.

¿alguna idea de que sucede?

David Martos dijo...

Que tipo estás poniendo en el tag CommonViewFields del fichero DWP para ese campo? Posiblemente sea un problema de no encontrar la columna según el tipo que estás poniendo.

aventurero dijo...

Gracias David,
En el .webpart lo he declarado
property name="CommonViewFields" type="string"Title,String;Body,String;Author,String;PublishedDate,DateTime;imagen,Image;PublishingPageContent,Note;/property
de tipo Image que he leido por algún otro blog que existía.
La columna imagen es de tipo Hipervínculo o imagen.

jarauta dijo...

Puede deberse a que la columna como tal se llame ows_imegen?

David Martos dijo...

Hola,

desconozco el nombre de la columna que estás tratando de pasar. Lo que sí te recomiendo es que trates de aislar el problema e intentes pasar sólo ese campo ya que, por ejemplo el campo Body debería ser un Note y no un Text. Dudo que afecte pero... Después, asegúrate del nombre que Sharepoint le da a tu campo "imagen" desde las propiedades de la lista y trata de pintarlo directamente en el xsl, sin ninguna variable intermedia. En las mismas propiedades de la lista podrás ver el tipo de campo que es. Para los campos de tipo imagen (como PublishingPageImage) el campo es de tipo Image, pero en el caso de tu columna no puedo asegurártelo. Si tienes problemas puedes tratar de pasarlo como Text y ver lo que le envía al xsl.

jarauta dijo...

Hola David, finalmente he resuelto el problema, gracias a tu ayuda.
Te comento mis problemas y la solución por si le sucede a más gente
La columna, en la lista, se llama imagen y ese es el nombre que debo de coger, no el interno de columna que es ows_imagen. En la lista el tipo de columna es "Hipervínculo o imagen", pero en el .webpart lo he puesto como string.
En el ItemStyle he creado una variable ya que al seleccionar value-of select="@imagen" me devolvía la url,texto alternativo.
De esa variable que he llamado UrlImagen, he hecho un split para poner la URL en el src de una imagen de la siguiente forma img class="estilo1imagenoticias" src="{substring-before($UrlImagen,','). Con esto ha funcionado todo.