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.

Related Posts:

  • Office System 2007 SP2Microsoft ha anunciado que el SP2 para Office System 2007 verá la luz entre febrero y abril de 2009. El paquete afectará tanto a las herramientas clientes de Office como a las herramientas de servidor. Algunas de las novedad… Read More
  • Integridad referencial en MOSSCuando hablamos de integridad referencial (i.e. control de relaciones entre diferentes entidades) y de MOSS lo primero que nos viene a la cabeza es el concepto Lookup Columns (o columnas de búsqueda). Con ellas podemos crear … Read More
  • CSP adquiere una nueva apariencia visualLos pasados días 28 y 29 de Octubre, en el marco de la ISU FY09 EMEA (Industry Solutions University) de Microsoft, se presentaron algunas de las nuevas funcionalidades de la plataforma CSP (http://www.codeplex.com/csp). En es… Read More
  • Custom Field Types en SharepointHoy, segundo día del Tech-ed developers EMEA 2008, he decidido asistir a una sesión que parecía ser de un nivel muy elevado, a juzgar por su nivel 400 y por el título que tenía: Extreme Sharepoint cus… Read More
  • Error javascript "object required" al arrastrar webparts de una zona a otraTras trabajar en varios portales públicos desarrollados sobre Sharepoint, he de decir que una de las cosas más frecuentes y molestas, y a la vez más olvidadas, son los errores de javascript. Nunca sabes a parti… Read More

6 comentarios:

jarauta 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.

jarauta 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.