Archivo de la categoría: Desarrollo de SharePoint

Cuidado con cambios importantes para ItemStyle.xsl

Estaba trabajando con ItemStyle.xsl para personalizar el aspecto de un elemento Web consulta de contenido y sobre la hora del almuerzo, Hice una última hora cambiar el xsl. No darse cuenta de lo, pero esto tuvo trascendentales consecuencias en la colección de sitios. Salió a almorzar y a mi regreso, notado este mensaje que aparece en un montón de lugares:

No se puede mostrar esta parte de la Web. Para solucionar el problema, abrir esta página Web en un editor HTML compatible con Windows SharePoint Services, como Microsoft Office SharePoint Designer. Si el problema persiste, Póngase en contacto con el administrador del servidor Web.

Culparon al cliente (sin darse cuenta aún que era culpa mía en este momento) pero finalmente notó intellisense de visual studio fue advirtiéndome que tenía malformaciones XSL. Corregido y todo comenzó a trabajar.

Ser muy cuidadoso cuando se trabaja con ItemStyle.xsl (y cualquiera de los archivos XSL globales) — romperlos afecta a muchos artefactos en la colección de sitios.

<final />

Mostrar contenido consulta Web parte resultados en una cuadrícula / Tabla

Introducción y objetivo

Fuera de la caja, MOSS’ Elemento Web consulta de contenido (CQWP) muestra los resultados en formato de lista, similar a resultados de búsqueda. También es posible mostrar los resultados en un formato de cuadrícula (i.e. Formato de tabla HTML). Formatos de cuadrícula son mejores en algunas circunstancias. Describo cómo lograr ese efecto en el presente artículo.

Escenario de negocio

He trabajado con un cliente en una implementación MOSS de toda la empresa. Hemos diseñado su taxonomía que proyectos son ciudadanos de primera clase en la jerarquía y tienen su propio sitio de nivel superior. Gerentes de proyectos mantienen una lista de singleton de información Resumen del proyecto, como título, presupuesto, fecha de terminación prevista, presupuesto restante y otros campos de tipo Resumen. Por "singleton" Me refiero a una lista personalizada de SharePoint garantizada que contiene sólo un elemento. Manera simplista, este aspecto:

imagen

El enfoque técnico es lo mismo como se describe aquí (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). La CQWP usa una transformación XSL para emitir HTML para el navegador para representar.

Siempre preveo el resultado antes de zambullirse en el XSL porque XSL es una pesadilla. Aquí está mi resultado deseado:

imagen

HTML así genera ese resultado:

<HTML>
 <cuerpo>
 <Centro>
 <mesa frontera= 1>

<!-- Etiquetas:>
 <TR bgcolor= azul>
 <TD><fuente Color= blanco><b>Nombre del proyecto</b></fuente></TD>
 <TD alinear= a la derecha><fuente Color= blanco><b>Fecha completa</b></fuente></TD>
 <TD alinear= a la derecha><fuente Color= blanco><b>Presupuesto</b></fuente></TD>
 <TD alinear= a la derecha><fuente Color= blanco><b>Gasto real</b></fuente></TD>
 <TD><fuente Color= blanco><b>Estado general</b></fuente></TD>
 </TR>

<TR>
 <TD>Sala de ordenadores Re-cablea.</TD>
 <TD alinear= a la derecha>02/01/08</TD>
 <TD alinear= a la derecha>22,500.00</TD>
 <TD alinear= a la derecha>19,000.00</TD>
 <TD>En progreso</TD>
 </TR>

<TR>
 <TD>Servidores de provisión para actualización de SQL</TD>
 <TD alinear= a la derecha>04/01/08</TD>
 <TD alinear= a la derecha>7,500.00</TD>
 <TD alinear= a la derecha>0.00</TD>
 <TD>Planeado</TD>
 </TR>

</mesa>
 </Centro>
 </cuerpo>
</HTML>

Enfoque

Siga estos pasos para crear la red:

  1. Identificar los componentes de la red (filas o columnas).
  2. Definir y crear columnas de sitio necesario.
  3. Crear sub sitios para los proyectos y las listas de singleton.
  4. Agregar el CQWP a una página web y configurar para buscar tus listas.
  5. Modificar XML del CQWP a recoger las columnas adicionales.
  6. Modificar el XSL para generar una tabla.

Me voy a concentrar en el número seis. Los números uno a través de cuatro son directa y algo que ya ha hecho cualquier usuario CQWP. Número cinco ha sido documentado por otros incluyendo este exhaustivo artículo cargado de captura de pantalla de MSDN aquí (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) blog de Heather Solomon y aquí (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).

Tuercas y pernos

Iniciar y ejecutar pasos del uno al cinco, según la documentación de MSDN y artículo de Heather Solomon.

En este punto, ha agregado su CQWP a la página y tienes tu <CommonViewFields> configurado según sea necesario.

Siguiendo los pasos habituales, Estos resultados intermedios:

1. Crear un tipo de contenido, una lista personalizada templatized para ese tipo de contenido y dos sitios. Aquí es el tipo de contenido:

imagen

Aquí está la estructura del sitio:

imagen

2. Añadir el CQWP después de crear mi proyecto subsitios y singleton listas Resumen proyecto:

imagen

3. Añadir toda la información adicional que quiero mediante la <CommonViewFields>:

        <propiedad nombre="CommonViewFields" tipo="cadena">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</propiedad>

Tenga en cuenta que tenía que guardar todos los campos de propiedad sobre una línea o no funcionaría. (CQWP me diría que la consulta no devuelva ningún elemento).

4. En este punto, Estamos listos para ir más allá del artículo de MSDN y tirón en sobre artículo de Heather Solomon. Seguir sus pasos a partir de cerca de paso #5 para crear una personalizada / unghosted versión de ItemStyle.xsl. Sigo el Consejo de Heather, a través de paso 11 a estos resultados intermedios:

4.1: Nombre mi Plantilla XSL como sigue:

<XSL:nombre de la plantilla = "Grid" fósforo = "fila[@Style = 'Red']" modo = "itemEstilo">

También ligeramente le sugirió modificar <XSL:para cada …> mediante la adición de un <BR /> etiqueta para proporcionar un listado limpiador:

    <XSL:para cada Seleccione="@*">
      P:<XSL:valor de Seleccione="nombre()" /><BR/>
    </XSL:para cada>

4.2: Modificar el elemento web, ir a la apariencia y seleccione mi Grid"" estilo:

imagen

Aplicar el cambio y aquí está el resultado:

imagen

De lo anterior podemos ver que los campos que queremos (Nombre del proyecto, gasto, estado, etc.) están disponibles para nosotros cuando emitimos el HTML. No sólo, pero vemos los nombres por los cuales debemos referencia esas columnas en el XSL. Por ejemplo, referenciamos el estatus del proyecto como "Project_x005F_x0020_Name".

En este punto, Partimos del blog de Heather y de los hombros de los gigantes, Añadir mi propia poco.

ContentQueryMain.xsl

NOTA: Cuando haga cambios a tanto ContentQueryMain.xsl como ItemStyle.xsl, es necesario comprobar que los archivos vuelve a antes de usted ver el efecto de los cambios.

Para fines de fabricación de rejilla, MOSS utiliza dos diferentes archivos XSL para generar los resultados que vemos de un CQWP. Para generar el bit anterior de salida, modificamos el ItemStyle.xsl. MOSS utiliza otro archivo XSL, ContentQueryMain.xsl a en conjunto con el ItemStyle.xsl para generar código HTML. Como su nombre lo indica, ContentQueryMain.xsl es el principal"" XSL que controla el flujo general de traducción. Recorre en iteración todos los elementos encontrados y los pasa uno a uno a plantillas en ItemStyle.xsl. Modificaremos el ItemStyle.xsl para generar la apertura <mesa> etiqueta antes de emitir la primera fila de datos y el cierre <mesa> etiqueta después de la emisión de la última fila. Para lograr esto, ContentQueryMain.xsl modificado para pasar dos parámetros a nuestra red"" plantilla de ItemStyle.xsl, "última fila" y "fila actual". ItemStyle.xsl usa estos para emitir condicionalmente las etiquetas necesarias.

Utilizando la técnica de Heather Solomon, que busque ContentQueryMain.xsl. Se encuentra en el mismo lugar que el ItemStyle.xsl. Esta captura de pantalla debe ayudar a:

imagen

Tenemos que hacer los siguientes cambios:

  • Modificar una plantilla xsl, "CallItemTemplate" que realmente invoca nuestra plantilla cuadrícula en ItemStyle.xsl. Pasaremos dos parámetros a la plantilla de cuadrícula por lo que tendrán los datos que necesita para generar condicional de apertura y cierre <mesa> Etiquetas.
  • Modificar otro poco de ContentQueryMain.xsl que se llama el "CallItemTemplate" pasar un "LastRow" parámetro así LastRow puede transmitirse a nuestra plantilla de cuadrícula.

Ubique la plantilla llamada "OuterTemplate.CallItemTemplate" identificada por la cadena:

  <XSL:plantilla nombre="OuterTemplate.CallItemTemplate">

Vuelva a colocar la plantilla entera como sigue:

  <XSL:plantilla nombre="OuterTemplate.CallItemTemplate">
    <XSL:param nombre="CurPosition" />

    <!--
      Añadir el "LastRow" parámetro.
      Sólo la usamos cuando el elemento style pase en "Grid".
    -->
    <XSL:param nombre="LastRow" />

    <XSL:Elija>
      <XSL:Cuando prueba="@Style = 'NewsRollUpItem'">
        <XSL:Aplique-plantillas Seleccione="." modo="itemEstilo">
          <XSL:con-param nombre="EditMode" Seleccione="$cbq_iseditmode" />
        </XSL:Aplique-plantillas>
      </XSL:Cuando>
      <XSL:Cuando prueba="@Style = 'NewsBigItem'">
        <XSL:Aplique-plantillas Seleccione="." modo="itemEstilo">
          <XSL:con-param nombre="CurPos" Seleccione="$CurPosition" />
        </XSL:Aplique-plantillas>
      </XSL:Cuando>
      <XSL:Cuando prueba="@Style = 'NewsCategoryItem'">
        <XSL:Aplique-plantillas Seleccione="." modo="itemEstilo">
          <XSL:con-param nombre="CurPos" Seleccione="$CurPosition" />
        </XSL:Aplique-plantillas>
      </XSL:Cuando>

      <!--
              Pasar la posición actual y lastrow a la plantilla de itemstyle.xsl de red.
              ItemStyle.xsl que va a utilizar para emitir al aire libre y cierre <mesa> Etiquetas.
      -->
      <XSL:Cuando prueba="@Style = 'Grid'">
        <XSL:Aplique-plantillas Seleccione="." modo="itemEstilo">
          <XSL:con-param nombre="CurPos" Seleccione="$CurPosition" />
          <XSL:con-param nombre="Duran" Seleccione="$LastRow" />
        </XSL:Aplique-plantillas>
      </XSL:Cuando>

      <XSL:de lo contrario>
        <XSL:Aplique-plantillas Seleccione="." modo="itemEstilo">
        </XSL:Aplique-plantillas>
      </XSL:de lo contrario>
    </XSL:Elija>
  </XSL:plantilla>

Los comentarios describen el propósito de los cambios.

Claro, el "OuterTemplate.CallItemTemplate" se llama sí mismo de otra plantilla. Localice esa plantilla buscando esta cadena de texto:

<XSL:plantilla nombre="OuterTemplate.Body">

Desplazarse por las instrucciones en OuterTemplate.Body e introduzca el parámetro LastRow como sigue (se muestra como un comentario en cursiva):

<XSL:plantilla de llamada nombre="OuterTemplate.CallItemTemplate">
  <XSL:con-param nombre="CurPosition" Seleccione="$CurPosition" />
  <!-- Inserta el parámetro LastRow. -->
  <XSL:con-param nombre="LastRow" Seleccione="$LastRow"/>
</XSL:plantilla de llamada>

Después de todo esto, por fin tenemos cosas configuradas correctamente para que nuestro ItemStyle.xsl puede emitir <mesa> Etiquetas en el lugar correcto.

ItemStyle.Xsl

NOTA: Nuevo, Check-in ItemStyle.xsl después de hacer los cambios para que veas el efecto de esos cambios.

Aquí tenemos dos tareas:

  • Reemplazar toda la plantilla de cuadrícula. Usted puede copiar/pegar desde abajo.
  • Añadir algunos mumbo jumbo fuera de la definición de plantilla que permite "formatcurrency" plantilla para trabajo. (Sabes que tengo una manija tenue XSL).

Primero, cerca de la parte superior de ItemStyle.xsl, Añadir la siguiente línea:

  <!-- Algunas tonterías que permite mostrar los E.E.U.U.. moneda. -->
  <XSL:formato decimal nombre="personal" dígito="D" />

  <XSL:plantilla nombre="Por defecto" partido="*" modo="itemEstilo">

Nota que agregué directamente antes del <XSL:nombre de la plantilla = "Default" …> definición.

Siguiente, volver a nuestra plantilla de cuadrícula. Reemplazar toda la plantilla de cuadrícula con el código siguiente. Fondo es comentó, pero no dudes en escribirme o dejar comentarios en mi blog si tienes preguntas.

  <XSL:plantilla nombre="Red" partido="Fila de[@Style = 'Grid']" modo="itemEstilo">

    <!--
      ContentMain.xsl pasa CurPos y último.
      Utilizamos estos emitir condicionalmente el abierto y cierre <mesa> Etiquetas.
    -->
    <XSL:param nombre="CurPos" />
    <XSL:param nombre="Duran" />

    <!-- Las siguientes variables son sin modificar desde el ItemStyle.xsl estándar -->
    <XSL:variable nombre="SafeImageUrl">
      <XSL:plantilla de llamada nombre="OuterTemplate.GetSafeStaticUrl">
        <XSL:con-param nombre="UrlColumnName" Seleccione="'ImageUrl'"/>
      </XSL:plantilla de llamada>
    </XSL:variable>
    <XSL:variable nombre="SafeLinkUrl">
      <XSL:plantilla de llamada nombre="OuterTemplate.GetSafeLink">
        <XSL:con-param nombre="UrlColumnName" Seleccione="'LinkUrl'"/>
      </XSL:plantilla de llamada>
    </XSL:variable>
    <XSL:variable nombre="DisplayTitle">
      <XSL:plantilla de llamada nombre="OuterTemplate.GetTitle">
        <XSL:con-param nombre="Título" Seleccione="@Title"/>
        <XSL:con-param nombre="UrlColumnName" Seleccione="'LinkUrl'"/>
      </XSL:plantilla de llamada>
    </XSL:variable>
    <XSL:variable nombre="LinkTarget">
      <XSL:Si prueba="@OpenInNewWindow = 'True'" >_blank</XSL:Si>
    </XSL:variable>

    <!--
      Aquí definimos una variable, "tableStart".  Contiene el código HTML que usamos para definir la apertura de la mesa, así como las etiquetas de columna.  Tenga en cuenta que si CurPos = 1, incluye el código HTML en una etiqueta CDATA.
      De lo contrario, estará vacía.

      El valor de tableStart es emitidos cada vez ItemStyle se llama a través de ContentQueryMain.xsl.
    -->
    <XSL:variable nombre="tableStart">
      <XSL:Si prueba="$CurPos = 1">
        <![CDATA[
        <frontera de tabla = 1>
          <TR bgcolor = "blue">
            <TD><color de fuente = "blanco"><b>Nombre del proyecto</b></fuente></TD>
            <TD align = "right"><color de fuente = "blanco"><b>Fecha completa</b></fuente></TD>
            <TD align = "right"><color de fuente = "blanco"><b>Presupuesto</b></fuente></TD>
            <TD align = "right"><color de fuente = "blanco"><b>Gasto real</b></fuente></TD>
            <TD><color de fuente = "blanco"><b>Estado general</b></fuente></TD>
          </TR>
        ]]>
      </XSL:Si>
    </XSL:variable>

    <!--
      Otra variable, tableEnd simplemente define el cierre etiqueta de mesa.

      Como con tableStart, siempre es sido emitida.  Por esta razón se asigna su valor condicional en base a si nos hemos pasados la última fila por ContentQueryMain.xsl.
    -->
    <XSL:variable nombre="tableEnd">
      <XSL:Si prueba="$CurPos = $Last">
        <![CDATA[ </mesa> ]]>
      </XSL:Si>
    </XSL:variable>

    <!--
      Emitir siempre el contenido de tableStart.  Si no se trata de la primera fila pasada a nosotros por ContentQueryMain.xsl, entonces sabemos que su valor estará en blanco.

      Desactivar el escape porque cuando tableStart no en blanco, incluye HTML real que queremos que el navegador procesa.  Si no decimos el analizador XSL para desactivar la salida de escape, se van a generar cosas como"&lt;mesa&gt;" en vez de"<mesa>".
    -->
    <XSL:valor de Seleccione="$tableStart" Disable-output-escaping=""/>


    <TR>
      <!--
      P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
      -->
      <TD>
        <XSL:valor de Seleccione="@Project_x005F_x0020_Name"/>
      </TD>

      <TD alinear="derecho">
        <XSL:valor de Seleccione="@Project_x005F_x0020_End_x005F_x0020_Date"/>
      </TD>

      <TD alinear="derecho">
        <XSL:plantilla de llamada nombre="FormatCurrency">
          <XSL:con-param nombre="valor" 
Seleccione="@Project_x005F_x0020_Budget"></XSL:con-param> </XSL:plantilla de llamada> </TD> <TD alinear="derecho"> <XSL:plantilla de llamada nombre="FormatCurrency"> <XSL:con-param nombre="valor" Seleccione="@Project_x005F_x0020_Expenses">
</XSL:con-param> </XSL:plantilla de llamada> </TD> <TD> <XSL:valor de Seleccione="@Project_x005F_x0020_Status"/> </TD> <!-- Lo siguiente es comentada para clarificar las cosas. Sin embargo, traerlo de vuelta y todo eso en un <TD> para ver su efecto. --> <!-- <div id = "linkitem" class = "item"> <XSL:Si la prueba = "string-length($SafeImageUrl) != 0 "> <div class = "imagen-área-left"> <a href = "{$SafeLinkUrl}" target = "{$LinkTarget}"> <IMG class = "imagen-ancho fijo" src = "{$SafeImageUrl}"
Alt = "{@ImageUrlAltText}"/> </un> </div> </XSL:Si> <div clase = "elemento de enlace"> <XSL:plantilla de llamada
Name="OuterTemplate.CallPresenceStatusIconTemplate"/> <a href = "{$SafeLinkUrl}"
target = "{$LinkTarget}" title = "{@LinkToolTip}"> <XSL:valor de select = "$DispXSLTitle" /> </un> <div class = "description"> <XSL:valor de select="@Description" /> </div> </div> </div>
--> </TR> <!-- Emiten el cierre etiqueta de mesa. Si no estamos en la última fila, Esto será en blanco. --> <XSL:valor de Seleccione="$tableEnd" Disable-output-escaping=""/> </XSL:plantilla> <XSL:plantilla nombre="FormatCurrency"> <XSL:param nombre="valor" Seleccione="0" /> <XSL:valor de Seleccione='formato de número($valor, "$DDD,DDD,DDD.DD", "el personal")' /> </XSL:plantilla>

Pantallas de entrada de datos estándar de WSS/MOSS no admiten desplegables en cascada (o otro intra-comunicación)

ACTUALIZACIÓN (04/2008): Esta entrada de blog gran muestra un enfoque de javascript buena base para este problema: http://webborg.blogspot.com/2008/04/add-functions-and-events-to-sharepoint.html

ACTUALIZACIÓN II: (04/2008): Esta entrada de blog parece prometedora, así: http://www.cleverworkarounds.com/2008/03/13/free-mosswss-2007-web-part-hide-controls-via-javascript/

Varias veces por semana, Si no diario, usuarios del Foro describen un requisito que normalmente se sufragarían mediante desplegables en cascada. Por ejemplo, Tengo dos controles de lista desplegable:

  • Lista de los Estados Unidos. Estados
  • Lista de los Estados Unidos. ciudades.

Como proveedores responsables de IU, Queremos operar así:

  • Paul selecciona a los Estados Unidos. Estado en el menú desplegable.
  • Esto hace que las ciudades desplegable para filtrar sólo las ciudades que pertenecen al estado seleccionado.
  • Paul selecciona una ciudad de esta lista filtrada.

No hay fuera de la caja soporte para esta característica. En realidad, no existe compatibilidad para cualquier tipo de comunicación intra-forma directa OOB. Esto incluye programación oculta/activación/desactivación de campos en respuesta a los cambios de campo en el formulario.

El verdadero objetivo de este artículo para describir posibles soluciones y estas son las opciones como los conozco:

  1. Desarrollar un tipo de columna personalizada. Como un desarrollador de columna personalizado, Usted tiene el control total sobre el mundo"" de la columna personalizada. Puede implementar una cascada descendente de esa manera.
  2. Considere el uso de flujo de trabajo. En algunos casos, que desea asignar automáticamente un valor al campo base en el valor de otro campo. En este caso, normalmente trata de utilizar una columna calculada, Pero algunas veces, sólo no hacer el trabajo. Flujo de trabajo de SharePoint Designer es una alternativa relativamente administrar respetuoso a cayendo en código y visual studio. Si vas a esta ruta, ser consciente del tema abordado por en este artículo (http://paulgalvin.spaces.live.com/blog/cns!CC1EDB3DAA9B8AA!405.entry).
  3. Controladores de eventos: Como flujo de trabajo, se trata de una solución después de los hechos. El controlador de eventos es un ensamblado de .NET (C#, VB.NET) a que SharePoint pasa control. El objeto de que desarrollar tiene acceso a los datos de la lista (y el modelo de objeto entero) y puede hacer cualquier cálculo necesario.
  4. Usar SharePoint Designer para crear formularios personalizados. No tengo experiencia directa con este enfoque, but I hear they are doing good things with NewForm.aspx these days 🙂
  5. Rodar su propia función de entrada de datos ASP.NET (como una página web independiente o como un elemento web) en su lugar.

Si alguien sabe otras o mejores opciones, por favor enviar un comentario y actualizaré el cuerpo de este post.

<final />

Etiquetas de Technorati:

Crear gráficos de barras en SharePoint

Visión general:

(ACTUALIZACIÓN 12/04/07: Agrega otro recurso interesante final de enlazar a otro blog que se ocupa de esto a través de una parte muy interesante de la web)

Esta entrada de blog describe cómo crear un gráfico de barras en SharePoint. Esto funciona en entornos WSS y MOSS como solo depende del elemento web vista de datos.

El enfoque general es la siguiente:

  1. Crear una lista o biblioteca de documentos que contiene los datos que desea gráfico.
  2. Colocar la biblioteca de documentos asociados / personalizada en una página de la lista y convertirlo en un elemento web de vista de datos (DVWP).
  3. Modificar XSL del DVWP para generar HTML que se muestra como un gráfico.

Escenario de negocio / El programa de instalación:

He creado una lista personalizada con la columna de título estándar y una columna adicional, "Estado". Estos modelos (muy simplista) una "autorización de gastos" escenario donde el título representa el proyecto y el estado de un valor de la lista de:

  • Propuesto
  • En proceso
  • Estancado

El objetivo es producir un gráfico de barras horizontal interactivo que muestra estos códigos de Estado.

He llenado la lista y este aspecto:

imagen

Crear elemento Web vista de datos:

Crear el DVWP agregando la lista personalizada para una página (página en mi caso) y siga las instrucciones aquí (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Además de simplemente crear el DVWP, También tenemos que establecer la propiedad de paginación para mostrar todas las filas disponibles. Para mí, Esto se ve algo como esto:

imagen

En este punto, Siempre cierro los SPD y el navegador. Luego volver a abrir la página usar el navegador. Esto evita que accidentalmente limpiando hasta la disposición de parte de la web en la página.

Modificar el XSLT:

Ahora es el momento de modificar el XSLT.

Siempre utilizo visual studio para esto. (Ver aquí para una nota importante acerca de intellisense que le ayudará mucho).

Crear un proyecto vacío agregar cuatro nuevos archivos (sustituir las palabras "Original" y "nuevo" según corresponda):

  • Original.XSLT
  • New.XSLT
  • Params.xml original
  • Params.xml nuevo

En mi caso, este aspecto:

imagen

Modificar el elemento web y copiar los parámetros y XSL al Original"" versión de Visual Studio.

El objetivo aquí es causar el XSL transformar los resultados que nos metemos atrás de la consulta DVWP en HTML que se representa como un gráfico.

Con este fin, ayuda a considerar primero lo que el HTML debería ser antes de que nos quedamos confundidos por la locura que se conoce como "XSL". (Que quede claro, el siguiente es sólo un ejemplo; no escribe o copia y pegar en visual studio. Proporcionar un golpe completo punto de partida para más adelante en la escritura). El siguiente gráfico de la muestra se procesa según el HTML inmediatamente después de:

Ejemplo de Gráfico de barras

HTML correspondiente:

<HTML>
<cuerpo>
<Centro>
<ancho de tabla = 80%>
<TR><TD><Centro>Gráfico de barras horizontales</TD></TR>
<TR>
<TD align = "center">
<frontera tabla = "1" ancho = 80%>
<TR>
<anchura TD = 10%>Abierto</TD>
<TD><tabla cellpadding ="0" cellspacing ="0" border = 0 width = 50%><TR bgcolor = rojo><TD>&nbsp;</TD></TR></mesa></TD>
</TR>
<TR>
<anchura TD = 10%>Cerrado</TD>
<TD><tabla cellpadding ="0" cellspacing ="0" border = 0 width = 25%><TR bgcolor = rojo><TD>&nbsp;</TD></TR></mesa></TD>
</TR>
<TR>
<anchura TD = 10%>Estancado</TD>
<TD><tabla cellpadding ="0" cellspacing ="0" border = 0 width = 25%><TR bgcolor = rojo><TD>&nbsp;</TD></TR></mesa></TD>
</TR>
</mesa>
</TD>
</TR>
</mesa>
</cuerpo>
</HTML>

Utilicé un enfoque muerto simple para crear mis barras estableciendo el color de fondo de una fila al "rojo".

Esto es el take-away: En el final, todo lo que estamos haciendo es crear HTML con filas y columnas.

Plantilla XSLT:

He copiado el XSLT que genera un gráfico de barras horizontal. Está bastante bien comentado así que no añado mucho aquí excepto estas notas:

  • Empecé con el valor por defecto XSL que SharePoint Designerme dio cuando he creado primero el DVWP.
  • He podido redujo desde del SPD 657 líneas 166 líneas de.
  • Yo no metan con el archivo XML de parámetros (que está separada del XSL y sabrá lo que quiero decir cuando vaya a modificar el DVWP sí; Hay dos archivos que se puede modificar). Sin embargo, a fin de simplificar la TI, Quitar casi todos ellos de la XSL. Esto significa que si usted quiere hacer uso de los parámetros, sólo tiene que añadir sus definiciones variable hacia el XSL. Eso será fácil ya que tendrás las definiciones variable originales de XSL en su proyecto de visual studio.
  • Usted debe ser capaz de copiar y pegar esto directamente en su proyecto de visual studio. A continuación, Quitar mis llamadas e insertar sus propias llamadas "ShowBar".
  • El detalle de obras mediante la creación de un <a href> Así: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Esta técnica puede ser útil en otros contextos. Al principio, Pensé que tendría que ajustarse a un formato más complejo: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, pero en mi entorno que no es necesario. URL de la lista se pasa a nosotros por SharePoint así que esto es muy fácil generalizar.

Aquí es:

<XSL:hoja de estilos Versión="1.0" excluir resultado de prefijos="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urna:schemas-microsoft-com:XSLT" xmlns:XSL="http://www.w3.org/1999/XSL/Transform"
xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:__designer="http://schemas.Microsoft.com/WebParts/v2/DataView/Designer"
xmlns:ASP="http://schemas.Microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.Microsoft.com/WebParts/v2/DataView/Runtime"
xmlns:o="urna:schemas-microsoft-com:Oficina" xmlns:s="UUID:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3-11 d 1-A29F-00AA00C14882" xmlns:RS="urna:schemas-microsoft-com:conjunto de filas" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urna:FrontPage:interna"
> <XSL:salida método="HTML" guión="No" /> <XSL:formato decimal NaN="" /> <XSL:param nombre="ListUrlDir"></XSL:param> <!-- Necesito esto para un desglose de la ayuda. --> <XSL:plantilla partido="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.Microsoft.com/ASPNET/20"
> <XSL:variable nombre="dvt_StyleName">Tabla</XSL:variable> <XSL:variable nombre="Filas" Seleccione="/dsQueryResponse/filas/fila" /> <XSL:variable nombre="dvt_RowCount" Seleccione="Conde($Filas)" /> <XSL:variable nombre="IsEmpty" Seleccione="$dvt_RowCount = 0" /> <XSL:variable nombre="dvt_IsEmpty" Seleccione="$dvt_RowCount = 0" /> <XSL:Elija> <XSL:Cuando prueba="$dvt_IsEmpty"> No hay datos al gráfico!<BR/> </XSL:Cuando> <XSL:de lo contrario> <!-- Lo interesante comienza aquí. Necesitamos definir un par de variables para cada fila en el gráfico: número total de elementos y por ciento del total. --> <XSL:variable nombre="totalProposed" Seleccione="Conde(/dsQueryResponse/filas/fila[espacio de normalizar(@Status) = 'Propuesto'])" /> <XSL:variable nombre="percentProposed" Seleccione="$totalProposed div $dvt_RowCount" /> <XSL:variable nombre="totalInProcess" Seleccione="Conde(/dsQueryResponse/filas/fila[espacio de normalizar(@Status) = 'En proceso'])" /> <XSL:variable nombre="percentInProcess" Seleccione="$totalInProcess div $dvt_RowCount" /> <XSL:variable nombre="totalStalled" Seleccione="Conde(/dsQueryResponse/filas/fila[espacio de normalizar(@Status) = 'Estancado'])" /> <XSL:variable nombre="percentStalled" Seleccione="$totalStalled div $dvt_RowCount" /> <!-- Definimos nuestra tabla HTML aquí. Yo estoy prestado de algunos estilos de SharePoint estándar aquí para que sea consistente. Creo que honrará a los cambios en el archivo css global así como tema reemplaza. --> <mesa Ancho="100%" cellspacing="0" cellpadding="2" estilo="frontera-derecho: 1 #C0C0C0 sólido; frontera inferior: 1 #C0C0C0 sólido; estilo de borde izquierdo: sólido; ancho del borde izquierdo: 1; border-top-style: sólido; border-top-width: 1;"> <TR> <TD alinear="Centro"> <mesa frontera="1" Ancho="100%"> <!-- Para cada estado que queremos ver, lo llamamos el "ShowBar" plantilla. Lo pasamos: 1. Una etiqueta de la fila. Esto se transforma en un hipervínculo. 2. El por ciento (variable desde arriba). 3. El nombre del campo actual del código de la lista subyacente. No es necesario para que coincida con la etiqueta de la pantalla. 4. El valor del campo emparejado para #3. 5. Total de artículos de este código de estado (No el total de todos los códigos de estado). Emite un <TR></TR> y la línea del gráfico de barras horizontales. Llamamos esta plantilla para cada código de estado que queremos ver. --> <XSL:plantilla de llamada nombre="ShowBar"> <XSL:con-param nombre="BarDisplayLabel" Seleccione="'Propuesta'"/> <XSL:con-param nombre="BarPercent" Seleccione="$percentProposed"/> <XSL:con-param nombre="QueryFilterFieldName" Seleccione="'Estado'"/> <XSL:con-param nombre="QueryFilterFieldValue" Seleccione="'Propuesta'"/> <XSL:con-param nombre="TotalItems" Seleccione="$totalProposed"></XSL:con-param> </XSL:plantilla de llamada> <XSL:plantilla de llamada nombre="ShowBar"> <XSL:con-param nombre="BarDisplayLabel" Seleccione="'Estancado'"/> <XSL:con-param nombre="BarPercent" Seleccione="$percentStalled"/> <XSL:con-param nombre="QueryFilterFieldName" Seleccione="'Estado'"/> <XSL:con-param nombre="QueryFilterFieldValue" Seleccione="'Estancado'"/> <XSL:con-param nombre="TotalItems" Seleccione="$totalStalled"></XSL:con-param> </XSL:plantilla de llamada> <XSL:plantilla de llamada nombre="ShowBar"> <XSL:con-param nombre="BarDisplayLabel" Seleccione="'En proceso'"/> <XSL:con-param nombre="BarPercent" Seleccione="$percentInProcess"/> <XSL:con-param nombre="QueryFilterFieldName" Seleccione="'Estado'"/> <XSL:con-param nombre="QueryFilterFieldValue" Seleccione="'En proceso'"/> <XSL:con-param nombre="TotalItems" Seleccione="$totalInProcess"></XSL:con-param> </XSL:plantilla de llamada> </mesa> </TD> </TR> </mesa> </XSL:de lo contrario> </XSL:Elija> </XSL:plantilla> <!-- Esta plantilla hace el trabajo de visualización de las líneas individuales en el gráfico de barras. Probablemente harás la mayor parte de su ajuste aquí. --> <XSL:plantilla nombre="ShowBar"> <XSL:param nombre="BarDisplayLabel" /> <!-- etiqueta para mostrar --> <XSL:param nombre="BarPercent"/> <!-- Por ciento del total. --> <XSL:param nombre="QueryFilterFieldName"/> <!-- Solía ir a la consulta & filtro --> <XSL:param nombre="QueryFilterFieldValue"/> <!-- Solía ir a la consulta & filtro --> <XSL:param nombre="TotalItems" /> <!-- recuento total de este barlabel --> <TR> <!-- La etiqueta de la barra. --> <TD clase="MS-formbody" Ancho="30%"> <!-- Este siguiente grupo de declaraciones construye una cadena de consulta que permite perforar hasta una vista filtrada de los datos subyacentes. Hacemos uso de algunas cosas aquí: 1. FilterField1 y FilterValue1 podemos pasar a una lista para filtrar en una columna. 2. SharePoint está pasando un parámetro fundamental que nos, ListUrlDir que apunta a la lista subyacente contra la cual esta DVWP "corre". No es divertido XSL? --> <XSL:texto Disable-output-escaping=""> <![CDATA[<a href ="]]></XSL:texto> <XSL:valor de Seleccione="$ListUrlDir"/> <XSL:texto Disable-output-escaping=""><![CDATA[?FilterField1 =]]></XSL:texto> <XSL:valor de Seleccione="$QueryFilterFieldName"/> <XSL:texto Disable-output-escaping=""><![CDATA[&FilterValue1 =]]></XSL:texto> <XSL:valor de Seleccione="$QueryFilterFieldValue"/> <XSL:texto Disable-output-escaping=""><![CDATA[">]]></XSL:texto> <XSL:valor de Seleccione="$BarDisplayLabel"/> <XSL:texto Disable-output-escaping=""><![CDATA[</un>]]></XSL:texto> <!-- El bit siguiente muestra algunos números en el formato: "(total / % del total)" --> (<XSL:valor de Seleccione="$TotalItems"/> / <!-- Esto nos crea una etiqueta porcentaje Niza. Gracias, Microsoft! --> <XSL:plantilla de llamada nombre="percentformat"> <XSL:con-param nombre="por ciento" Seleccione="$BarPercent"/> </XSL:plantilla de llamada>) </TD> <!-- Finalmente, emitir un <TD> etiqueta para la barra propia.--> <TD> <mesa cellpadding="0" cellspacing="0" frontera="0" Ancho="{Ronda($BarPercent * 100)+1}%"> <TR bgcolor="rojo"> <XSL:texto Disable-output-escaping=""><![CDATA[&nbsp;]]></XSL:texto> </TR> </mesa> </TD> </TR> </XSL:plantilla> <!-- Esto está tomada directamente de algunos XSL que encontré en una plantilla de MS. --> <XSL:plantilla nombre="percentformat"> <XSL:param nombre="por ciento"/> <XSL:Elija> <XSL:Cuando prueba="formato de número($por ciento, '#,##0%;-#,##0%')= 'NaN'">0%</XSL:Cuando> <XSL:de lo contrario> <XSL:valor de Seleccione="formato de número($por ciento, '#,##0%;-#,##0%')" /> </XSL:de lo contrario> </XSL:Elija> </XSL:plantilla> </XSL:hoja de estilos>

Los resultados:

XSL desde arriba genera este gráfico:

imagen

Desglosar los datos subyacentes haciendo clic en el código de Estado:

imagen

Reflexiones finales:

Puede ser generalizada?

Me encanta este concepto gráfica, pero odio el hecho de que tengo que ir y hacer tanta codificación manual. Yo he pensado un poco en si puede ser generalizado y soy optimista, pero también estoy un poco temeroso que puede ser un muro en alguna parte a lo largo de la ruta de acceso que no ofrece ninguna solución. Si alguien tiene algunas buenas ideas sobre esto, por favor tome nota de las observaciones o Enviarme un correo electrónico.

Gráficos verticales:

Este es un gráfico de barras horizontal. Es ciertamente posible crear un gráfico vertical. Sólo tenemos que cambiar a la HTML. Empezaría de la misma manera: Crear una representación de HTML de un gráfico de barras vertical y luego averiguar cómo conseguirlo vía XSL. Si alguien está interesado en, Pude convencí a probar y trabajar las torceduras. Si alguien ya ha hecho, por favor hágamelo saber y con mucho gusto voy enlace a tu blog 🙂

Creo que el desafío con un gráfico vertical es que las etiquetas de la gráfica son más difíciles de administrar, pero ciertamente no es imposible.

Campo nombre Gotcha:

Hay al menos dos cosas a buscar con los nombres de campo.

Primero, un nombre de campo con un espacio tiene que ser escapado en el XSL. Probablemente se trata de una cuestión:

        <XSL:variable nombre="totalProposed" 
Seleccione="Conde(/dsQueryResponse/filas/fila[espacio de normalizar(@Status) = 'Propuesto'])" />

Si tu estado"" columna realmente es llamado "código de Estado" a continuación, debe hacer referencia a él como "Status_x0020_Code":

   <XSL:variable nombre="totalProposed" 
Seleccione="Conde(/dsQueryResponse/filas/fila[espacio de normalizar(@ Status_x0020_Code) = 'Propuesto'])" />

Segundo, y me siento un poco borroso en este, pero también hay que estar alerta para los cambios de nombre de campo. Si llama a su campo "código de estado" y más tarde en, cámbiele el "Estado de AFE", el nombre interno"" no cambia. El nombre interno seguirá siendo "código de estado" y debe hacer referencia como "Status_x0020_Code". Los "otros recursos" enlaces pueden ayudar a diagnosticar y corregir este tipo de problema.

Acerca de ese Color:

Elegí "rojo" porque es agradable a mí en el momento. No sería una gran cosa para mostrar diferentes colores para dar más que una descripción visual de un número, sino también proporcionar un KPI útil. Por ejemplo, Si el porcentaje de "estancado" AFE es > 10% a continuación mostramos rojo, de lo contrario, mostrarlo en negro. Uso <XSL:Elija> para lograr esto.

Otros recursos:

Transformar feliz!

<final />

Suscribirse a mi blog!

Etiquetas de Technorati: , , , , , ,

Presentar los datos de OM a través de una lista personalizada (o, Sin embargo otro datos de OM Displayor [como YACC, pero diferentes])

Hoy en día, Pasé un puñado de horas rastreando la causa detrás del mensaje "el nombre de la columna que escribiste ya está en uso o reservados. Elegir otro nombre."

La columna en cuestión podría crearse, elimina y vuelve a crear en otro entorno, así que sabía que no era un nombre reservado. Sin embargo, Simplemente no encontré la columna en cualquier lugar mediante la interfaz de usuario de SharePoint estándar en cualquier sitio en la colección de sitios.

Envié a Foros MSDN aquí y el Indomable Andrew Woodward me apuntaban en la dirección de los datos subyacentes de modelo de objeto.

Me fui a CodePlex para encontrar algunas herramientas que me ayudaría a asomarse a los datos subyacentes de OM y ayudarme a localizar el problema.

Intenté varias herramientas y eran muy chulo e interesante pero al final, la interfaz de usuario no era lo suficientemente bueno para mi propósito. No estoy criticando por cualquier medio, Pero claramente los matriceros no tienen mi problema en mente cuando crearon su interfaz de usuario :). Mayoría de las personas parece estar invirtiendo una buena cantidad de tiempo y esfuerzo en la creación de estaciones de trabajo / aplicaciones cliente que proporcionan vistas de árbol, Haga clic en menús contextuales, etc.. Estos son agradables y todos, Pero es mucho trabajo para crear una experiencia de usuario de top-of-the-line que también es muy flexible.

Realmente necesitaba una respuesta a este problema. Se me ocurrió si todas las columnas de sitio podría tener en la colección de sitios en una lista personalizada, Yo podría filtrar, ordenar y crear vistas que me ayudara a encontrar esta columna supuestamente existente (que lo hizo, BTW). Fui por delante y lo y una o dos horas más tarde, tenían todas las columnas de mi sitio cargado en una lista personalizada con agrupación, clasificación y así sucesivamente. Encontré mi respuesta cinco minutos más tarde.

Y si asumo con éxito sobre el mundo, Creo que se decreto que todos los proveedores de herramientas de SharePoint deben considerar seriamente superficie sus datos de modelo de objeto en una lista personalizada. De esa manera, Yo tengo el poder para buscar alguna manera quiero (limitada, Claro, por las características estándar de sharepoint).